diff --git a/res/values/strings.xml b/res/values/strings.xml
index b9207cd..6a1ab9c 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5870,7 +5870,7 @@
     <string name="emergency_tone_vibrate">Vibrate</string>
 
     <!-- Sound: Title for the Do not Disturb option and associated settings page. [CHAR LIMIT=30] -->
-    <string name="zen_mode_settings_title" translatable="false">@*android:string/zen_mode_feature_name</string>
+    <string name="zen_mode_settings_title" translatable="false">Do not disturb</string>
 
     <!-- Do not disturb: Title for the Priority interruptions option and associated settings page. [CHAR LIMIT=30] -->
     <string name="zen_mode_priority_settings_title">Priority only allows</string>
@@ -6278,6 +6278,8 @@
 
     <!-- [CHAR LIMIT=130] Zen mode settings:  visual interruptions: screen is off: summary -->
     <string name="zen_mode_screen_off_summary">Prevent notifications silenced by Do Not Disturb from turning on the screen or pulsing the notification light</string>
+    <!-- [CHAR LIMIT=130] Zen mode settings:  visual interruptions: screen is off: summary -->
+    <string name="zen_mode_screen_off_summary_no_led">Prevent notifications silenced by Do Not Disturb from turning on the screen</string>
 
     <!-- [CHAR LIMIT=130] Zen mode settings:  visual interruptions summary -->
     <string name="zen_mode_all_visual_interruptions">Off</string>
@@ -6454,13 +6456,16 @@
    <string name="notifications_enabled">Normal</string>
    <!-- App notification summary with notifications disabled [CHAR LIMIT=40] -->
    <string name="notifications_disabled">Blocked</string>
-    <!-- App notification summary with notifications disabled [CHAR LIMIT=40] -->
+    <!-- App notification summary with notifications silenced [CHAR LIMIT=40] -->
     <string name="notifications_silenced">Silenced</string>
-   <!-- App notification summary with 2 items [CHAR LIMIT=15] -->
-   <string name="notifications_two_items"><xliff:g id="notif_state" example="Priority">%1$s</xliff:g> / <xliff:g id="notif_state" example="Priority">%2$s</xliff:g></string>
-   <!-- App notification summary with 3 items [CHAR LIMIT=15] -->
-   <string name="notifications_three_items"><xliff:g id="notif_state" example="Priority">%1$s</xliff:g> / <xliff:g id="notif_state" example="Priority">%2$s</xliff:g> / <xliff:g id="notif_state" example="Priority">%3$s</xliff:g></string>
-
+    <!-- App notification summary with notifications redacted [CHAR LIMIT=70] -->
+    <string name="notifications_redacted">Sensitive content not on lock screen</string>
+    <!-- App notification summary with notifications hidden [CHAR LIMIT=40] -->
+    <string name="notifications_hidden">Not on lock screen</string>
+    <!-- App notification summary with notifications bypassing DND [CHAR LIMIT=40] -->
+    <string name="notifications_priority">Do Not Disturb overridden</string>
+    <!-- App notification summary divider [CHAR LIMIT=40] -->
+    <string name="notifications_summary_divider">\u00A0/\u00A0</string>
 
    <!-- Permissions preference summary [CHAR LIMIT=40] -->
    <plurals name="permissions_summary">
@@ -6500,7 +6505,7 @@
     <string name="filter_with_domain_urls_apps">With domain URLs</string>
     <!-- Label for showing apps with priority notifications in list [CHAR LIMIT=30] -->
     <string name="filter_notif_priority_apps">Overrides Do Not Disturb</string>
-    <!-- Label for showing apps redacting sensitive notifications in list [CHAR LIMIT=30] -->
+    <!-- Label for showing apps redacting sensitive notifications in list [CHAR LIMIT=50] -->
     <string name="filter_notif_sensitive_apps">No sensitive content on lock screen</string>
     <!-- Label for showing apps hiding notifications from lockscreen [CHAR LIMIT=30] -->
     <string name="filter_notif_hide_notifications_apps">Never shown on lock screen</string>
@@ -7017,7 +7022,10 @@
     <string name="data_usage_summary_format"><xliff:g id="amount" example="50%">%1$s</xliff:g> of data used</string>
 
     <!-- Summary of notifications [CHAR LIMIT=NONE] -->
-    <string name="notification_summary"><xliff:g id="count" example="24">%1$d</xliff:g> apps blocked from sending</string>
+    <plurals name="notification_summary">
+        <item quantity="one"><xliff:g id="count" example="1">%d</xliff:g> app blocked from sending</item>
+        <item quantity="other"><xliff:g id="count" example="10">%d</xliff:g> apps blocked from sending</item>
+    </plurals>
 
     <!-- Summary of notifications when no apps are blocked [CHAR LIMIT=NONE] -->
     <string name="notification_summary_none">All apps allowed to send</string>
diff --git a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
index 5109edd..790d99b 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
@@ -32,6 +32,8 @@
 
 public class AccessibilitySettingsForSetupWizardActivity extends SettingsActivity {
 
+    private static final String SAVE_KEY_TITLE = "activity_title";
+
     private boolean mSendExtraWindowStateChanged;
 
     @Override
@@ -62,6 +64,18 @@
     }
 
     @Override
+    protected void onSaveInstanceState(Bundle savedState) {
+        savedState.putCharSequence(SAVE_KEY_TITLE, getTitle());
+        super.onSaveInstanceState(savedState);
+    }
+
+    @Override
+    protected void onRestoreInstanceState(Bundle savedState) {
+        super.onRestoreInstanceState(savedState);
+        setTitle(savedState.getCharSequence(SAVE_KEY_TITLE));
+    }
+
+    @Override
     public void onResume() {
         super.onResume();
         mSendExtraWindowStateChanged = false;
diff --git a/src/com/android/settings/applications/AppStateNotificationBridge.java b/src/com/android/settings/applications/AppStateNotificationBridge.java
index 39b502c..e8db2aa 100644
--- a/src/com/android/settings/applications/AppStateNotificationBridge.java
+++ b/src/com/android/settings/applications/AppStateNotificationBridge.java
@@ -16,9 +16,12 @@
 package com.android.settings.applications;
 
 import android.app.Notification;
+import android.content.Context;
 import android.content.pm.PackageManager;
+import android.os.UserHandle;
 import android.service.notification.NotificationListenerService;
 
+import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.notification.NotificationBackend;
 import com.android.settings.notification.NotificationBackend.AppRow;
 import com.android.settingslib.applications.ApplicationsState;
@@ -35,11 +38,13 @@
 
     private final NotificationBackend mNotifBackend;
     private final PackageManager mPm;
+    private final Context mContext;
 
-    public AppStateNotificationBridge(PackageManager pm, ApplicationsState appState,
+    public AppStateNotificationBridge(Context context, ApplicationsState appState,
             Callback callback, NotificationBackend notifBackend) {
         super(appState, callback);
-        mPm = pm;
+        mContext = context;
+        mPm = mContext.getPackageManager();
         mNotifBackend = notifBackend;
     }
 
@@ -49,13 +54,13 @@
         final int N = apps.size();
         for (int i = 0; i < N; i++) {
             AppEntry app = apps.get(i);
-            app.extraInfo = mNotifBackend.loadAppRow(mPm, app.info);
+            app.extraInfo = mNotifBackend.loadAppRow(mContext, mPm, app.info);
         }
     }
 
     @Override
     protected void updateExtraInfo(AppEntry app, String pkg, int uid) {
-        app.extraInfo = mNotifBackend.loadAppRow(mPm, app.info);
+        app.extraInfo = mNotifBackend.loadAppRow(mContext, mPm, app.info);
     }
 
     public static final AppFilter FILTER_APP_NOTIFICATION_BLOCKED = new AppFilter() {
@@ -107,7 +112,7 @@
 
         @Override
         public boolean filterApp(AppEntry info) {
-            return info.extraInfo != null
+            return info.extraInfo != null && ((AppRow) info.extraInfo).lockScreenSecure
                     && ((AppRow) info.extraInfo).appVisOverride == Notification.VISIBILITY_PRIVATE;
         }
     };
@@ -119,7 +124,7 @@
 
         @Override
         public boolean filterApp(AppEntry info) {
-            return info.extraInfo != null
+            return info.extraInfo != null && ((AppRow) info.extraInfo).lockScreenSecure
                     && ((AppRow) info.extraInfo).appVisOverride == Notification.VISIBILITY_SECRET;
         }
     };
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index 2eaa76f..667b328 100755
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -21,6 +21,7 @@
 import android.app.ActivityManager;
 import android.app.AlertDialog;
 import android.app.LoaderManager.LoaderCallbacks;
+import android.app.Notification;
 import android.app.admin.DevicePolicyManager;
 import android.content.ActivityNotFoundException;
 import android.content.BroadcastReceiver;
@@ -73,6 +74,7 @@
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.internal.os.BatterySipper;
 import com.android.internal.os.BatteryStatsHelper;
+import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.AppHeader;
 import com.android.settings.DeviceAdminAdd;
 import com.android.settings.R;
@@ -1001,18 +1003,39 @@
 
     public static CharSequence getNotificationSummary(AppEntry appEntry, Context context,
             NotificationBackend backend) {
-        AppRow appRow = backend.loadAppRow(context.getPackageManager(), appEntry.info);
+        AppRow appRow = backend.loadAppRow(context, context.getPackageManager(), appEntry.info);
         return getNotificationSummary(appRow, context);
     }
 
     public static CharSequence getNotificationSummary(AppRow appRow, Context context) {
+        List<String> summaryAttributes = new ArrayList<>();
+        StringBuffer summary = new StringBuffer();
         if (appRow.banned) {
-            return context.getString(R.string.notifications_disabled);
+            summaryAttributes.add(context.getString(R.string.notifications_disabled));
         } else if (appRow.appImportance > NotificationListenerService.Ranking.IMPORTANCE_NONE
                 && appRow.appImportance < NotificationListenerService.Ranking.IMPORTANCE_DEFAULT) {
-            return context.getString(R.string.notifications_silenced);
+            summaryAttributes.add(context.getString(R.string.notifications_silenced));
         }
-        return "";
+        final boolean lockscreenSecure = new LockPatternUtils(context).isSecure(
+                UserHandle.myUserId());
+        if (lockscreenSecure) {
+            if (appRow.appVisOverride == Notification.VISIBILITY_PRIVATE) {
+                summaryAttributes.add(context.getString(R.string.notifications_redacted));
+            } else if (appRow.appVisOverride == Notification.VISIBILITY_SECRET) {
+                summaryAttributes.add(context.getString(R.string.notifications_hidden));
+            }
+        }
+        if (appRow.appBypassDnd) {
+            summaryAttributes.add(context.getString(R.string.notifications_priority));
+        }
+        final int N = summaryAttributes.size();
+        for (int i = 0; i < N; i++) {
+            if (i > 0) {
+                summary.append(context.getString(R.string.notifications_summary_divider));
+            }
+            summary.append(summaryAttributes.get(i));
+        }
+        return summary.toString();
     }
 
     private class MemoryUpdater extends AsyncTask<Void, Void, ProcStatsPackageEntry> {
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index 56661b4..34fed57 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -788,8 +788,8 @@
             mPm = mContext.getPackageManager();
             mFilterMode = filterMode;
             if (mManageApplications.mListType == LIST_TYPE_NOTIFICATION) {
-                mExtraInfoBridge = new AppStateNotificationBridge(mContext.getPackageManager(),
-                        mState, this, manageApplications.mNotifBackend);
+                mExtraInfoBridge = new AppStateNotificationBridge(mContext, mState, this,
+                        manageApplications.mNotifBackend);
             } else if (mManageApplications.mListType == LIST_TYPE_USAGE_ACCESS) {
                 mExtraInfoBridge = new AppStateUsageBridge(mContext, mState, this);
             } else if (mManageApplications.mListType == LIST_TYPE_HIGH_POWER) {
diff --git a/src/com/android/settings/applications/NotificationApps.java b/src/com/android/settings/applications/NotificationApps.java
index 05b450d..f76aa8d 100644
--- a/src/com/android/settings/applications/NotificationApps.java
+++ b/src/com/android/settings/applications/NotificationApps.java
@@ -52,7 +52,7 @@
                     ApplicationsState.getInstance((Application) context.getApplicationContext());
             mSession = mAppState.newSession(this);
             mNotifBackend = new NotificationBackend();
-            mExtraInfoBridge = new AppStateNotificationBridge(mContext.getPackageManager(),
+            mExtraInfoBridge = new AppStateNotificationBridge(mContext,
                     mAppState, this, mNotifBackend);
         }
 
@@ -72,8 +72,8 @@
             if (apps.size() == 0) {
                 mLoader.setSummary(this, mContext.getString(R.string.notification_summary_none));
             } else {
-                mLoader.setSummary(this, mContext.getString(R.string.notification_summary,
-                        apps.size()));
+                mLoader.setSummary(this, mContext.getResources().getQuantityString(
+                        R.plurals.notification_summary, apps.size(), apps.size()));
             }
         }
 
diff --git a/src/com/android/settings/dashboard/SummaryLoader.java b/src/com/android/settings/dashboard/SummaryLoader.java
index 5019844..e6c1243 100644
--- a/src/com/android/settings/dashboard/SummaryLoader.java
+++ b/src/com/android/settings/dashboard/SummaryLoader.java
@@ -46,6 +46,7 @@
     private final HandlerThread mWorkerThread;
 
     private DashboardAdapter mAdapter;
+    private boolean mListening;
 
     public SummaryLoader(Activity activity, List<DashboardCategory> categories) {
         mHandler = new Handler();
@@ -64,6 +65,8 @@
 
     public void release() {
         mWorkerThread.quitSafely();
+        // Make sure we aren't listening.
+        setListeningW(false);
     }
 
     public void setAdapter(DashboardAdapter adapter) {
@@ -122,6 +125,27 @@
         return tile.metaData;
     }
 
+    private synchronized void setListeningW(boolean listening) {
+        if (mListening == listening) return;
+        if (DEBUG) Log.d(TAG, "Listening " + listening);
+        for (SummaryProvider p : mSummaryMap.keySet()) {
+            p.setListening(listening);
+        }
+        mListening = listening;
+    }
+
+    private synchronized void makeProviderW(Tile tile) {
+        SummaryProvider provider = getSummaryProvider(tile);
+        if (provider != null) {
+            if (DEBUG) Log.d(TAG, "Creating " + tile);
+            mSummaryMap.put(provider, tile);
+            if (mListening) {
+                // If we are somehow already listening, put the provider in that state.
+                provider.setListening(true);
+            }
+        }
+    }
+
     public interface SummaryProvider {
         void setListening(boolean listening);
     }
@@ -143,18 +167,11 @@
             switch (msg.what) {
                 case MSG_GET_PROVIDER:
                     Tile tile = (Tile) msg.obj;
-                    SummaryProvider provider = getSummaryProvider(tile);
-                    if (provider != null) {
-                        if (DEBUG) Log.d(TAG, "Creating " + tile);
-                        mSummaryMap.put(provider, tile);
-                    }
+                    makeProviderW(tile);
                     break;
                 case MSG_SET_LISTENING:
                     boolean listening = msg.arg1 != 0;
-                    if (DEBUG) Log.d(TAG, "Listening " + listening);
-                    for (SummaryProvider p : mSummaryMap.keySet()) {
-                        p.setListening(listening);
-                    }
+                    setListeningW(listening);
                     break;
             }
         }
diff --git a/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java b/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java
index b56dd6c..28a5588 100644
--- a/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java
+++ b/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java
@@ -153,7 +153,7 @@
         dragCell.setMiniLabel(mNumberFormatter.format(i + 1));
         dragCell.setShowCheckbox(mRemoveMode);
         dragCell.setShowMiniLabel(!mRemoveMode);
-        dragCell.setShowHandle(!mRemoveMode);
+        dragCell.setShowHandle(!mRemoveMode && mDragEnabled);
         dragCell.setChecked(false);
         dragCell.setTag(feedItem);
         dragCell.getCheckbox()
diff --git a/src/com/android/settings/localepicker/LocaleListEditor.java b/src/com/android/settings/localepicker/LocaleListEditor.java
index a816f7a..63649d7 100644
--- a/src/com/android/settings/localepicker/LocaleListEditor.java
+++ b/src/com/android/settings/localepicker/LocaleListEditor.java
@@ -66,7 +66,7 @@
         setHasOptionsMenu(true);
 
         LocaleStore.fillCache(this.getContext());
-        List<LocaleStore.LocaleInfo> feedsList = getUserLocaleList(this.getContext());
+        final List<LocaleStore.LocaleInfo> feedsList = getUserLocaleList(this.getContext());
         mAdapter = new LocaleDragAndDropAdapter(this.getContext(), feedsList);
     }
 
@@ -143,6 +143,7 @@
                     public void onClick(DialogInterface dialog, int which) {
                         mAdapter.removeChecked();
                         setRemoveMode(!mRemoveMode);
+                        updateVisibilityOfRemoveMenu();
                     }
                 })
                 .create()
@@ -157,6 +158,7 @@
         menuItem.setIcon(R.drawable.ic_delete);
         super.onCreateOptionsMenu(menu, inflater);
         mMenu = menu;
+        updateVisibilityOfRemoveMenu();
     }
 
     private static List<LocaleStore.LocaleInfo> getUserLocaleList(Context context) {
@@ -200,6 +202,15 @@
     @Override
     public void onLocaleSelected(LocaleStore.LocaleInfo locale) {
         mAdapter.addLocale(locale);
+        updateVisibilityOfRemoveMenu();
     }
 
+    // Hide the "Remove" menu if there is only one locale in the list, show it otherwise
+    // This is called when the menu is first created, and then one add / remove locale
+    private void updateVisibilityOfRemoveMenu() {
+        final MenuItem menuItemRemove = mMenu.findItem(MENU_ID_REMOVE);
+        if (menuItemRemove != null) {
+            menuItemRemove.setVisible(mAdapter.getItemCount() > 1);
+        }
+    }
 }
diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java
index f393300..144c841 100644
--- a/src/com/android/settings/notification/AppNotificationSettings.java
+++ b/src/com/android/settings/notification/AppNotificationSettings.java
@@ -82,7 +82,7 @@
         mBlock = (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_BLOCK);
         mSilent = (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_SILENT);
 
-        mAppRow = mBackend.loadAppRow(mPm, mPkgInfo);
+        mAppRow = mBackend.loadAppRow(mContext, mPm, mPkgInfo);
 
         NotificationManager.Policy policy =
                 NotificationManager.from(mContext).getNotificationPolicy();
diff --git a/src/com/android/settings/notification/NotificationBackend.java b/src/com/android/settings/notification/NotificationBackend.java
index c418769..9b05da4 100644
--- a/src/com/android/settings/notification/NotificationBackend.java
+++ b/src/com/android/settings/notification/NotificationBackend.java
@@ -24,8 +24,11 @@
 import android.content.pm.PackageManager;
 import android.graphics.drawable.Drawable;
 import android.os.ServiceManager;
+import android.os.UserHandle;
 import android.service.notification.NotificationListenerService;
 import android.util.Log;
+
+import com.android.internal.widget.LockPatternUtils;
 import com.android.settingslib.Utils;
 
 public class NotificationBackend {
@@ -34,7 +37,7 @@
     static INotificationManager sINM = INotificationManager.Stub.asInterface(
             ServiceManager.getService(Context.NOTIFICATION_SERVICE));
 
-    public AppRow loadAppRow(PackageManager pm, ApplicationInfo app) {
+    public AppRow loadAppRow(Context context, PackageManager pm, ApplicationInfo app) {
         final AppRow row = new AppRow();
         row.pkg = app.packageName;
         row.uid = app.uid;
@@ -49,11 +52,13 @@
         row.appImportance = getImportance(row.pkg, row.uid);
         row.appBypassDnd = getBypassZenMode(row.pkg, row.uid);
         row.appVisOverride = getVisibilityOverride(row.pkg, row.uid);
+        row.lockScreenSecure = new LockPatternUtils(context).isSecure(
+                UserHandle.myUserId());
         return row;
     }
 
-    public AppRow loadAppRow(PackageManager pm, PackageInfo app) {
-        final AppRow row = loadAppRow(pm, app.applicationInfo);
+    public AppRow loadAppRow(Context context, PackageManager pm, PackageInfo app) {
+        final AppRow row = loadAppRow(context, pm, app.applicationInfo);
         row.systemApp = Utils.isSystemPackage(pm, app);
         return row;
     }
@@ -142,5 +147,6 @@
         public int appImportance;
         public boolean appBypassDnd;
         public int appVisOverride;
+        public boolean lockScreenSecure;
     }
 }
diff --git a/src/com/android/settings/notification/ZenModeVisualInterruptionSettings.java b/src/com/android/settings/notification/ZenModeVisualInterruptionSettings.java
index a951a69..0a0acd1 100644
--- a/src/com/android/settings/notification/ZenModeVisualInterruptionSettings.java
+++ b/src/com/android/settings/notification/ZenModeVisualInterruptionSettings.java
@@ -55,6 +55,10 @@
         mPolicy = NotificationManager.from(mContext).getNotificationPolicy();
 
         mScreenOff = (SwitchPreference) root.findPreference(KEY_SCREEN_OFF);
+        if (!getResources()
+                .getBoolean(com.android.internal.R.bool.config_intrusiveNotificationLed)) {
+            mScreenOff.setSummary(R.string.zen_mode_screen_off_summary_no_led);
+        }
         mScreenOff.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
             @Override
             public boolean onPreferenceChange(Preference preference, Object newValue) {
