diff --git a/res/values/strings.xml b/res/values/strings.xml
index 3f8cbb9..357b138 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5985,9 +5985,6 @@
     <!-- [CHAR LIMIT=180] Notification importance summary -->
     <string name="show_silently_summary">Don\'t make sound, vibrate, or peek these notifications into view on the current screen.</string>
 
-    <!-- Default Apps > Default notification assistant -->
-    <string name="default_notification_assistant">Notification assistant</string>
-
     <!-- Sound & notification > Advanced section: Title for managing notification listeners option. [CHAR LIMIT=30] -->
     <string name="manage_notification_access_title">Notification access</string>
 
diff --git a/res/xml/advanced_apps.xml b/res/xml/advanced_apps.xml
index 99e81a6..99da745 100644
--- a/res/xml/advanced_apps.xml
+++ b/res/xml/advanced_apps.xml
@@ -66,11 +66,6 @@
             android:title="@string/sms_application_title"
             settings:keywords="@string/keywords_more_default_sms_app" />
 
-        <com.android.settings.applications.DefaultNotificationAssistantPreference
-            android:key="default_notification_asst_app"
-            android:title="@string/default_notification_assistant" />
-
-
     </PreferenceCategory>
 
     <com.android.settings.WorkOnlyCategory
diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java
index 4dde340..8847321 100644
--- a/src/com/android/settings/ChooseLockGeneric.java
+++ b/src/com/android/settings/ChooseLockGeneric.java
@@ -611,12 +611,26 @@
 
         private void removeAllFingerprintTemplatesAndFinish() {
             if (mFingerprintManager != null && mFingerprintManager.isHardwareDetected()
-                    && mFingerprintManager.getEnrolledFingerprints().size() > 0) {
+                    && mFingerprintManager.hasEnrolledFingerprints(mUserId)) {
+                mFingerprintManager.setActiveUser(mUserId);
                 mFingerprintManager.remove(
-                        new Fingerprint(null, 0, 0, 0), mUserId, mRemovalCallback);
-            } else {
-                finish();
+                        new Fingerprint(null, mUserId, 0, 0), mUserId,
+                        new RemovalCallback() {
+                            @Override
+                            public void onRemovalError(Fingerprint fp, int errMsgId,
+                                    CharSequence errString) {
+                                mRemovalCallback.onRemovalError(fp, errMsgId, errString);
+                                mFingerprintManager.setActiveUser(UserHandle.myUserId());
+                            }
+
+                            @Override
+                            public void onRemovalSucceeded(Fingerprint fingerprint) {
+                                mRemovalCallback.onRemovalSucceeded(fingerprint);
+                                mFingerprintManager.setActiveUser(UserHandle.myUserId());
+                            }
+                        });
             }
+            finish();
         }
 
         @Override
@@ -636,7 +650,7 @@
         }
 
         private int getResIdForFactoryResetProtectionWarningMessage() {
-            boolean hasFingerprints = mFingerprintManager.hasEnrolledFingerprints();
+            boolean hasFingerprints = mFingerprintManager.hasEnrolledFingerprints(mUserId);
             boolean isProfile = Utils.isManagedProfile(UserManager.get(getActivity()), mUserId);
             switch (mLockPatternUtils.getKeyguardStoredPasswordQuality(mUserId)) {
                 case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 8966974..eb781e4 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -702,7 +702,12 @@
                 dialog.show(getChildFragmentManager(), TAG_UNIFICATION_DIALOG);
             } else {
                 mLockPatternUtils.setSeparateProfileChallengeEnabled(mProfileChallengeUserId, true);
-                createPreferenceHierarchy();
+                Bundle extras = new Bundle();
+                extras.putInt(Intent.EXTRA_USER_ID, mProfileChallengeUserId);
+                startFragment(this,
+                        "com.android.settings.ChooseLockGeneric$ChooseLockGenericFragment",
+                        R.string.lock_settings_picker_title_profile,
+                        SET_OR_CHANGE_LOCK_METHOD_REQUEST_PROFILE, extras);
             }
         } else if (KEY_SHOW_PASSWORD.equals(key)) {
             Settings.System.putInt(getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD,
diff --git a/src/com/android/settings/applications/DefaultNotificationAssistantPreference.java b/src/com/android/settings/applications/DefaultNotificationAssistantPreference.java
deleted file mode 100644
index 53fc391..0000000
--- a/src/com/android/settings/applications/DefaultNotificationAssistantPreference.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/**
- * Copyright (C) 2015 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.applications;
-
-import android.app.ActivityManager;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.pm.ServiceInfo;
-import android.provider.Settings;
-import android.service.notification.NotificationAssistantService;
-import android.util.AttributeSet;
-import android.util.Slog;
-import com.android.settings.AppListPreference;
-import com.android.settings.R;
-import com.android.settings.notification.ManagedServiceSettings;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class DefaultNotificationAssistantPreference extends AppListPreference {
-    private static final String TAG = "DefaultNotiAssist";
-
-    private PackageManager mPm;
-    private final ManagedServiceSettings.Config mConfig;
-    private final Context mContext;
-
-    public DefaultNotificationAssistantPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-
-        mContext = context;
-        mPm = context.getPackageManager();
-        mConfig = getConfig();
-        setShowItemNone(true);
-        updateList(getServices());
-    }
-
-    @Override
-    protected boolean persistString(String value) {
-        Settings.Secure.putString(mContext.getContentResolver(), mConfig.setting, value);
-        setSummary(getEntry());
-        return true;
-    }
-
-    private void updateList(List<ServiceInfo> services) {
-        final ComponentName[] assistants = new ComponentName[services.size()];
-        for (int i = 0; i < services.size(); i++) {
-            assistants[i] = new ComponentName(services.get(i).packageName, services.get(i).name);
-        }
-        final String assistant =
-                Settings.Secure.getString(mContext.getContentResolver(), mConfig.setting);
-        setComponentNames(assistants, assistant == null ? null
-                : ComponentName.unflattenFromString(assistant));
-    }
-
-    private List<ServiceInfo> getServices() {
-        List<ServiceInfo> services = new ArrayList<>();
-        final int user = ActivityManager.getCurrentUser();
-
-        List<ResolveInfo> installedServices = mPm.queryIntentServicesAsUser(
-                new Intent(mConfig.intentAction),
-                PackageManager.GET_SERVICES | PackageManager.GET_META_DATA,
-                user);
-
-        for (int i = 0, count = installedServices.size(); i < count; i++) {
-            ResolveInfo resolveInfo = installedServices.get(i);
-            ServiceInfo info = resolveInfo.serviceInfo;
-
-            if (!mConfig.permission.equals(info.permission)) {
-                Slog.w(mConfig.tag, "Skipping " + mConfig.noun + " service "
-                        + info.packageName + "/" + info.name
-                        + ": it does not require the permission "
-                        + mConfig.permission);
-                continue;
-            }
-            services.add(info);
-        }
-        return services;
-    }
-
-    private ManagedServiceSettings.Config getConfig() {
-        final ManagedServiceSettings.Config c = new ManagedServiceSettings.Config();
-        c.tag = TAG;
-        c.setting = Settings.Secure.ENABLED_NOTIFICATION_ASSISTANT;
-        c.intentAction = NotificationAssistantService.SERVICE_INTERFACE;
-        c.permission = android.Manifest.permission.BIND_NOTIFICATION_ASSISTANT_SERVICE;
-        c.noun = "notification assistant";
-        c.warningDialogTitle = R.string.notification_listener_security_warning_title;
-        c.warningDialogSummary = R.string.notification_listener_security_warning_summary;
-        c.emptyText = R.string.no_notification_listeners;
-        return c;
-    }
-}
diff --git a/src/com/android/settings/dashboard/SuggestionsChecks.java b/src/com/android/settings/dashboard/SuggestionsChecks.java
index 7d617b7..3ea815c 100644
--- a/src/com/android/settings/dashboard/SuggestionsChecks.java
+++ b/src/com/android/settings/dashboard/SuggestionsChecks.java
@@ -37,7 +37,7 @@
 import com.android.settings.Settings.ZenModeAutomationSuggestionActivity;
 import com.android.settingslib.drawer.Tile;
 
-import java.util.List;
+import java.util.Collection;
 
 /**
  * The Home of all stupidly dynamic Settings Suggestions checks.
@@ -86,10 +86,10 @@
     }
 
     private boolean hasEnabledZenAutoRules() {
-        List<AutomaticZenRule> zenRules = NotificationManager.from(mContext).getAutomaticZenRules();
-        final int N = zenRules.size();
-        for (int i = 0; i < N; i++) {
-            if (zenRules.get(i).isEnabled()) {
+        Collection<AutomaticZenRule> zenRules =
+                NotificationManager.from(mContext).getAutomaticZenRules().values();
+        for (AutomaticZenRule rule : zenRules) {
+            if (rule.isEnabled()) {
                 return true;
             }
         }
diff --git a/src/com/android/settings/notification/NotificationStation.java b/src/com/android/settings/notification/NotificationStation.java
index b871848..75acdc3 100644
--- a/src/com/android/settings/notification/NotificationStation.java
+++ b/src/com/android/settings/notification/NotificationStation.java
@@ -87,7 +87,7 @@
         }
     };
 
-    private NotificationListenerService mListener = new NotificationListenerService() {
+    private final NotificationListenerService mListener = new NotificationListenerService() {
         @Override
         public void onNotificationPosted(StatusBarNotification sbn, RankingMap ranking) {
             logd("onNotificationPosted: %s", sbn.getNotification());
@@ -135,22 +135,16 @@
         mPm = mContext.getPackageManager();
         mNoMan = INotificationManager.Stub.asInterface(
                 ServiceManager.getService(Context.NOTIFICATION_SERVICE));
-        try {
-            mListener.registerAsSystemService(mContext, new ComponentName(mContext.getPackageName(),
-                    this.getClass().getCanonicalName()), ActivityManager.getCurrentUser());
-        } catch (RemoteException e) {
-            Log.e(TAG, "Cannot register listener", e);
-        }
     }
 
     @Override
-    public void onDetach() {
+    public void onPause() {
         try {
             mListener.unregisterAsSystemService();
         } catch (RemoteException e) {
             Log.e(TAG, "Cannot unregister listener", e);
         }
-        super.onDetach();
+        super.onPause();
     }
 
     @Override
@@ -171,6 +165,12 @@
     public void onResume() {
         logd("onResume()");
         super.onResume();
+        try {
+            mListener.registerAsSystemService(mContext, new ComponentName(mContext.getPackageName(),
+                    this.getClass().getCanonicalName()), ActivityManager.getCurrentUser());
+        } catch (RemoteException e) {
+            Log.e(TAG, "Cannot register listener", e);
+        }
         refreshList();
     }
 
@@ -205,17 +205,17 @@
     }
 
     private static String getTitleString(Notification n) {
-        String title = null;
+        CharSequence title = null;
         if (n.extras != null) {
-            title = n.extras.getString(Notification.EXTRA_TITLE);
+            title = n.extras.getCharSequence(Notification.EXTRA_TITLE);
             if (TextUtils.isEmpty(title)) {
-                title = n.extras.getString(Notification.EXTRA_TEXT);
+                title = n.extras.getCharSequence(Notification.EXTRA_TEXT);
             }
         }
         if (TextUtils.isEmpty(title) && !TextUtils.isEmpty(n.tickerText)) {
-            title = n.tickerText.toString();
+            title = n.tickerText;
         }
-        return title;
+        return String.valueOf(title);
     }
 
     private static String formatPendingIntent(PendingIntent pi) {
diff --git a/src/com/android/settings/notification/ZenModeAutomationSettings.java b/src/com/android/settings/notification/ZenModeAutomationSettings.java
index df19c60..f1546aa 100644
--- a/src/com/android/settings/notification/ZenModeAutomationSettings.java
+++ b/src/com/android/settings/notification/ZenModeAutomationSettings.java
@@ -46,7 +46,9 @@
 
 import java.lang.ref.WeakReference;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Comparator;
+import java.util.Map;
 
 public class ZenModeAutomationSettings extends ZenModeSettingsBase {
 
@@ -111,15 +113,15 @@
                 AutomaticZenRule rule = new AutomaticZenRule(ruleName, ri.serviceComponent,
                         ri.defaultConditionId, NotificationManager.INTERRUPTION_FILTER_PRIORITY,
                         true);
-                AutomaticZenRule savedRule = addZenRule(rule);
-                if (savedRule != null) {
-                    startActivity(getRuleIntent(ri.settingsAction, null, savedRule.getId()));
+                String savedRuleId = addZenRule(rule);
+                if (savedRuleId != null) {
+                    startActivity(getRuleIntent(ri.settingsAction, null, savedRuleId));
                 }
             }
         }.show();
     }
 
-    private void showDeleteRuleDialog(final String ruleId, final String ruleName) {
+    private void showDeleteRuleDialog(final String ruleId, final CharSequence ruleName) {
         new AlertDialog.Builder(mContext)
                 .setMessage(getString(R.string.zen_mode_delete_rule_confirmation, ruleName))
                 .setNegativeButton(R.string.cancel, null)
@@ -147,8 +149,9 @@
         return intent;
     }
 
-    private AutomaticZenRule[] sortedRules() {
-        final AutomaticZenRule[] rt = mRules.toArray(new AutomaticZenRule[mRules.size()]);
+    private Map.Entry<String,AutomaticZenRule>[] sortedRules() {
+        final Map.Entry<String,AutomaticZenRule>[] rt =
+                mRules.toArray(new Map.Entry[mRules.size()]);
         Arrays.sort(rt, RULE_COMPARATOR);
         return rt;
     }
@@ -156,8 +159,8 @@
     private void updateControls() {
         final PreferenceScreen root = getPreferenceScreen();
         root.removeAll();
-        final AutomaticZenRule[] sortedRules = sortedRules();
-        for (AutomaticZenRule sortedRule : sortedRules) {
+        final Map.Entry<String,AutomaticZenRule>[] sortedRules = sortedRules();
+        for (Map.Entry<String,AutomaticZenRule> sortedRule : sortedRules) {
             ZenRulePreference pref = new ZenRulePreference(getPrefContext(), sortedRule);
             if (pref.appExists) {
                 root.addPreference(pref);
@@ -247,15 +250,17 @@
         return null;
     }
 
-    private static final Comparator<AutomaticZenRule> RULE_COMPARATOR =
-            new Comparator<AutomaticZenRule>() {
+    private static final Comparator<Map.Entry<String,AutomaticZenRule>> RULE_COMPARATOR =
+            new Comparator<Map.Entry<String,AutomaticZenRule>>() {
         @Override
-        public int compare(AutomaticZenRule lhs, AutomaticZenRule rhs) {
-            int byDate = Long.compare(lhs.getCreationTime(), rhs.getCreationTime());
+        public int compare(Map.Entry<String,AutomaticZenRule> lhs,
+                Map.Entry<String,AutomaticZenRule> rhs) {
+            int byDate = Long.compare(lhs.getValue().getCreationTime(),
+                    rhs.getValue().getCreationTime());
             if (byDate != 0) {
                 return byDate;
             } else {
-                return key(lhs).compareTo(key(rhs));
+                return key(lhs.getValue()).compareTo(key(rhs.getValue()));
             }
         }
 
@@ -263,20 +268,22 @@
             final int type = ZenModeConfig.isValidScheduleConditionId(rule.getConditionId()) ? 1
                     : ZenModeConfig.isValidEventConditionId(rule.getConditionId()) ? 2
                     : 3;
-            return type + rule.getName();
+            return type + rule.getName().toString();
         }
     };
 
     private class ZenRulePreference extends Preference {
-        final String mName;
+        final CharSequence mName;
         final String mId;
         final boolean appExists;
 
-        public ZenRulePreference(Context context, final AutomaticZenRule rule) {
+        public ZenRulePreference(Context context,
+                final Map.Entry<String, AutomaticZenRule> ruleEntry) {
             super(context);
 
+            final AutomaticZenRule rule = ruleEntry.getValue();
             mName = rule.getName();
-            mId = rule.getId();
+            mId = ruleEntry.getKey();
 
             final boolean isSchedule = ZenModeConfig.isValidScheduleConditionId(
                     rule.getConditionId());
diff --git a/src/com/android/settings/notification/ZenModeRuleSettingsBase.java b/src/com/android/settings/notification/ZenModeRuleSettingsBase.java
index 501a260..d251580 100644
--- a/src/com/android/settings/notification/ZenModeRuleSettingsBase.java
+++ b/src/com/android/settings/notification/ZenModeRuleSettingsBase.java
@@ -123,7 +123,7 @@
                 if (zenMode == mRule.getInterruptionFilter()) return false;
                 if (DEBUG) Log.d(TAG, "onPrefChange zenMode=" + zenMode);
                 mRule.setInterruptionFilter(zenMode);
-                setZenRule(mRule);
+                setZenRule(mId, mRule);
                 return true;
             }
         });
@@ -166,7 +166,7 @@
         MetricsLogger.action(mContext, MetricsEvent.ACTION_ZEN_ENABLE_RULE, enabled);
         if (DEBUG) Log.d(TAG, "onSwitchChanged enabled=" + enabled);
         mRule.setEnabled(enabled);
-        setZenRule(mRule);
+        setZenRule(mId, mRule);
         if (enabled) {
             final int toastText = getEnabledToastText();
             if (toastText != 0) {
@@ -182,7 +182,7 @@
 
     protected void updateRule(Uri newConditionId) {
         mRule.setConditionId(newConditionId);
-        setZenRule(mRule);
+        setZenRule(mId, mRule);
     }
 
     @Override
@@ -219,7 +219,7 @@
             @Override
             public void onOk(String ruleName) {
                 mRule.setName(ruleName);
-                setZenRule(mRule);
+                setZenRule(mId, mRule);
             }
         }.show();
     }
@@ -243,7 +243,7 @@
                     public void onClick(DialogInterface dialog, int which) {
                         MetricsLogger.action(mContext, MetricsEvent.ACTION_ZEN_DELETE_RULE_OK);
                         mDeleting = true;
-                        removeZenRule(mRule.getId());
+                        removeZenRule(mId);
                     }
                 })
                 .show();
diff --git a/src/com/android/settings/notification/ZenModeSettingsBase.java b/src/com/android/settings/notification/ZenModeSettingsBase.java
index ec1426d..7864244 100644
--- a/src/com/android/settings/notification/ZenModeSettingsBase.java
+++ b/src/com/android/settings/notification/ZenModeSettingsBase.java
@@ -31,7 +31,10 @@
 
 import com.android.settings.RestrictedSettingsFragment;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 abstract public class ZenModeSettingsBase extends RestrictedSettingsFragment {
     protected static final String TAG = "ZenModeSettings";
@@ -41,7 +44,7 @@
     private final SettingsObserver mSettingsObserver = new SettingsObserver();
 
     protected Context mContext;
-    protected List<AutomaticZenRule> mRules;
+    protected Set<Map.Entry<String, AutomaticZenRule>> mRules;
     protected int mZenMode;
 
     abstract protected void onZenModeChanged();
@@ -92,16 +95,17 @@
         }
     }
 
-    protected AutomaticZenRule addZenRule(AutomaticZenRule rule) {
+    protected String addZenRule(AutomaticZenRule rule) {
+        String id = NotificationManager.from(mContext).addAutomaticZenRule(rule);
         final AutomaticZenRule savedRule =
-                NotificationManager.from(mContext).addAutomaticZenRule(rule);
+                NotificationManager.from(mContext).getAutomaticZenRule(id);
         maybeRefreshRules(savedRule != null, true);
-        return savedRule;
+        return id;
     }
 
-    protected boolean setZenRule(AutomaticZenRule rule) {
+    protected boolean setZenRule(String id, AutomaticZenRule rule) {
         final boolean success =
-                NotificationManager.from(mContext).updateAutomaticZenRule(rule);
+                NotificationManager.from(mContext).updateAutomaticZenRule(id, rule);
         maybeRefreshRules(success, true);
         return success;
     }
@@ -127,8 +131,10 @@
         NotificationManager.from(mContext).setZenMode(zenMode, conditionId, TAG);
     }
 
-    private List<AutomaticZenRule> getZenModeRules() {
-        return NotificationManager.from(mContext).getAutomaticZenRules();
+    private Set<Map.Entry<String, AutomaticZenRule>> getZenModeRules() {
+        Map<String, AutomaticZenRule> ruleMap
+                = NotificationManager.from(mContext).getAutomaticZenRules();
+        return ruleMap.entrySet();
     }
 
     private final class SettingsObserver extends ContentObserver {
diff --git a/src/com/android/settings/notification/ZenRuleNameDialog.java b/src/com/android/settings/notification/ZenRuleNameDialog.java
index 2c0ee42..f69198b 100644
--- a/src/com/android/settings/notification/ZenRuleNameDialog.java
+++ b/src/com/android/settings/notification/ZenRuleNameDialog.java
@@ -31,10 +31,10 @@
 
     private final AlertDialog mDialog;
     private final EditText mEditText;
-    private final String mOriginalRuleName;
+    private final CharSequence mOriginalRuleName;
     private final boolean mIsNew;
 
-    public ZenRuleNameDialog(Context context, String ruleName) {
+    public ZenRuleNameDialog(Context context, CharSequence ruleName) {
         mIsNew = ruleName == null;
         mOriginalRuleName = ruleName;
         final View v = LayoutInflater.from(context).inflate(R.layout.zen_rule_name, null, false);
@@ -52,7 +52,7 @@
                     public void onClick(DialogInterface dialog, int which) {
                         final String newName = trimmedText();
                         if (!mIsNew && mOriginalRuleName != null
-                                && mOriginalRuleName.equalsIgnoreCase(newName)) {
+                                && mOriginalRuleName.equals(newName)) {
                             return;  // no change to an existing rule, just dismiss
                         }
                         onOk(newName);
