diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 178d225..fb92647 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -3030,6 +3030,8 @@
                        android:value="com.android.settings.category.ia.homepage"/>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                        android:value="com.android.settings.network.NetworkDashboardFragment"/>
+            <meta-data android:name="com.android.settings.summary"
+                       android:value="@string/network_dashboard_summary"/>
         </activity>
 
         <activity-alias android:name="DataUsageDashboardAlias"
@@ -3053,6 +3055,8 @@
                        android:value="com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment"/>
             <meta-data android:name="com.android.settings.category"
                        android:value="com.android.settings.category.ia.homepage"/>
+            <meta-data android:name="com.android.settings.summary"
+                       android:value="@string/connected_devices_dashboard_summary"/>
         </activity>
 
         <activity android:name=".Settings$AppAndNotificationDashboardActivity"
@@ -3065,6 +3069,8 @@
                        android:value="com.android.settings.applications.AppAndNotificationDashboardFragment"/>
             <meta-data android:name="com.android.settings.category"
                        android:value="com.android.settings.category.ia.homepage"/>
+            <meta-data android:name="com.android.settings.summary"
+                       android:value="@string/app_and_notification_dashboard_summary"/>
         </activity>
 
         <activity-alias android:name="BatteryDashboardAlias"
@@ -3089,6 +3095,8 @@
                        android:value="com.android.settings.DisplaySettings" />
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                        android:value="true" />
+            <meta-data android:name="com.android.settings.summary"
+                       android:value="@string/display_dashboard_summary"/>
         </activity-alias>
 
         <activity-alias android:name="SoundDashboardAlias"
@@ -3102,6 +3110,8 @@
                        android:value="com.android.settings.notification.SoundSettings" />
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                        android:value="true" />
+            <meta-data android:name="com.android.settings.summary"
+                       android:value="@string/sound_dashboard_summary"/>
         </activity-alias>
 
         <activity android:name=".Settings$StorageDashboardActivity"
@@ -3167,6 +3177,8 @@
                        android:value="com.android.settings.accessibility.AccessibilitySettings" />
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                        android:value="true" />
+            <meta-data android:name="com.android.settings.summary"
+                       android:resource="@string/accessibility_settings_summary" />
         </activity-alias>
 
         <activity android:name=".Settings$SystemDashboardActivity"
@@ -3179,6 +3191,8 @@
                        android:value="com.android.settings.category.ia.homepage"/>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                        android:value="com.android.settings.system.SystemDashboardFragment"/>
+            <meta-data android:name="com.android.settings.summary"
+                       android:value="@string/system_dashboard_summary"/>
         </activity>
 
         <activity android:name=".Settings$SupportDashboardActivity"
@@ -3192,7 +3206,7 @@
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                        android:value="com.android.settings.dashboard.SupportFragment"/>
             <meta-data android:name="com.android.settings.summary"
-                       android:resource="@string/help_label"/>
+                       android:resource="@string/support_summary"/>
         </activity>
 
         <!-- Alias for IME & Language in new IA. Should merge into TargetActivity when launch -->
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 6cb164a..d4a1786 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -743,7 +743,8 @@
     <!-- Main Settings screen setting option title for the item to take you to the accounts screen [CHAR LIMIT=22] -->
     <string name="account_settings_title">Accounts</string>
     <!-- Main Settings screen setting option title for the item to take you to the security screen -->
-    <string name="security_settings_title">Security &amp; lockscreen</string>
+    <string name="security_settings_title">Security &amp; screen lock</string>
+
     <!-- Main Settings screen setting option summary text for the item tot ake you to the security and location screen -->
     <string name="security_settings_summary">Set My Location, screen unlock, SIM card lock, credential storage lock</string>
     <!-- Main Settings screen setting option summary text for the item to take you to the CDMA security and location screen -->
@@ -754,7 +755,8 @@
     <string name="disabled_by_administrator_summary">Disabled by administrator</string>
     <!-- In the security screen, the header title for security statuses -->
     <string name="security_status_title">Security status</string>
-
+    <!-- Summary for Security settings, explaining a few important settings under it [CHAR LIMIT=NONE]-->
+    <string name="security_dashboard_summary">Location, fingerprint</string>
     <!-- Fingerprint enrollment and settings --><skip />
     <!-- Title shown for menu item that launches fingerprint settings or enrollment [CHAR LIMIT=22] -->
     <string name="security_settings_fingerprint_preference_title">Fingerprint</string>
@@ -3960,6 +3962,8 @@
     <string name="accessibility_settings">Accessibility</string>
     <!-- Settings title for accessibility settings screen -->
     <string name="accessibility_settings_title">Accessibility settings</string>
+    <!-- Summary for Accessibility settings, explaining a few important settings under it [CHAR LIMIT=NONE]-->
+    <string name="accessibility_settings_summary">Screen readers, audio, display, interaction controls</string>
     <!-- Settings title for a brief version of Vision-Related Accessibility Settings. Displayed in Setup Wizard only. [CHAR LIMIT=35] -->
     <string name="vision_settings_title">Vision Settings</string>
     <!-- Settings description for a brief version of Vision-Related Accessibility Settings. Tells the user that they can adjust these settings now to help them through the remainder of the Setup Wizard and that they can later be changed in Settings. Displayed in Setup Wizard only. [CHAR LIMIT=none] -->
@@ -5698,6 +5702,9 @@
     <!-- Help menu label [CHAR LIMIT=20] -->
     <string name="help_label">Help &amp; feedback</string>
 
+    <!-- Summary text for support setting tile [CHAR LIMIT=None] -->
+    <string name="support_summary">Help articles, phone &amp; chat support</string>
+
     <!-- Help URI, Default [DO NOT TRANSLATE] -->
     <string name="help_uri_default" translatable="false"></string>
     <!-- Help URI, Android beam [DO NOT TRANSLATE] -->
@@ -5956,17 +5963,23 @@
 
     <!-- Title for setting tile leading to network and Internet settings [CHAR LIMIT=40]-->
     <string name="network_dashboard_title">Network &amp; internet</string>
+    <!-- Summary for Network and Internet settings, explaining a few important settings under it [CHAR LIMIT=NONE]-->
+    <string name="network_dashboard_summary">Wi-Fi, cellular, data usage, hotspot</string>
     <!-- Title for setting tile leading to Connected devices settings [CHAR LIMIT=40]-->
     <string name="connected_devices_dashboard_title">Connected devices</string>
+    <!-- Summary for Connected devices settings, explaning a few important settings under it [CHAR LIMIT=NONE]-->
+    <string name="connected_devices_dashboard_summary">Bluetooth, NFC, cast</string>
     <!-- Title for setting tile leading to Apps & Notification settings [CHAR LIMIT=40]-->
     <string name="app_and_notification_dashboard_title">Apps &amp; notifications</string>
+    <!-- Summary for Apps & Notification settings, explaining a few important settings under it [CHAR LIMIT=NONE]-->
+    <string name="app_and_notification_dashboard_summary">Permissions, default apps</string>
     <!-- Title for setting tile leading to User and accounts settings [CHAR LIMIT=40]-->
     <string name="account_dashboard_title">User &amp; accounts</string>
     <!-- Title for setting tile leading to setting UI which allows user set default app to
     handle actions such as open web page, making phone calls, default SMS apps [CHAR  LIMIT=40]-->
     <string name="app_default_dashboard_title">Default apps</string>
-    <!-- Summary text for system preference tile, showing current display language of device [CHAR LIMIT=NONE]-->
-    <string name="system_dashboard_summary">Language: <xliff:g id="language">%1$s</xliff:g></string>
+    <!-- Summary text for system preference tile, showing important setting items under system setting [CHAR LIMIT=NONE]-->
+    <string name="system_dashboard_summary">Languages, backup, updates, about phone</string>
 
     <!-- Search strings -->
     <!-- Text to describe the search results fragment title [CHAR LIMIT=16] -->
@@ -6060,6 +6073,9 @@
     [CHAR LIMIT=100] -->
     <string name="sound_settings_summary">Ring volume at <xliff:g id="percentage" example="2%">%1$s</xliff:g></string>
 
+    <!-- Summary for sound settings, explaining a few important settings under it [CHAR LIMIT=NONE]-->
+    <string name="sound_dashboard_summary">Volume, vibration, Do not disturb</string>
+
     <!-- Sound: Dashboard summary indicating the volume of ringtone when at 0% with vibrate enabled. [CHAR LIMIT=100] -->
     <string name="sound_settings_summary_vibrate">Ringer set to vibrate</string>
 
@@ -7403,6 +7419,8 @@
 
     <!-- Summary of display with screen sleep timeout [CHAR LIMIT=NONE] -->
     <string name="display_summary">Sleep after <xliff:g id="timeout_description" example="10 minutes">%1$s</xliff:g> of inactivity</string>
+    <!-- Summary for Display settings, explaining a few important settings under it [CHAR LIMIT=NONE]-->
+    <string name="display_dashboard_summary">Wallpaper, sleep, font size</string>
     <!-- Example summary of display used in Setup Wizard preview screen [CHAR LIMIT=NONE] -->
     <string name="display_summary_example">Sleep after 10 minutes of inactivity</string>
 
diff --git a/src/com/android/settings/DisplaySettings.java b/src/com/android/settings/DisplaySettings.java
index d9cd047..aa17499 100644
--- a/src/com/android/settings/DisplaySettings.java
+++ b/src/com/android/settings/DisplaySettings.java
@@ -16,15 +16,12 @@
 
 package com.android.settings;
 
-import android.app.Activity;
 import android.content.Context;
 import android.provider.SearchIndexableResource;
-import android.provider.Settings;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.display.AutoBrightnessPreferenceController;
 import com.android.settings.display.AutoRotatePreferenceController;
 import com.android.settings.display.CameraGesturePreferenceController;
@@ -42,13 +39,10 @@
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
-import com.android.settingslib.drawer.CategoryKey;
 
 import java.util.ArrayList;
 import java.util.List;
 
-import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
-
 public class DisplaySettings extends DashboardFragment {
     private static final String TAG = "DisplaySettings";
 
@@ -102,46 +96,6 @@
         return R.string.help_uri_display;
     }
 
-    private static class SummaryProvider implements SummaryLoader.SummaryProvider {
-        private final Context mContext;
-        private final SummaryLoader mLoader;
-
-        private SummaryProvider(Context context, SummaryLoader loader) {
-            mContext = context;
-            mLoader = loader;
-        }
-
-        @Override
-        public void setListening(boolean listening) {
-            if (listening) {
-                updateSummary();
-            }
-        }
-
-        private void updateSummary() {
-            final long currentTimeout = Settings.System.getLong(mContext.getContentResolver(),
-                    SCREEN_OFF_TIMEOUT, TimeoutPreferenceController.FALLBACK_SCREEN_TIMEOUT_VALUE);
-            final CharSequence[] entries =
-                    mContext.getResources().getTextArray(R.array.screen_timeout_entries);
-            final CharSequence[] values =
-                    mContext.getResources().getTextArray(R.array.screen_timeout_values);
-            final CharSequence timeoutDescription = TimeoutPreferenceController
-                    .getTimeoutDescription(currentTimeout, entries, values);
-            final String summary = timeoutDescription == null ? ""
-                    : mContext.getString(R.string.display_summary, timeoutDescription);
-            mLoader.setSummary(this, summary);
-        }
-    }
-
-    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
-            = new SummaryLoader.SummaryProviderFactory() {
-        @Override
-        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
-                SummaryLoader summaryLoader) {
-            return new SummaryProvider(activity, summaryLoader);
-        }
-    };
-
     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
                 @Override
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 4dc545b..f274114 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -1300,7 +1300,8 @@
                         dashboardFeatureProvider.getTilesForCategory(CategoryKey.CATEGORY_SECURITY);
                 mSummaryLoader.setSummary(this, getPackageVerifierSummary(dashboardCategory));
             } else {
-                mSummaryLoader.setSummary(this, null);
+                mSummaryLoader.setSummary(this,
+                        mContext.getString(R.string.security_dashboard_summary));
             }
         }
 
diff --git a/src/com/android/settings/accounts/UserAndAccountDashboardFragment.java b/src/com/android/settings/accounts/UserAndAccountDashboardFragment.java
index dbc0292..66fd85a 100644
--- a/src/com/android/settings/accounts/UserAndAccountDashboardFragment.java
+++ b/src/com/android/settings/accounts/UserAndAccountDashboardFragment.java
@@ -15,14 +15,19 @@
  */
 package com.android.settings.accounts;
 
+import android.app.Activity;
 import android.content.Context;
+import android.content.pm.UserInfo;
 import android.os.Bundle;
+import android.os.UserHandle;
+import android.os.UserManager;
 import android.provider.SearchIndexableResource;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settingslib.drawer.Tile;
@@ -81,6 +86,36 @@
         return true;
     }
 
+    private static class SummaryProvider implements SummaryLoader.SummaryProvider {
+
+        private final Context mContext;
+        private final SummaryLoader mSummaryLoader;
+
+        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
+            mContext = context;
+            mSummaryLoader = summaryLoader;
+        }
+
+        @Override
+        public void setListening(boolean listening) {
+            if (listening) {
+                UserInfo info = mContext.getSystemService(UserManager.class).getUserInfo(
+                        UserHandle.myUserId());
+                mSummaryLoader.setSummary(this, mContext.getString(R.string.user_summary,
+                        info.name));
+            }
+        }
+    }
+
+    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
+            = new SummaryLoader.SummaryProviderFactory() {
+        @Override
+        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
+                SummaryLoader summaryLoader) {
+            return new SummaryProvider(activity, summaryLoader);
+        }
+    };
+
     public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
                 @Override
diff --git a/src/com/android/settings/notification/SoundSettings.java b/src/com/android/settings/notification/SoundSettings.java
index 1cf0ae6..c1a2159 100644
--- a/src/com/android/settings/notification/SoundSettings.java
+++ b/src/com/android/settings/notification/SoundSettings.java
@@ -16,14 +16,8 @@
 
 package com.android.settings.notification;
 
-import android.app.Activity;
-import android.app.NotificationManager;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
-import android.content.IntentFilter;
-import android.media.AudioManager;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
@@ -39,11 +33,9 @@
 import com.android.settings.core.PreferenceController;
 import com.android.settings.core.lifecycle.Lifecycle;
 import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.BaseSearchIndexProvider;
 
-import java.text.NumberFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -109,7 +101,7 @@
     @Override
     protected int getPreferenceScreenResId() {
         return mDashboardFeatureProvider.isEnabled()
-            ? R.xml.ia_sound_settings : R.xml.sound_settings;
+                ? R.xml.ia_sound_settings : R.xml.sound_settings;
     }
 
     @Override
@@ -127,7 +119,7 @@
         controllers.add(new AlarmVolumePreferenceController(context, mVolumeCallback, lifecycle));
         controllers.add(new MediaVolumePreferenceController(context, mVolumeCallback, lifecycle));
         controllers.add(
-            new NotificationVolumePreferenceController(context, mVolumeCallback, lifecycle));
+                new NotificationVolumePreferenceController(context, mVolumeCallback, lifecycle));
         controllers.add(new RingVolumePreferenceController(context, mVolumeCallback, lifecycle));
 
         // === Phone & notification ringtone ===
@@ -198,7 +190,9 @@
                 mCurrent.stopSample();
             }
         }
-    };
+    }
+
+    ;
 
     // === Callbacks ===
 
@@ -220,130 +214,63 @@
         }
     }
 
-    // === Summary ===
-
-    private static class SummaryProvider extends BroadcastReceiver
-            implements SummaryLoader.SummaryProvider {
-
-        private final Context mContext;
-        private final AudioManager mAudioManager;
-        private final SummaryLoader mSummaryLoader;
-        private final int maxVolume;
-
-        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
-            mContext = context;
-            mSummaryLoader = summaryLoader;
-            mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
-            maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_RING);
-        }
-
-        @Override
-        public void setListening(boolean listening) {
-            if (listening) {
-                IntentFilter filter = new IntentFilter();
-                filter.addAction(AudioManager.VOLUME_CHANGED_ACTION);
-                filter.addAction(AudioManager.STREAM_DEVICES_CHANGED_ACTION);
-                filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
-                filter.addAction(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION);
-                filter.addAction(AudioManager.STREAM_MUTE_CHANGED_ACTION);
-                filter.addAction(NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED);
-                mContext.registerReceiver(this, filter);
-            } else {
-                mContext.unregisterReceiver(this);
-            }
-        }
-
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            final int ringerMode = mAudioManager.getRingerMode();
-            int resId;
-            String percent = "";
-            if (ringerMode == mAudioManager.RINGER_MODE_SILENT) {
-                resId = R.string.sound_settings_summary_silent;
-            } else if (ringerMode == mAudioManager.RINGER_MODE_VIBRATE){
-                resId = R.string.sound_settings_summary_vibrate;
-            }
-            else {
-                percent =  NumberFormat.getPercentInstance().format(
-                        (double) mAudioManager.getStreamVolume(
-                                AudioManager.STREAM_RING) / maxVolume);
-                resId = R.string.sound_settings_summary;
-            }
-
-            final ComponentName suppressor = NotificationManager.from(mContext)
-                    .getEffectsSuppressor();
-            if (suppressor != null) {
-                String suppressText = SuppressorHelper.getSuppressionText(mContext, suppressor);
-                mSummaryLoader.setSummary(this, suppressText);
-            } else {
-                mSummaryLoader.setSummary(this, mContext.getString(resId, percent));
-            }
-        }
-    }
-
-    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
-            = new SummaryLoader.SummaryProviderFactory() {
-        @Override
-        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
-                SummaryLoader summaryLoader) {
-            return new SummaryProvider(activity, summaryLoader);
-        }
-    };
-
     // === Indexing ===
 
     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
 
-        public List<SearchIndexableResource> getXmlResourcesToIndex(
-                Context context, boolean enabled) {
-            final SearchIndexableResource sir = new SearchIndexableResource(context);
-            sir.xmlResId = R.xml.sound_settings;
-            return Arrays.asList(sir);
-        }
+                public List<SearchIndexableResource> getXmlResourcesToIndex(
+                        Context context, boolean enabled) {
+                    final SearchIndexableResource sir = new SearchIndexableResource(context);
+                    sir.xmlResId = R.xml.sound_settings;
+                    return Arrays.asList(sir);
+                }
 
-        public List<String> getNonIndexableKeys(Context context) {
-            final ArrayList<String> rt = new ArrayList<String>();
-            new NotificationVolumePreferenceController(
-                context, null /* Callback */, null /* Lifecycle */).updateNonIndexableKeys(rt);
-            new RingVolumePreferenceController(
-                context, null /* Callback */, null /* Lifecycle */).updateNonIndexableKeys(rt);
-            new PhoneRingtonePreferenceController(context).updateNonIndexableKeys(rt);
-            new VibrateWhenRingPreferenceController(context).updateNonIndexableKeys(rt);
-            new EmergencyBroadcastPreferenceController(context).updateNonIndexableKeys(rt);
-            if (FeatureFactory.getFactory(context).getDashboardFeatureProvider(context)
-                .isEnabled()) {
-                new DialPadTonePreferenceController(context,
-                    null /* SettingsPreferenceFragment */,
-                    null /* Lifecycle */).updateNonIndexableKeys(rt);
-                new ScreenLockSoundPreferenceController(context,
-                    null /* SettingsPreferenceFragment */,
-                    null /* Lifecycle */).updateNonIndexableKeys(rt);
-                new ChargingSoundPreferenceController(context,
-                    null /* SettingsPreferenceFragment */,
-                    null /* Lifecycle */).updateNonIndexableKeys(rt);
-                new DockingSoundPreferenceController(context,
-                    null /* SettingsPreferenceFragment */,
-                    null /* Lifecycle */).updateNonIndexableKeys(rt);
-                new TouchSoundPreferenceController(context, null /* SettingsPreferenceFragment */,
-                    null /* Lifecycle */).updateNonIndexableKeys(rt);
-                new VibrateOnTouchPreferenceController(context,
-                    null /* SettingsPreferenceFragment */,
-                    null /* Lifecycle */).updateNonIndexableKeys(rt);
-                new DockAudioMediaPreferenceController(context,
-                    null /* SettingsPreferenceFragment */,
-                    null /* Lifecycle */).updateNonIndexableKeys(rt);
-                new BootSoundPreferenceController(context).updateNonIndexableKeys(rt);
-                new EmergencyTonePreferenceController(context,
-                    null /* SettingsPreferenceFragment */,
-                    null /* Lifecycle */).updateNonIndexableKeys(rt);
-            } else {
-                new CastPreferenceController(context).updateNonIndexableKeys(rt);
-            }
+                public List<String> getNonIndexableKeys(Context context) {
+                    final ArrayList<String> rt = new ArrayList<String>();
+                    new NotificationVolumePreferenceController(
+                            context, null /* Callback */,
+                            null /* Lifecycle */).updateNonIndexableKeys(rt);
+                    new RingVolumePreferenceController(
+                            context, null /* Callback */,
+                            null /* Lifecycle */).updateNonIndexableKeys(rt);
+                    new PhoneRingtonePreferenceController(context).updateNonIndexableKeys(rt);
+                    new VibrateWhenRingPreferenceController(context).updateNonIndexableKeys(rt);
+                    new EmergencyBroadcastPreferenceController(context).updateNonIndexableKeys(rt);
+                    if (FeatureFactory.getFactory(context).getDashboardFeatureProvider(context)
+                            .isEnabled()) {
+                        new DialPadTonePreferenceController(context,
+                                null /* SettingsPreferenceFragment */,
+                                null /* Lifecycle */).updateNonIndexableKeys(rt);
+                        new ScreenLockSoundPreferenceController(context,
+                                null /* SettingsPreferenceFragment */,
+                                null /* Lifecycle */).updateNonIndexableKeys(rt);
+                        new ChargingSoundPreferenceController(context,
+                                null /* SettingsPreferenceFragment */,
+                                null /* Lifecycle */).updateNonIndexableKeys(rt);
+                        new DockingSoundPreferenceController(context,
+                                null /* SettingsPreferenceFragment */,
+                                null /* Lifecycle */).updateNonIndexableKeys(rt);
+                        new TouchSoundPreferenceController(context, null /*
+                        SettingsPreferenceFragment */,
+                                null /* Lifecycle */).updateNonIndexableKeys(rt);
+                        new VibrateOnTouchPreferenceController(context,
+                                null /* SettingsPreferenceFragment */,
+                                null /* Lifecycle */).updateNonIndexableKeys(rt);
+                        new DockAudioMediaPreferenceController(context,
+                                null /* SettingsPreferenceFragment */,
+                                null /* Lifecycle */).updateNonIndexableKeys(rt);
+                        new BootSoundPreferenceController(context).updateNonIndexableKeys(rt);
+                        new EmergencyTonePreferenceController(context,
+                                null /* SettingsPreferenceFragment */,
+                                null /* Lifecycle */).updateNonIndexableKeys(rt);
+                    } else {
+                        new CastPreferenceController(context).updateNonIndexableKeys(rt);
+                    }
 
-            return rt;
-        }
-    };
+                    return rt;
+                }
+            };
 
     // === Work Sound Settings ===
 
diff --git a/src/com/android/settings/system/SystemDashboardFragment.java b/src/com/android/settings/system/SystemDashboardFragment.java
index c46bc6f..2898ce2 100644
--- a/src/com/android/settings/system/SystemDashboardFragment.java
+++ b/src/com/android/settings/system/SystemDashboardFragment.java
@@ -23,10 +23,8 @@
 import com.android.settings.R;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.deviceinfo.AdditionalSystemUpdatePreferenceController;
 import com.android.settings.deviceinfo.SystemUpdatePreferenceController;
-import com.android.settings.localepicker.LocaleFeatureProvider;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
@@ -64,34 +62,6 @@
     }
 
     /**
-     * For Summary
-     */
-    private static class SummaryProvider implements SummaryLoader.SummaryProvider {
-
-        private final Context mContext;
-        private final SummaryLoader mSummaryLoader;
-        private final LocaleFeatureProvider mLocaleFeatureProvider;
-
-        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
-            mContext = context;
-            mSummaryLoader = summaryLoader;
-            mLocaleFeatureProvider = FeatureFactory.getFactory(context).getLocaleFeatureProvider();
-        }
-
-        @Override
-        public void setListening(boolean listening) {
-            if (listening) {
-                final String language = mContext.getString(
-                        R.string.system_dashboard_summary, mLocaleFeatureProvider.getLocaleNames());
-                mSummaryLoader.setSummary(this, language);
-            }
-        }
-    }
-
-    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY =
-            (context, summaryLoader) -> new SummaryProvider(context, summaryLoader);
-
-    /**
      * For Search.
      */
     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index a794953..c49aa1d 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -39,7 +39,6 @@
 import android.os.RemoteException;
 import android.os.UserHandle;
 import android.os.UserManager;
-import android.provider.Settings;
 import android.provider.Settings.Global;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.Preference.OnPreferenceClickListener;
@@ -66,7 +65,6 @@
 import com.android.settings.Utils;
 import com.android.settings.accounts.AddUserWhenLockedPreferenceController;
 import com.android.settings.accounts.EmergencyInfoPreferenceController;
-import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
@@ -1060,36 +1058,6 @@
         mMePreference.setTitle(label);
     }
 
-    private static class SummaryProvider implements SummaryLoader.SummaryProvider {
-
-        private final Context mContext;
-        private final SummaryLoader mSummaryLoader;
-
-        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
-            mContext = context;
-            mSummaryLoader = summaryLoader;
-        }
-
-        @Override
-        public void setListening(boolean listening) {
-            if (listening) {
-                UserInfo info = mContext.getSystemService(UserManager.class).getUserInfo(
-                        UserHandle.myUserId());
-                mSummaryLoader.setSummary(this, mContext.getString(R.string.user_summary,
-                        info.name));
-            }
-        }
-    }
-
-    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
-            = new SummaryLoader.SummaryProviderFactory() {
-        @Override
-        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
-                                                                   SummaryLoader summaryLoader) {
-            return new SummaryProvider(activity, summaryLoader);
-        }
-    };
-
     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
                 @Override
diff --git a/tests/robotests/src/com/android/settings/DisplaySettingsTest.java b/tests/robotests/src/com/android/settings/DisplaySettingsTest.java
deleted file mode 100644
index ac499eb..0000000
--- a/tests/robotests/src/com/android/settings/DisplaySettingsTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.settings;
-
-import android.app.Activity;
-import android.provider.Settings.System;
-import com.android.settings.dashboard.SummaryLoader;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.Robolectric;
-import org.robolectric.annotation.Config;
-
-import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
-import static junit.framework.Assert.assertEquals;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class DisplaySettingsTest {
-
-  private Activity mActivity;
-  @Mock private SummaryLoader mSummaryLoader;
-  private SummaryLoader.SummaryProvider mSummaryProvider;
-
-  @Before
-  public void setUp() {
-    MockitoAnnotations.initMocks(this);
-    mActivity = Robolectric.buildActivity(Activity.class).get();
-    mSummaryProvider = DisplaySettings.SUMMARY_PROVIDER_FACTORY.createSummaryProvider(
-            mActivity, mSummaryLoader);
-  }
-
-  @Test
-  public void testInvalidTimeouts_summaryShouldBeEmpty() {
-    System.putLong(mActivity.getContentResolver(), SCREEN_OFF_TIMEOUT, -1);
-    assertEquals(System.getLong(mActivity.getContentResolver(), SCREEN_OFF_TIMEOUT, 0), -1);
-    mSummaryProvider.setListening(true);
-
-    System.putLong(mActivity.getContentResolver(), SCREEN_OFF_TIMEOUT, 1234);
-    mSummaryProvider.setListening(true);
-
-    verify(mSummaryLoader, times(2)).setSummary(mSummaryProvider, "");
-  }
-
-  @Test
-  public void testValidTimeouts_summaryShouldNotBeEmpty() {
-    final CharSequence[] values =
-            mActivity.getResources().getTextArray(R.array.screen_timeout_values);
-
-    for (CharSequence value : values) {
-      long timeout = Long.parseLong(value.toString());
-      System.putLong(mActivity.getContentResolver(), SCREEN_OFF_TIMEOUT, timeout);
-      assertEquals(System.getLong(mActivity.getContentResolver(), SCREEN_OFF_TIMEOUT, 0), timeout);
-      mSummaryProvider.setListening(true);
-    }
-
-    verify(mSummaryLoader, never()).setSummary(mSummaryProvider, "");
-  }
-}
diff --git a/tests/robotests/src/com/android/settings/accounts/UserAndAccountDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/accounts/UserAndAccountDashboardFragmentTest.java
index 90761a0..e1c2abf 100644
--- a/tests/robotests/src/com/android/settings/accounts/UserAndAccountDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/UserAndAccountDashboardFragmentTest.java
@@ -15,11 +15,16 @@
  */
 package com.android.settings.accounts;
 
+import android.app.Activity;
 import android.content.Context;
+import android.content.pm.UserInfo;
 import android.os.Bundle;
+import android.os.UserManager;
 import android.provider.SearchIndexableResource;
 
+import com.android.settings.R;
 import com.android.settings.TestConfig;
+import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settingslib.drawer.CategoryKey;
 import com.android.settingslib.drawer.Tile;
@@ -37,6 +42,9 @@
 import java.util.List;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 @RunWith(RobolectricTestRunner.class)
@@ -48,6 +56,8 @@
 
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private Context mContext;
+    @Mock
+    private UserManager mUserManager;
     private UserAndAccountDashboardFragment mFragment;
 
     @Before
@@ -87,6 +97,24 @@
     }
 
     @Test
+    public void updateSummary_shouldDisplaySignedInUser() {
+        final Activity activity = mock(Activity.class);
+        final SummaryLoader loader = mock(SummaryLoader.class);
+        final UserInfo userInfo = new UserInfo();
+        userInfo.name = "test_name";
+
+        when(activity.getSystemService(UserManager.class)).thenReturn(mUserManager);
+        when(mUserManager.getUserInfo(anyInt())).thenReturn(userInfo);
+
+        final SummaryLoader.SummaryProvider provider = mFragment.SUMMARY_PROVIDER_FACTORY
+                .createSummaryProvider(activity, loader);
+        provider.setListening(true);
+
+        verify(activity).getString(R.string.user_summary,
+                userInfo.name);
+    }
+
+    @Test
     public void testSearchIndexProvider_shouldIndexResource() {
         final List<SearchIndexableResource> indexRes =
                 UserAndAccountDashboardFragment.SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(
diff --git a/tests/robotests/src/com/android/settings/system/SystemDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/system/SystemDashboardFragmentTest.java
deleted file mode 100644
index 65a8805..0000000
--- a/tests/robotests/src/com/android/settings/system/SystemDashboardFragmentTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.settings.system;
-
-
-import android.app.Activity;
-import com.android.settings.SettingsRobolectricTestRunner;
-import com.android.settings.TestConfig;
-import com.android.settings.dashboard.SummaryLoader;
-import com.android.settings.testutils.FakeFeatureFactory;
-import com.google.common.truth.Truth;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.annotation.Config;
-
-import static com.android.settings.system.SystemDashboardFragment.SUMMARY_PROVIDER_FACTORY;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class SystemDashboardFragmentTest {
-
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private Activity mActivity;
-    @Mock
-    private SummaryLoader mSummaryLoader;
-
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        FakeFeatureFactory.setupForTest(mActivity);
-    }
-
-    @Test
-    public void hasSummaryProvider() {
-        Truth.assertThat(SUMMARY_PROVIDER_FACTORY).isNotNull();
-    }
-
-    @Test
-    public void updateSummary_isListening_shouldNotifySummaryLoader() {
-        final SummaryLoader.SummaryProvider summaryProvider =
-                SUMMARY_PROVIDER_FACTORY.createSummaryProvider(mActivity, mSummaryLoader);
-        summaryProvider.setListening(true);
-
-        verify(mSummaryLoader).setSummary(eq(summaryProvider), anyString());
-    }
-
-    @Test
-    public void updateSummary_notListening_shouldNotNotifySummaryLoader() {
-        final SummaryLoader.SummaryProvider summaryProvider =
-                SUMMARY_PROVIDER_FACTORY.createSummaryProvider(mActivity, mSummaryLoader);
-        summaryProvider.setListening(false);
-
-        verify(mSummaryLoader, never()).setSummary(eq(summaryProvider), anyString());
-    }
-}
