diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 4d9e2f0..ba975a2 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -50,7 +50,6 @@
 import android.view.ViewGroup;
 import android.widget.Button;
 import android.widget.SearchView;
-import com.android.internal.logging.MetricsLogger;
 import com.android.internal.util.ArrayUtils;
 import com.android.settings.Settings.WifiSettingsActivity;
 import com.android.settings.accessibility.AccessibilitySettings;
@@ -111,7 +110,7 @@
 import com.android.settings.wifi.WifiSettings;
 import com.android.settings.wifi.p2p.WifiP2pSettings;
 import com.android.settingslib.drawer.DashboardCategory;
-import com.android.settingslib.drawer.DashboardTile;
+import com.android.settingslib.drawer.Tile;
 import com.android.settingslib.drawer.SettingsDrawerActivity;
 
 import java.util.ArrayList;
@@ -199,6 +198,8 @@
 
     private static final String EMPTY_QUERY = "";
 
+    private static final int REQUEST_SUGGESTION = 42;
+
     private String mFragmentClass;
 
     private CharSequence mInitialTitle;
@@ -365,6 +366,7 @@
     private int mHomeActivitiesCount = 1;
 
     private Intent mResultIntentData;
+    private ComponentName mCurrentSuggestion;
 
     public SwitchBar getSwitchBar() {
         return mSwitchBar;
@@ -1031,7 +1033,7 @@
             // When on restricted users, disable all extra categories (but only the settings ones).
             List<DashboardCategory> categories = getDashboardCategories();
             for (DashboardCategory category : categories) {
-                for (DashboardTile tile : category.tiles) {
+                for (Tile tile : category.tiles) {
                     ComponentName component = tile.intent.getComponent();
                     if (packageName.equals(component)&& !ArrayUtils.contains(
                             SETTINGS_FOR_RESTRICTED, component.getClassName())) {
@@ -1146,7 +1148,7 @@
     }
 
     @Override
-    protected void onTileClicked(DashboardTile tile) {
+    protected void onTileClicked(Tile tile) {
         if (mIsShowingDashboard) {
             // If on dashboard, don't finish so the back comes back to here.
             openTile(tile);
@@ -1200,4 +1202,20 @@
     public void setResultIntentData(Intent resultIntentData) {
         mResultIntentData = resultIntentData;
     }
+
+    public void startSuggestion(Intent intent) {
+        mCurrentSuggestion = intent.getComponent();
+        startActivityForResult(intent, REQUEST_SUGGESTION);
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (requestCode == REQUEST_SUGGESTION && mCurrentSuggestion != null
+                && resultCode != RESULT_CANCELED) {
+            getPackageManager().setComponentEnabledSetting(mCurrentSuggestion,
+                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
+        }
+        super.onActivityResult(requestCode, resultCode, data);
+    }
+
 }
diff --git a/src/com/android/settings/dashboard/DashboardAdapter.java b/src/com/android/settings/dashboard/DashboardAdapter.java
index a53d8b6..b564a27 100644
--- a/src/com/android/settings/dashboard/DashboardAdapter.java
+++ b/src/com/android/settings/dashboard/DashboardAdapter.java
@@ -16,10 +16,14 @@
 package com.android.settings.dashboard;
 
 import android.content.Context;
+import android.content.pm.PackageManager;
+import android.support.v7.widget.PopupMenu;
 import android.support.v7.widget.RecyclerView;
 import android.text.TextUtils;
 import android.util.TypedValue;
+import android.view.ContextThemeWrapper;
 import android.view.LayoutInflater;
+import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ImageView;
@@ -30,14 +34,21 @@
 import com.android.settings.dashboard.conditional.Condition;
 import com.android.settings.dashboard.conditional.ConditionAdapterUtils;
 import com.android.settingslib.drawer.DashboardCategory;
-import com.android.settingslib.drawer.DashboardTile;
+import com.android.settingslib.drawer.Tile;
 
 import java.util.ArrayList;
 import java.util.List;
 
-public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.DashboardItemHolder> implements View.OnClickListener {
+public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.DashboardItemHolder>
+        implements View.OnClickListener {
     public static final String TAG = "DashboardAdapter";
 
+    private static int SUGGESTION_MODE_DEFAULT = 0;
+    private static int SUGGESTION_MODE_COLLAPSED = 1;
+    private static int SUGGESTION_MODE_EXPANDED = 2;
+
+    private static final int DEFAULT_SUGGESTION_COUNT = 2;
+
     private final List<Object> mItems = new ArrayList<>();
     private final List<Integer> mTypes = new ArrayList<>();
     private final List<Integer> mIds = new ArrayList<>();
@@ -46,11 +57,14 @@
 
     private List<DashboardCategory> mCategories;
     private List<Condition> mConditions;
+    private List<Tile> mSuggestions;
 
     private boolean mIsShowingAll;
     // Used for counting items;
     private int mId;
 
+    private int mSuggestionMode = SUGGESTION_MODE_DEFAULT;
+
     private Condition mExpandedCondition = null;
 
     public DashboardAdapter(Context context) {
@@ -59,6 +73,11 @@
         setHasStableIds(true);
     }
 
+    public void setSuggestions(List<Tile> suggestions) {
+        mSuggestions = suggestions;
+        recountItems();
+    }
+
     public void setCategories(List<DashboardCategory> categories) {
         mCategories = categories;
 
@@ -68,7 +87,7 @@
                 tintColor, true);
         for (int i = 0; i < categories.size(); i++) {
             for (int j = 0; j < categories.get(i).tiles.size(); j++) {
-                DashboardTile tile = categories.get(i).tiles.get(j);
+                Tile tile = categories.get(i).tiles.get(j);
 
                 if (!mContext.getPackageName().equals(
                         tile.intent.getComponent().getPackageName())) {
@@ -78,34 +97,53 @@
                 }
             }
         }
-        setShowingAll(mIsShowingAll);
+        recountItems();
     }
 
     public void setConditions(List<Condition> conditions) {
         mConditions = conditions;
-        setShowingAll(mIsShowingAll);
+        recountItems();
     }
 
     public boolean isShowingAll() {
         return mIsShowingAll;
     }
 
-    public void notifyChanged(DashboardTile tile) {
+    public void notifyChanged(Tile tile) {
         notifyDataSetChanged();
     }
 
     public void setShowingAll(boolean showingAll) {
         mIsShowingAll = showingAll;
+        recountItems();
+    }
+
+    private void recountItems() {
         reset();
+        boolean hasConditions = false;
         for (int i = 0; mConditions != null && i < mConditions.size(); i++) {
-            countItem(mConditions.get(i), R.layout.condition_card, mConditions.get(i).shouldShow());
+            boolean shouldShow = mConditions.get(i).shouldShow();
+            hasConditions |= shouldShow;
+            countItem(mConditions.get(i), R.layout.condition_card, shouldShow);
+        }
+        boolean hasSuggestions = mSuggestions != null && mSuggestions.size() != 0;
+        countItem(null, R.layout.dashboard_spacer, hasConditions && hasSuggestions);
+        countItem(null, R.layout.suggestion_header, hasSuggestions);
+        if (mSuggestions != null) {
+            int maxSuggestions = mSuggestionMode == SUGGESTION_MODE_DEFAULT
+                    ? Math.min(DEFAULT_SUGGESTION_COUNT, mSuggestions.size())
+                    : mSuggestionMode == SUGGESTION_MODE_EXPANDED ? mSuggestions.size()
+                    : 0;
+            for (int i = 0; i < mSuggestions.size(); i++) {
+                countItem(mSuggestions.get(i), R.layout.suggestion_tile, i < maxSuggestions);
+            }
         }
         countItem(null, R.layout.dashboard_spacer, true);
         for (int i = 0; mCategories != null && i < mCategories.size(); i++) {
             DashboardCategory category = mCategories.get(i);
             countItem(category, R.layout.dashboard_category, mIsShowingAll);
             for (int j = 0; j < category.tiles.size(); j++) {
-                DashboardTile tile = category.tiles.get(j);
+                Tile tile = category.tiles.get(j);
                 countItem(tile, R.layout.dashboard_tile, mIsShowingAll
                         || ArrayUtils.contains(DashboardSummary.INITIAL_ITEMS,
                         tile.intent.getComponent().getClassName()));
@@ -126,6 +164,7 @@
         if (add) {
             mItems.add(object);
             mTypes.add(type);
+            // TODO: Counting namespaces for handling of suggestions/conds appearing/disappearing.
             mIds.add(mId);
         }
         mId++;
@@ -144,7 +183,7 @@
                 onBindCategory(holder, (DashboardCategory) mItems.get(position));
                 break;
             case R.layout.dashboard_tile:
-                final DashboardTile tile = (DashboardTile) mItems.get(position);
+                final Tile tile = (Tile) mItems.get(position);
                 onBindTile(holder, tile);
                 holder.itemView.setOnClickListener(new View.OnClickListener() {
                     @Override
@@ -153,14 +192,28 @@
                     }
                 });
                 break;
-            case R.layout.see_all:
-                onBindSeeAll(holder);
+            case R.layout.suggestion_header:
+                onBindSuggestionHeader(holder);
+                break;
+            case R.layout.suggestion_tile:
+                final Tile suggestion = (Tile) mItems.get(position);
+                onBindTile(holder, suggestion);
                 holder.itemView.setOnClickListener(new View.OnClickListener() {
                     @Override
                     public void onClick(View v) {
-                        setShowingAll(!mIsShowingAll);
+                        ((SettingsActivity) mContext).startSuggestion(suggestion.intent);
                     }
                 });
+                holder.itemView.findViewById(R.id.overflow).setOnClickListener(
+                        new View.OnClickListener() {
+                            @Override
+                            public void onClick(View v) {
+                                showRemoveOption(v, suggestion);
+                            }
+                        });
+                break;
+            case R.layout.see_all:
+                onBindSeeAll(holder);
                 break;
             case R.layout.condition_card:
                 ConditionAdapterUtils.bindViews((Condition) mItems.get(position), holder,
@@ -175,11 +228,53 @@
         }
     }
 
-    private void onBindTile(DashboardItemHolder holder, DashboardTile dashboardTile) {
-        holder.icon.setImageIcon(dashboardTile.icon);
-        holder.title.setText(dashboardTile.title);
-        if (!TextUtils.isEmpty(dashboardTile.summary)) {
-            holder.summary.setText(dashboardTile.summary);
+    private void showRemoveOption(View v, final Tile suggestion) {
+        PopupMenu popup = new PopupMenu(
+                new ContextThemeWrapper(mContext, R.style.Theme_AppCompat_DayNight), v);
+        popup.getMenu().add(R.string.suggestion_remove).setOnMenuItemClickListener(
+                new MenuItem.OnMenuItemClickListener() {
+            @Override
+            public boolean onMenuItemClick(MenuItem item) {
+                mContext.getPackageManager().setComponentEnabledSetting(
+                        suggestion.intent.getComponent(),
+                        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+                        PackageManager.DONT_KILL_APP);
+                mSuggestions.remove(suggestion);
+                recountItems();
+                return true;
+            }
+        });
+        popup.show();
+    }
+
+    private void onBindSuggestionHeader(final DashboardItemHolder holder) {
+        holder.icon.setImageResource(hasMoreSuggestions() ? R.drawable.ic_expand_more
+                : R.drawable.ic_expand_less);
+        holder.title.setText(mContext.getString(R.string.suggestions_title, mSuggestions.size()));
+        holder.itemView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (hasMoreSuggestions()) {
+                    mSuggestionMode = SUGGESTION_MODE_EXPANDED;
+                } else {
+                    mSuggestionMode = SUGGESTION_MODE_COLLAPSED;
+                }
+                recountItems();
+            }
+        });
+    }
+
+    private boolean hasMoreSuggestions() {
+        return mSuggestionMode == SUGGESTION_MODE_COLLAPSED
+                || (mSuggestionMode == SUGGESTION_MODE_DEFAULT
+                && mSuggestions.size() > DEFAULT_SUGGESTION_COUNT);
+    }
+
+    private void onBindTile(DashboardItemHolder holder, Tile tile) {
+        holder.icon.setImageIcon(tile.icon);
+        holder.title.setText(tile.title);
+        if (!TextUtils.isEmpty(tile.summary)) {
+            holder.summary.setText(tile.summary);
             holder.summary.setVisibility(View.VISIBLE);
         } else {
             holder.summary.setVisibility(View.GONE);
@@ -193,6 +288,12 @@
     private void onBindSeeAll(DashboardItemHolder holder) {
         holder.title.setText(mIsShowingAll ? R.string.see_less
                 : R.string.see_all);
+        holder.itemView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                setShowingAll(!mIsShowingAll);
+            }
+        });
     }
 
     @Override
diff --git a/src/com/android/settings/dashboard/DashboardSummary.java b/src/com/android/settings/dashboard/DashboardSummary.java
index 95170a4..cbb1549 100644
--- a/src/com/android/settings/dashboard/DashboardSummary.java
+++ b/src/com/android/settings/dashboard/DashboardSummary.java
@@ -33,6 +33,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.SuggestionParser;
 import com.android.settingslib.drawer.DashboardCategory;
 import com.android.settingslib.drawer.SettingsDrawerActivity;
 
@@ -58,6 +59,7 @@
     private DashboardAdapter mAdapter;
     private SummaryLoader mSummaryLoader;
     private ConditionManager mConditionManager;
+    private SuggestionParser mSuggestionParser;
 
     @Override
     protected int getMetricsCategory() {
@@ -76,6 +78,7 @@
         if (DEBUG_TIMING) Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime)
                 + " ms");
         mConditionManager = ConditionManager.get(getContext());
+        mSuggestionParser = new SuggestionParser(getContext(), R.xml.suggestion_ordering);
     }
 
     @Override
@@ -135,6 +138,7 @@
         mDashboard.setListener(this);
         mAdapter = new DashboardAdapter(getContext());
         mAdapter.setConditions(mConditionManager.getConditions());
+        mAdapter.setSuggestions(mSuggestionParser.getSuggestions());
         mSummaryLoader.setAdapter(mAdapter);
         ConditionAdapterUtils.addDismiss(mDashboard);
 
diff --git a/src/com/android/settings/dashboard/SummaryLoader.java b/src/com/android/settings/dashboard/SummaryLoader.java
index a9dd43a..a94ae83 100644
--- a/src/com/android/settings/dashboard/SummaryLoader.java
+++ b/src/com/android/settings/dashboard/SummaryLoader.java
@@ -25,7 +25,7 @@
 import android.util.Log;
 import com.android.settings.SettingsActivity;
 import com.android.settingslib.drawer.DashboardCategory;
-import com.android.settingslib.drawer.DashboardTile;
+import com.android.settingslib.drawer.Tile;
 
 import java.lang.reflect.Field;
 import java.util.ArrayList;
@@ -38,8 +38,8 @@
     public static final String SUMMARY_PROVIDER_FACTORY = "SUMMARY_PROVIDER_FACTORY";
 
     private final Activity mActivity;
-    private final ArrayMap<SummaryProvider, DashboardTile> mSummaryMap = new ArrayMap<>();
-    private final List<DashboardTile> mTiles = new ArrayList<>();
+    private final ArrayMap<SummaryProvider, Tile> mSummaryMap = new ArrayMap<>();
+    private final List<Tile> mTiles = new ArrayList<>();
 
     private final Worker mWorker;
     private final Handler mHandler;
@@ -54,9 +54,9 @@
         mWorker = new Worker(mWorkerThread.getLooper());
         mActivity = activity;
         for (int i = 0; i < categories.size(); i++) {
-            List<DashboardTile> tiles = categories.get(i).tiles;
+            List<Tile> tiles = categories.get(i).tiles;
             for (int j = 0; j < tiles.size(); j++) {
-                DashboardTile tile = tiles.get(j);
+                Tile tile = tiles.get(j);
                 mWorker.obtainMessage(Worker.MSG_GET_PROVIDER, tile).sendToTarget();
             }
         }
@@ -71,7 +71,7 @@
     }
 
     public void setSummary(SummaryProvider provider, final CharSequence summary) {
-        final DashboardTile tile = mSummaryMap.get(provider);
+        final Tile tile = mSummaryMap.get(provider);
         mHandler.post(new Runnable() {
             @Override
             public void run() {
@@ -85,7 +85,7 @@
         mWorker.obtainMessage(Worker.MSG_SET_LISTENING, listening ? 1 : 0, 0).sendToTarget();
     }
 
-    private SummaryProvider getSummaryProvider(DashboardTile tile) {
+    private SummaryProvider getSummaryProvider(Tile tile) {
         if (!mActivity.getPackageName().equals(tile.intent.getComponent().getPackageName())) {
             // Not within Settings, can't load Summary directly.
             // TODO: Load summary indirectly.
@@ -118,7 +118,7 @@
         return null;
     }
 
-    private Bundle getMetaData(DashboardTile tile) {
+    private Bundle getMetaData(Tile tile) {
         return tile.metaData;
     }
 
@@ -142,7 +142,7 @@
         public void handleMessage(Message msg) {
             switch (msg.what) {
                 case MSG_GET_PROVIDER:
-                    DashboardTile tile = (DashboardTile) msg.obj;
+                    Tile tile = (Tile) msg.obj;
                     SummaryProvider provider = getSummaryProvider(tile);
                     if (provider != null) {
                         if (DEBUG) Log.d(TAG, "Creating " + tile);
