diff --git a/res/values/strings.xml b/res/values/strings.xml
index 35a6f51..f6b36b4 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -750,8 +750,6 @@
     <string name="encryption_and_credential_settings_summary">Phone encrypted</string>
     <!-- Security Settings screen setting option title for the item to take you to the lock screen preference screen [CHAR LIMIT=60] -->
     <string name="lockscreen_settings_title">Lock screen preferences</string>
-    <!-- Security Settings screen setting option summary for the item to take you to the lock screen preference screen -->
-    <string name="lockscreen_settings_summary">Show all notification content</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>
@@ -2289,7 +2287,7 @@
     <!-- Adaptive brightness settings screen, setting option summary to enable adaptive brightness when user prefers very high brightness.
          Meant to make it clear that preferring very high brightness uses more battery. [CHAR LIMIT=100] -->
     <string name="auto_brightness_very_high_summary">Increased battery usage</string>
-    <!-- Adaptive brightness settings screen, disclaimer that explains in more detail about how adaptive brightness works [CHAR LIMIT=100] -->
+    <!-- Adaptive brightness settings screen, disclaimer that explains in more detail about how adaptive brightness works [CHAR LIMIT=150] -->
     <string name="auto_brightness_disclaimer">Optimize brightness level for available light. When this feature is on, you can still adjust brightness temporarily.</string>
 
     <!-- Night display screen, setting option name to enable night display (renamed "Night Light" with title caps). [CHAR LIMIT=30] -->
@@ -4462,7 +4460,7 @@
     <!-- Summary for the background activity when it is disabled [CHAR_LIMIT=120] -->
     <string name="background_activity_summary_disabled">App not allowed to run in background</string>
 
-    <!-- Title for the screen usage in power use UI [CHAR_LIMIT=40] -->
+    <!-- Title for the screen usage in power use UI [CHAR_LIMIT=60] -->
     <string name="device_screen_usage">Screen usage since full charge</string>
     <!-- Title for the screen consumption in power use UI(i.e. Screen consumption: 30% of battery usage) [CHAR_LIMIT=40] -->
     <string name="device_screen_consumption">Screen consumption</string>
diff --git a/res/xml/automatic_storage_management_settings.xml b/res/xml/automatic_storage_management_settings.xml
index 73d708d..1428741 100644
--- a/res/xml/automatic_storage_management_settings.xml
+++ b/res/xml/automatic_storage_management_settings.xml
@@ -18,38 +18,18 @@
         xmlns:settings="http://schemas.android.com/apk/res-auto"
         android:title="@string/automatic_storage_manager_settings" >
 
-    <PreferenceCategory
-        android:key="automatic"
-        android:title="@string/deletion_helper_automatic_title">
-
-        <SwitchPreference
-            android:key="storage_manager_active"
-            android:title="@string/automatic_storage_manager_preference_title"
-            android:summary="@string/automatic_storage_manager_text"/>
-
-        <Preference
-            android:key="freed_bytes"
-            android:persistent="false"
-            android:selectable="false" />
-
         <DropDownPreference
             android:key="days"
             android:summary="%s"
             android:title="@string/automatic_storage_manager_days_title"
             android:entries="@array/automatic_storage_management_days"
             android:entryValues="@array/automatic_storage_management_days_values"
-            settings:allowDividerAbove="true" />
-
-    </PreferenceCategory>
-
-    <PreferenceCategory
-        android:key="manual"
-        android:title="@string/deletion_helper_manual_title">
+            settings:allowDividerBelow="true" />
 
         <Preference
-            android:key="deletion_helper"
-            android:title="@string/deletion_helper_preference_title"/>
-
-    </PreferenceCategory>
+            android:key="freed_bytes"
+            android:persistent="false"
+            android:selectable="false"
+            settings:allowDividerAbove="true" />
 
 </PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/security_settings_chooser.xml b/res/xml/security_settings_chooser.xml
index dc6e727..067ebab 100644
--- a/res/xml/security_settings_chooser.xml
+++ b/res/xml/security_settings_chooser.xml
@@ -31,7 +31,6 @@
 
         <Preference android:key="lockscreen_preferences"
             android:title="@string/lockscreen_settings_title"
-            android:summary="@string/lockscreen_settings_summary"
             android:fragment="com.android.settings.security.LockscreenDashboardFragment"/>
 
     </PreferenceCategory>
diff --git a/res/xml/security_settings_password.xml b/res/xml/security_settings_password.xml
index e3a5dfd..7de65f7 100644
--- a/res/xml/security_settings_password.xml
+++ b/res/xml/security_settings_password.xml
@@ -30,7 +30,6 @@
 
         <Preference android:key="lockscreen_preferences"
             android:title="@string/lockscreen_settings_title"
-            android:summary="@string/lockscreen_settings_summary"
             android:fragment="com.android.settings.security.LockscreenDashboardFragment"/>
 
     </PreferenceCategory>
diff --git a/res/xml/security_settings_pattern.xml b/res/xml/security_settings_pattern.xml
index 295e896..1585f01 100644
--- a/res/xml/security_settings_pattern.xml
+++ b/res/xml/security_settings_pattern.xml
@@ -30,7 +30,6 @@
 
         <Preference android:key="lockscreen_preferences"
             android:title="@string/lockscreen_settings_title"
-            android:summary="@string/lockscreen_settings_summary"
             android:fragment="com.android.settings.security.LockscreenDashboardFragment"/>
 
     </PreferenceCategory>
diff --git a/res/xml/security_settings_pin.xml b/res/xml/security_settings_pin.xml
index 5613177..f7705b7 100644
--- a/res/xml/security_settings_pin.xml
+++ b/res/xml/security_settings_pin.xml
@@ -30,7 +30,6 @@
 
         <Preference android:key="lockscreen_preferences"
             android:title="@string/lockscreen_settings_title"
-            android:summary="@string/lockscreen_settings_summary"
             android:fragment="com.android.settings.security.LockscreenDashboardFragment"/>
 
     </PreferenceCategory>
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index a56889d..1e64b7f 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -60,6 +60,7 @@
 import com.android.settings.enterprise.ManageDeviceAdminPreferenceController;
 import com.android.settings.fingerprint.FingerprintSettings;
 import com.android.settings.location.LocationPreferenceController;
+import com.android.settings.notification.LockScreenNotificationPreferenceController;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
@@ -103,6 +104,8 @@
     @VisibleForTesting
     static final String KEY_MANAGE_TRUST_AGENTS = "manage_trust_agents";
     private static final String KEY_UNIFICATION = "unification";
+    @VisibleForTesting
+    static final String KEY_LOCKSCREEN_PREFERENCES = "lockscreen_preferences";
 
     private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123;
     private static final int CHANGE_TRUST_AGENT_SETTINGS = 126;
@@ -169,6 +172,7 @@
     private LocationPreferenceController mLocationcontroller;
     private ManageDeviceAdminPreferenceController mManageDeviceAdminPreferenceController;
     private EnterprisePrivacyPreferenceController mEnterprisePrivacyPreferenceController;
+    private LockScreenNotificationPreferenceController mLockScreenNotificationPreferenceController;
 
     @Override
     public int getMetricsCategory() {
@@ -210,6 +214,8 @@
                 = new ManageDeviceAdminPreferenceController(activity);
         mEnterprisePrivacyPreferenceController
                 = new EnterprisePrivacyPreferenceController(activity, null /* lifecycle */);
+        mLockScreenNotificationPreferenceController
+                = new LockScreenNotificationPreferenceController(activity);
     }
 
     private static int getResIdForLockUnlockScreen(Context context,
@@ -317,6 +323,7 @@
         if (securityCategory != null) {
             maybeAddFingerprintPreference(securityCategory, UserHandle.myUserId());
             numberOfTrustAgent = addTrustAgentSettings(securityCategory);
+            setLockscreenPreferencesSummary(securityCategory);
         }
 
         mVisiblePatternProfile =
@@ -423,6 +430,15 @@
         }
     }
 
+    @VisibleForTesting
+    void setLockscreenPreferencesSummary(PreferenceGroup group) {
+        final Preference lockscreenPreferences = group.findPreference(KEY_LOCKSCREEN_PREFERENCES);
+        if (lockscreenPreferences != null) {
+            lockscreenPreferences.setSummary(
+                mLockScreenNotificationPreferenceController.getSummaryResource());
+        }
+    }
+
     /*
      * Sets the preference as disabled by admin if PASSWORD_QUALITY_MANAGED is set.
      * The preference must be a RestrictedPreference.
diff --git a/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java
index 4d4cfe8..adf2938 100644
--- a/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java
+++ b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java
@@ -17,44 +17,39 @@
 package com.android.settings.deletionhelper;
 
 import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.FragmentManager;
 import android.content.ContentResolver;
-import android.content.Intent;
 import android.os.Bundle;
-import android.os.SystemProperties;
-import android.os.storage.StorageManager;
 import android.provider.Settings;
-import android.support.v14.preference.SwitchPreference;
 import android.support.v7.preference.DropDownPreference;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.Preference.OnPreferenceChangeListener;
 import android.text.format.DateUtils;
 import android.text.format.Formatter;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
+import com.android.settings.SettingsActivity;
 import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.widget.SwitchBar;
 
 /**
  * AutomaticStorageManagerSettings is the Settings screen for configuration and management of the
  * automatic storage manager.
  */
-public class AutomaticStorageManagerSettings extends SettingsPreferenceFragment implements
-        OnPreferenceChangeListener, Preference.OnPreferenceClickListener {
-    public static final int DEFAULT_DAYS_TO_RETAIN = 90;
-
+public class AutomaticStorageManagerSettings extends SettingsPreferenceFragment
+        implements OnPreferenceChangeListener {
     private static final String KEY_DAYS = "days";
-    private static final String KEY_DELETION_HELPER = "deletion_helper";
     private static final String KEY_FREED = "freed_bytes";
-    private static final String KEY_STORAGE_MANAGER_SWITCH = "storage_manager_active";
     private static final String STORAGE_MANAGER_ENABLED_BY_DEFAULT_PROPERTY =
             "ro.storage_manager.enabled";
 
+    private AutomaticStorageManagerSwitchBarController mSwitchController;
     private DropDownPreference mDaysToRetain;
     private Preference mFreedBytes;
-    private Preference mDeletionHelper;
-    private SwitchPreference mStorageManagerSwitch;
+    private SwitchBar mSwitchBar;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -63,19 +58,21 @@
     }
 
     @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
+    public View onCreateView(
+            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+        View view = super.onCreateView(inflater, container, savedInstanceState);
+
+        initializeDaysToRetainPreference();
+        initializeFreedBytesPreference();
+        initializeSwitchBar();
+
+        return view;
+    }
+
+    private void initializeDaysToRetainPreference() {
         mDaysToRetain = (DropDownPreference) findPreference(KEY_DAYS);
         mDaysToRetain.setOnPreferenceChangeListener(this);
 
-        mFreedBytes = findPreference(KEY_FREED);
-
-        mDeletionHelper = findPreference(KEY_DELETION_HELPER);
-        mDeletionHelper.setOnPreferenceClickListener(this);
-
-        mStorageManagerSwitch = (SwitchPreference) findPreference(KEY_STORAGE_MANAGER_SWITCH);
-        mStorageManagerSwitch.setOnPreferenceChangeListener(this);
-
         ContentResolver cr = getContentResolver();
         int photosDaysToRetain = Settings.Secure.getInt(cr,
                 Settings.Secure.AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
@@ -83,7 +80,24 @@
         String[] stringValues =
                 getResources().getStringArray(R.array.automatic_storage_management_days_values);
         mDaysToRetain.setValue(stringValues[daysValueToIndex(photosDaysToRetain, stringValues)]);
+    }
 
+    private void initializeSwitchBar() {
+        final SettingsActivity activity = (SettingsActivity) getActivity();
+        mSwitchBar = activity.getSwitchBar();
+        mSwitchBar.show();
+        mSwitchController =
+                new AutomaticStorageManagerSwitchBarController(
+                        getContext(),
+                        mSwitchBar,
+                        mMetricsFeatureProvider,
+                        mDaysToRetain,
+                        getFragmentManager());
+    }
+
+    private void initializeFreedBytesPreference() {
+        ContentResolver cr = getContentResolver();
+        mFreedBytes = findPreference(KEY_FREED);
         long freedBytes = Settings.Secure.getLong(cr,
                 Settings.Secure.AUTOMATIC_STORAGE_MANAGER_BYTES_CLEARED,
                 0);
@@ -93,11 +107,13 @@
         if (freedBytes == 0 || lastRunMillis == 0) {
             mFreedBytes.setVisible(false);
         } else {
-            Activity activity = getActivity();
-            mFreedBytes.setSummary(activity.getString(
-                    R.string.automatic_storage_manager_freed_bytes,
-                    Formatter.formatFileSize(activity, freedBytes),
-                    DateUtils.formatDateTime(activity, lastRunMillis, DateUtils.FORMAT_SHOW_DATE)));
+            final Activity activity = getActivity();
+            mFreedBytes.setSummary(
+                    activity.getString(
+                            R.string.automatic_storage_manager_freed_bytes,
+                            Formatter.formatFileSize(activity, freedBytes),
+                            DateUtils.formatDateTime(
+                                    activity, lastRunMillis, DateUtils.FORMAT_SHOW_DATE)));
         }
     }
 
@@ -107,31 +123,27 @@
         boolean isStorageManagerChecked =
                 Settings.Secure.getInt(getContentResolver(),
                         Settings.Secure.AUTOMATIC_STORAGE_MANAGER_ENABLED, 0) != 0;
-        mStorageManagerSwitch.setChecked(isStorageManagerChecked);
+        // Using the setCheckedInternal means the checked status won't propagate through the
+        // listeners -- this will prevent us from accidentally causing a metrics event on resume.
+        mSwitchBar.setCheckedInternal(isStorageManagerChecked);
         mDaysToRetain.setEnabled(isStorageManagerChecked);
     }
 
     @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+
+        mSwitchBar.hide();
+        mSwitchController.tearDown();
+    }
+
+    @Override
     public boolean onPreferenceChange(Preference preference, Object newValue) {
-        switch (preference.getKey()) {
-            case KEY_STORAGE_MANAGER_SWITCH:
-                boolean storageManagerChecked = (boolean) newValue;
-                mMetricsFeatureProvider.action(getContext(),
-                        MetricsEvent.ACTION_TOGGLE_STORAGE_MANAGER, storageManagerChecked);
-                mDaysToRetain.setEnabled(storageManagerChecked);
-                Settings.Secure.putInt(getContentResolver(),
-                        Settings.Secure.AUTOMATIC_STORAGE_MANAGER_ENABLED,
-                        storageManagerChecked ? 1 : 0);
-                // Only show a warning if enabling.
-                if (storageManagerChecked) {
-                    maybeShowWarning();
-                }
-                break;
-            case KEY_DAYS:
-                Settings.Secure.putInt(getContentResolver(),
-                        Settings.Secure.AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
-                        Integer.parseInt((String) newValue));
-                break;
+        if (KEY_DAYS.equals(preference.getKey())) {
+            Settings.Secure.putInt(
+                    getContentResolver(),
+                    Settings.Secure.AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
+                    Integer.parseInt((String) newValue));
         }
         return true;
     }
@@ -142,15 +154,6 @@
     }
 
     @Override
-    public boolean onPreferenceClick(Preference preference) {
-        if (KEY_DELETION_HELPER.equals(preference.getKey())) {
-            Intent intent = new Intent(StorageManager.ACTION_MANAGE_STORAGE);
-            getContext().startActivity(intent);
-        }
-        return true;
-    }
-
-    @Override
     protected int getHelpResource() {
         return R.string.help_uri_storage;
     }
@@ -164,15 +167,4 @@
         }
         return indices.length - 1;
     }
-
-    private void maybeShowWarning() {
-        // If the storage manager is on by default, we can use the normal message.
-        boolean warningUnneeded = SystemProperties.getBoolean(
-                STORAGE_MANAGER_ENABLED_BY_DEFAULT_PROPERTY, false);
-        if (warningUnneeded) {
-            return;
-        }
-        ActivationWarningFragment fragment = ActivationWarningFragment.newInstance();
-        fragment.show(getFragmentManager(), ActivationWarningFragment.TAG);
-    }
 }
diff --git a/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarController.java b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarController.java
new file mode 100644
index 0000000..a648102
--- /dev/null
+++ b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarController.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2017 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.deletionhelper;
+
+import android.app.FragmentManager;
+import android.content.Context;
+import android.os.SystemProperties;
+import android.provider.Settings;
+import android.support.v7.preference.Preference;
+import android.widget.Switch;
+
+import com.android.internal.util.Preconditions;
+import com.android.settings.core.instrumentation.MetricsFeatureProvider;
+import com.android.settings.widget.SwitchBar;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+
+/** Handles the logic for flipping the storage management toggle on a {@link SwitchBar}. */
+public class AutomaticStorageManagerSwitchBarController
+        implements SwitchBar.OnSwitchChangeListener {
+    private static final String STORAGE_MANAGER_ENABLED_BY_DEFAULT_PROPERTY =
+            "ro.storage_manager.enabled";
+
+    private Context mContext;
+    private SwitchBar mSwitchBar;
+    private MetricsFeatureProvider mMetrics;
+    private Preference mDaysToRetainPreference;
+    private FragmentManager mFragmentManager;
+
+    public AutomaticStorageManagerSwitchBarController(
+            Context context,
+            SwitchBar switchBar,
+            MetricsFeatureProvider metrics,
+            Preference daysToRetainPreference,
+            FragmentManager fragmentManager) {
+        mContext = Preconditions.checkNotNull(context);
+        mSwitchBar = Preconditions.checkNotNull(switchBar);
+        mMetrics = Preconditions.checkNotNull(metrics);
+        mDaysToRetainPreference = Preconditions.checkNotNull(daysToRetainPreference);
+        mFragmentManager = Preconditions.checkNotNull(fragmentManager);
+
+        mSwitchBar.addOnSwitchChangeListener(this);
+    }
+
+    @Override
+    public void onSwitchChanged(Switch switchView, boolean isChecked) {
+        mMetrics.action(mContext, MetricsEvent.ACTION_TOGGLE_STORAGE_MANAGER, isChecked);
+        mDaysToRetainPreference.setEnabled(isChecked);
+        Settings.Secure.putInt(
+                mContext.getContentResolver(),
+                Settings.Secure.AUTOMATIC_STORAGE_MANAGER_ENABLED,
+                isChecked ? 1 : 0);
+        // Only show a warning if enabling.
+        if (isChecked) {
+            maybeShowWarning();
+        }
+    }
+
+    /** Unregisters the controller from listening to further events. */
+    public void tearDown() {
+        mSwitchBar.removeOnSwitchChangeListener(this);
+    }
+
+    private void maybeShowWarning() {
+        // If the storage manager is on by default, we don't need to show the additional dialog.
+        if (SystemProperties.getBoolean(STORAGE_MANAGER_ENABLED_BY_DEFAULT_PROPERTY, false)) {
+            return;
+        }
+        ActivationWarningFragment fragment = ActivationWarningFragment.newInstance();
+        fragment.show(mFragmentManager, ActivationWarningFragment.TAG);
+    }
+}
diff --git a/src/com/android/settings/fingerprint/FingerprintRemoveSidecar.java b/src/com/android/settings/fingerprint/FingerprintRemoveSidecar.java
new file mode 100644
index 0000000..eda4c82
--- /dev/null
+++ b/src/com/android/settings/fingerprint/FingerprintRemoveSidecar.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2017 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.fingerprint;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.hardware.fingerprint.Fingerprint;
+import android.hardware.fingerprint.FingerprintManager;
+import android.os.Bundle;
+import com.android.settings.core.InstrumentedPreferenceFragment;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import android.os.UserHandle;
+import java.util.Queue;
+import java.util.LinkedList;
+import android.util.Log;
+
+/**
+ * Sidecar fragment to handle the state around fingerprint removal.
+ */
+public class FingerprintRemoveSidecar extends InstrumentedPreferenceFragment {
+
+    private static final String TAG = "FingerprintRemoveSidecar";
+    private Listener mListener;
+    private Fingerprint mFingerprintRemoving;
+    private Queue<Object> mFingerprintsRemoved;
+    FingerprintManager mFingerprintManager;
+
+    private class RemovalError {
+        Fingerprint fingerprint;
+        int errMsgId;
+        CharSequence errString;
+        public RemovalError(Fingerprint fingerprint, int errMsgId, CharSequence errString) {
+            this.fingerprint = fingerprint;
+            this.errMsgId = errMsgId;
+            this.errString = errString;
+        }
+    }
+
+    private FingerprintManager.RemovalCallback
+            mRemoveCallback = new FingerprintManager.RemovalCallback() {
+        @Override
+        public void onRemovalSucceeded(Fingerprint fingerprint) {
+            if (mListener != null) {
+                mListener.onRemovalSucceeded(fingerprint);
+            } else {
+                mFingerprintsRemoved.add(fingerprint);
+            };
+            mFingerprintRemoving = null;
+        }
+
+        @Override
+        public void onRemovalError(Fingerprint fp, int errMsgId, CharSequence errString) {
+            if (mListener != null) {
+                mListener.onRemovalError(fp, errMsgId, errString);
+            } else {
+                mFingerprintsRemoved.add(new RemovalError(fp, errMsgId, errString));
+            }
+            mFingerprintRemoving = null;
+        }
+    };
+
+    public void startRemove(Fingerprint fingerprint, int userId) {
+        if (mFingerprintRemoving != null) {
+            Log.e(TAG, "Remove already in progress");
+            return;
+        }
+        if (userId != UserHandle.USER_NULL) {
+            mFingerprintManager.setActiveUser(userId);
+        }
+        mFingerprintRemoving = fingerprint;
+        mFingerprintManager.remove(fingerprint, userId, mRemoveCallback);;
+    }
+
+    public FingerprintRemoveSidecar() {
+        mFingerprintsRemoved = new LinkedList<>();
+    }
+
+    public void setFingerprintManager(FingerprintManager fingerprintManager) {
+        mFingerprintManager = fingerprintManager;
+    }
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setRetainInstance(true);
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+    }
+
+    @Override
+    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+    }
+
+    public void setListener(Listener listener) {
+        if (mListener == null && listener != null) {
+            while (!mFingerprintsRemoved.isEmpty()) {
+                Object o = mFingerprintsRemoved.poll();
+                if (o instanceof Fingerprint) {
+                    listener.onRemovalSucceeded((Fingerprint)o);
+                } else if (o instanceof RemovalError) {
+                    RemovalError e = (RemovalError) o;
+                    listener.onRemovalError(e.fingerprint, e.errMsgId, e.errString);
+                }
+            }
+        }
+        mListener = listener;
+    }
+
+    public interface Listener {
+        void onRemovalSucceeded(Fingerprint fingerprint);
+        void onRemovalError(Fingerprint fp, int errMsgId, CharSequence errString);
+    }
+
+    final boolean isRemovingFingerprint(int fid) {
+        return inProgress() && mFingerprintRemoving.getFingerId() == fid;
+    }
+
+    final boolean inProgress() {
+        return mFingerprintRemoving != null;
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return MetricsEvent.FINGERPRINT_REMOVE_SIDECAR;
+    }
+
+}
diff --git a/src/com/android/settings/fingerprint/FingerprintSettings.java b/src/com/android/settings/fingerprint/FingerprintSettings.java
index dc6616a..01670fe 100644
--- a/src/com/android/settings/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/fingerprint/FingerprintSettings.java
@@ -31,7 +31,6 @@
 import android.hardware.fingerprint.FingerprintManager;
 import android.hardware.fingerprint.FingerprintManager.AuthenticationCallback;
 import android.hardware.fingerprint.FingerprintManager.AuthenticationResult;
-import android.hardware.fingerprint.FingerprintManager.RemovalCallback;
 import android.os.Bundle;
 import android.os.CancellationSignal;
 import android.os.Handler;
@@ -64,11 +63,11 @@
 import com.android.settings.Utils;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 import com.android.settings.widget.FooterPreference;
-import com.android.settings.widget.FooterPreferenceMixin;
 import com.android.settingslib.HelpUtils;
 import com.android.settingslib.RestrictedLockUtils;
 
 import java.util.List;
+import java.util.HashMap;
 
 import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 
@@ -160,6 +159,10 @@
         private Drawable mHighlightDrawable;
         private int mUserId;
 
+        private static final String TAG_REMOVAL_SIDECAR = "removal_sidecar";
+        private FingerprintRemoveSidecar mRemovalSidecar;
+        private HashMap<Integer, String> mFingerprintsRenaming;
+
         private AuthenticationCallback mAuthCallback = new AuthenticationCallback() {
             @Override
             public void onAuthenticationSucceeded(AuthenticationResult result) {
@@ -184,22 +187,30 @@
                         .sendToTarget();
             }
         };
-        private RemovalCallback mRemoveCallback = new RemovalCallback() {
 
-            @Override
+        FingerprintRemoveSidecar.Listener mRemovalListener =
+                new FingerprintRemoveSidecar.Listener() {
             public void onRemovalSucceeded(Fingerprint fingerprint) {
                 mHandler.obtainMessage(MSG_REFRESH_FINGERPRINT_TEMPLATES,
                         fingerprint.getFingerId(), 0).sendToTarget();
+                updateDialog();
             }
-
-            @Override
             public void onRemovalError(Fingerprint fp, int errMsgId, CharSequence errString) {
                 final Activity activity = getActivity();
                 if (activity != null) {
                     Toast.makeText(activity, errString, Toast.LENGTH_SHORT);
                 }
+                updateDialog();
+            }
+            private void updateDialog() {
+                RenameDeleteDialog renameDeleteDialog = (RenameDeleteDialog)getFragmentManager().
+                        findFragmentByTag(RenameDeleteDialog.class.getName());
+                if (renameDeleteDialog != null) {
+                    renameDeleteDialog.enableDelete();
+                }
             }
         };
+
         private final Handler mHandler = new Handler() {
             @Override
             public void handleMessage(android.os.Message msg) {
@@ -263,6 +274,9 @@
         }
 
         private void retryFingerprint() {
+            if (mRemovalSidecar.inProgress()) {
+                return;
+            }
             if (!mInFingerprintLockout) {
                 mFingerprintCancel = new CancellationSignal();
                 mFingerprintManager.authenticate(null, mFingerprintCancel, 0 /* flags */,
@@ -278,7 +292,31 @@
         @Override
         public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
+
+            Activity activity = getActivity();
+            mFingerprintManager = Utils.getFingerprintManagerOrNull(activity);
+
+            mRemovalSidecar = (FingerprintRemoveSidecar)
+                    getFragmentManager().findFragmentByTag(TAG_REMOVAL_SIDECAR);
+            if (mRemovalSidecar == null) {
+                mRemovalSidecar = new FingerprintRemoveSidecar();
+                getFragmentManager().beginTransaction()
+                        .add(mRemovalSidecar, TAG_REMOVAL_SIDECAR).commit();
+            }
+            mRemovalSidecar.setFingerprintManager(mFingerprintManager);
+            mRemovalSidecar.setListener(mRemovalListener);
+
+            RenameDeleteDialog renameDeleteDialog = (RenameDeleteDialog)getFragmentManager().
+                    findFragmentByTag(RenameDeleteDialog.class.getName());
+            if (renameDeleteDialog != null) {
+               renameDeleteDialog.setDeleteInProgress(mRemovalSidecar.inProgress());
+            }
+
+            mFingerprintsRenaming = new HashMap<Integer, String>();
+
             if (savedInstanceState != null) {
+                mFingerprintsRenaming = (HashMap<Integer, String>)
+                        savedInstanceState.getSerializable("mFingerprintsRenaming");
                 mToken = savedInstanceState.getByteArray(
                         ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
                 mLaunchedConfirm = savedInstanceState.getBoolean(
@@ -287,9 +325,6 @@
             mUserId = getActivity().getIntent().getIntExtra(
                     Intent.EXTRA_USER_ID, UserHandle.myUserId());
 
-            Activity activity = getActivity();
-            mFingerprintManager = Utils.getFingerprintManagerOrNull(activity);
-
             // Need to authenticate a session token if none
             if (mToken == null && mLaunchedConfirm == false) {
                 mLaunchedConfirm = true;
@@ -347,6 +382,12 @@
                 pref.setFingerprint(item);
                 pref.setPersistent(false);
                 pref.setIcon(R.drawable.ic_fingerprint_24dp);
+                if (mRemovalSidecar.isRemovingFingerprint(item.getFingerId())) {
+                    pref.setEnabled(false);
+                }
+                if (mFingerprintsRenaming.containsKey(item.getFingerId())) {
+                    pref.setTitle(mFingerprintsRenaming.get(item.getFingerId()));
+                }
                 root.addPreference(pref);
                 pref.setOnPreferenceChangeListener(this);
             }
@@ -366,11 +407,14 @@
             final int max = getContext().getResources().getInteger(
                     com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser);
             boolean tooMany = mFingerprintManager.getEnrolledFingerprints(mUserId).size() >= max;
+            // retryFingerprint() will be called when remove finishes
+            // need to disable enroll or have a way to determine if enroll is in progress
+            final boolean removalInProgress = mRemovalSidecar.inProgress();
             CharSequence maxSummary = tooMany ?
                     getContext().getString(R.string.fingerprint_add_max, max) : "";
             Preference addPreference = findPreference(KEY_FINGERPRINT_ADD);
             addPreference.setSummary(maxSummary);
-            addPreference.setEnabled(!tooMany);
+            addPreference.setEnabled(!tooMany && !removalInProgress);
         }
 
         private static String genKey(int id) {
@@ -383,6 +427,9 @@
             // Make sure we reload the preference hierarchy since fingerprints may be added,
             // deleted or renamed.
             updatePreferences();
+            if (mRemovalSidecar != null) {
+                mRemovalSidecar.setListener(mRemovalListener);
+            }
         }
 
         private void updatePreferences() {
@@ -394,6 +441,9 @@
         public void onPause() {
             super.onPause();
             stopFingerprint();
+            if (mRemovalSidecar != null) {
+                mRemovalSidecar.setListener(null);
+            }
         }
 
         @Override
@@ -401,6 +451,7 @@
             outState.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN,
                     mToken);
             outState.putBoolean(KEY_LAUNCHED_CONFIRM, mLaunchedConfirm);
+            outState.putSerializable("mFingerprintsRenaming", mFingerprintsRenaming);
         }
 
         @Override
@@ -415,7 +466,7 @@
                 startActivityForResult(intent, ADD_FINGERPRINT_REQUEST);
             } else if (pref instanceof FingerprintPreference) {
                 FingerprintPreference fpref = (FingerprintPreference) pref;
-                final Fingerprint fp =fpref.getFingerprint();
+                final Fingerprint fp = fpref.getFingerprint();
                 showRenameDeleteDialog(fp);
                 return super.onPreferenceTreeClick(pref);
             }
@@ -425,7 +476,14 @@
         private void showRenameDeleteDialog(final Fingerprint fp) {
             RenameDeleteDialog renameDeleteDialog = new RenameDeleteDialog();
             Bundle args = new Bundle();
-            args.putParcelable("fingerprint", fp);
+            if (mFingerprintsRenaming.containsKey(fp.getFingerId())) {
+                final Fingerprint f = new Fingerprint(mFingerprintsRenaming.get(fp.getFingerId()),
+                        fp.getGroupId(), fp.getFingerId(), fp.getDeviceId());
+                args.putParcelable("fingerprint", f);
+            } else {
+                args.putParcelable("fingerprint", fp);
+            }
+            renameDeleteDialog.setDeleteInProgress(mRemovalSidecar.inProgress());
             renameDeleteDialog.setArguments(args);
             renameDeleteDialog.setTargetFragment(this, 0);
             renameDeleteDialog.show(getFragmentManager(), RenameDeleteDialog.class.getName());
@@ -537,11 +595,16 @@
         }
 
         private void deleteFingerPrint(Fingerprint fingerPrint) {
-            mFingerprintManager.remove(fingerPrint, mUserId, mRemoveCallback);
+            mRemovalSidecar.startRemove(fingerPrint, mUserId);
+            String name = genKey(fingerPrint.getFingerId());
+            Preference prefToRemove = findPreference(name);
+            prefToRemove.setEnabled(false);
+            updateAddPreference();
         }
 
         private void renameFingerPrint(int fingerId, String newName) {
             mFingerprintManager.rename(fingerId, mUserId, newName);
+            mFingerprintsRenaming.put(fingerId, newName);
             updatePreferences();
         }
 
@@ -561,7 +624,12 @@
             private Boolean mTextHadFocus;
             private int mTextSelectionStart;
             private int mTextSelectionEnd;
+            private AlertDialog mAlertDialog;
+            private boolean mDeleteInProgress;
 
+            public void setDeleteInProgress(boolean deleteInProgress) {
+                mDeleteInProgress = deleteInProgress;
+            }
             @Override
             public Dialog onCreateDialog(Bundle savedInstanceState) {
                 mFp = getArguments().getParcelable("fingerprint");
@@ -571,7 +639,7 @@
                     mTextSelectionStart = savedInstanceState.getInt("startSelection");
                     mTextSelectionEnd = savedInstanceState.getInt("endSelection");
                 }
-                final AlertDialog alertDialog = new AlertDialog.Builder(getActivity())
+                mAlertDialog = new AlertDialog.Builder(getActivity())
                         .setView(R.layout.fingerprint_rename_dialog)
                         .setPositiveButton(R.string.security_settings_fingerprint_enroll_dialog_ok,
                                 new DialogInterface.OnClickListener() {
@@ -605,10 +673,10 @@
                                     }
                                 })
                         .create();
-                alertDialog.setOnShowListener(new DialogInterface.OnShowListener() {
+                mAlertDialog.setOnShowListener(new DialogInterface.OnShowListener() {
                     @Override
                     public void onShow(DialogInterface dialog) {
-                        mDialogTextField = (EditText) alertDialog.findViewById(
+                        mDialogTextField = (EditText) mAlertDialog.findViewById(
                                 R.id.fingerprint_rename_field);
                         CharSequence name = mFingerName == null ? mFp.getName() : mFingerName;
                         mDialogTextField.setText(name);
@@ -617,14 +685,24 @@
                         } else {
                             mDialogTextField.setSelection(mTextSelectionStart, mTextSelectionEnd);
                         }
+                        if (mDeleteInProgress) {
+                            mAlertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(false);
+                        }
                     }
                 });
                 if (mTextHadFocus == null || mTextHadFocus) {
                     // Request the IME
-                    alertDialog.getWindow().setSoftInputMode(
+                    mAlertDialog.getWindow().setSoftInputMode(
                             WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
                 }
-                return alertDialog;
+                return mAlertDialog;
+            }
+
+            public void enableDelete() {
+                mDeleteInProgress = false;
+                if (mAlertDialog != null) {
+                    mAlertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(true);
+                }
             }
 
             private void onDeleteClick(DialogInterface dialog) {
diff --git a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
index fe0cf4d..b341760 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
@@ -66,7 +66,8 @@
             UsageType.USER,
             UsageType.IDLE,
             UsageType.APP,
-            UsageType.UNACCOUNTED};
+            UsageType.UNACCOUNTED,
+            UsageType.OVERCOUNTED};
     private BatteryHistoryPreference mHistPref;
     private PreferenceGroup mUsageListGroup;
     private PowerUsageFeatureProvider mPowerUsageFeatureProvider;
@@ -169,6 +170,9 @@
         mUsageListGroup.removeAll();
         for (int i = 0, size = dataList.size(); i < size; i++) {
             final PowerUsageData batteryData = dataList.get(i);
+            if (shouldHide(batteryData)) {
+                continue;
+            }
             final PowerGaugePreference pref = new PowerGaugePreference(getPrefContext());
 
             pref.setKey(String.valueOf(batteryData.usageType));
@@ -199,6 +203,8 @@
             return UsageType.CELL;
         } else if (drainType == DrainType.UNACCOUNTED) {
             return UsageType.UNACCOUNTED;
+        } else if (drainType == DrainType.OVERCOUNTED) {
+            return UsageType.OVERCOUNTED;
         } else if (mPowerUsageFeatureProvider.isTypeSystem(sipper)) {
             return UsageType.SYSTEM;
         } else if (mPowerUsageFeatureProvider.isTypeService(sipper)) {
@@ -209,6 +215,16 @@
     }
 
     @VisibleForTesting
+    boolean shouldHide(PowerUsageData powerUsageData) {
+        if (powerUsageData.usageType == UsageType.UNACCOUNTED
+                || powerUsageData.usageType == UsageType.OVERCOUNTED) {
+            return true;
+        }
+
+        return false;
+    }
+
+    @VisibleForTesting
     List<PowerUsageData> parsePowerUsageData(BatteryStatsHelper statusHelper) {
         final List<BatterySipper> batterySippers = statusHelper.getUsageList();
         final Map<Integer, PowerUsageData> batteryDataMap = new HashMap<>();
@@ -297,7 +313,8 @@
                 UsageType.BLUETOOTH,
                 UsageType.USER,
                 UsageType.IDLE,
-                UsageType.UNACCOUNTED})
+                UsageType.UNACCOUNTED,
+                UsageType.OVERCOUNTED})
         public @interface UsageType {
             int APP = 0;
             int WIFI = 1;
@@ -308,6 +325,7 @@
             int USER = 6;
             int IDLE = 7;
             int UNACCOUNTED = 8;
+            int OVERCOUNTED = 9;
         }
 
         @StringRes
@@ -353,6 +371,8 @@
                     return R.string.power_idle;
                 case UsageType.UNACCOUNTED:
                     return R.string.power_unaccounted;
+                case UsageType.OVERCOUNTED:
+                    return R.string.power_overcounted;
                 case UsageType.APP:
                 default:
                     return R.string.power_apps;
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 2c1fd78..d9323db 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -599,6 +599,8 @@
                 || drainType == DrainType.WIFI
                 || drainType == DrainType.SCREEN
                 || drainType == DrainType.BLUETOOTH
+                || drainType == DrainType.UNACCOUNTED
+                || drainType == DrainType.OVERCOUNTED
                 || (sipper.totalPowerMah * SECONDS_IN_HOUR) < MIN_POWER_THRESHOLD_MILLI_AMP
                 || mPowerFeatureProvider.isTypeService(sipper)
                 || mPowerFeatureProvider.isTypeSystem(sipper);
@@ -625,7 +627,11 @@
             final BatterySipper sipper = sippers.get(i);
             if (shouldHideSipper(sipper)) {
                 sippers.remove(i);
-                totalPowerMah += sipper.totalPowerMah;
+                if (sipper.drainType != DrainType.OVERCOUNTED
+                        && sipper.drainType != DrainType.UNACCOUNTED) {
+                    // Don't add it if it is overcounted or unaccounted
+                    totalPowerMah += sipper.totalPowerMah;
+                }
             }
         }
 
diff --git a/src/com/android/settings/notification/LockScreenNotificationPreferenceController.java b/src/com/android/settings/notification/LockScreenNotificationPreferenceController.java
index a7ebbe1..547ff80 100644
--- a/src/com/android/settings/notification/LockScreenNotificationPreferenceController.java
+++ b/src/com/android/settings/notification/LockScreenNotificationPreferenceController.java
@@ -267,16 +267,20 @@
         }
     }
 
+    public int getSummaryResource() {
+        final boolean enabled = getLockscreenNotificationsEnabled(UserHandle.myUserId());
+        final boolean allowPrivate = !mSecure
+            || getLockscreenAllowPrivateNotifications(UserHandle.myUserId());
+        return !enabled ? R.string.lock_screen_notifications_summary_disable :
+            allowPrivate ? R.string.lock_screen_notifications_summary_show :
+                R.string.lock_screen_notifications_summary_hide;
+    }
+
     private void updateLockscreenNotifications() {
         if (mLockscreen == null) {
             return;
         }
-        final boolean enabled = getLockscreenNotificationsEnabled(UserHandle.myUserId());
-        final boolean allowPrivate = !mSecure
-                || getLockscreenAllowPrivateNotifications(UserHandle.myUserId());
-        mLockscreenSelectedValue = !enabled ? R.string.lock_screen_notifications_summary_disable :
-                allowPrivate ? R.string.lock_screen_notifications_summary_show :
-                        R.string.lock_screen_notifications_summary_hide;
+        mLockscreenSelectedValue = getSummaryResource();
         mLockscreen.setValue(Integer.toString(mLockscreenSelectedValue));
     }
 
diff --git a/tests/robotests/src/com/android/settings/SecuritySettingsTest.java b/tests/robotests/src/com/android/settings/SecuritySettingsTest.java
index 91111a8..9bdf502 100644
--- a/tests/robotests/src/com/android/settings/SecuritySettingsTest.java
+++ b/tests/robotests/src/com/android/settings/SecuritySettingsTest.java
@@ -24,10 +24,12 @@
 import android.os.Bundle;
 import android.provider.Settings;
 import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceGroup;
 import android.support.v7.preference.PreferenceScreen;
 
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.dashboard.SummaryLoader;
+import com.android.settings.notification.LockScreenNotificationPreferenceController;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.shadow.ShadowSecureSettings;
 import com.android.settingslib.drawer.DashboardCategory;
@@ -47,6 +49,7 @@
 import org.robolectric.util.ReflectionHelpers;
 
 import java.util.Map;
+import org.robolectric.util.ReflectionHelpers;
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Matchers.any;
@@ -186,4 +189,22 @@
         verify(preference).setSummary(context.getResources().getQuantityString(
             R.plurals.manage_trust_agents_summary_on, 2, 2));
     }
+
+    @Test
+    public void testSetLockscreenPreferencesSummary_shouldSetSummaryFromLockScreenNotification() {
+        final Preference preference = mock(Preference.class);
+        final PreferenceGroup group = mock(PreferenceGroup.class);
+        when(group.findPreference(SecuritySettings.KEY_LOCKSCREEN_PREFERENCES))
+            .thenReturn(preference);
+        final LockScreenNotificationPreferenceController controller =
+            mock(LockScreenNotificationPreferenceController.class);
+
+        final SecuritySettings securitySettings = new SecuritySettings();
+        ReflectionHelpers.setField(securitySettings,
+            "mLockScreenNotificationPreferenceController", controller);
+
+        when(controller.getSummaryResource()).thenReturn(1234);
+        securitySettings.setLockscreenPreferencesSummary(group);
+        verify(preference).setSummary(1234);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarControllerTest.java b/tests/robotests/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarControllerTest.java
new file mode 100644
index 0000000..b4f5f3d
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarControllerTest.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2017 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.deletionhelper;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.content.Context;
+import android.support.v7.preference.Preference;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import com.android.settings.core.instrumentation.MetricsFeatureProvider;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
+import com.android.settings.widget.SwitchBar;
+
+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.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class AutomaticStorageManagerSwitchBarControllerTest {
+    private Context mContext;
+    private SwitchBar mSwitchBar;
+    private MetricsFeatureProvider mMetricsFeatureProvider;
+    private Preference mPreference;
+
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private FragmentManager mFragmentManager;
+
+    private AutomaticStorageManagerSwitchBarController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = spy(RuntimeEnvironment.application);
+        mSwitchBar = new SwitchBar(mContext);
+
+        Context fakeContextForFakeProvider = mock(Context.class, RETURNS_DEEP_STUBS);
+        FeatureFactory featureFactory = FakeFeatureFactory.getFactory(fakeContextForFakeProvider);
+        mMetricsFeatureProvider = featureFactory.getMetricsFeatureProvider();
+        mPreference = new Preference(mContext);
+
+        mController =
+                new AutomaticStorageManagerSwitchBarController(
+                        mContext,
+                        mSwitchBar,
+                        mMetricsFeatureProvider,
+                        mPreference,
+                        mFragmentManager);
+    }
+
+    @Test
+    public void onSwitchChanged_false_recordsAMetric() {
+        mController.onSwitchChanged(null, false);
+
+        verify(mMetricsFeatureProvider)
+                .action(
+                        eq(mContext),
+                        eq(MetricsProto.MetricsEvent.ACTION_TOGGLE_STORAGE_MANAGER),
+                        eq(false));
+    }
+
+    @Test
+    public void onSwitchChanged_true_recordsAMetric() {
+        mController.onSwitchChanged(null, true);
+
+        verify(mMetricsFeatureProvider)
+                .action(
+                        eq(mContext),
+                        eq(MetricsProto.MetricsEvent.ACTION_TOGGLE_STORAGE_MANAGER),
+                        eq(true));
+    }
+
+    @Test
+    public void onSwitchChanged_showWarningFragmentIfNotEnabledByDefault() {
+        mController.onSwitchChanged(null, true);
+
+        verify(mFragmentManager.beginTransaction())
+                .add(any(Fragment.class), eq(ActivationWarningFragment.TAG));
+    }
+
+    @Config(shadows = {SettingsShadowSystemProperties.class})
+    @Test
+    public void onSwitchChange_doNotShowWarningFragmentIfEnabledByDefault() {
+        SettingsShadowSystemProperties.set("ro.storage_manager.enabled", "true");
+
+        mController.onSwitchChanged(null, true);
+
+        verify(mFragmentManager.beginTransaction(), never())
+                .add(any(Fragment.class), eq(ActivationWarningFragment.TAG));
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
index 6ac6500..4216d57 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
@@ -207,7 +207,7 @@
 
         assertThat(usageTypeSet).asList().containsExactly(UsageType.APP, UsageType.WIFI,
                 UsageType.CELL, UsageType.BLUETOOTH, UsageType.IDLE, UsageType.SERVICE,
-                UsageType.USER, UsageType.SYSTEM, UsageType.UNACCOUNTED);
+                UsageType.USER, UsageType.SYSTEM, UsageType.UNACCOUNTED, UsageType.OVERCOUNTED);
     }
 
     @Test
@@ -223,4 +223,27 @@
             assertThat(dataList.get(i - 1).totalPowerMah).isAtLeast(dataList.get(i).totalPowerMah);
         }
     }
+
+    @Test
+    public void testShouldHide_typeUnAccounted_returnTrue() {
+        mPowerUsageData.usageType = UsageType.UNACCOUNTED;
+
+        assertThat(mPowerUsageAdvanced.shouldHide(mPowerUsageData)).isTrue();
+    }
+
+
+    @Test
+    public void testShouldHide_typeOverCounted_returnTrue() {
+        mPowerUsageData.usageType = UsageType.OVERCOUNTED;
+
+        assertThat(mPowerUsageAdvanced.shouldHide(mPowerUsageData)).isTrue();
+    }
+
+
+    @Test
+    public void testShouldHide_typeNormal_returnFalse() {
+        mPowerUsageData.usageType = UsageType.APP;
+
+        assertThat(mPowerUsageAdvanced.shouldHide(mPowerUsageData)).isFalse();
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
index 5f2d54f..7f59b18 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
@@ -90,6 +90,7 @@
     private static final double TOTAL_POWER = 200;
     private static final double BATTERY_SCREEN_USAGE = 300;
     private static final double BATTERY_SYSTEM_USAGE = 600;
+    private static final double BATTERY_OVERCOUNTED_USAGE = 500;
     private static final double PRECISION = 0.001;
     private static final double POWER_USAGE_PERCENTAGE = 50;
     private static final Intent ADDITIONAL_BATTERY_INFO_INTENT =
@@ -112,6 +113,8 @@
     @Mock
     private BatterySipper mScreenBatterySipper;
     @Mock
+    private BatterySipper mOvercountedBatterySipper;
+    @Mock
     private BatterySipper mSystemBatterySipper;
     @Mock
     private BatterySipper mCellBatterySipper;
@@ -188,6 +191,9 @@
         mSystemBatterySipper.totalPowerMah = BATTERY_SYSTEM_USAGE;
         when(mSystemBatterySipper.getUid()).thenReturn(Process.SYSTEM_UID);
 
+        mOvercountedBatterySipper.drainType = BatterySipper.DrainType.OVERCOUNTED;
+        mOvercountedBatterySipper.totalPowerMah = BATTERY_OVERCOUNTED_USAGE;
+
         mUsageList = new ArrayList<>();
         mUsageList.add(mNormalBatterySipper);
         mUsageList.add(mScreenBatterySipper);
@@ -303,6 +309,7 @@
         sippers.add(mNormalBatterySipper);
         sippers.add(mScreenBatterySipper);
         sippers.add(mSystemBatterySipper);
+        sippers.add(mOvercountedBatterySipper);
         when(mFeatureFactory.powerUsageFeatureProvider.isTypeSystem(mSystemBatterySipper))
                 .thenReturn(true);
 
@@ -318,6 +325,18 @@
     }
 
     @Test
+    public void testShouldHideSipper_TypeUnAccounted_ReturnTrue() {
+        mNormalBatterySipper.drainType = BatterySipper.DrainType.UNACCOUNTED;
+        assertThat(mFragment.shouldHideSipper(mNormalBatterySipper)).isTrue();
+    }
+
+    @Test
+    public void testShouldHideSipper_TypeOverCounted_ReturnTrue() {
+        mNormalBatterySipper.drainType = BatterySipper.DrainType.OVERCOUNTED;
+        assertThat(mFragment.shouldHideSipper(mNormalBatterySipper)).isTrue();
+    }
+
+    @Test
     public void testShouldHideSipper_typeWifi_returnTrue() {
         mNormalBatterySipper.drainType = BatterySipper.DrainType.WIFI;
         assertThat(mFragment.shouldHideSipper(mNormalBatterySipper)).isTrue();
