diff --git a/res/layout/dashboard_tile.xml b/res/layout/dashboard_tile.xml
index d05af83..fa7a63b 100644
--- a/res/layout/dashboard_tile.xml
+++ b/res/layout/dashboard_tile.xml
@@ -16,6 +16,7 @@
 
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/dashboard_tile"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:gravity="center_vertical"
diff --git a/src/com/android/settings/dashboard/DashboardAdapter.java b/src/com/android/settings/dashboard/DashboardAdapter.java
index 8b29273..fadc023 100644
--- a/src/com/android/settings/dashboard/DashboardAdapter.java
+++ b/src/com/android/settings/dashboard/DashboardAdapter.java
@@ -18,9 +18,12 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
 import android.support.v7.widget.PopupMenu;
 import android.support.v7.widget.RecyclerView;
 import android.text.TextUtils;
+import android.util.ArrayMap;
 import android.util.TypedValue;
 import android.view.ContextThemeWrapper;
 import android.view.LayoutInflater;
@@ -60,9 +63,9 @@
     private final List<Object> mItems = new ArrayList<>();
     private final List<Integer> mTypes = new ArrayList<>();
     private final List<Integer> mIds = new ArrayList<>();
+    private final IconCache mCache;
 
     private final Context mContext;
-    private final SuggestionsChecks mSuggestionsChecks;
 
     private List<DashboardCategory> mCategories;
     private List<Condition> mConditions;
@@ -79,7 +82,7 @@
 
     public DashboardAdapter(Context context) {
         mContext = context;
-        mSuggestionsChecks = new SuggestionsChecks(mContext);
+        mCache = new IconCache(context);
 
         setHasStableIds(true);
         setShowingAll(true);
@@ -89,15 +92,9 @@
         return mSuggestions;
     }
 
-    public void setSuggestions(SuggestionParser suggestionParser) {
-        mSuggestionParser = suggestionParser;
-        mSuggestions = suggestionParser.getSuggestions();
-        for (int i = 0; i < mSuggestions.size(); i++) {
-            if (mSuggestionsChecks.isSuggestionComplete(mSuggestions.get(i))) {
-                disableSuggestion(mSuggestions.get(i));
-                mSuggestions.remove(i--);
-            }
-        }
+    public void setSuggestions(List<Tile> suggestions, SuggestionParser parser) {
+        mSuggestions = suggestions;
+        mSuggestionParser = parser;
         recountItems();
     }
 
@@ -226,12 +223,8 @@
             case R.layout.dashboard_tile:
                 final Tile tile = (Tile) mItems.get(position);
                 onBindTile(holder, tile);
-                holder.itemView.setOnClickListener(new View.OnClickListener() {
-                    @Override
-                    public void onClick(View v) {
-                        ((SettingsActivity) mContext).openTile(tile);
-                    }
-                });
+                holder.itemView.setTag(tile);
+                holder.itemView.setOnClickListener(this);
                 break;
             case R.layout.suggestion_header:
                 onBindSuggestionHeader(holder);
@@ -289,7 +282,7 @@
         popup.show();
     }
 
-    private void disableSuggestion(Tile suggestion) {
+    public void disableSuggestion(Tile suggestion) {
         if (mSuggestionParser.dismissSuggestion(suggestion)) {
             mContext.getPackageManager().setComponentEnabledSetting(
                     suggestion.intent.getComponent(),
@@ -323,7 +316,7 @@
     }
 
     private void onBindTile(DashboardItemHolder holder, Tile tile) {
-        holder.icon.setImageIcon(tile.icon);
+        holder.icon.setImageDrawable(mCache.getIcon(tile.icon));
         holder.title.setText(tile.title);
         if (!TextUtils.isEmpty(tile.summary)) {
             holder.summary.setText(tile.summary);
@@ -365,6 +358,10 @@
 
     @Override
     public void onClick(View v) {
+        if (v.getId() == R.id.dashboard_tile) {
+            ((SettingsActivity) mContext).openTile((Tile) v.getTag());
+            return;
+        }
         if (v.getTag() == mExpandedCondition) {
             MetricsLogger.action(mContext, MetricsEvent.ACTION_SETTINGS_CONDITION_CLICK,
                     mExpandedCondition.getMetricsConstant());
@@ -409,6 +406,25 @@
         return packageName;
     }
 
+    private static class IconCache {
+
+        private final Context mContext;
+        private final ArrayMap<Icon, Drawable> mMap = new ArrayMap<>();
+
+        public IconCache(Context context) {
+            mContext = context;
+        }
+
+        public Drawable getIcon(Icon icon) {
+            Drawable drawable = mMap.get(icon);
+            if (drawable == null) {
+                drawable = icon.loadDrawable(mContext);
+                mMap.put(icon, drawable);
+            }
+            return drawable;
+        }
+    }
+
     public static class DashboardItemHolder extends RecyclerView.ViewHolder {
         public final ImageView icon;
         public final TextView title;
diff --git a/src/com/android/settings/dashboard/DashboardSummary.java b/src/com/android/settings/dashboard/DashboardSummary.java
index 66b3730..2e93880 100644
--- a/src/com/android/settings/dashboard/DashboardSummary.java
+++ b/src/com/android/settings/dashboard/DashboardSummary.java
@@ -17,6 +17,7 @@
 package com.android.settings.dashboard;
 
 import android.content.Context;
+import android.os.AsyncTask;
 import android.os.Bundle;
 import android.support.v7.widget.LinearLayoutManager;
 import android.util.Log;
@@ -27,7 +28,6 @@
 import android.view.ViewGroup;
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.MetricsProto.MetricsEvent;
-import com.android.settingslib.HelpUtils;
 import com.android.settings.InstrumentedFragment;
 import com.android.settings.R;
 import com.android.settings.Settings;
@@ -36,6 +36,7 @@
 import com.android.settings.dashboard.conditional.ConditionAdapterUtils;
 import com.android.settings.dashboard.conditional.ConditionManager;
 import com.android.settings.dashboard.conditional.FocusRecyclerView;
+import com.android.settingslib.HelpUtils;
 import com.android.settingslib.SuggestionParser;
 import com.android.settingslib.drawer.DashboardCategory;
 import com.android.settingslib.drawer.SettingsDrawerActivity;
@@ -69,6 +70,7 @@
     private ConditionManager mConditionManager;
     private SuggestionParser mSuggestionParser;
     private LinearLayoutManager mLayoutManager;
+    private SuggestionsChecks mSuggestionsChecks;
 
     @Override
     protected int getMetricsCategory() {
@@ -88,6 +90,7 @@
         mConditionManager = ConditionManager.get(context);
         mSuggestionParser = new SuggestionParser(context,
                 context.getSharedPreferences(SUGGESTIONS, 0), R.xml.suggestion_ordering);
+        mSuggestionsChecks = new SuggestionsChecks(getContext());
         if (DEBUG_TIMING) Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime)
                 + " ms");
     }
@@ -118,9 +121,11 @@
                 MetricsLogger.visible(getContext(), c.getMetricsConstant());
             }
         }
-        for (Tile suggestion : mAdapter.getSuggestions()) {
-            MetricsLogger.action(getContext(), MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION,
-                    DashboardAdapter.getSuggestionIdentifier(getContext(), suggestion));
+        if (mAdapter.getSuggestions() != null) {
+            for (Tile suggestion : mAdapter.getSuggestions()) {
+                MetricsLogger.action(getContext(), MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION,
+                        DashboardAdapter.getSuggestionIdentifier(getContext(), suggestion));
+            }
         }
         if (DEBUG_TIMING) Log.d(TAG, "onResume took " + (System.currentTimeMillis() - startTime)
                 + " ms");
@@ -200,17 +205,12 @@
             return;
         }
 
-        long start = System.currentTimeMillis();
-        // TODO: Cache summaries from old categories somehow.
         List<DashboardCategory> categories =
                 ((SettingsActivity) getActivity()).getDashboardCategories();
         mAdapter.setCategories(categories);
 
         // recheck to see if any suggestions have been changed.
-        mAdapter.setSuggestions(mSuggestionParser);
-
-        long delta = System.currentTimeMillis() - start;
-        Log.d(TAG, "rebuildUI took: " + delta + " ms");
+        new SuggestionLoader().execute();
     }
 
     @Override
@@ -223,4 +223,24 @@
         Log.d(TAG, "onConditionsChanged");
         mAdapter.setConditions(mConditionManager.getConditions());
     }
+
+    private class SuggestionLoader extends AsyncTask<Void, Void, List<Tile>> {
+
+        @Override
+        protected List<Tile> doInBackground(Void... params) {
+            List<Tile> suggestions = mSuggestionParser.getSuggestions();
+            for (int i = 0; i < suggestions.size(); i++) {
+                if (mSuggestionsChecks.isSuggestionComplete(suggestions.get(i))) {
+                    mAdapter.disableSuggestion(suggestions.get(i));
+                    suggestions.remove(i--);
+                }
+            }
+            return suggestions;
+        }
+
+        @Override
+        protected void onPostExecute(List<Tile> tiles) {
+            mAdapter.setSuggestions(tiles, mSuggestionParser);
+        }
+    }
 }
diff --git a/src/com/android/settings/dashboard/conditional/ConditionManager.java b/src/com/android/settings/dashboard/conditional/ConditionManager.java
index 0d02ae2..128ac27 100644
--- a/src/com/android/settings/dashboard/conditional/ConditionManager.java
+++ b/src/com/android/settings/dashboard/conditional/ConditionManager.java
@@ -16,6 +16,7 @@
 package com.android.settings.dashboard.conditional;
 
 import android.content.Context;
+import android.os.AsyncTask;
 import android.os.PersistableBundle;
 import android.util.Log;
 import android.util.Xml;
@@ -49,18 +50,14 @@
 
     private final Context mContext;
     private final ArrayList<Condition> mConditions;
-    private final File mXmlFile;
+    private File mXmlFile;
 
     private final ArrayList<ConditionListener> mListeners = new ArrayList<>();
 
     private ConditionManager(Context context) {
         mContext = context;
         mConditions = new ArrayList<Condition>();
-        mXmlFile = new File(context.getFilesDir(), FILE_NAME);
-        if (mXmlFile.exists()) {
-            readFromXml();
-        }
-        addMissingConditions();
+        new ConditionLoader().execute();
     }
 
     public void refreshAll() {
@@ -209,12 +206,33 @@
 
     public void addListener(ConditionListener listener) {
         mListeners.add(listener);
+        listener.onConditionsChanged();
     }
 
     public void remListener(ConditionListener listener) {
         mListeners.remove(listener);
     }
 
+    private class ConditionLoader extends AsyncTask<Void, Void, Void> {
+        @Override
+        protected Void doInBackground(Void... params) {
+            mXmlFile = new File(mContext.getFilesDir(), FILE_NAME);
+            if (mXmlFile.exists()) {
+                readFromXml();
+            }
+            addMissingConditions();
+            return null;
+        }
+
+        @Override
+        protected void onPostExecute(Void aVoid) {
+            final int N = mListeners.size();
+            for (int i = 0; i < N; i++) {
+                mListeners.get(i).onConditionsChanged();
+            }
+        }
+    }
+
     public static ConditionManager get(Context context) {
         if (sInstance == null) {
             sInstance = new ConditionManager(context.getApplicationContext());
