Merge "Remove DocumentsContract.ACTION_BROWSE."
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 2549f61..4c8ba07 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -537,11 +537,11 @@
                 <category android:name="android.intent.category.VOICE_LAUNCH" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
-            <intent-filter android:priority="5">
+            <intent-filter android:priority="240">
                 <action android:name="com.android.settings.action.SETTINGS" />
             </intent-filter>
             <meta-data android:name="com.android.settings.category"
-                android:value="com.android.settings.category.system" />
+                android:value="com.android.settings.category.ia.system" />
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                 android:value="com.android.settings.DateTimeSettings" />
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
@@ -552,7 +552,7 @@
                 android:label="@string/language_picker_title"
                 android:icon="@drawable/ic_settings_language"
                 android:taskAffinity="com.android.settings"
-                android:parentActivityName="Settings$InputMethodAndLanguageSettingsActivity">
+                android:parentActivityName="Settings$LanguageAndInputSettingsActivity">
             <intent-filter android:priority="1">
                 <action android:name="android.settings.LOCALE_SETTINGS" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -568,25 +568,25 @@
                 android:value="true" />
         </activity>
 
-        <activity android:name="Settings$InputMethodAndLanguageSettingsActivity"
+        <activity android:name=".Settings$LanguageAndInputSettingsActivity"
             android:label="@string/language_keyboard_settings_title"
             android:icon="@drawable/ic_settings_language"
             android:taskAffinity="com.android.settings"
-            android:parentActivityName="Settings">
+            android:parentActivityName="Settings$SystemDashboardActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.VOICE_LAUNCH" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
-            <intent-filter android:priority="-1">
-                <action android:name="com.android.settings.action.SETTINGS" />
+            <intent-filter android:priority="260">
+                <action android:name="com.android.settings.action.SETTINGS"/>
             </intent-filter>
             <meta-data android:name="com.android.settings.category"
-                android:value="com.android.settings.category.personal" />
+                android:value="com.android.settings.category.ia.system"/>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                android:value="com.android.settings.inputmethod.InputMethodAndLanguageSettings" />
+                android:value="com.android.settings.language.LanguageAndInputSettings"/>
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
-                android:value="true" />
+                android:value="true"/>
         </activity>
 
         <activity android:name="Settings$AvailableVirtualKeyboardActivity"
@@ -648,15 +648,15 @@
                 android:label="@string/language_keyboard_settings_title"
                 android:clearTaskOnLaunch="true"
                 android:exported="true"
-                android:targetActivity="Settings$InputMethodAndLanguageSettingsActivity">
+                android:targetActivity="Settings$LanguageAndInputSettingsActivity">
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                android:value="com.android.settings.inputmethod.InputMethodAndLanguageSettings" />
+                android:value="com.android.settings.language.LanguageAndInputSettings" />
         </activity-alias>
 
         <activity android:name="Settings$SpellCheckersSettingsActivity"
                 android:label="@string/spellcheckers_settings_title"
                 android:taskAffinity="com.android.settings"
-                android:parentActivityName="Settings$InputMethodAndLanguageSettingsActivity">
+                android:parentActivityName="Settings$LanguageAndInputSettingsActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.VOICE_LAUNCH" />
@@ -692,7 +692,7 @@
         <activity android:name="Settings$UserDictionarySettingsActivity"
                 android:label="@string/user_dict_settings_title"
                 android:taskAffinity="com.android.settings"
-                android:parentActivityName="Settings$InputMethodAndLanguageSettingsActivity">
+                android:parentActivityName="Settings$LanguageAndInputSettingsActivity">
             <intent-filter android:priority="1">
                 <action android:name="android.settings.USER_DICTIONARY_SETTINGS" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -955,11 +955,11 @@
                 <category android:name="android.intent.category.DEFAULT" />
                 <category android:name="android.intent.category.VOICE_LAUNCH" />
             </intent-filter>
-            <intent-filter android:priority="-1">
+            <intent-filter android:priority="10">
                 <action android:name="com.android.settings.action.SETTINGS" />
             </intent-filter>
             <meta-data android:name="com.android.settings.category"
-                android:value="com.android.settings.category.system" />
+                android:value="com.android.settings.category.ia.system" />
             <meta-data android:name="com.android.settings.title"
                 android:resource="@string/about_settings" />
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
@@ -1454,15 +1454,17 @@
                 <category android:name="android.intent.category.VOICE_LAUNCH" />
                 <category android:name="com.android.settings.SHORTCUT" />
             </intent-filter>
-            <intent-filter android:priority="4">
+            <intent-filter android:priority="2">
                 <action android:name="com.android.settings.action.SETTINGS" />
             </intent-filter>
             <meta-data android:name="com.android.settings.category"
-                android:value="com.android.settings.category.system" />
+                android:value="com.android.settings.category.ia.homepage" />
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                 android:value="com.android.settings.accessibility.AccessibilitySettings" />
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                 android:value="true" />
+            <meta-data android:name="com.android.settings.summary"
+                android:resource="@string/accessibility_settings_summary" />
         </activity>
 
         <activity android:name=".accessibility.AccessibilitySettingsForSetupWizardActivity"
@@ -1520,7 +1522,7 @@
         <activity android:name="Settings$TextToSpeechSettingsActivity"
                 android:label="@string/tts_settings"
                 android:taskAffinity="com.android.settings"
-                android:parentActivityName="Settings$InputMethodAndLanguageSettingsActivity">
+                android:parentActivityName="Settings$LanguageAndInputSettingsActivity">
             <intent-filter android:priority="1">
                 <action android:name="com.android.settings.TTS_SETTINGS" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -1540,11 +1542,11 @@
                 <action android:name="android.settings.ENTERPRISE_PRIVACY_SETTINGS" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
-            <intent-filter>
+            <intent-filter android:priority="-1">
                 <action android:name="com.android.settings.action.SETTINGS" />
             </intent-filter>
             <meta-data android:name="com.android.settings.category"
-                android:value="com.android.settings.category.device" />
+                android:value="com.android.settings.category.ia.system" />
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                 android:value="com.android.settings.enterprise.EnterprisePrivacySettings" />
         </activity>
@@ -1918,11 +1920,11 @@
                 <action android:name="com.android.settings.APPLICATION_DEVELOPMENT_SETTINGS" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
-            <intent-filter android:priority="2">
+            <intent-filter android:priority="50">
                 <action android:name="com.android.settings.action.SETTINGS" />
             </intent-filter>
             <meta-data android:name="com.android.settings.category"
-                android:value="com.android.settings.category.system" />
+                android:value="com.android.settings.category.ia.system" />
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                 android:value="com.android.settings.DevelopmentSettings" />
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
@@ -1943,11 +1945,11 @@
                 <category android:name="android.intent.category.DEFAULT" />
                 <category android:name="android.intent.category.VOICE_LAUNCH" />
             </intent-filter>
-            <intent-filter android:priority="3">
+            <intent-filter android:priority="2">
                 <action android:name="com.android.settings.action.SETTINGS" />
             </intent-filter>
             <meta-data android:name="com.android.settings.category"
-                android:value="com.android.settings.category.system" />
+                android:value="com.android.settings.category.ia.device" />
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                 android:value="com.android.settings.print.PrintSettingsFragment" />
         </activity>
@@ -2213,11 +2215,11 @@
                 <category android:name="android.intent.category.DEFAULT" />
                 <category android:name="com.android.settings.SHORTCUT" />
             </intent-filter>
-            <intent-filter android:priority="4">
+            <intent-filter android:priority="8">
                 <action android:name="com.android.settings.action.SETTINGS" />
             </intent-filter>
             <meta-data android:name="com.android.settings.category"
-                android:value="com.android.settings.category.device" />
+                android:value="com.android.settings.category.ia.homepage" />
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                 android:value="com.android.settings.fuelgauge.PowerUsageSummary" />
         </activity>
@@ -2575,15 +2577,21 @@
                 <category android:name="android.intent.category.VOICE_LAUNCH" />
                 <category android:name="com.android.settings.SHORTCUT" />
             </intent-filter>
-            <intent-filter android:priority="7">
+            <intent-filter android:priority="1">
+                <action android:name="android.settings.ACTION_OTHER_SOUND_SETTINGS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+            <intent-filter android:priority="6">
                 <action android:name="com.android.settings.action.SETTINGS" />
             </intent-filter>
             <meta-data android:name="com.android.settings.category"
-                       android:value="com.android.settings.category.device" />
+                       android:value="com.android.settings.category.ia.homepage" />
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                 android:value="com.android.settings.notification.SoundSettings" />
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                 android:value="true" />
+            <meta-data android:name="com.android.settings.summary"
+                android:value="@string/sound_dashboard_summary"/>
         </activity>
 
         <!-- Keep compatibility with old shortcuts. -->
@@ -2595,24 +2603,6 @@
                 android:value="com.android.settings.notification.SoundSettings" />
         </activity-alias>
 
-        <activity android:name="Settings$OtherSoundSettingsActivity"
-                android:label="@string/other_sound_settings"
-                android:exported="true"
-                android:taskAffinity="">
-            <intent-filter android:priority="1">
-                <action android:name="android.settings.ACTION_OTHER_SOUND_SETTINGS" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                android:value="com.android.settings.notification.OtherSoundSettings" />
-            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
-                android:value="true" />
-        </activity>
-
         <!-- Show apps for which application-level notification settings are applicable -->
         <activity android:name="Settings$NotificationAppListActivity"
                 android:label="@string/app_notifications_title"
@@ -2931,27 +2921,7 @@
                 android:value="true" />
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                 android:value="com.android.settings.webview.WebViewAppPicker" />
-      </activity-alias>
-
-        <!-- activity for gesture settings -->
-        <activity android:name="Settings$GestureSettingsActivity"
-                  android:label="@string/gesture_preference_title"
-                  android:icon="@drawable/ic_settings_gestures"
-                  android:enabled="@bool/config_gesture_settings_enabled">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="com.android.settings.SHORTCUT" />
-            </intent-filter>
-            <intent-filter>
-                <action android:name="com.android.settings.action.SETTINGS" />
-            </intent-filter>
-            <meta-data android:name="com.android.settings.category"
-                       android:value="com.android.settings.category.device" />
-            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                       android:value="com.android.settings.gestures.GestureSettings" />
-            <meta-data android:name="com.android.settings.summary"
-                       android:resource="@string/gesture_preference_summary" />
-        </activity>
+        </activity-alias>
 
         <activity android:name=".backup.BackupSettingsActivity"
                   android:label="@string/privacy_settings_title"
@@ -2968,11 +2938,11 @@
                 <category android:name="android.intent.category.DEFAULT" />
                 <category android:name="android.intent.category.VOICE_LAUNCH" />
             </intent-filter>
-            <intent-filter android:priority="-2">
+            <intent-filter android:priority="60">
                 <action android:name="com.android.settings.action.SETTINGS" />
             </intent-filter>
             <meta-data android:name="com.android.settings.category"
-                       android:value="com.android.settings.category.personal" />
+                       android:value="com.android.settings.category.ia.system" />
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                        android:value="true" />
         </activity>
@@ -3046,33 +3016,6 @@
                        android:value="@string/app_and_notification_dashboard_summary"/>
         </activity>
 
-        <activity-alias android:name="BatteryDashboardAlias"
-                        android:targetActivity="Settings$PowerUsageSummaryActivity">
-            <intent-filter android:priority="8">
-                <action android:name="com.android.settings.action.SETTINGS"/>
-            </intent-filter>
-            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                       android:value="com.android.settings.fuelgauge.PowerUsageSummary"/>
-            <meta-data android:name="com.android.settings.category"
-                       android:value="com.android.settings.category.ia.homepage"/>
-        </activity-alias>
-
-        <activity-alias android:name="SoundDashboardAlias"
-                        android:targetActivity="Settings$SoundSettingsActivity"
-                        android:icon="@drawable/ic_dashboard_sound">
-            <intent-filter android:priority="6">
-                <action android:name="com.android.settings.action.SETTINGS" />
-            </intent-filter>
-            <meta-data android:name="com.android.settings.category"
-                       android:value="com.android.settings.category.ia.homepage" />
-            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                       android:value="com.android.settings.notification.SoundSettings" />
-            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
-                       android:value="true" />
-            <meta-data android:name="com.android.settings.summary"
-                       android:value="@string/sound_dashboard_summary"/>
-        </activity-alias>
-
         <activity android:name=".Settings$StorageDashboardActivity"
                   android:label="@string/storage_settings"
                   android:icon="@drawable/ic_dashboard_storage">
@@ -3118,21 +3061,6 @@
               android:value="true" />
         </activity>
 
-        <activity-alias android:name="AccessibilityDashboardAlias"
-                        android:targetActivity="Settings$AccessibilitySettingsActivity">
-            <intent-filter android:priority="2">
-                <action android:name="com.android.settings.action.SETTINGS" />
-            </intent-filter>
-            <meta-data android:name="com.android.settings.category"
-                       android:value="com.android.settings.category.ia.homepage" />
-            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                       android:value="com.android.settings.accessibility.AccessibilitySettings" />
-            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
-                       android:value="true" />
-            <meta-data android:name="com.android.settings.summary"
-                       android:resource="@string/accessibility_settings_summary" />
-        </activity-alias>
-
         <activity android:name=".Settings$SystemDashboardActivity"
                   android:label="@string/header_category_system"
                   android:icon="@drawable/ic_dashboard_system">
@@ -3161,78 +3089,6 @@
                        android:resource="@string/support_summary"/>
         </activity>
 
-        <!-- Alias for IME & Language in new IA. Should merge into TargetActivity when launch -->
-        <activity android:name=".Settings$LanguageAndInputSettingsActivity"
-                  android:label="@string/language_keyboard_settings_title"
-                  android:icon="@drawable/ic_settings_language">
-            <intent-filter android:priority="260">
-                <action android:name="com.android.settings.action.SETTINGS"/>
-            </intent-filter>
-            <meta-data android:name="com.android.settings.category"
-                       android:value="com.android.settings.category.ia.system"/>
-            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                       android:value="com.android.settings.language.LanguageAndInputSettings"/>
-            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
-                       android:value="true"/>
-            <!-- Inherit intent-filter from LanguageSettingsActivity -->
-        </activity>
-
-        <!-- Alias for Date & Time in new IA. Should merge into TargetActivity when launch -->
-        <activity-alias android:name="DateTimeDashboardAlias"
-                        android:targetActivity="Settings$DateTimeSettingsActivity">
-            <intent-filter android:priority="240">
-                <action android:name="com.android.settings.action.SETTINGS" />
-            </intent-filter>
-            <meta-data android:name="com.android.settings.category"
-                       android:value="com.android.settings.category.ia.system" />
-            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                       android:value="com.android.settings.DateTimeSettings" />
-            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
-                       android:value="true" />
-        </activity-alias>
-
-        <activity-alias android:name="BackupResetDashboardAlias"
-                        android:targetActivity=".backup.BackupSettingsActivity">
-            <intent-filter android:priority="60">
-                <action android:name="com.android.settings.action.SETTINGS" />
-            </intent-filter>
-            <meta-data android:name="com.android.settings.category"
-                       android:value="com.android.settings.category.ia.system" />
-            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
-                       android:value="true" />
-        </activity-alias>
-
-        <!-- Alias for developer setting in new IA. Should merge into TargetActivity when launch -->
-        <activity-alias android:name="DevelopmentSettingsDashboardAlias"
-                        android:targetActivity="Settings$DevelopmentSettingsActivity"
-                        android:label="@string/development_settings_title"
-                        android:icon="@drawable/ic_settings_development">
-            <intent-filter android:priority="50">
-                <action android:name="com.android.settings.action.SETTINGS" />
-            </intent-filter>
-            <meta-data android:name="com.android.settings.category"
-                       android:value="com.android.settings.category.ia.system" />
-            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                       android:value="com.android.settings.DevelopmentSettings" />
-            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
-                       android:value="true" />
-        </activity-alias>
-
-        <activity-alias android:name="AboutDeviceDashboardAlias"
-                        android:targetActivity="Settings$DeviceInfoSettingsActivity">
-            <intent-filter android:priority="10">
-                <action android:name="com.android.settings.action.SETTINGS" />
-            </intent-filter>
-            <meta-data android:name="com.android.settings.category"
-                       android:value="com.android.settings.category.ia.system" />
-            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                       android:value="com.android.settings.DeviceInfoSettings" />
-            <meta-data android:name="com.android.settings.title"
-                android:resource="@string/about_settings" />
-            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
-                       android:value="true" />
-        </activity-alias>
-
         <activity-alias android:name="MemorySettingsDashboardAlias"
                         android:targetActivity=".Settings$MemorySettingsActivity">
             <intent-filter>
@@ -3244,17 +3100,6 @@
                        android:value="com.android.settings.applications.ProcessStatsSummary" />
         </activity-alias>
 
-        <activity-alias android:name="PrintDashboardAlias"
-                        android:targetActivity="Settings$PrintSettingsActivity">
-            <intent-filter android:priority="2">
-                <action android:name="com.android.settings.action.SETTINGS"/>
-            </intent-filter>
-            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                       android:value="com.android.settings.print.PrintSettingsFragment" />
-            <meta-data android:name="com.android.settings.category"
-                       android:value="com.android.settings.category.ia.device" />
-        </activity-alias>
-
         <activity-alias android:name="ManageApplicationsDashboardAlias"
                         android:targetActivity="Settings$ManageApplicationsActivity">
             <intent-filter android:priority="200">
@@ -3335,18 +3180,6 @@
                        android:value="true"/>
         </activity-alias>
 
-        <!-- Alias for enterprise privacy setting in new IA. Should merge into TargetActivity when launch -->
-        <activity-alias android:name="EnterprisePrivacyDashboardAlias"
-                        android:targetActivity="Settings$EnterprisePrivacySettingsActivity">
-            <intent-filter android:priority="-1">
-                <action android:name="com.android.settings.action.SETTINGS" />
-            </intent-filter>
-            <meta-data android:name="com.android.settings.category"
-                android:value="com.android.settings.category.ia.system" />
-            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                android:value="com.android.settings.enterprise.EnterprisePrivacySettings" />
-        </activity-alias>
-
         <!-- End of information architecture host activities -->
 
         <service
diff --git a/res/layout/dashboard_container.xml b/res/layout/dashboard_container.xml
deleted file mode 100644
index f6b81ae..0000000
--- a/res/layout/dashboard_container.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<com.android.settings.widget.RtlCompatibleViewPager
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:id="@+id/pager"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"/>
diff --git a/res/layout/dashboard_container_header.xml b/res/layout/dashboard_container_header.xml
deleted file mode 100644
index 37412e7..0000000
--- a/res/layout/dashboard_container_header.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<com.android.settings.widget.SlidingTabLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/sliding_tabs"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_marginStart="@dimen/dashboard_header_margin_start"
-    android:layout_marginEnd="@dimen/dashboard_header_margin_end"/>
diff --git a/res/values-sw720dp-land/dimens.xml b/res/values-sw720dp-land/dimens.xml
index 70faa0f..b1ec4c7 100644
--- a/res/values-sw720dp-land/dimens.xml
+++ b/res/values-sw720dp-land/dimens.xml
@@ -21,10 +21,6 @@
     <dimen name="dashboard_padding_start">160dp</dimen>
     <dimen name="dashboard_padding_end">160dp</dimen>
 
-    <!-- Dashboard Header margin in its container -->
-    <dimen name="dashboard_header_margin_start">304dp</dimen>
-    <dimen name="dashboard_header_margin_end">304dp</dimen>
-
     <!-- ActionBar contentInsetStart -->
     <dimen name="actionbar_contentInsetStart">128dp</dimen>
     <dimen name="actionbar_subsettings_contentInsetStart">128dp</dimen>
diff --git a/res/values-sw720dp/dimens.xml b/res/values-sw720dp/dimens.xml
index a0be467..981c936 100644
--- a/res/values-sw720dp/dimens.xml
+++ b/res/values-sw720dp/dimens.xml
@@ -42,10 +42,6 @@
     <dimen name="dashboard_padding_start">80dp</dimen>
     <dimen name="dashboard_padding_end">80dp</dimen>
 
-    <!-- Dashboard Header margin in its container -->
-    <dimen name="dashboard_header_margin_start">176dp</dimen>
-    <dimen name="dashboard_header_margin_end">176dp</dimen>
-
     <!-- Dashboard category padding start / end -->
     <dimen name="dashboard_category_padding_start">24dp</dimen>
     <dimen name="dashboard_category_padding_end">24dp</dimen>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 601fb40..8b172fa 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -701,7 +701,7 @@
 
     <!-- Values for the list of long press timeout options. -->
     <string-array name="long_press_timeout_selector_values" translatable="false">
-        <item>500</item>
+        <item>400</item>
         <item>1000</item>
         <item>1500</item>
     </string-array>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 0ddc634..fe5845a 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -88,10 +88,6 @@
     <dimen name="dashboard_padding_top">0dp</dimen>
     <dimen name="dashboard_padding_bottom">0dp</dimen>
 
-    <!-- Dashboard Header margin in its container -->
-    <dimen name="dashboard_header_margin_start">0dp</dimen>
-    <dimen name="dashboard_header_margin_end">0dp</dimen>
-
     <!-- Dashboard category padding start / end -->
     <dimen name="dashboard_category_padding_start">0dp</dimen>
     <dimen name="dashboard_category_padding_end">0dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 0da0009..01547ef 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -8187,7 +8187,7 @@
     <string name="do_disclosure_learn_more">Learn more</string>
 
     <!-- Preference label for the Photos & Videos storage section. [CHAR LIMIT=50] -->
-    <string name="storage_photos_videos">Photos &amp; Videos</string>
+    <string name="storage_photos_videos">Photos &amp; videos</string>
 
     <!-- Preference label for the Music & Audio storage section. [CHAR LIMIT=50] -->
     <string name="storage_music_audio">Music &amp; audio</string>
diff --git a/res/xml/gesture_settings.xml b/res/xml/gesture_settings.xml
deleted file mode 100644
index 808c9b2..0000000
--- a/res/xml/gesture_settings.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:settings="http://schemas.android.com/apk/res-auto"
-    android:title="@string/gesture_preference_title"
-    settings:keywords="@string/keywords_gesture">
-
-    <com.android.settings.gestures.GesturePreference
-        android:key="gesture_assist"
-        android:title="@string/assist_gesture_title"
-        android:summary="@string/assist_gesture_summary"
-        settings:animation="@raw/gesture_assist"
-        settings:preview="@drawable/gesture_assist"/>
-
-    <com.android.settings.gestures.GesturePreference
-        android:key="gesture_swipe_down_fingerprint"
-        android:title="@string/fingerprint_swipe_for_notifications_title"
-        android:summary="@string/fingerprint_swipe_for_notifications_summary"
-        settings:animation="@raw/gesture_fingerprint_swipe"
-        settings:preview="@drawable/gesture_fingerprint_swipe"/>
-
-    <com.android.settings.gestures.GesturePreference
-        android:key="gesture_double_tap_power"
-        android:title="@string/double_tap_power_for_camera_title"
-        android:summary="@string/double_tap_power_for_camera_summary"
-        settings:animation="@raw/gesture_double_tap"
-        settings:preview="@drawable/gesture_double_tap"/>
-
-    <com.android.settings.gestures.GesturePreference
-        android:key="gesture_double_twist"
-        android:title="@string/double_twist_for_camera_mode_title"
-        android:summary="@string/double_twist_for_camera_mode_summary"
-        settings:animation="@raw/gesture_twist"
-        settings:preview="@drawable/gesture_twist"/>
-
-    <com.android.settings.gestures.GesturePreference
-        android:key="gesture_double_tap_screen"
-        android:title="@string/ambient_display_title"
-        android:summary="@string/ambient_display_summary"
-        settings:animation="@raw/gesture_ambient_tap"
-        settings:preview="@drawable/gesture_ambient_tap"/>
-
-    <com.android.settings.gestures.GesturePreference
-        android:key="gesture_pick_up"
-        android:title="@string/ambient_display_pickup_title"
-        android:summary="@string/ambient_display_pickup_summary"
-        settings:animation="@raw/gesture_ambient_lift"
-        settings:preview="@drawable/gesture_ambient_lift"/>
-
-</PreferenceScreen>
diff --git a/res/xml/language_settings.xml b/res/xml/language_settings.xml
deleted file mode 100644
index 8aa105b..0000000
--- a/res/xml/language_settings.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 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.
--->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
-                  android:key="language_keyboard_settings"
-                  android:title="@string/language_keyboard_settings_title">
-
-    <Preference
-            android:key="phone_language"
-            android:title="@string/phone_language"
-            android:fragment="com.android.settings.localepicker.LocaleListEditor"
-            />
-
-    <!-- Spell checker preference title, summary and fragment will be set programmatically. -->
-    <!-- Note: Mark this as persistent="false" to remove unnecessarily saved shared preference.
-         See: InputMethodAndSubtypeUtil.removeUnnecessaryNonPersistentPreference. -->
-    <Preference
-        android:key="spellcheckers_settings"
-        android:title="@string/spellcheckers_settings_title"
-        android:fragment="com.android.settings.inputmethod.SpellCheckersSettings"
-        android:persistent="false"/>
-
-    <!-- User dictionary preference title and fragment will be set programmatically. -->
-    <Preference
-            android:key="key_user_dictionary_settings"
-            android:title="@string/user_dict_settings_title"
-            />
-
-    <PreferenceCategory
-        android:title="@string/keyboard_and_input_methods_category">
-        <Preference
-            android:title="@string/virtual_keyboard_category"
-            android:fragment="com.android.settings.inputmethod.VirtualKeyboardFragment" />
-        <Preference
-            android:title="@string/physical_keyboard_title"
-            android:fragment="com.android.settings.inputmethod.PhysicalKeyboardFragment" />
-    </PreferenceCategory>
-
-    <PreferenceCategory
-            android:key="voice_category"
-            android:title="@string/voice_category" >
-
-        <Preference
-                android:key="tts_settings"
-                android:title="@string/tts_settings_title"
-                android:fragment="com.android.settings.tts.TextToSpeechSettings"
-                />
-
-    </PreferenceCategory>
-
-    <PreferenceCategory
-            android:key="pointer_settings_category"
-            android:title="@string/pointer_settings_category">
-
-        <com.android.settings.PointerSpeedPreference
-                android:key="pointer_speed"
-                android:title="@string/pointer_speed"
-                android:dialogTitle="@string/pointer_speed"
-                />
-
-    </PreferenceCategory>
-
-    <PreferenceCategory
-            android:key="game_controller_settings_category"
-            android:title="@string/game_controller_settings_category">
-
-        <SwitchPreference
-                android:key="vibrate_input_devices"
-                android:title="@string/vibrate_input_devices"
-                android:summaryOn="@string/vibrate_input_devices_summary"
-                android:summaryOff="@string/vibrate_input_devices_summary"
-                />
-
-    </PreferenceCategory>
-
-</PreferenceScreen>
diff --git a/res/xml/sound_settings.xml b/res/xml/sound_settings.xml
deleted file mode 100644
index c74d1f1..0000000
--- a/res/xml/sound_settings.xml
+++ /dev/null
@@ -1,109 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
-                  xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
-          android:title="@string/sound_settings"
-          android:key="sound_settings"
-          settings:keywords="@string/keywords_sounds">
-
-        <!-- Media volume -->
-        <com.android.settings.notification.VolumeSeekBarPreference
-                android:key="media_volume"
-                android:icon="@*android:drawable/ic_audio_media"
-                android:title="@string/media_volume_option_title" />
-
-        <!-- Alarm volume -->
-        <com.android.settings.notification.VolumeSeekBarPreference
-                android:key="alarm_volume"
-                android:icon="@*android:drawable/ic_audio_alarm"
-                android:title="@string/alarm_volume_option_title" />
-
-        <!-- Ring volume -->
-        <com.android.settings.notification.VolumeSeekBarPreference
-                android:key="ring_volume"
-                android:icon="@*android:drawable/ic_audio_ring_notif"
-                android:title="@string/ring_volume_option_title" />
-
-        <!-- Notification volume -->
-        <com.android.settings.notification.VolumeSeekBarPreference
-                android:key="notification_volume"
-                android:icon="@*android:drawable/ic_audio_ring_notif"
-                android:title="@string/notification_volume_option_title" />
-
-        <!-- Also vibrate for calls -->
-        <SwitchPreference
-                android:key="vibrate_when_ringing"
-                android:title="@string/vibrate_when_ringing_title" />
-
-
-        <!-- Interruptions -->
-        <com.android.settingslib.RestrictedPreference
-                android:key="zen_mode"
-                android:title="@string/zen_mode_settings_title"
-                settings:useAdminDisabledSummary="true"
-                settings:keywords="@string/keywords_sounds_and_notifications_interruptions"
-                android:fragment="com.android.settings.notification.ZenModeSettings" />
-
-        <!-- Phone ringtone -->
-        <com.android.settings.DefaultRingtonePreference
-                android:key="ringtone"
-                android:title="@string/ringtone_title"
-                android:dialogTitle="@string/ringtone_title"
-                android:summary="@string/ringtone_summary"
-                android:ringtoneType="ringtone" />
-
-        <!-- Default notification ringtone -->
-        <com.android.settings.DefaultRingtonePreference
-                android:key="notification_ringtone"
-                android:title="@string/notification_ringtone_title"
-                android:dialogTitle="@string/notification_ringtone_title"
-                android:summary="@string/ringtone_summary"
-                android:ringtoneType="notification" />
-
-        <!-- Default alarm ringtone -->
-        <com.android.settings.DefaultRingtonePreference
-                android:key="alarm_ringtone"
-                android:title="@string/alarm_ringtone_title"
-                android:dialogTitle="@string/alarm_ringtone_title"
-                android:summary="@string/ringtone_summary"
-                android:persistent="false"
-                android:ringtoneType="alarm" />
-
-        <com.android.settingslib.RestrictedPreference
-                android:key="cell_broadcast_settings"
-                android:title="@string/cell_broadcast_settings"
-                settings:useAdminDisabledSummary="true">
-                    <intent
-                        android:action="android.intent.action.MAIN"
-                        android:targetPackage="com.android.cellbroadcastreceiver"
-                        android:targetClass="com.android.cellbroadcastreceiver.CellBroadcastSettings" />
-        </com.android.settingslib.RestrictedPreference>
-
-        <!-- Other sounds -->
-        <Preference
-                android:key="other_sounds"
-                android:title="@string/other_sound_settings"
-                android:persistent="false"
-                android:fragment="com.android.settings.notification.OtherSoundSettings" />
-
-        <!-- Cast -->
-        <Preference
-                android:key="wifi_display"
-                android:title="@string/wifi_display_settings_title"
-                android:fragment="com.android.settings.wfd.WifiDisplaySettings" />
-
-</PreferenceScreen>
diff --git a/src/com/android/settings/DeviceInfoSettings.java b/src/com/android/settings/DeviceInfoSettings.java
index 47cb9829..89ba999 100644
--- a/src/com/android/settings/DeviceInfoSettings.java
+++ b/src/com/android/settings/DeviceInfoSettings.java
@@ -17,6 +17,7 @@
 package com.android.settings;
 
 import android.app.Activity;
+import android.app.Fragment;
 import android.content.Context;
 import android.content.Intent;
 import android.os.Build;
@@ -24,6 +25,7 @@
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.core.PreferenceController;
+import com.android.settings.core.lifecycle.Lifecycle;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.deviceinfo.AdditionalSystemUpdatePreferenceController;
@@ -38,7 +40,6 @@
 import com.android.settings.deviceinfo.RegulatoryInfoPreferenceController;
 import com.android.settings.deviceinfo.SELinuxStatusPreferenceController;
 import com.android.settings.deviceinfo.SafetyInfoPreferenceController;
-import com.android.settings.deviceinfo.SafetyLegalPreferenceController;
 import com.android.settings.deviceinfo.SecurityPatchPreferenceController;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
@@ -51,8 +52,6 @@
 
     private static final String LOG_TAG = "DeviceInfoSettings";
 
-    private BuildNumberPreferenceController mBuildNumberPreferenceController;
-
     @Override
     public int getMetricsCategory() {
         return MetricsEvent.DEVICEINFO;
@@ -65,7 +64,9 @@
 
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
-        if (mBuildNumberPreferenceController.onActivityResult(requestCode, resultCode, data)) {
+        final BuildNumberPreferenceController buildNumberPreferenceController =
+                getPreferenceController(BuildNumberPreferenceController.class);
+        if (buildNumberPreferenceController.onActivityResult(requestCode, resultCode, data)) {
             return;
         }
         super.onActivityResult(requestCode, resultCode, data);
@@ -83,24 +84,8 @@
 
     @Override
     protected List<PreferenceController> getPreferenceControllers(Context context) {
-        final List<PreferenceController> controllers = new ArrayList<>();
-        mBuildNumberPreferenceController =
-                new BuildNumberPreferenceController(context, getActivity(), this /* fragment */);
-        getLifecycle().addObserver(mBuildNumberPreferenceController);
-        controllers.add(mBuildNumberPreferenceController);
-        controllers.add(new AdditionalSystemUpdatePreferenceController(context));
-        controllers.add(new ManualPreferenceController(context));
-        controllers.add(new FeedbackPreferenceController(this, context));
-        controllers.add(new KernelVersionPreferenceController(context));
-        controllers.add(new BasebandVersionPreferenceController(context));
-        controllers.add(new FirmwareVersionPreferenceController(context, getLifecycle()));
-        controllers.add(new RegulatoryInfoPreferenceController(context));
-        controllers.add(new DeviceModelPreferenceController(context));
-        controllers.add(new SecurityPatchPreferenceController(context));
-        controllers.add(new FccEquipmentIdPreferenceController(context));
-        controllers.add(new SELinuxStatusPreferenceController(context));
-        controllers.add(new SafetyInfoPreferenceController(context));
-        return controllers;
+        return buildPreferenceControllers(context, getActivity(), this /* fragment */,
+                getLifecycle());
     }
 
     private static class SummaryProvider implements SummaryLoader.SummaryProvider {
@@ -131,6 +116,26 @@
         }
     };
 
+    private static List<PreferenceController> buildPreferenceControllers(Context context,
+            Activity activity, Fragment fragment, Lifecycle lifecycle) {
+        final List<PreferenceController> controllers = new ArrayList<>();
+        controllers.add(
+                new BuildNumberPreferenceController(context, activity, fragment, lifecycle));
+        controllers.add(new AdditionalSystemUpdatePreferenceController(context));
+        controllers.add(new ManualPreferenceController(context));
+        controllers.add(new FeedbackPreferenceController(fragment, context));
+        controllers.add(new KernelVersionPreferenceController(context));
+        controllers.add(new BasebandVersionPreferenceController(context));
+        controllers.add(new FirmwareVersionPreferenceController(context, lifecycle));
+        controllers.add(new RegulatoryInfoPreferenceController(context));
+        controllers.add(new DeviceModelPreferenceController(context));
+        controllers.add(new SecurityPatchPreferenceController(context));
+        controllers.add(new FccEquipmentIdPreferenceController(context));
+        controllers.add(new SELinuxStatusPreferenceController(context));
+        controllers.add(new SafetyInfoPreferenceController(context));
+        return controllers;
+    }
+
     /**
      * For Search.
      */
@@ -146,19 +151,9 @@
                 }
 
                 @Override
-                public List<String> getNonIndexableKeys(Context context) {
-                    final List<String> keys = new ArrayList<>();
-                    new SafetyLegalPreferenceController(context).updateNonIndexableKeys(keys);
-                    new BasebandVersionPreferenceController(context).updateNonIndexableKeys(keys);
-                    new FeedbackPreferenceController(null, context).updateNonIndexableKeys(keys);
-                    new AdditionalSystemUpdatePreferenceController(context)
-                            .updateNonIndexableKeys(keys);
-                    new RegulatoryInfoPreferenceController(context).updateNonIndexableKeys(keys);
-                    new SecurityPatchPreferenceController(context).updateNonIndexableKeys(keys);
-                    new FccEquipmentIdPreferenceController(context).updateNonIndexableKeys(keys);
-                    new SELinuxStatusPreferenceController(context).updateNonIndexableKeys(keys);
-                    new SafetyInfoPreferenceController(context).updateNonIndexableKeys(keys);
-                    return keys;
+                public List<PreferenceController> getPreferenceControllers(Context context) {
+                    return buildPreferenceControllers(context, null /*activity */,
+                            null /* fragment */, null /* lifecycle */);
                 }
             };
 }
diff --git a/src/com/android/settings/DisplaySettings.java b/src/com/android/settings/DisplaySettings.java
index 1e0547b..6fbffe8 100644
--- a/src/com/android/settings/DisplaySettings.java
+++ b/src/com/android/settings/DisplaySettings.java
@@ -69,6 +69,15 @@
 
     @Override
     protected List<PreferenceController> getPreferenceControllers(Context context) {
+        return buildPreferenceControllers(context);
+    }
+
+    @Override
+    protected int getHelpResource() {
+        return R.string.help_uri_display;
+    }
+
+    private static List<PreferenceController> buildPreferenceControllers(Context context) {
         final List<PreferenceController> controllers = new ArrayList<>();
         controllers.add(new AutoBrightnessPreferenceController(context));
         controllers.add(new AutoRotatePreferenceController(context));
@@ -87,11 +96,6 @@
         return controllers;
     }
 
-    @Override
-    protected int getHelpResource() {
-        return R.string.help_uri_display;
-    }
-
     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
                 @Override
@@ -106,32 +110,8 @@
                 }
 
                 @Override
-                public List<String> getNonIndexableKeys(Context context) {
-                    ArrayList<String> result = new ArrayList<>();
-
-                    new AutoBrightnessPreferenceController(context).updateNonIndexableKeys(result);
-                    new AutoRotatePreferenceController(context).updateNonIndexableKeys(result);
-                    new CameraGesturePreferenceController(context).updateNonIndexableKeys(result);
-                    new DozePreferenceController(context).updateNonIndexableKeys(result);
-                    new FontSizePreferenceController(context).updateNonIndexableKeys(result);
-                    new LiftToWakePreferenceController(context).updateNonIndexableKeys(result);
-                    new NightDisplayPreferenceController(context).updateNonIndexableKeys(result);
-                    new NightModePreferenceController(context).updateNonIndexableKeys(result);
-                    new ScreenSaverPreferenceController(context).updateNonIndexableKeys(result);
-                    new TapToWakePreferenceController(context).updateNonIndexableKeys(result);
-                    new TimeoutPreferenceController(context).updateNonIndexableKeys(result);
-                    new VrDisplayPreferenceController(context).updateNonIndexableKeys(result);
-                    new WallpaperPreferenceController(context).updateNonIndexableKeys(result);
-                    new ThemePreferenceController(context).updateNonIndexableKeys(result);
-
-                    return result;
-                }
-
-                @Override
                 public List<PreferenceController> getPreferenceControllers(Context context) {
-                    final List<PreferenceController> controllers = new ArrayList<>();
-                    controllers.add(new AutoBrightnessPreferenceController(context));
-                    return controllers;
+                    return buildPreferenceControllers(context);
                 }
             };
 }
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index e92027a..94c12c1 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -40,7 +40,6 @@
     public static class PublicVolumeSettingsActivity extends SettingsActivity { /* empty */ }
     public static class WifiSettingsActivity extends SettingsActivity { /* empty */ }
     public static class WifiP2pSettingsActivity extends SettingsActivity { /* empty */ }
-    public static class InputMethodAndLanguageSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AvailableVirtualKeyboardActivity extends SettingsActivity { /* empty */ }
     public static class KeyboardLayoutPickerActivity extends SettingsActivity { /* empty */ }
     public static class PhysicalKeyboardActivity extends SettingsActivity { /* empty */ }
@@ -68,10 +67,7 @@
     }
     public static class BackgroundCheckSummaryActivity extends SettingsActivity { /* empty */ }
     public static class StorageUseActivity extends SettingsActivity { /* empty */ }
-    public static class DevelopmentSettingsActivity extends SettingsActivity {
-        public static final String DASHBOARD_ALIAS =
-                "com.android.settings.DevelopmentSettingsDashboardAlias";
-    }
+    public static class DevelopmentSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AccessibilitySettingsActivity extends SettingsActivity { /* empty */ }
     public static class CaptioningSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AccessibilityInversionSettingsActivity extends SettingsActivity { /* empty */ }
@@ -87,7 +83,6 @@
     public static class BatterySaverSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AccountSyncSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AccountSyncSettingsInAddAccountActivity extends SettingsActivity { /* empty */ }
-    public static class GestureSettingsActivity extends SettingsActivity { /* empty */ }
     public static class CryptKeeperSettingsActivity extends SettingsActivity { /* empty */ }
     public static class DeviceAdminSettingsActivity extends SettingsActivity { /* empty */ }
     public static class DataUsageSummaryActivity extends SettingsActivity { /* empty */ }
@@ -121,7 +116,6 @@
     public static class NotificationAppListActivity extends SettingsActivity { /* empty */ }
     public static class AppNotificationSettingsActivity extends SettingsActivity { /* empty */ }
     public static class ChannelNotificationSettingsActivity extends SettingsActivity { /* empty */ }
-    public static class OtherSoundSettingsActivity extends SettingsActivity { /* empty */ }
     public static class ManageDomainUrlsActivity extends SettingsActivity { /* empty */ }
     public static class AutomaticStorageManagerSettingsActivity extends SettingsActivity { /* empty */ }
     public static class GamesStorageActivity extends SettingsActivity { /* empty */ }
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 00bdf57..1b9b3b3 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -58,7 +58,6 @@
 import com.android.settings.core.gateway.SettingsGateway;
 import com.android.settings.core.instrumentation.MetricsFeatureProvider;
 import com.android.settings.core.instrumentation.SharedPreferencesLogger;
-import com.android.settings.dashboard.DashboardContainerFragment;
 import com.android.settings.dashboard.DashboardFeatureProvider;
 import com.android.settings.dashboard.DashboardSummary;
 import com.android.settings.dashboard.SearchResultsSummary;
@@ -154,6 +153,7 @@
     public static final String EXTRA_SHOW_FRAGMENT_AS_SUBSETTING =
             ":settings:show_fragment_as_subsetting";
 
+    @Deprecated
     public static final String EXTRA_HIDE_DRAWER = ":settings:hide_drawer";
 
     public static final String META_DATA_KEY_FRAGMENT_CLASS =
@@ -236,7 +236,6 @@
     private DashboardFeatureProvider mDashboardFeatureProvider;
     private Intent mResultIntentData;
     private ComponentName mCurrentSuggestion;
-    private final StringBuffer mDebugData = new StringBuffer();
 
     @VisibleForTesting
     String mSearchQuery;
@@ -367,9 +366,6 @@
         if (intent.hasExtra(EXTRA_UI_OPTIONS)) {
             getWindow().setUiOptions(intent.getIntExtra(EXTRA_UI_OPTIONS, 0));
         }
-        if (intent.getBooleanExtra(EXTRA_HIDE_DRAWER, false)) {
-            setIsDrawerPresent(false);
-        }
 
         mDevelopmentPreferences = getSharedPreferences(DevelopmentSettings.PREF_FILE,
                 Context.MODE_PRIVATE);
@@ -436,43 +432,7 @@
             mDisplaySearch = savedState.getBoolean(SAVE_KEY_SHOW_SEARCH);
 
         } else {
-            if (!mIsShowingDashboard) {
-                if (initialFragmentName == null) {
-                    logFragmentData(intent, className, isSubSettings);
-                }
-                mDisplaySearch = false;
-                // UP will be shown only if it is a sub settings
-                if (mIsShortcut) {
-                    mDisplayHomeAsUpEnabled = isSubSettings;
-                } else if (isSubSettings) {
-                    mDisplayHomeAsUpEnabled = true;
-                } else {
-                    mDisplayHomeAsUpEnabled = false;
-                }
-                setTitleFromIntent(intent);
-
-                Bundle initialArguments = intent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
-                switchToFragment(initialFragmentName, initialArguments, true, false,
-                        mInitialTitleResId, mInitialTitle, false);
-            } else {
-                // No UP affordance if we are displaying the main Dashboard
-                mDisplayHomeAsUpEnabled = false;
-                // Show Search affordance
-                mDisplaySearch = true;
-                mInitialTitleResId = R.string.dashboard_title;
-
-                // add argument to indicate which settings tab should be initially selected
-                final Bundle args = new Bundle();
-                final String extraName = DashboardContainerFragment.EXTRA_SELECT_SETTINGS_TAB;
-                args.putString(extraName, intent.getStringExtra(extraName));
-                if (isDashboardFeatureEnabled()) {
-                    switchToFragment(DashboardSummary.class.getName(), args, false, false,
-                            mInitialTitleResId, mInitialTitle, false);
-                } else {
-                    switchToFragment(DashboardContainerFragment.class.getName(), args, false, false,
-                            mInitialTitleResId, mInitialTitle, false);
-                }
-            }
+            launchSettingFragment(initialFragmentName, isSubSettings, intent);
         }
 
         mActionBar = getActionBar();
@@ -544,6 +504,35 @@
         }
     }
 
+    @VisibleForTesting
+    void launchSettingFragment(String initialFragmentName, boolean isSubSettings, Intent intent) {
+        if (!mIsShowingDashboard && initialFragmentName != null) {
+            mDisplaySearch = false;
+            // UP will be shown only if it is a sub settings
+            if (mIsShortcut) {
+                mDisplayHomeAsUpEnabled = isSubSettings;
+            } else if (isSubSettings) {
+                mDisplayHomeAsUpEnabled = true;
+            } else {
+                mDisplayHomeAsUpEnabled = false;
+            }
+            setTitleFromIntent(intent);
+
+            Bundle initialArguments = intent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
+            switchToFragment(initialFragmentName, initialArguments, true, false,
+                mInitialTitleResId, mInitialTitle, false);
+        } else {
+            // No UP affordance if we are displaying the main Dashboard
+            mDisplayHomeAsUpEnabled = false;
+            // Show Search affordance
+            mDisplaySearch = true;
+            mInitialTitleResId = R.string.dashboard_title;
+
+            switchToFragment(DashboardSummary.class.getName(), null /* args */, false, false,
+                mInitialTitleResId, mInitialTitle, false);
+        }
+    }
+
     public void setDisplaySearchMenu(boolean displaySearch) {
         if (displaySearch != mDisplaySearch) {
             mDisplaySearch = displaySearch;
@@ -705,7 +694,6 @@
         String startingFragment = getStartingFragmentClass(superIntent);
         // This is called from super.onCreate, isMultiPane() is not yet reliable
         // Do not use onIsHidingHeaders either, which relies itself on this method
-        log("getIntent() startingFragment", startingFragment);
         if (startingFragment != null) {
             Intent modIntent = new Intent(superIntent);
             modIntent.putExtra(EXTRA_SHOW_FRAGMENT, startingFragment);
@@ -727,11 +715,9 @@
      * returns the class name to load as a fragment.
      */
     private String getStartingFragmentClass(Intent intent) {
-        log("getStartingFragmentClass() mFragmentClass", mFragmentClass);
         if (mFragmentClass != null) return mFragmentClass;
 
         String intentClass = intent.getComponent().getClassName();
-        log("getStartingFragmentClass() intentClass", intentClass);
         if (intentClass.equals(getClass().getName())) return null;
 
         if ("com.android.settings.ManageApplications".equals(intentClass)
@@ -951,18 +937,10 @@
         setTileEnabled(new ComponentName(packageName,
                         Settings.DevelopmentSettingsActivity.class.getName()),
                 showDev, isAdmin);
-        setTileEnabled(new ComponentName(packageName,
-                        Settings.DevelopmentSettingsActivity.DASHBOARD_ALIAS),
-                showDev, isAdmin);
 
         if (UserHandle.MU_ENABLED && !isAdmin) {
             // When on restricted users, disable all extra categories (but only the settings ones).
-            List<DashboardCategory> categories;
-            if (isDashboardFeatureEnabled()) {
-                categories = mDashboardFeatureProvider.getAllCategories();
-            } else {
-                categories = getDashboardCategories();
-            }
+            final List<DashboardCategory> categories = mDashboardFeatureProvider.getAllCategories();
 
             for (DashboardCategory category : categories) {
                 for (Tile tile : category.tiles) {
@@ -981,17 +959,11 @@
         setTileEnabled(new ComponentName(packageName,
                 BackupSettingsActivity.class.getName()), true,
                 isAdmin || Utils.isCarrierDemoUser(this));
-        setTileEnabled(new ComponentName(packageName,
-                "com.android.settings.BackupResetDashboardAlias"), true, isAdmin);
 
         setTileEnabled(new ComponentName(packageName,
                 Settings.EnterprisePrivacySettingsActivity.class.getName()),
                 FeatureFactory.getFactory(this).getEnterprisePrivacyFeatureProvider(this)
                         .hasDeviceOwner(), isAdmin);
-        setTileEnabled(new ComponentName(packageName,
-                        "com.android.settings.EnterprisePrivacyDashboardAlias"),
-                FeatureFactory.getFactory(this).getEnterprisePrivacyFeatureProvider(this)
-                        .hasDeviceOwner(), isAdmin);
         // Final step, refresh categories.
         updateCategories();
     }
@@ -1017,15 +989,6 @@
         }
     }
 
-    @Override
-    protected boolean isDashboardFeatureEnabled() {
-        if (mDashboardFeatureProvider == null) {
-            mDashboardFeatureProvider =
-                    FeatureFactory.getFactory(this).getDashboardFeatureProvider(this);
-        }
-        return mDashboardFeatureProvider.isEnabled();
-    }
-
     // give subclasses access to the Next button
     public boolean hasNextButton() {
         return mNextButton != null;
@@ -1085,16 +1048,6 @@
     }
 
     @Override
-    protected void onTileClicked(Tile tile) {
-        if (mIsShowingDashboard) {
-            // If on dashboard, don't finish so the back comes back to here.
-            openTile(tile);
-        } else {
-            super.onTileClicked(tile);
-        }
-    }
-
-    @Override
     public void onProfileTileOpen() {
         if (!mIsShowingDashboard) {
             finish();
@@ -1161,37 +1114,4 @@
         }
         super.onActivityResult(requestCode, resultCode, data);
     }
-
-    private void logFragmentData(Intent intent, String className, boolean isSubSettings) {
-        if (intent != null) {
-            logBundleData(intent.getExtras(), "Intent extra");
-            logBundleData(intent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS), "Fragment args");
-        } else {
-            log("Intent data", "NULL");
-        }
-        log("Fragment", mFragmentClass);
-        log("Shortcut", mIsShortcut);
-        log("Class Name", className);
-        log("Show dashboard", mIsShowingDashboard);
-        log("Sub setting", isSubSettings);
-        log("Title", mInitialTitle);
-        Log.d(LOG_TAG, mDebugData.toString());
-        mDebugData.delete(0, mDebugData.length());
-    }
-
-    private void logBundleData(Bundle data, String name) {
-        if (data != null) {
-            final Set<String> keys = data.keySet();
-            mDebugData.append(name).append(": ");
-            for (String key : keys) {
-                log(key, data.get(key));
-            }
-        } else {
-            log(name, "NULL");
-        }
-    }
-
-    private void log(String key, Object data) {
-        mDebugData.append(key).append("=").append(data).append(", ");
-    }
 }
diff --git a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
index cf72383..b820cc2 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
@@ -46,7 +46,6 @@
 
         // Finish configuring the content view.
         getActionBar().setDisplayHomeAsUpEnabled(true);
-        setIsDrawerPresent(false);
     }
 
     @Override
diff --git a/src/com/android/settings/applications/AppStorageSettings.java b/src/com/android/settings/applications/AppStorageSettings.java
index e97a9ac..b4d7526 100644
--- a/src/com/android/settings/applications/AppStorageSettings.java
+++ b/src/com/android/settings/applications/AppStorageSettings.java
@@ -19,9 +19,11 @@
 import android.app.ActivityManager;
 import android.app.AlertDialog;
 import android.app.AppGlobals;
+import android.app.LoaderManager;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
+import android.content.Loader;
 import android.content.UriPermission;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.IPackageDataObserver;
@@ -52,8 +54,9 @@
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.applications.ApplicationsState.AppEntry;
 import com.android.settingslib.applications.ApplicationsState.Callbacks;
+import com.android.settingslib.applications.StorageStatsSource;
+import com.android.settingslib.applications.StorageStatsSource.AppStorageStats;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -64,7 +67,8 @@
 import static android.content.pm.ApplicationInfo.FLAG_SYSTEM;
 
 public class AppStorageSettings extends AppInfoWithHeader
-        implements OnClickListener, Callbacks, DialogInterface.OnClickListener {
+        implements OnClickListener, Callbacks, DialogInterface.OnClickListener,
+        LoaderManager.LoaderCallbacks<AppStorageStats> {
     private static final String TAG = AppStorageSettings.class.getSimpleName();
 
     //internal constants used in Handler
@@ -123,6 +127,7 @@
     private boolean mCanClearData = true;
     private boolean mHaveSizes = false;
 
+    private AppStorageStats mLastResult;
     private long mLastCodeSize = -1;
     private long mLastDataSize = -1;
     private long mLastExternalCodeSize = -1;
@@ -139,6 +144,7 @@
 
     private VolumeInfo[] mCandidates;
     private AlertDialog.Builder mDialogBuilder;
+    private ApplicationInfo mInfo;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -152,7 +158,7 @@
     @Override
     public void onResume() {
         super.onResume();
-        mState.requestSize(mPackageName, mUserId);
+        updateSize();
     }
 
     private void setupViews() {
@@ -266,79 +272,13 @@
         return Formatter.formatFileSize(getActivity(), size);
     }
 
-    private void refreshSizeInfo() {
-        if (mAppEntry.size == ApplicationsState.SIZE_INVALID
-                || mAppEntry.size == ApplicationsState.SIZE_UNKNOWN) {
-            mLastCodeSize = mLastDataSize = mLastCacheSize = mLastTotalSize = -1;
-            if (!mHaveSizes) {
-                mAppSize.setSummary(mComputingStr);
-                mDataSize.setSummary(mComputingStr);
-                mCacheSize.setSummary(mComputingStr);
-                mTotalSize.setSummary(mComputingStr);
-            }
-            mClearDataButton.setEnabled(false);
-            mClearCacheButton.setEnabled(false);
-        } else {
-            mHaveSizes = true;
-            long codeSize = mAppEntry.codeSize;
-            long dataSize = mAppEntry.dataSize;
-            if (Environment.isExternalStorageEmulated()) {
-                codeSize += mAppEntry.externalCodeSize;
-                dataSize +=  mAppEntry.externalDataSize;
-            } else {
-                if (mLastExternalCodeSize != mAppEntry.externalCodeSize) {
-                    mLastExternalCodeSize = mAppEntry.externalCodeSize;
-                    mExternalCodeSize.setSummary(getSizeStr(mAppEntry.externalCodeSize));
-                }
-                if (mLastExternalDataSize !=  mAppEntry.externalDataSize) {
-                    mLastExternalDataSize =  mAppEntry.externalDataSize;
-                    mExternalDataSize.setSummary(getSizeStr( mAppEntry.externalDataSize));
-                }
-            }
-            if (mLastCodeSize != codeSize) {
-                mLastCodeSize = codeSize;
-                mAppSize.setSummary(getSizeStr(codeSize));
-            }
-            if (mLastDataSize != dataSize) {
-                mLastDataSize = dataSize;
-                mDataSize.setSummary(getSizeStr(dataSize));
-            }
-            long cacheSize = mAppEntry.cacheSize + mAppEntry.externalCacheSize;
-            if (mLastCacheSize != cacheSize) {
-                mLastCacheSize = cacheSize;
-                mCacheSize.setSummary(getSizeStr(cacheSize));
-            }
-            if (mLastTotalSize != mAppEntry.size) {
-                mLastTotalSize = mAppEntry.size;
-                mTotalSize.setSummary(getSizeStr(mAppEntry.size));
-            }
-
-            if ((mAppEntry.dataSize+ mAppEntry.externalDataSize) <= 0 || !mCanClearData) {
-                mClearDataButton.setEnabled(false);
-            } else {
-                mClearDataButton.setEnabled(true);
-                mClearDataButton.setOnClickListener(this);
-            }
-            if (cacheSize <= 0) {
-                mClearCacheButton.setEnabled(false);
-            } else {
-                mClearCacheButton.setEnabled(true);
-                mClearCacheButton.setOnClickListener(this);
-            }
-        }
-        if (mAppsControlDisallowedBySystem) {
-            mClearCacheButton.setEnabled(false);
-            mClearDataButton.setEnabled(false);
-        }
-    }
-
     @Override
     protected boolean refreshUi() {
         retrieveAppEntry();
         if (mAppEntry == null) {
             return false;
         }
-        refreshSizeInfo();
+        updateUiWithSize(mLastResult);
         refreshGrantedUriPermissions();
 
         final VolumeInfo currentVol = getActivity().getPackageManager()
@@ -454,7 +394,7 @@
         mClearDataButton.setText(R.string.clear_user_data_text);
         if (result == OP_SUCCESSFUL) {
             Log.i(TAG, "Cleared user data for package : "+packageName);
-            mState.requestSize(mPackageName, mUserId);
+            updateSize();
         } else {
             mClearDataButton.setEnabled(true);
         }
@@ -570,8 +510,91 @@
 
     @Override
     public void onPackageSizeChanged(String packageName) {
-        if (packageName.equals(mAppEntry.info.packageName)) {
-            refreshSizeInfo();
+    }
+
+    @Override
+    public Loader<AppStorageStats> onCreateLoader(int id, Bundle args) {
+        Context context = getContext();
+        return new FetchPackageStorageAsyncLoader(
+                context, new StorageStatsSource(context), mInfo, UserHandle.of(mUserId));
+    }
+
+    @Override
+    public void onLoadFinished(Loader<AppStorageStats> loader, AppStorageStats result) {
+        mLastResult = result;
+        updateUiWithSize(result);
+    }
+
+    @Override
+    public void onLoaderReset(Loader<AppStorageStats> loader) {
+    }
+
+    private void updateSize() {
+        PackageManager packageManager = getPackageManager();
+        try {
+            mInfo = packageManager.getApplicationInfo(mPackageName, 0);
+        } catch (PackageManager.NameNotFoundException e) {
+            Log.e(TAG, "Could not find package", e);
+        }
+
+        if (mInfo == null) {
+            return;
+        }
+
+        getLoaderManager().restartLoader(1, Bundle.EMPTY, this);
+    }
+
+    private void updateUiWithSize(AppStorageStats result) {
+        if (result == null) {
+            mLastCodeSize = mLastDataSize = mLastCacheSize = mLastTotalSize = -1;
+            if (!mHaveSizes) {
+                mAppSize.setSummary(mComputingStr);
+                mDataSize.setSummary(mComputingStr);
+                mCacheSize.setSummary(mComputingStr);
+                mTotalSize.setSummary(mComputingStr);
+            }
+            mClearDataButton.setEnabled(false);
+            mClearCacheButton.setEnabled(false);
+        } else {
+            mHaveSizes = true;
+            long codeSize = result.getCodeBytes();
+            long dataSize = result.getDataBytes();
+            if (mLastCodeSize != codeSize) {
+                mLastCodeSize = codeSize;
+                mAppSize.setSummary(getSizeStr(codeSize));
+            }
+            if (mLastDataSize != dataSize) {
+                mLastDataSize = dataSize;
+                mDataSize.setSummary(getSizeStr(dataSize));
+            }
+            long cacheSize = result.getCacheBytes();
+            if (mLastCacheSize != cacheSize) {
+                mLastCacheSize = cacheSize;
+                mCacheSize.setSummary(getSizeStr(cacheSize));
+            }
+
+            long totalSize = codeSize + dataSize + cacheSize;
+            if (mLastTotalSize != totalSize) {
+                mLastTotalSize = totalSize;
+                mTotalSize.setSummary(getSizeStr(totalSize));
+            }
+
+            if (dataSize <= 0 || !mCanClearData) {
+                mClearDataButton.setEnabled(false);
+            } else {
+                mClearDataButton.setEnabled(true);
+                mClearDataButton.setOnClickListener(this);
+            }
+            if (cacheSize <= 0) {
+                mClearCacheButton.setEnabled(false);
+            } else {
+                mClearCacheButton.setEnabled(true);
+                mClearCacheButton.setOnClickListener(this);
+            }
+        }
+        if (mAppsControlDisallowedBySystem) {
+            mClearCacheButton.setEnabled(false);
+            mClearDataButton.setEnabled(false);
         }
     }
 
@@ -586,7 +609,7 @@
                     break;
                 case MSG_CLEAR_CACHE:
                     // Refresh size info
-                    mState.requestSize(mPackageName, mUserId);
+                    updateSize();
                     break;
             }
         }
diff --git a/src/com/android/settings/applications/FetchPackageStorageAsyncLoader.java b/src/com/android/settings/applications/FetchPackageStorageAsyncLoader.java
new file mode 100644
index 0000000..3477299
--- /dev/null
+++ b/src/com/android/settings/applications/FetchPackageStorageAsyncLoader.java
@@ -0,0 +1,53 @@
+/*
+ * 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.applications;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.os.UserHandle;
+
+import com.android.internal.util.Preconditions;
+import com.android.settings.utils.AsyncLoader;
+import com.android.settingslib.applications.StorageStatsSource;
+import com.android.settingslib.applications.StorageStatsSource.AppStorageStats;
+
+/**
+ * Fetches the storage stats using the StorageStatsManager for a given package and user tuple.
+ */
+public class FetchPackageStorageAsyncLoader extends AsyncLoader<AppStorageStats> {
+    private final StorageStatsSource mSource;
+    private final ApplicationInfo mInfo;
+    private final UserHandle mUser;
+
+    public FetchPackageStorageAsyncLoader(Context context, @NonNull StorageStatsSource source,
+            @NonNull ApplicationInfo info, @NonNull UserHandle user) {
+        super(context);
+        mSource = Preconditions.checkNotNull(source);
+        mInfo = info;
+        mUser = user;
+    }
+
+    @Override
+    public AppStorageStats loadInBackground() {
+        return mSource.getStatsForPackage(mInfo.volumeUuid, mInfo.packageName, mUser);
+    }
+
+    @Override
+    protected void onDiscardResult(AppStorageStats result) {
+    }
+}
diff --git a/src/com/android/settings/applications/assist/ManageAssist.java b/src/com/android/settings/applications/assist/ManageAssist.java
index b1ca5c6..a54f0ff 100644
--- a/src/com/android/settings/applications/assist/ManageAssist.java
+++ b/src/com/android/settings/applications/assist/ManageAssist.java
@@ -50,15 +50,7 @@
 
     @Override
     protected List<PreferenceController> getPreferenceControllers(Context context) {
-        final Lifecycle lifecycle = getLifecycle();
-        final List<PreferenceController> controllers = new ArrayList<>();
-        controllers.add(new DefaultAssistPreferenceController(context));
-        controllers.add(new GestureAssistPreferenceController(context));
-        controllers.add(new AssistContextPreferenceController(context, lifecycle));
-        controllers.add(new AssistScreenshotPreferenceController(context, lifecycle));
-        controllers.add(new AssistFlashScreenPreferenceController(context, lifecycle));
-        controllers.add(new DefaultVoiceInputPreferenceController(context, lifecycle));
-        return controllers;
+        return buildPreferenceControllers(context, getLifecycle());
     }
 
     @Override
@@ -74,6 +66,19 @@
                 .setTitle(R.string.assist_footer);
     }
 
+    private static List<PreferenceController> buildPreferenceControllers(Context context,
+            Lifecycle lifecycle) {
+        final List<PreferenceController> controllers = new ArrayList<>();
+        controllers.add(new DefaultAssistPreferenceController(context));
+        controllers.add(new GestureAssistPreferenceController(context));
+        controllers.add(new AssistContextPreferenceController(context, lifecycle));
+        controllers.add(new AssistScreenshotPreferenceController(context, lifecycle));
+        controllers.add(new AssistFlashScreenPreferenceController(context, lifecycle));
+        controllers.add(new DefaultVoiceInputPreferenceController(context, lifecycle));
+        return controllers;
+    }
+
+
     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
                 @Override
@@ -85,19 +90,8 @@
                 }
 
                 @Override
-                public List<String> getNonIndexableKeys(Context context) {
-                    List<String> result = new ArrayList<>();
-                    new DefaultAssistPreferenceController(context).updateNonIndexableKeys(result);
-                    new GestureAssistPreferenceController(context).updateNonIndexableKeys(result);
-                    new AssistContextPreferenceController(context, null)
-                            .updateNonIndexableKeys(result);
-                    new AssistScreenshotPreferenceController(context, null)
-                            .updateNonIndexableKeys(result);
-                    new AssistFlashScreenPreferenceController(context, null)
-                            .updateNonIndexableKeys(result);
-                    new DefaultVoiceInputPreferenceController(context, null)
-                            .updateNonIndexableKeys(result);
-                    return result;
+                public List<PreferenceController> getPreferenceControllers(Context context) {
+                    return buildPreferenceControllers(context, null /* lifecycle */);
                 }
             };
 }
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index e0bb8bc..e0ed1eb 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -53,7 +53,6 @@
 import com.android.settings.applications.DrawOverlayDetails;
 import com.android.settings.applications.InstalledAppDetails;
 import com.android.settings.applications.ManageApplications;
-import com.android.settings.applications.assist.ManageAssist;
 import com.android.settings.applications.ManageDomainUrls;
 import com.android.settings.applications.NotificationApps;
 import com.android.settings.applications.PictureInPictureSettings;
@@ -62,6 +61,7 @@
 import com.android.settings.applications.UsageAccessDetails;
 import com.android.settings.applications.VrListenerSettings;
 import com.android.settings.applications.WriteSettingsDetails;
+import com.android.settings.applications.assist.ManageAssist;
 import com.android.settings.bluetooth.BluetoothSettings;
 import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
 import com.android.settings.dashboard.SupportFragment;
@@ -84,11 +84,9 @@
 import com.android.settings.gestures.DoubleTapPowerSettings;
 import com.android.settings.gestures.DoubleTapScreenSettings;
 import com.android.settings.gestures.DoubleTwistGestureSettings;
-import com.android.settings.gestures.GestureSettings;
 import com.android.settings.gestures.PickupGestureSettings;
 import com.android.settings.gestures.SwipeToNotificationSettings;
 import com.android.settings.inputmethod.AvailableVirtualKeyboardFragment;
-import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
 import com.android.settings.inputmethod.KeyboardLayoutPickerFragment;
 import com.android.settings.inputmethod.PhysicalKeyboardFragment;
 import com.android.settings.inputmethod.SpellCheckersSettings;
@@ -104,7 +102,6 @@
 import com.android.settings.notification.ConfigureNotificationSettings;
 import com.android.settings.notification.NotificationAccessSettings;
 import com.android.settings.notification.NotificationStation;
-import com.android.settings.notification.OtherSoundSettings;
 import com.android.settings.notification.SoundSettings;
 import com.android.settings.notification.ZenAccessSettings;
 import com.android.settings.notification.ZenModeAutomationSettings;
@@ -147,7 +144,6 @@
             VpnSettings.class.getName(),
             DateTimeSettings.class.getName(),
             LocaleListEditor.class.getName(),
-            InputMethodAndLanguageSettings.class.getName(),
             AvailableVirtualKeyboardFragment.class.getName(),
             LanguageAndInputSettings.class.getName(),
             SpellCheckersSettings.class.getName(),
@@ -180,7 +176,6 @@
             WifiDisplaySettings.class.getName(),
             PowerUsageSummary.class.getName(),
             AccountSyncSettings.class.getName(),
-            GestureSettings.class.getName(),
             AssistGestureSettings.class.getName(),
             SwipeToNotificationSettings.class.getName(),
             DoubleTapPowerSettings.class.getName(),
@@ -208,7 +203,6 @@
             BatterySaverSettings.class.getName(),
             AppNotificationSettings.class.getName(),
             ChannelNotificationSettings.class.getName(),
-            OtherSoundSettings.class.getName(),
             ApnSettings.class.getName(),
             ApnEditor.class.getName(),
             WifiCallingSettings.class.getName(),
@@ -263,11 +257,9 @@
             Settings.StorageSettingsActivity.class.getName(),
             Settings.ManageApplicationsActivity.class.getName(),
             Settings.PowerUsageSummaryActivity.class.getName(),
-            Settings.GestureSettingsActivity.class.getName(),
             //personal_section
             Settings.LocationSettingsActivity.class.getName(),
             Settings.SecuritySettingsActivity.class.getName(),
-            Settings.InputMethodAndLanguageSettingsActivity.class.getName(),
             Settings.UserSettingsActivity.class.getName(),
             //system_section
             Settings.DateTimeSettingsActivity.class.getName(),
@@ -281,8 +273,9 @@
             // Home page
             Settings.NetworkDashboardActivity.class.getName(),
             Settings.ConnectedDeviceDashboardActivity.class.getName(),
+            Settings.WifiDisplaySettingsActivity.class.getName(),
             Settings.AppAndNotificationDashboardActivity.class.getName(),
-            "com.android.settings.BatteryDashboardAlias",
+            Settings.StorageDashboardActivity.class.getName(),
             "com.android.settings.SoundDashboardAlias",
             "com.android.settings.SecurityDashboardAlias",
             "com.android.settings.UsersDashboardAlias",
@@ -296,9 +289,5 @@
             "com.android.settings.DataUsageDashboardAlias",
             // Home page > System
             Settings.LanguageAndInputSettingsActivity.class.getName(),
-            "com.android.settings.DateTimeDashboardAlias",
-            "com.android.settings.AccessibilityDashboardAlias",
-            "com.android.settings.AboutDeviceDashboardAlias",
-            "com.android.settings.EnterprisePrivacyDashboardAlias",
     };
 }
diff --git a/src/com/android/settings/dashboard/DashboardContainerFragment.java b/src/com/android/settings/dashboard/DashboardContainerFragment.java
deleted file mode 100644
index b3ee808..0000000
--- a/src/com/android/settings/dashboard/DashboardContainerFragment.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.dashboard;
-
-import android.app.Activity;
-import android.app.Fragment;
-import android.app.FragmentManager;
-import android.content.Context;
-import android.os.Bundle;
-import android.support.v13.app.FragmentPagerAdapter;
-import android.text.TextUtils;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.R;
-import com.android.settings.SettingsActivity;
-import com.android.settings.core.InstrumentedFragment;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
-import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.overlay.SupportFeatureProvider;
-import com.android.settings.widget.RtlCompatibleViewPager;
-import com.android.settings.widget.SlidingTabLayout;
-import com.android.settingslib.drawer.SettingsDrawerActivity;
-
-/**
- * Container for Dashboard fragments.
- */
-public final class DashboardContainerFragment extends InstrumentedFragment {
-
-    public static final String EXTRA_SELECT_SETTINGS_TAB = ":settings:select_settings_tab";
-
-    private static final String ARG_SUPPORT_TAB = "SUPPORT";
-    private static final String ARG_SUMMARY_TAB = "SUMMARY";
-    private static final int INDEX_SUMMARY_FRAGMENT = 0;
-    private static final int INDEX_SUPPORT_FRAGMENT = 1;
-
-    private RtlCompatibleViewPager mViewPager;
-    private View mHeaderView;
-    private DashboardViewPagerAdapter mPagerAdapter;
-
-    @Override
-    public int getMetricsCategory() {
-        return MetricsProto.MetricsEvent.DASHBOARD_CONTAINER;
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setHasOptionsMenu(true);
-    }
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
-        final View content = inflater.inflate(R.layout.dashboard_container, parent, false);
-        mViewPager = (RtlCompatibleViewPager) content.findViewById(R.id.pager);
-        mPagerAdapter = new DashboardViewPagerAdapter(getContext(),
-                getChildFragmentManager(), mViewPager);
-        mViewPager.setAdapter(mPagerAdapter);
-        mViewPager.addOnPageChangeListener(
-                new TabChangeListener((SettingsActivity) getActivity(), mMetricsFeatureProvider));
-
-        // check if support tab needs to be selected
-        final String selectedTab = getArguments().
-                getString(EXTRA_SELECT_SETTINGS_TAB, ARG_SUMMARY_TAB);
-        if (TextUtils.equals(selectedTab, ARG_SUPPORT_TAB)) {
-            mViewPager.setCurrentItem(INDEX_SUPPORT_FRAGMENT);
-        } else {
-            mViewPager.setCurrentItem(INDEX_SUMMARY_FRAGMENT);
-        }
-
-        mHeaderView = inflater.inflate(R.layout.dashboard_container_header, parent, false);
-        ((SlidingTabLayout) mHeaderView).setViewPager(mViewPager);
-        return content;
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        if (mPagerAdapter.getCount() > 1) {
-            final Activity activity = getActivity();
-            if (activity instanceof SettingsDrawerActivity) {
-                ((SettingsDrawerActivity) getActivity()).setContentHeaderView(mHeaderView);
-            }
-        }
-    }
-
-    private static final class DashboardViewPagerAdapter extends FragmentPagerAdapter {
-
-        private final Context mContext;
-        private final SupportFeatureProvider mSupportFeatureProvider;
-        private final RtlCompatibleViewPager mViewPager;
-
-        public DashboardViewPagerAdapter(Context context, FragmentManager fragmentManager,
-                RtlCompatibleViewPager viewPager) {
-            super(fragmentManager);
-            mContext = context;
-            mSupportFeatureProvider =
-                    FeatureFactory.getFactory(context).getSupportFeatureProvider(context);
-            mViewPager = viewPager;
-        }
-
-        @Override
-        public CharSequence getPageTitle(int position) {
-            switch (position) {
-                case INDEX_SUMMARY_FRAGMENT:
-                    return mContext.getString(R.string.page_tab_title_summary);
-                case INDEX_SUPPORT_FRAGMENT:
-                    return mContext.getString(R.string.page_tab_title_support);
-            }
-            return super.getPageTitle(position);
-        }
-
-        @Override
-        public Fragment getItem(int position) {
-            switch (position) {
-                case INDEX_SUMMARY_FRAGMENT:
-                    return new DashboardSummary();
-                case INDEX_SUPPORT_FRAGMENT:
-                    return new SupportFragment();
-                default:
-                    throw new IllegalArgumentException(
-                            String.format(
-                                    "Position %d does not map to a valid dashboard fragment",
-                                    position));
-            }
-        }
-
-        @Override
-        public Object instantiateItem(ViewGroup container, int position) {
-            return super.instantiateItem(container,
-                    mViewPager.getRtlAwareIndex(position));
-        }
-
-        @Override
-        public int getCount() {
-            return mSupportFeatureProvider == null ? 1 : 2;
-        }
-    }
-
-    private static final class TabChangeListener
-            implements RtlCompatibleViewPager.OnPageChangeListener {
-
-        private final SettingsActivity mActivity;
-        private final MetricsFeatureProvider mMetricsFeatureProvider;
-
-        public TabChangeListener(SettingsActivity activity,
-                MetricsFeatureProvider metricsFeatureProvider) {
-            mActivity = activity;
-            mMetricsFeatureProvider = metricsFeatureProvider;
-        }
-
-        @Override
-        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
-            // Do nothing.
-        }
-
-        @Override
-        public void onPageScrollStateChanged(int state) {
-            // Do nothing
-        }
-
-        @Override
-        public void onPageSelected(int position) {
-            switch (position) {
-                case INDEX_SUMMARY_FRAGMENT:
-                    mMetricsFeatureProvider.action(
-                            mActivity, MetricsProto.MetricsEvent.ACTION_SELECT_SUMMARY);
-                    mActivity.setDisplaySearchMenu(true);
-                    break;
-                case INDEX_SUPPORT_FRAGMENT:
-                    mMetricsFeatureProvider.action(
-                            mActivity, MetricsProto.MetricsEvent.ACTION_SELECT_SUPPORT_FRAGMENT);
-                    mActivity.setDisplaySearchMenu(false);
-                    break;
-            }
-        }
-    }
-}
diff --git a/src/com/android/settings/dashboard/DashboardFragmentRegistry.java b/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
index 4d0b8cf..8935ee3 100644
--- a/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
+++ b/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
@@ -28,7 +28,6 @@
 import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
 import com.android.settings.deviceinfo.StorageDashboardFragment;
 import com.android.settings.fuelgauge.PowerUsageSummary;
-import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
 import com.android.settings.language.LanguageAndInputSettings;
 import com.android.settings.network.NetworkDashboardFragment;
 import com.android.settings.notification.SoundSettings;
@@ -80,8 +79,6 @@
                 CategoryKey.CATEGORY_ACCOUNT);
         PARENT_TO_CATEGORY_KEY_MAP.put(
                 SystemDashboardFragment.class.getName(), CategoryKey.CATEGORY_SYSTEM);
-        PARENT_TO_CATEGORY_KEY_MAP.put(InputMethodAndLanguageSettings.class.getName(),
-                CategoryKey.CATEGORY_SYSTEM_LANGUAGE);
         PARENT_TO_CATEGORY_KEY_MAP.put(LanguageAndInputSettings.class.getName(),
                 CategoryKey.CATEGORY_SYSTEM_LANGUAGE);
         PARENT_TO_CATEGORY_KEY_MAP.put(DevelopmentSettings.class.getName(),
diff --git a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
index a9fd21b..6c492cc 100644
--- a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
@@ -36,6 +36,7 @@
 import com.android.settings.Utils;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.core.instrumentation.MetricsFeatureProvider;
+import com.android.settings.core.lifecycle.Lifecycle;
 import com.android.settings.core.lifecycle.LifecycleObserver;
 import com.android.settings.core.lifecycle.events.OnResume;
 import com.android.settings.overlay.FeatureFactory;
@@ -61,12 +62,16 @@
     private int mDevHitCountdown;
     private boolean mProcessingLastDevHit;
 
-    public BuildNumberPreferenceController(Context context, Activity activity, Fragment fragment) {
+    public BuildNumberPreferenceController(Context context, Activity activity, Fragment fragment,
+            Lifecycle lifecycle) {
         super(context);
         mActivity = activity;
         mFragment = fragment;
-        mUm = UserManager.get(activity);
+        mUm = UserManager.get(context);
         mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
+        if (lifecycle != null) {
+            lifecycle.addObserver(this);
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
index 72e1493..298a7ad 100644
--- a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
+++ b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
@@ -184,16 +184,19 @@
                 }
 
                 @Override
-                public List<String> getNonIndexableKeys(Context context) {
-                    if (!FeatureFactory.getFactory(context).getDashboardFeatureProvider(context)
-                            .isEnabled()) {
-                        return null;
-                    }
-                    final ManageStoragePreferenceController controller =
-                            new ManageStoragePreferenceController(context);
-                    final List<String> keys = new ArrayList<>();
-                    controller.updateNonIndexableKeys(keys);
-                    return keys;
+                public List<PreferenceController> getPreferenceControllers(Context context) {
+                    final StorageManager sm = context.getSystemService(StorageManager.class);
+                    final UserManagerWrapper userManager =
+                            new UserManagerWrapperImpl(context.getSystemService(UserManager.class));
+                    final List<PreferenceController> controllers = new ArrayList<>();
+                    controllers.add(new StorageSummaryDonutPreferenceController(context));
+                    controllers.add(new StorageItemPreferenceController(context, null /* host */,
+                            null /* volume */, new StorageManagerVolumeProvider(sm)));
+                    controllers.addAll(SecondaryUserController.getSecondaryUserControllers(
+                            context, userManager));
+                    controllers.add(new ManageStoragePreferenceController(context));
+                    return controllers;
                 }
+
             };
 }
diff --git a/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java b/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java
index 0bf43e2..4fcacd8 100644
--- a/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java
+++ b/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java
@@ -28,8 +28,6 @@
 import com.android.settings.Utils;
 import com.android.settings.core.PreferenceController;
 
-import java.util.List;
-
 import static android.content.Context.CARRIER_CONFIG_SERVICE;
 
 public class SystemUpdatePreferenceController extends PreferenceController {
@@ -67,14 +65,6 @@
     }
 
     @Override
-    public void updateNonIndexableKeys(List<String> keys) {
-        // TODO: system update needs to be fixed for non-owner user b/22760654
-        if (!isAvailable()) {
-            keys.add(KEY_SYSTEM_UPDATE_SETTINGS);
-        }
-    }
-
-    @Override
     public boolean handlePreferenceTreeClick(Preference preference) {
         if (KEY_SYSTEM_UPDATE_SETTINGS.equals(preference.getKey())) {
             CarrierConfigManager configManager =
diff --git a/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java b/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java
index d5d96a5..f54c685 100644
--- a/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java
+++ b/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java
@@ -23,7 +23,6 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.UserInfo;
 import android.os.UserHandle;
-import android.util.ArraySet;
 import android.util.Log;
 import android.util.SparseArray;
 
@@ -75,27 +74,31 @@
         Log.d(TAG, "Loading apps");
         List<ApplicationInfo> applicationInfos =
                 mPackageManager.getInstalledApplicationsAsUser(0, userId);
-        ArraySet<Integer> seenUid = new ArraySet<>(); // some apps share a uid
         AppsStorageResult result = new AppsStorageResult();
+        UserHandle myUser = UserHandle.of(userId);
         for (int i = 0, size = applicationInfos.size(); i < size; i++) {
             ApplicationInfo app = applicationInfos.get(i);
-            if (seenUid.contains(app.uid)) {
-                continue;
-            }
-            seenUid.add(app.uid);
+            StorageStatsSource.AppStorageStats stats =
+                    mStatsManager.getStatsForPackage(mUuid, app.packageName, myUser);
 
-            StorageStatsSource.AppStorageStats stats = mStatsManager.getStatsForUid(mUuid, app.uid);
-            // Note: This omits cache intentionally -- we are not attributing it to the apps.
-            long appSize = stats.getCodeBytes() + stats.getDataBytes();
+            long attributedAppSizeInBytes = stats.getDataBytes();
+            // This matches how the package manager calculates sizes -- by zeroing out code sizes of
+            // system apps which are not updated. My initial tests suggest that this results in the
+            // original code size being counted for updated system apps when they shouldn't, but
+            // I am not sure how to avoid this problem without specifically going in to find that
+            // code size.
+            if (!app.isSystemApp() || app.isUpdatedSystemApp()) {
+                attributedAppSizeInBytes += stats.getCodeBytes();
+            }
             switch (app.category) {
                 case CATEGORY_GAME:
-                    result.gamesSize += appSize;
+                    result.gamesSize += attributedAppSizeInBytes;
                     break;
                 case CATEGORY_AUDIO:
-                    result.musicAppsSize += appSize;
+                    result.musicAppsSize += attributedAppSizeInBytes;
                     break;
                 default:
-                    result.otherAppsSize += appSize;
+                    result.otherAppsSize += attributedAppSizeInBytes;
                     break;
             }
         }
diff --git a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
index 826ec09..fc96340 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
@@ -71,9 +71,11 @@
 
         mHistPref = (BatteryHistoryPreference) findPreference(KEY_BATTERY_GRAPH);
         mUsageListGroup = (PreferenceGroup) findPreference(KEY_BATTERY_USAGE_LIST);
-        mPowerUsageFeatureProvider = FeatureFactory.getFactory(getContext())
-                .getPowerUsageFeatureProvider(getContext());
-        mPackageManager = getContext().getPackageManager();
+
+        final Context context = getContext();
+        mPowerUsageFeatureProvider = FeatureFactory.getFactory(context)
+                .getPowerUsageFeatureProvider(context);
+        mPackageManager = context.getPackageManager();
     }
 
     @Override
@@ -137,9 +139,9 @@
             return UsageType.USER;
         } else if (drainType == DrainType.CELL) {
             return UsageType.CELL;
-        } else if (uid == Process.SYSTEM_UID || uid == Process.ROOT_UID) {
+        } else if (mPowerUsageFeatureProvider.isTypeSystem(sipper)) {
             return UsageType.SYSTEM;
-        } else if (mPowerUsageFeatureProvider.isTypeService(sipper.mPackages)) {
+        } else if (mPowerUsageFeatureProvider.isTypeService(sipper)) {
             return UsageType.SERVICE;
         } else {
             return UsageType.APP;
diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
index 3dab38e..7cb6c00 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
@@ -17,38 +17,44 @@
 package com.android.settings.fuelgauge;
 
 import android.content.Intent;
+import com.android.internal.os.BatterySipper;
 
 /**
  * Feature Provider used in power usage
  */
 public interface PowerUsageFeatureProvider {
-  /**
-   * Check whether location setting is enabled
-   */
-  boolean isLocationSettingEnabled(String[] packages);
+    /**
+     * Check whether location setting is enabled
+     */
+    boolean isLocationSettingEnabled(String[] packages);
 
-  /**
-   * Check whether additional battery info feature is enabled.
-   */
-  boolean isAdditionalBatteryInfoEnabled();
+    /**
+     * Check whether additional battery info feature is enabled.
+     */
+    boolean isAdditionalBatteryInfoEnabled();
 
-  /**
-   * Gets an {@link Intent} to show additional battery info.
-   */
-  Intent getAdditionalBatteryInfoIntent();
+    /**
+     * Gets an {@link Intent} to show additional battery info.
+     */
+    Intent getAdditionalBatteryInfoIntent();
 
-  /**
-   * Check whether advanced ui is enabled
-   */
-  boolean isAdvancedUiEnabled();
+    /**
+     * Check whether advanced ui is enabled
+     */
+    boolean isAdvancedUiEnabled();
 
-  /**
-   * Check whether it is type service
-   */
-  boolean isTypeService(String[] packages);
+    /**
+     * Check whether it is type service
+     */
+    boolean isTypeService(BatterySipper sipper);
 
-  /**
-   * Check whether the toggle for power accounting is enabled
-   */
-  boolean isPowerAccountingToggleEnabled();
+    /**
+     * Check whether it is type system
+     */
+    boolean isTypeSystem(BatterySipper sipper);
+
+    /**
+     * Check whether the toggle for power accounting is enabled
+     */
+    boolean isPowerAccountingToggleEnabled();
 }
diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
index 7f843e2..b8c40fd 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
@@ -16,9 +16,49 @@
 
 package com.android.settings.fuelgauge;
 
+import android.content.Context;
 import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.Process;
+import com.android.internal.os.BatterySipper;
+import com.android.internal.util.ArrayUtils;
 
 public class PowerUsageFeatureProviderImpl implements PowerUsageFeatureProvider {
+
+    private static final String PACKAGE_CALENDAR_PROVIDER = "com.android.providers.calendar";
+    private static final String PACKAGE_MEDIA_PROVIDER = "com.android.providers.media";
+    private static final String[] PACKAGES_SYSTEM = {PACKAGE_MEDIA_PROVIDER,
+            PACKAGE_CALENDAR_PROVIDER};
+
+    protected PackageManager mPackageManager;
+
+    public PowerUsageFeatureProviderImpl(Context context) {
+        mPackageManager = context.getPackageManager();
+    }
+
+    @Override
+    public boolean isTypeService(BatterySipper sipper) {
+        return false;
+    }
+
+    @Override
+    public boolean isTypeSystem(BatterySipper sipper) {
+        final int uid = sipper.uidObj == null ? -1 : sipper.getUid();
+        sipper.mPackages = mPackageManager.getPackagesForUid(uid);
+        // Classify all the sippers to type system if the range of uid is 0...FIRST_APPLICATION_UID
+        if (uid >= Process.ROOT_UID && uid < Process.FIRST_APPLICATION_UID) {
+            return true;
+        } else if (sipper.mPackages != null) {
+            for (final String packageName : sipper.mPackages) {
+                if (ArrayUtils.contains(PACKAGES_SYSTEM, packageName)) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
     @Override
     public boolean isLocationSettingEnabled(String[] packages) {
         return false;
@@ -40,11 +80,6 @@
     }
 
     @Override
-    public boolean isTypeService(String[] packages) {
-        return false;
-    }
-
-    @Override
     public boolean isPowerAccountingToggleEnabled() {
         return false;
     }
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 5f0e6e0..50c3f06 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -99,16 +99,17 @@
 
     @VisibleForTesting
     boolean mShowAllApps = false;
-
+    @VisibleForTesting
     Preference mScreenUsagePref;
     @VisibleForTesting
     Preference mScreenConsumptionPref;
     @VisibleForTesting
     Preference mCellularNetworkPref;
+    @VisibleForTesting
+    PowerUsageFeatureProvider mPowerFeatureProvider;
 
     private LayoutPreference mBatteryLayoutPref;
     private PreferenceGroup mAppListGroup;
-
     private int mStatsType = BatteryStats.STATS_SINCE_CHARGED;
 
     @Override
@@ -121,6 +122,8 @@
         mScreenUsagePref = findPreference(KEY_SCREEN_USAGE);
         mScreenConsumptionPref = findPreference(KEY_SCREEN_CONSUMPTION);
         mCellularNetworkPref = findPreference(KEY_CELLULAR_NETWORK);
+
+        initFeatureProvider();
     }
 
     @Override
@@ -193,14 +196,11 @@
 
         menu.add(Menu.NONE, MENU_HIGH_POWER_APPS, Menu.NONE, R.string.high_power_apps);
 
-        PowerUsageFeatureProvider powerUsageFeatureProvider =
-                FeatureFactory.getFactory(getContext()).getPowerUsageFeatureProvider(getContext());
-        if (powerUsageFeatureProvider != null &&
-                powerUsageFeatureProvider.isAdditionalBatteryInfoEnabled()) {
+        if (mPowerFeatureProvider.isAdditionalBatteryInfoEnabled()) {
             menu.add(Menu.NONE, MENU_ADDITIONAL_BATTERY_INFO,
                     Menu.NONE, R.string.additional_battery_info);
         }
-        if (powerUsageFeatureProvider.isPowerAccountingToggleEnabled()) {
+        if (mPowerFeatureProvider.isPowerAccountingToggleEnabled()) {
             menu.add(Menu.NONE, MENU_TOGGLE_APPS, Menu.NONE,
                     mShowAllApps ? R.string.hide_extra_apps : R.string.show_all_apps);
         }
@@ -579,12 +579,12 @@
     @VisibleForTesting
     boolean shouldHideSipper(BatterySipper sipper) {
         final DrainType drainType = sipper.drainType;
-        final int uid = sipper.getUid();
 
         return drainType == DrainType.IDLE || drainType == DrainType.CELL
-                || drainType == DrainType.SCREEN || uid == Process.ROOT_UID
-                || uid == Process.SYSTEM_UID
-                || (sipper.totalPowerMah * SECONDS_IN_HOUR) < MIN_POWER_THRESHOLD_MILLI_AMP;
+                || drainType == DrainType.SCREEN || drainType == DrainType.BLUETOOTH
+                || (sipper.totalPowerMah * SECONDS_IN_HOUR) < MIN_POWER_THRESHOLD_MILLI_AMP
+                || mPowerFeatureProvider.isTypeService(sipper)
+                || mPowerFeatureProvider.isTypeSystem(sipper);
     }
 
     @VisibleForTesting
@@ -620,6 +620,13 @@
         mBatteryLayoutPref = layoutPreference;
     }
 
+    @VisibleForTesting
+    void initFeatureProvider() {
+        final Context context = getContext();
+        mPowerFeatureProvider = FeatureFactory.getFactory(context)
+                .getPowerUsageFeatureProvider(context);
+    }
+
     private static List<BatterySipper> getFakeStats() {
         ArrayList<BatterySipper> stats = new ArrayList<>();
         float use = 5;
diff --git a/src/com/android/settings/gestures/GestureSettings.java b/src/com/android/settings/gestures/GestureSettings.java
deleted file mode 100644
index 8c038ff..0000000
--- a/src/com/android/settings/gestures/GestureSettings.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.gestures;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.os.UserHandle;
-import android.provider.SearchIndexableResource;
-import android.support.v7.preference.Preference;
-import android.support.v7.widget.RecyclerView;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.android.internal.hardware.AmbientDisplayConfiguration;
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.R;
-import com.android.settings.core.PreferenceController;
-import com.android.settings.core.lifecycle.Lifecycle;
-import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settings.search.Indexable;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Top level fragment for gesture settings.
- * This will create individual switch preference for each gesture and handle updates when each
- * preference is updated
- */
-public class GestureSettings extends DashboardFragment {
-
-    private static final String TAG = "GestureSettings";
-    private List<GesturePreference> mPreferences;
-
-    @Override
-    protected int getPreferenceScreenResId() {
-        return R.xml.gesture_settings;
-    }
-
-    @Override
-    protected List<PreferenceController> getPreferenceControllers(Context context) {
-        final AmbientDisplayConfiguration ambientConfig = new AmbientDisplayConfiguration(context);
-        final List<PreferenceController> controllers = new ArrayList<>();
-        final Lifecycle lifecycle = getLifecycle();
-        controllers.add(new AssistGesturePreferenceController(context, lifecycle));
-        controllers.add(new SwipeToNotificationPreferenceController(context, lifecycle));
-        controllers.add(new DoubleTapPowerPreferenceController(context, lifecycle));
-        controllers.add(new DoubleTwistPreferenceController(context, lifecycle));
-        controllers.add(new PickupGesturePreferenceController(
-                context, lifecycle, ambientConfig, UserHandle.myUserId()));
-        controllers.add(new DoubleTapScreenPreferenceController(
-                context, lifecycle, ambientConfig, UserHandle.myUserId()));
-        return controllers;
-    }
-
-    @Override
-    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
-        super.onCreatePreferences(savedInstanceState, rootKey);
-        mPreferences = new ArrayList();
-        addPreferenceToTrackingList(AssistGesturePreferenceController.class);
-        addPreferenceToTrackingList(SwipeToNotificationPreferenceController.class);
-        addPreferenceToTrackingList(DoubleTapScreenPreferenceController.class);
-        addPreferenceToTrackingList(DoubleTwistPreferenceController.class);
-        addPreferenceToTrackingList(PickupGesturePreferenceController.class);
-        addPreferenceToTrackingList(DoubleTapPowerPreferenceController.class);
-    }
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        View view = super.onCreateView(inflater, container, savedInstanceState);
-        RecyclerView listview = getListView();
-        listview.addOnScrollListener(new RecyclerView.OnScrollListener() {
-            @Override
-            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
-                if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
-                    for (GesturePreference pref : mPreferences) {
-                        pref.setScrolling(true);
-                    }
-                } else if (newState == RecyclerView.SCROLL_STATE_IDLE) {
-                    for (GesturePreference pref : mPreferences) {
-                        pref.setScrolling(false);
-                    }
-                }
-            }
-
-            @Override
-            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
-            }
-        });
-        return view;
-    }
-
-    @Override
-    public void onStart() {
-        super.onStart();
-        for (GesturePreference preference : mPreferences) {
-            preference.onViewVisible();
-        }
-    }
-
-    @Override
-    public void onStop() {
-        super.onStop();
-        for (GesturePreference preference : mPreferences) {
-            preference.onViewInvisible();
-        }
-    }
-
-    @Override
-    protected String getLogTag() {
-        return TAG;
-    }
-
-    @Override
-    protected int getHelpResource() {
-        return R.string.help_url_gestures;
-    }
-
-    @Override
-    public int getMetricsCategory() {
-        return MetricsEvent.SETTINGS_GESTURES;
-    }
-
-    private <T extends PreferenceController> void addPreferenceToTrackingList(Class<T> clazz) {
-        final PreferenceController controller = getPreferenceController(clazz);
-        final Preference preference = findPreference(controller.getPreferenceKey());
-        if (preference != null && preference instanceof GesturePreference) {
-            mPreferences.add((GesturePreference) preference);
-        }
-    }
-}
diff --git a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
deleted file mode 100644
index 121af98..0000000
--- a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright (C) 2008 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.inputmethod;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.hardware.input.InputDeviceIdentifier;
-import android.speech.tts.TtsEngines;
-import android.support.v7.preference.Preference;
-
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.R;
-import com.android.settings.Settings.KeyboardLayoutPickerActivity;
-import com.android.settings.Utils;
-import com.android.settings.core.PreferenceController;
-import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.dashboard.SummaryLoader;
-import com.android.settings.language.PhoneLanguagePreferenceController;
-import com.android.settings.language.TtsPreferenceController;
-import com.android.settings.language.UserDictionaryPreferenceController;
-import com.android.settings.localepicker.LocaleFeatureProvider;
-import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settings.search.Indexable;
-import com.android.settings.search.SearchIndexableRaw;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @deprecated New features should use {@code InputAndGestureSettings} and
- * {@code LanguageAndRegionSettings} instead.
- */
-@Deprecated
-public class InputMethodAndLanguageSettings extends DashboardFragment
-        implements KeyboardLayoutDialogFragment.OnSetupKeyboardLayoutsListener, Indexable {
-
-    private static final String TAG = "IMEAndLanguageSetting";
-
-    private Intent mIntentWaitingForResult;
-
-    @Override
-    public int getMetricsCategory() {
-        return MetricsEvent.INPUTMETHOD_LANGUAGE;
-    }
-
-    @Override
-    protected String getLogTag() {
-        return TAG;
-    }
-
-    @Override
-    protected int getPreferenceScreenResId() {
-        return R.xml.language_settings;
-    }
-
-    @Override
-    protected List<PreferenceController> getPreferenceControllers(Context context) {
-        final GameControllerPreferenceController gameControllerPreferenceController =
-                new GameControllerPreferenceController(context);
-        getLifecycle().addObserver(gameControllerPreferenceController);
-
-        final List<PreferenceController> list = new ArrayList<>();
-        list.add(gameControllerPreferenceController);
-        list.add(new PhoneLanguagePreferenceController(context));
-        list.add(new SpellCheckerPreferenceController(context));
-        list.add(new UserDictionaryPreferenceController(context));
-        list.add(new TtsPreferenceController(context, new TtsEngines(context)));
-        return list;
-    }
-
-    @Override
-    public boolean onPreferenceTreeClick(Preference preference) {
-        // Input Method stuff
-        if (Utils.isMonkeyRunning()) {
-            return false;
-        }
-        return super.onPreferenceTreeClick(preference);
-    }
-
-    private void showKeyboardLayoutDialog(InputDeviceIdentifier inputDeviceIdentifier) {
-        KeyboardLayoutDialogFragment fragment = (KeyboardLayoutDialogFragment)
-                getFragmentManager().findFragmentByTag("keyboardLayout");
-        if (fragment == null) {
-            fragment = new KeyboardLayoutDialogFragment(inputDeviceIdentifier);
-            fragment.setTargetFragment(this, 0);
-            fragment.show(getActivity().getFragmentManager(), "keyboardLayout");
-        }
-    }
-
-    @Override
-    public void onSetupKeyboardLayouts(InputDeviceIdentifier inputDeviceIdentifier) {
-        final Intent intent = new Intent(Intent.ACTION_MAIN);
-        intent.setClass(getActivity(), KeyboardLayoutPickerActivity.class);
-        intent.putExtra(KeyboardLayoutPickerFragment.EXTRA_INPUT_DEVICE_IDENTIFIER,
-                inputDeviceIdentifier);
-        mIntentWaitingForResult = intent;
-        startActivityForResult(intent, 0);
-    }
-
-    @Override
-    public void onActivityResult(int requestCode, int resultCode, Intent data) {
-        super.onActivityResult(requestCode, resultCode, data);
-
-        if (mIntentWaitingForResult != null) {
-            InputDeviceIdentifier inputDeviceIdentifier = mIntentWaitingForResult
-                    .getParcelableExtra(KeyboardLayoutPickerFragment.EXTRA_INPUT_DEVICE_IDENTIFIER);
-            mIntentWaitingForResult = null;
-            showKeyboardLayoutDialog(inputDeviceIdentifier);
-        }
-    }
-
-    private static class SummaryProvider implements SummaryLoader.SummaryProvider {
-
-        private final SummaryLoader mSummaryLoader;
-        private LocaleFeatureProvider mLocaleFeatureProvider;
-
-        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
-            mSummaryLoader = summaryLoader;
-            mLocaleFeatureProvider = FeatureFactory.getFactory(context).getLocaleFeatureProvider();
-        }
-
-        @Override
-        public void setListening(boolean listening) {
-            if (listening) {
-                String localeNames = mLocaleFeatureProvider.getLocaleNames();
-                mSummaryLoader.setSummary(this, localeNames);
-            }
-        }
-    }
-
-    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
-            = new SummaryLoader.SummaryProviderFactory() {
-        @Override
-        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
-                SummaryLoader summaryLoader) {
-            return new SummaryProvider(activity, summaryLoader);
-        }
-    };
-
-    public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
-            new BaseSearchIndexProvider() {
-        @Override
-        public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
-            List<SearchIndexableRaw> indexables = new ArrayList<>();
-
-            final String screenTitle = context.getString(R.string.language_keyboard_settings_title);
-
-            // Locale picker.
-            final PhoneLanguagePreferenceController mLanguagePrefController =
-                    new PhoneLanguagePreferenceController(context);
-            if (mLanguagePrefController.isAvailable()) {
-                String localeNames = FeatureFactory.getFactory(context).getLocaleFeatureProvider()
-                        .getLocaleNames();
-                SearchIndexableRaw indexable = new SearchIndexableRaw(context);
-                indexable.key = mLanguagePrefController.getPreferenceKey();
-                indexable.title = context.getString(R.string.phone_language);
-                indexable.summaryOn = localeNames;
-                indexable.summaryOff = localeNames;
-                indexable.screenTitle = screenTitle;
-                indexables.add(indexable);
-            }
-
-            // Spell checker.
-            SearchIndexableRaw indexable = new SearchIndexableRaw(context);
-            indexable.key = SpellCheckerPreferenceController.KEY_SPELL_CHECKERS;
-            indexable.title = context.getString(R.string.spellcheckers_settings_title);
-            indexable.screenTitle = screenTitle;
-            indexable.keywords = context.getString(R.string.keywords_spell_checker);
-            indexables.add(indexable);
-
-            // User dictionary.
-            if (UserDictionaryList.getUserDictionaryLocalesSet(context) != null) {
-                indexable = new SearchIndexableRaw(context);
-                indexable.key = "user_dict_settings";
-                indexable.title = context.getString(R.string.user_dict_settings_title);
-                indexable.screenTitle = screenTitle;
-                indexables.add(indexable);
-            }
-
-            // Keyboard settings.
-            indexable = new SearchIndexableRaw(context);
-            indexable.key = "keyboard_settings";
-            indexable.title = context.getString(R.string.keyboard_settings_category);
-            indexable.screenTitle = screenTitle;
-            indexable.keywords = context.getString(R.string.keywords_keyboard_and_ime);
-            indexables.add(indexable);
-
-            if (!PhysicalKeyboardFragment.getPhysicalFullKeyboards().isEmpty()) {
-                // Hard keyboard category.
-                indexable = new SearchIndexableRaw(context);
-                indexable.key = "builtin_keyboard_settings";
-                indexable.title = context.getString(R.string.builtin_keyboard_settings_title);
-                indexable.screenTitle = screenTitle;
-                indexables.add(indexable);
-            }
-
-            // Text-to-speech.
-            TtsEngines ttsEngines = new TtsEngines(context);
-            if (!ttsEngines.getEngines().isEmpty()) {
-                indexable = new SearchIndexableRaw(context);
-                indexable.key = "tts_settings";
-                indexable.title = context.getString(R.string.tts_settings_title);
-                indexable.screenTitle = screenTitle;
-                indexable.keywords = context.getString(R.string.keywords_text_to_speech_output);
-                indexables.add(indexable);
-            }
-
-            // Pointer settings.
-            indexable = new SearchIndexableRaw(context);
-            indexable.key = "pointer_settings_category";
-            indexable.title = context.getString(R.string.pointer_settings_category);
-            indexable.screenTitle = screenTitle;
-            indexables.add(indexable);
-
-            indexable = new SearchIndexableRaw(context);
-            indexable.key = "pointer_speed";
-            indexable.title = context.getString(R.string.pointer_speed);
-            indexable.screenTitle = screenTitle;
-            indexables.add(indexable);
-
-            // Game controllers.
-            if (!new GameControllerPreferenceController(context).isAvailable()) {
-                indexable = new SearchIndexableRaw(context);
-                indexable.key = GameControllerPreferenceController.PREF_KEY;
-                indexable.title = context.getString(R.string.vibrate_input_devices);
-                indexable.summaryOn = context.getString(R.string.vibrate_input_devices_summary);
-                indexable.summaryOff = context.getString(R.string.vibrate_input_devices_summary);
-                indexable.screenTitle = screenTitle;
-                indexables.add(indexable);
-            }
-
-            return indexables;
-        }
-    };
-}
diff --git a/src/com/android/settings/network/TetherPreferenceController.java b/src/com/android/settings/network/TetherPreferenceController.java
index 236fa96..5b8d55e 100644
--- a/src/com/android/settings/network/TetherPreferenceController.java
+++ b/src/com/android/settings/network/TetherPreferenceController.java
@@ -21,7 +21,6 @@
 import android.content.Context;
 import android.net.ConnectivityManager;
 import android.os.UserHandle;
-import android.os.UserManager;
 import android.support.annotation.VisibleForTesting;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
@@ -30,7 +29,6 @@
 import com.android.settings.TetherSettings;
 import com.android.settings.core.PreferenceController;
 
-import java.util.List;
 import java.util.concurrent.atomic.AtomicReference;
 
 import static android.os.UserManager.DISALLOW_CONFIG_TETHERING;
@@ -45,7 +43,6 @@
     private final AtomicReference<BluetoothPan> mBluetoothPan;
     private final ConnectivityManager mConnectivityManager;
     private final BluetoothAdapter mBluetoothAdapter;
-    private final UserManager mUserManager;
 
     private final BluetoothProfile.ServiceListener mBtProfileServiceListener =
             new android.bluetooth.BluetoothProfile.ServiceListener() {
@@ -68,7 +65,6 @@
         mBluetoothPan = null;
         mConnectivityManager = null;
         mBluetoothAdapter = null;
-        mUserManager = null;
     }
 
     public TetherPreferenceController(Context context) {
@@ -78,7 +74,6 @@
                 context, DISALLOW_CONFIG_TETHERING, UserHandle.myUserId()) != null;
         mConnectivityManager =
                 (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
-        mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
         mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
         if (mBluetoothAdapter != null) {
             mBluetoothAdapter.getProfileProxy(context, mBtProfileServiceListener,
@@ -114,13 +109,6 @@
     }
 
     @Override
-    public void updateNonIndexableKeys(List<String> keys) {
-        if (!mUserManager.isAdminUser() || !mConnectivityManager.isTetheringSupported()) {
-            keys.add(KEY_TETHER_SETTINGS);
-        }
-    }
-
-    @Override
     public String getPreferenceKey() {
         return KEY_TETHER_SETTINGS;
     }
diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java
index d0f6f2e..4c310e6 100644
--- a/src/com/android/settings/notification/AppNotificationSettings.java
+++ b/src/com/android/settings/notification/AppNotificationSettings.java
@@ -184,6 +184,7 @@
                     channelPref.setKey(channel.getId());
                     channelPref.setTitle(channel.getName());
                     channelPref.setChecked(channel.getImportance() != IMPORTANCE_NONE);
+                    channelPref.setMultiLine(true);
 
                     if (channel.isDeleted()) {
                         channelPref.setTitle(
diff --git a/src/com/android/settings/notification/CastPreferenceController.java b/src/com/android/settings/notification/CastPreferenceController.java
index 7de5c48..0156dfd 100644
--- a/src/com/android/settings/notification/CastPreferenceController.java
+++ b/src/com/android/settings/notification/CastPreferenceController.java
@@ -17,11 +17,8 @@
 package com.android.settings.notification;
 
 import android.content.Context;
-import android.support.v7.preference.Preference;
 
-import com.android.settings.Utils;
 import com.android.settings.core.PreferenceController;
-import java.util.List;
 
 public class CastPreferenceController extends PreferenceController {
 
@@ -41,11 +38,4 @@
         return true;
     }
 
-    @Override
-    public void updateNonIndexableKeys(List<String> keys) {
-        if (!Utils.isVoiceCapable(mContext)) {
-            keys.add(KEY_WIFI_DISPLAY);
-        }
-    }
-
 }
diff --git a/src/com/android/settings/notification/NotificationVolumePreferenceController.java b/src/com/android/settings/notification/NotificationVolumePreferenceController.java
index e4759d7..40448a4 100644
--- a/src/com/android/settings/notification/NotificationVolumePreferenceController.java
+++ b/src/com/android/settings/notification/NotificationVolumePreferenceController.java
@@ -37,7 +37,7 @@
 
     @VisibleForTesting
     NotificationVolumePreferenceController(Context context,
-        VolumeSeekBarPreference.Callback callback, Lifecycle lifecycle, AudioHelper helper) {
+        Callback callback, Lifecycle lifecycle, AudioHelper helper) {
         super(context, callback, lifecycle);
         mHelper = helper;
     }
diff --git a/src/com/android/settings/notification/OtherSoundSettings.java b/src/com/android/settings/notification/OtherSoundSettings.java
deleted file mode 100644
index 5c409d3..0000000
--- a/src/com/android/settings/notification/OtherSoundSettings.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (C) 2014 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.notification;
-
-import android.content.Context;
-import android.provider.SearchIndexableResource;
-
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.R;
-import com.android.settings.core.PreferenceController;
-import com.android.settings.core.lifecycle.Lifecycle;
-import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.search.BaseSearchIndexProvider;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/* This class has been deprecated  Modifications to Other Sounds settings should be made in
-   {@link SoundSettings } instead. */
-@Deprecated
-public class OtherSoundSettings extends DashboardFragment {
-    private static final String TAG = "OtherSoundSettings";
-
-    @Override
-    public int getMetricsCategory() {
-        return MetricsEvent.NOTIFICATION_OTHER_SOUND;
-    }
-
-    @Override
-    protected int getHelpResource() {
-        return R.string.help_uri_other_sounds;
-    }
-
-    @Override
-    protected String getLogTag() {
-        return TAG;
-    }
-
-    @Override
-    protected int getPreferenceScreenResId() {
-        return R.xml.other_sound_settings;
-    }
-
-    @Override
-    protected List<PreferenceController> getPreferenceControllers(Context context) {
-        final List<PreferenceController> controllers = new ArrayList<>();
-        Lifecycle lifecycle = getLifecycle();
-        controllers.add(new DialPadTonePreferenceController(context, this, lifecycle));
-        controllers.add(new ScreenLockSoundPreferenceController(context, this, lifecycle));
-        controllers.add(new ChargingSoundPreferenceController(context, this, lifecycle));
-        controllers.add(new DockingSoundPreferenceController(context, this, lifecycle));
-        controllers.add(new TouchSoundPreferenceController(context, this, lifecycle));
-        controllers.add(new VibrateOnTouchPreferenceController(context, this, lifecycle));
-        controllers.add(new DockAudioMediaPreferenceController(context, this, lifecycle));
-        controllers.add(new BootSoundPreferenceController(context));
-        controllers.add(new EmergencyTonePreferenceController(context, this, lifecycle));
-        return controllers;
-    }
-
-    // === Indexing ===
-
-    public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
-            new BaseSearchIndexProvider() {
-
-        public List<SearchIndexableResource> getXmlResourcesToIndex(
-                Context context, boolean enabled) {
-            final SearchIndexableResource sir = new SearchIndexableResource(context);
-            sir.xmlResId = R.xml.other_sound_settings;
-            return Arrays.asList(sir);
-        }
-
-        public List<String> getNonIndexableKeys(Context context) {
-            final ArrayList<String> rt = new ArrayList<String>();
-            new DialPadTonePreferenceController(context, null /* SettingsPreferenceFragment */,
-                null /* Lifecycle */).updateNonIndexableKeys(rt);
-            new ScreenLockSoundPreferenceController(context, null /* SettingsPreferenceFragment */,
-                null /* Lifecycle */).updateNonIndexableKeys(rt);
-            new ChargingSoundPreferenceController(context, null /* SettingsPreferenceFragment */,
-                null /* Lifecycle */).updateNonIndexableKeys(rt);
-            new DockingSoundPreferenceController(context, null /* SettingsPreferenceFragment */,
-                null /* Lifecycle */).updateNonIndexableKeys(rt);
-            new TouchSoundPreferenceController(context, null /* SettingsPreferenceFragment */,
-                null /* Lifecycle */).updateNonIndexableKeys(rt);
-            new VibrateOnTouchPreferenceController(context, null /* SettingsPreferenceFragment */,
-                null /* Lifecycle */).updateNonIndexableKeys(rt);
-            new DockAudioMediaPreferenceController(context, null /* SettingsPreferenceFragment */,
-                null /* Lifecycle */).updateNonIndexableKeys(rt);
-            new BootSoundPreferenceController(context).updateNonIndexableKeys(rt);
-            new EmergencyTonePreferenceController(context, null /* SettingsPreferenceFragment */,
-                null /* Lifecycle */).updateNonIndexableKeys(rt);
-            return rt;
-        }
-    };
-}
diff --git a/src/com/android/settings/notification/SettingPrefController.java b/src/com/android/settings/notification/SettingPrefController.java
index d126fc4..64d65bb 100644
--- a/src/com/android/settings/notification/SettingPrefController.java
+++ b/src/com/android/settings/notification/SettingPrefController.java
@@ -71,13 +71,6 @@
     }
 
     @Override
-    public void updateNonIndexableKeys(List<String> keys) {
-        if (!mPreference.isApplicable(mContext)) {
-            keys.add(mPreference.getKey());
-        }
-    }
-
-    @Override
     public void updateState(Preference preference) {
         mPreference.update(mContext);
     }
diff --git a/src/com/android/settings/notification/SoundSettings.java b/src/com/android/settings/notification/SoundSettings.java
index c7b0384..df60573 100644
--- a/src/com/android/settings/notification/SoundSettings.java
+++ b/src/com/android/settings/notification/SoundSettings.java
@@ -33,7 +33,6 @@
 import com.android.settings.core.PreferenceController;
 import com.android.settings.core.lifecycle.Lifecycle;
 import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.BaseSearchIndexProvider;
 
 import java.util.ArrayList;
@@ -51,7 +50,6 @@
     private final VolumePreferenceCallback mVolumeCallback = new VolumePreferenceCallback();
     private final H mHandler = new H();
 
-    private WorkSoundPreferenceController mWorkSoundController;
     private RingtonePreference mRequestPreference;
 
     @Override
@@ -100,51 +98,12 @@
 
     @Override
     protected int getPreferenceScreenResId() {
-        return mDashboardFeatureProvider.isEnabled()
-                ? R.xml.ia_sound_settings : R.xml.sound_settings;
+        return R.xml.ia_sound_settings;
     }
 
     @Override
     protected List<PreferenceController> getPreferenceControllers(Context context) {
-        final List<PreferenceController> controllers = new ArrayList<>();
-        Lifecycle lifecycle = getLifecycle();
-        if (!mDashboardFeatureProvider.isEnabled()) {
-            controllers.add(new CastPreferenceController(context));
-        }
-        controllers.add(new ZenModePreferenceController(context));
-        controllers.add(new EmergencyBroadcastPreferenceController(context));
-        controllers.add(new VibrateWhenRingPreferenceController(context));
-
-        // === Volumes ===
-        controllers.add(new AlarmVolumePreferenceController(context, mVolumeCallback, lifecycle));
-        controllers.add(new MediaVolumePreferenceController(context, mVolumeCallback, lifecycle));
-        controllers.add(
-                new NotificationVolumePreferenceController(context, mVolumeCallback, lifecycle));
-        controllers.add(new RingVolumePreferenceController(context, mVolumeCallback, lifecycle));
-
-        // === Phone & notification ringtone ===
-        controllers.add(new PhoneRingtonePreferenceController(context));
-        controllers.add(new AlarmRingtonePreferenceController(context));
-        controllers.add(new NotificationRingtonePreferenceController(context));
-
-        // === Work Sound Settings ===
-        mWorkSoundController = new WorkSoundPreferenceController(context, this, getLifecycle());
-        controllers.add(mWorkSoundController);
-
-        // === Other Sound Settings ===
-        if (mDashboardFeatureProvider.isEnabled()) {
-            controllers.add(new DialPadTonePreferenceController(context, this, lifecycle));
-            controllers.add(new ScreenLockSoundPreferenceController(context, this, lifecycle));
-            controllers.add(new ChargingSoundPreferenceController(context, this, lifecycle));
-            controllers.add(new DockingSoundPreferenceController(context, this, lifecycle));
-            controllers.add(new TouchSoundPreferenceController(context, this, lifecycle));
-            controllers.add(new VibrateOnTouchPreferenceController(context, this, lifecycle));
-            controllers.add(new DockAudioMediaPreferenceController(context, this, lifecycle));
-            controllers.add(new BootSoundPreferenceController(context));
-            controllers.add(new EmergencyTonePreferenceController(context, this, lifecycle));
-        }
-
-        return controllers;
+        return buildPreferenceControllers(context, this, mVolumeCallback, getLifecycle());
     }
 
     @Override
@@ -192,8 +151,6 @@
         }
     }
 
-    ;
-
     // === Callbacks ===
 
 
@@ -214,6 +171,43 @@
         }
     }
 
+    private static List<PreferenceController> buildPreferenceControllers(Context context,
+            SoundSettings fragment, VolumeSeekBarPreference.Callback callback,
+            Lifecycle lifecycle) {
+        final List<PreferenceController> controllers = new ArrayList<>();
+        controllers.add(new ZenModePreferenceController(context));
+        controllers.add(new EmergencyBroadcastPreferenceController(context));
+        controllers.add(new VibrateWhenRingPreferenceController(context));
+
+        // === Volumes ===
+        controllers.add(new AlarmVolumePreferenceController(context, callback, lifecycle));
+        controllers.add(new MediaVolumePreferenceController(context, callback, lifecycle));
+        controllers.add(
+                new NotificationVolumePreferenceController(context, callback, lifecycle));
+        controllers.add(new RingVolumePreferenceController(context, callback, lifecycle));
+
+        // === Phone & notification ringtone ===
+        controllers.add(new PhoneRingtonePreferenceController(context));
+        controllers.add(new AlarmRingtonePreferenceController(context));
+        controllers.add(new NotificationRingtonePreferenceController(context));
+
+        // === Work Sound Settings ===
+        controllers.add(new WorkSoundPreferenceController(context, fragment, lifecycle));
+
+        // === Other Sound Settings ===
+        controllers.add(new DialPadTonePreferenceController(context, fragment, lifecycle));
+        controllers.add(new ScreenLockSoundPreferenceController(context, fragment, lifecycle));
+        controllers.add(new ChargingSoundPreferenceController(context, fragment, lifecycle));
+        controllers.add(new DockingSoundPreferenceController(context, fragment, lifecycle));
+        controllers.add(new TouchSoundPreferenceController(context, fragment, lifecycle));
+        controllers.add(new VibrateOnTouchPreferenceController(context, fragment, lifecycle));
+        controllers.add(new DockAudioMediaPreferenceController(context, fragment, lifecycle));
+        controllers.add(new BootSoundPreferenceController(context));
+        controllers.add(new EmergencyTonePreferenceController(context, fragment, lifecycle));
+
+        return controllers;
+    }
+
     // === Indexing ===
 
     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
@@ -222,61 +216,24 @@
                 public List<SearchIndexableResource> getXmlResourcesToIndex(
                         Context context, boolean enabled) {
                     final SearchIndexableResource sir = new SearchIndexableResource(context);
-                    sir.xmlResId = R.xml.sound_settings;
+                    sir.xmlResId = R.xml.ia_sound_settings;
                     return Arrays.asList(sir);
                 }
 
-                public List<String> getNonIndexableKeys(Context context) {
-                    final ArrayList<String> rt = new ArrayList<String>();
-                    new NotificationVolumePreferenceController(
-                            context, null /* Callback */,
-                            null /* Lifecycle */).updateNonIndexableKeys(rt);
-                    new RingVolumePreferenceController(
-                            context, null /* Callback */,
-                            null /* Lifecycle */).updateNonIndexableKeys(rt);
-                    new PhoneRingtonePreferenceController(context).updateNonIndexableKeys(rt);
-                    new VibrateWhenRingPreferenceController(context).updateNonIndexableKeys(rt);
-                    new EmergencyBroadcastPreferenceController(context).updateNonIndexableKeys(rt);
-                    if (FeatureFactory.getFactory(context).getDashboardFeatureProvider(context)
-                            .isEnabled()) {
-                        new DialPadTonePreferenceController(context,
-                                null /* SettingsPreferenceFragment */,
-                                null /* Lifecycle */).updateNonIndexableKeys(rt);
-                        new ScreenLockSoundPreferenceController(context,
-                                null /* SettingsPreferenceFragment */,
-                                null /* Lifecycle */).updateNonIndexableKeys(rt);
-                        new ChargingSoundPreferenceController(context,
-                                null /* SettingsPreferenceFragment */,
-                                null /* Lifecycle */).updateNonIndexableKeys(rt);
-                        new DockingSoundPreferenceController(context,
-                                null /* SettingsPreferenceFragment */,
-                                null /* Lifecycle */).updateNonIndexableKeys(rt);
-                        new TouchSoundPreferenceController(context, null /*
-                        SettingsPreferenceFragment */,
-                                null /* Lifecycle */).updateNonIndexableKeys(rt);
-                        new VibrateOnTouchPreferenceController(context,
-                                null /* SettingsPreferenceFragment */,
-                                null /* Lifecycle */).updateNonIndexableKeys(rt);
-                        new DockAudioMediaPreferenceController(context,
-                                null /* SettingsPreferenceFragment */,
-                                null /* Lifecycle */).updateNonIndexableKeys(rt);
-                        new BootSoundPreferenceController(context).updateNonIndexableKeys(rt);
-                        new EmergencyTonePreferenceController(context,
-                                null /* SettingsPreferenceFragment */,
-                                null /* Lifecycle */).updateNonIndexableKeys(rt);
-                    } else {
-                        new CastPreferenceController(context).updateNonIndexableKeys(rt);
-                    }
-
-                    return rt;
+                @Override
+                public List<PreferenceController> getPreferenceControllers(Context context) {
+                    return buildPreferenceControllers(context, null /* fragment */,
+                            null /* callback */, null /* lifecycle */);
                 }
             };
 
     // === Work Sound Settings ===
 
     void enableWorkSync() {
-        if (mWorkSoundController != null) {
-            mWorkSoundController.enableWorkSync();
+        final WorkSoundPreferenceController workSoundController =
+                getPreferenceController(WorkSoundPreferenceController.class);
+        if (workSoundController != null) {
+            workSoundController.enableWorkSync();
         }
     }
 }
diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.java b/src/com/android/settings/overlay/FeatureFactoryImpl.java
index 377e6bb..e72ee03 100644
--- a/src/com/android/settings/overlay/FeatureFactoryImpl.java
+++ b/src/com/android/settings/overlay/FeatureFactoryImpl.java
@@ -80,7 +80,7 @@
     @Override
     public PowerUsageFeatureProvider getPowerUsageFeatureProvider(Context context) {
         if (mPowerUsageFeatureProvider == null) {
-            mPowerUsageFeatureProvider = new PowerUsageFeatureProviderImpl();
+            mPowerUsageFeatureProvider = new PowerUsageFeatureProviderImpl(context);
         }
         return mPowerUsageFeatureProvider;
     }
diff --git a/src/com/android/settings/search/BaseSearchIndexProvider.java b/src/com/android/settings/search/BaseSearchIndexProvider.java
index bb518ba..38c8d40 100644
--- a/src/com/android/settings/search/BaseSearchIndexProvider.java
+++ b/src/com/android/settings/search/BaseSearchIndexProvider.java
@@ -18,8 +18,10 @@
 
 import android.content.Context;
 import android.provider.SearchIndexableResource;
+
 import com.android.settings.core.PreferenceController;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -28,7 +30,7 @@
  */
 public class BaseSearchIndexProvider implements Indexable.SearchIndexProvider {
 
-    private static final List<String> EMPTY_LIST = Collections.<String>emptyList();
+    private static final List<String> EMPTY_LIST = Collections.emptyList();
 
     public BaseSearchIndexProvider() {
     }
@@ -45,7 +47,16 @@
 
     @Override
     public List<String> getNonIndexableKeys(Context context) {
-        return EMPTY_LIST;
+        final List<PreferenceController> controllers = getPreferenceControllers(context);
+        if (controllers != null && !controllers.isEmpty()) {
+            final List<String> nonIndexableKeys = new ArrayList<>();
+            for (PreferenceController controller : controllers) {
+                controller.updateNonIndexableKeys(nonIndexableKeys);
+            }
+            return nonIndexableKeys;
+        } else {
+            return EMPTY_LIST;
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/search/DynamicIndexableContentMonitor.java b/src/com/android/settings/search/DynamicIndexableContentMonitor.java
index 0cc2688..c91f381 100644
--- a/src/com/android/settings/search/DynamicIndexableContentMonitor.java
+++ b/src/com/android/settings/search/DynamicIndexableContentMonitor.java
@@ -49,9 +49,9 @@
 import com.android.internal.content.PackageMonitor;
 import com.android.settings.accessibility.AccessibilitySettings;
 import com.android.settings.inputmethod.AvailableVirtualKeyboardFragment;
-import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
 import com.android.settings.inputmethod.PhysicalKeyboardFragment;
 import com.android.settings.inputmethod.VirtualKeyboardFragment;
+import com.android.settings.language.LanguageAndInputSettings;
 import com.android.settings.print.PrintSettingsFragment;
 
 import java.util.ArrayList;
@@ -423,7 +423,7 @@
             mContentResolver = context.getContentResolver();
             mInputMethodServices.clear();
             // Build index of {@link UserDictionary}.
-            buildIndex(InputMethodAndLanguageSettings.class, true /* rebuild */);
+            buildIndex(LanguageAndInputSettings.class, true /* rebuild */);
             // Build index of IMEs.
             buildIndex(VirtualKeyboardFragment.class, true /* rebuild */);
             buildIndex(AvailableVirtualKeyboardFragment.class, true /* rebuild */);
@@ -478,7 +478,7 @@
                 buildIndex(VirtualKeyboardFragment.class, true /* rebuild */);
                 buildIndex(AvailableVirtualKeyboardFragment.class, true /* rebuild */);
             } else if (UserDictionary.Words.CONTENT_URI.equals(uri)) {
-                buildIndex(InputMethodAndLanguageSettings.class, true /* rebuild */);
+                buildIndex(LanguageAndInputSettings.class, true /* rebuild */);
             }
         }
     }
diff --git a/src/com/android/settings/search/Index.java b/src/com/android/settings/search/Index.java
index b79a7f4..b146a22 100644
--- a/src/com/android/settings/search/Index.java
+++ b/src/com/android/settings/search/Index.java
@@ -707,7 +707,7 @@
     }
 
     private String buildSearchMatchStringForColumns(String query, String[] columnNames) {
-        final String value = query + "*";
+        final String value = (query != null ? query.trim() : "") + "*";
         StringBuilder sb = new StringBuilder();
         final int count = columnNames.length;
         for (int n = 0; n < count; n++) {
diff --git a/src/com/android/settings/search/Ranking.java b/src/com/android/settings/search/Ranking.java
index fc1b8d9..d3c32ca 100644
--- a/src/com/android/settings/search/Ranking.java
+++ b/src/com/android/settings/search/Ranking.java
@@ -41,12 +41,16 @@
 import com.android.settings.enterprise.EnterprisePrivacySettings;
 import com.android.settings.fuelgauge.BatterySaverSettings;
 import com.android.settings.fuelgauge.PowerUsageSummary;
-import com.android.settings.gestures.GestureSettings;
-import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
+import com.android.settings.gestures.AssistGestureSettings;
+import com.android.settings.gestures.DoubleTapPowerSettings;
+import com.android.settings.gestures.DoubleTapScreenSettings;
+import com.android.settings.gestures.DoubleTwistGestureSettings;
+import com.android.settings.gestures.PickupGestureSettings;
+import com.android.settings.gestures.SwipeToNotificationSettings;
+import com.android.settings.language.LanguageAndInputSettings;
 import com.android.settings.location.LocationSettings;
 import com.android.settings.location.ScanningSettings;
 import com.android.settings.notification.ConfigureNotificationSettings;
-import com.android.settings.notification.OtherSoundSettings;
 import com.android.settings.notification.SoundSettings;
 import com.android.settings.notification.ZenModeAutomationSettings;
 import com.android.settings.notification.ZenModePrioritySettings;
@@ -133,7 +137,6 @@
 
         // Notifications
         sRankMap.put(ConfigureNotificationSettings.class.getName(), RANK_NOTIFICATIONS);
-        sRankMap.put(OtherSoundSettings.class.getName(), RANK_NOTIFICATIONS);
         sRankMap.put(ZenModeSettings.class.getName(), RANK_NOTIFICATIONS);
         sRankMap.put(ZenModePrioritySettings.class.getName(), RANK_NOTIFICATIONS);
         sRankMap.put(ZenModeAutomationSettings.class.getName(), RANK_NOTIFICATIONS);
@@ -154,7 +157,12 @@
         sRankMap.put(UserSettings.class.getName(), RANK_USERS);
 
         // Gestures
-        sRankMap.put(GestureSettings.class.getName(), RANK_GESTURE);
+        sRankMap.put(AssistGestureSettings.class.getName(), RANK_GESTURE);
+        sRankMap.put(DoubleTapPowerSettings.class.getName(), RANK_GESTURE);
+        sRankMap.put(DoubleTapScreenSettings.class.getName(), RANK_GESTURE);
+        sRankMap.put(DoubleTwistGestureSettings.class.getName(), RANK_GESTURE);
+        sRankMap.put(PickupGestureSettings.class.getName(), RANK_GESTURE);
+        sRankMap.put(SwipeToNotificationSettings.class.getName(), RANK_GESTURE);
 
         // Location
         sRankMap.put(LocationSettings.class.getName(), RANK_LOCATION);
@@ -169,7 +177,7 @@
         sRankMap.put(UserAndAccountDashboardFragment.class.getName(), RANK_ACCOUNT);
 
         // IMEs
-        sRankMap.put(InputMethodAndLanguageSettings.class.getName(), RANK_IME);
+        sRankMap.put(LanguageAndInputSettings.class.getName(), RANK_IME);
 
         // Privacy
         sRankMap.put(PrivacySettings.class.getName(), RANK_PRIVACY);
diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java
index 1968c7a..6ecfe59 100644
--- a/src/com/android/settings/search/SearchIndexableResources.java
+++ b/src/com/android/settings/search/SearchIndexableResources.java
@@ -44,7 +44,6 @@
 import com.android.settings.datausage.DataUsageMeteredSettings;
 import com.android.settings.datausage.DataUsageSummary;
 import com.android.settings.deviceinfo.StorageDashboardFragment;
-import com.android.settings.deviceinfo.StorageProfileFragment;
 import com.android.settings.deviceinfo.StorageSettings;
 import com.android.settings.display.ScreenZoomSettings;
 import com.android.settings.enterprise.EnterprisePrivacySettings;
@@ -56,11 +55,9 @@
 import com.android.settings.gestures.DoubleTapPowerSettings;
 import com.android.settings.gestures.DoubleTapScreenSettings;
 import com.android.settings.gestures.DoubleTwistGestureSettings;
-import com.android.settings.gestures.GestureSettings;
 import com.android.settings.gestures.PickupGestureSettings;
 import com.android.settings.gestures.SwipeToNotificationSettings;
 import com.android.settings.inputmethod.AvailableVirtualKeyboardFragment;
-import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
 import com.android.settings.inputmethod.PhysicalKeyboardFragment;
 import com.android.settings.inputmethod.VirtualKeyboardFragment;
 import com.android.settings.language.LanguageAndInputSettings;
@@ -69,7 +66,6 @@
 import com.android.settings.network.NetworkDashboardFragment;
 import com.android.settings.nfc.PaymentSettings;
 import com.android.settings.notification.ConfigureNotificationSettings;
-import com.android.settings.notification.OtherSoundSettings;
 import com.android.settings.notification.SoundSettings;
 import com.android.settings.notification.ZenModePrioritySettings;
 import com.android.settings.notification.ZenModeSettings;
@@ -122,7 +118,6 @@
         addIndex(AppAndNotificationDashboardFragment.class, NO_DATA_RES_ID,
                 R.drawable.ic_settings_applications);
         addIndex(SoundSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_sound);
-        addIndex(OtherSoundSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_sound);
         addIndex(ZenModeSettings.class,
                 R.xml.zen_mode_settings, R.drawable.ic_settings_notifications);
         addIndex(ZenModePrioritySettings.class,
@@ -139,7 +134,6 @@
         addIndex(SpecialAccessSettings.class,
                 R.xml.special_access, R.drawable.ic_settings_applications);
         addIndex(UserSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_multiuser);
-        addIndex(GestureSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_gestures);
         addIndex(AssistGestureSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_gestures);
         addIndex(PickupGestureSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_gestures);
         addIndex(DoubleTapScreenSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_gestures);
@@ -156,8 +150,6 @@
         addIndex(ScreenPinningSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_security);
         addIndex(UserAndAccountDashboardFragment.class, NO_DATA_RES_ID,
                 R.drawable.ic_settings_accounts);
-        addIndex(InputMethodAndLanguageSettings.class,
-                NO_DATA_RES_ID, R.drawable.ic_settings_language);
         addIndex(VirtualKeyboardFragment.class, NO_DATA_RES_ID, R.drawable.ic_settings_language);
         addIndex(AvailableVirtualKeyboardFragment.class,
                 NO_DATA_RES_ID, R.drawable.ic_settings_language);
diff --git a/src/com/android/settings/system/SystemDashboardFragment.java b/src/com/android/settings/system/SystemDashboardFragment.java
index 2898ce2..c4bf0da 100644
--- a/src/com/android/settings/system/SystemDashboardFragment.java
+++ b/src/com/android/settings/system/SystemDashboardFragment.java
@@ -55,6 +55,10 @@
 
     @Override
     protected List<PreferenceController> getPreferenceControllers(Context context) {
+        return buildPreferenceControllers(context);
+    }
+
+    private static List<PreferenceController> buildPreferenceControllers(Context context) {
         final List<PreferenceController> controllers = new ArrayList<>();
         controllers.add(new SystemUpdatePreferenceController(context, UserManager.get(context)));
         controllers.add(new AdditionalSystemUpdatePreferenceController(context));
@@ -79,17 +83,8 @@
                 }
 
                 @Override
-                public List<String> getNonIndexableKeys(Context context) {
-                    if (!FeatureFactory.getFactory(context).getDashboardFeatureProvider(context)
-                            .isEnabled()) {
-                        return null;
-                    }
-                    final List<String> keys = new ArrayList<>();
-                    new SystemUpdatePreferenceController(context, UserManager.get(context))
-                            .updateNonIndexableKeys(keys);
-                    new AdditionalSystemUpdatePreferenceController(context)
-                            .updateNonIndexableKeys(keys);
-                    return keys;
+                public List<PreferenceController> getPreferenceControllers(Context context) {
+                    return buildPreferenceControllers(context);
                 }
             };
 }
diff --git a/src/com/android/settings/widget/MasterSwitchPreference.java b/src/com/android/settings/widget/MasterSwitchPreference.java
index 94c429b..ba3458a 100644
--- a/src/com/android/settings/widget/MasterSwitchPreference.java
+++ b/src/com/android/settings/widget/MasterSwitchPreference.java
@@ -22,6 +22,7 @@
 import android.util.AttributeSet;
 import android.widget.CompoundButton;
 import android.widget.Switch;
+import android.widget.TextView;
 
 import com.android.settings.R;
 import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
@@ -34,6 +35,7 @@
 
     private Switch mSwitch;
     private boolean mChecked;
+    private boolean mMultiLine;
 
     public MasterSwitchPreference(Context context, AttributeSet attrs,
             int defStyleAttr, int defStyleRes) {
@@ -74,6 +76,12 @@
                 }
             });
         }
+        if (mMultiLine) {
+            TextView textView = (TextView)holder.findViewById(android.R.id.title);
+            if (textView != null) {
+                textView.setSingleLine(false);
+            }
+        }
     }
 
     public boolean isChecked() {
@@ -97,6 +105,14 @@
         }
     }
 
+    public boolean isMultiLine() {
+        return mMultiLine;
+    }
+
+    public void setMultiLine(boolean multiLine) {
+        mMultiLine = multiLine;
+    }
+
     /**
      * If admin is not null, disables the switch.
      * Otherwise, keep it enabled.
diff --git a/tests/app/src/com/android/settings/dashboard/TabSelectionOnLaunchTest.java b/tests/app/src/com/android/settings/dashboard/TabSelectionOnLaunchTest.java
deleted file mode 100644
index 24c1ead..0000000
--- a/tests/app/src/com/android/settings/dashboard/TabSelectionOnLaunchTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.settings.dashboard;
-
-import android.content.Intent;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
-import com.android.settings.Settings;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.matcher.ViewMatchers.isSelected;
-import static android.support.test.espresso.matcher.ViewMatchers.withText;
-import static org.hamcrest.core.IsNot.not;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class TabSelectionOnLaunchTest {
-    @Rule
-    public ActivityTestRule<Settings> mActivityRule =
-            new ActivityTestRule<>(Settings.class, true, false);
-
-    private final int FLAG_RESTART = Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK;
-    private final String ARG_SELECT_SUPPORT_TAB = "SUPPORT";
-    private final String ARG_SELECT_FAKE_TAB = "NOT_SUPPORT";
-
-    @Test
-    /* cold start for settings app with correct flags and extra always selects support tab */
-    public void test_ColdStartWithCorrectArgsCorrectFlags_SupportSelected() {
-        launchSettingsWithFlags(ARG_SELECT_SUPPORT_TAB, FLAG_RESTART);
-        verifySupportSelected();
-    }
-
-    @Test
-    /* cold start with correct flags and wrong extra defaults to all tab */
-    public void test_ColdStartWithWrongExtra_DoesNotSelectSupport() {
-        launchSettingsWithFlags(ARG_SELECT_FAKE_TAB, FLAG_RESTART);
-        verifySupportNotSelected();
-    }
-
-    @Test
-    /* warm start from elsewhere in settings with wrong flags does not select support */
-    public void test_WarmStartSummarySelectedCorrectExtraWrongFlags_DoesNotSelectSupport() {
-        InstrumentationRegistry.getContext().
-                startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS));
-        launchSettingsNoFlags(ARG_SELECT_SUPPORT_TAB);
-        verifySupportNotSelected();
-    }
-
-    @Test
-    /* warm start from elsewhere in settings with with wrong flags & extra does not select support*/
-    public void test_WarmStartSummarySelectedWrongExtraWrongFlags_DoesNotSelectSupport() {
-        InstrumentationRegistry.getContext().
-                startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS));
-        launchSettingsNoFlags(ARG_SELECT_FAKE_TAB);
-        verifySupportNotSelected();
-    }
-
-    @Test
-    /* settings does not crash on null string */
-    public void test_DoesNotCrashOnNullExtra_DoesNotSelectSupport() {
-        launchSettingsWithFlags(null, FLAG_RESTART);
-        verifySupportNotSelected();
-    }
-
-    private void verifySupportNotSelected() {
-        onView(withText(mActivityRule.getActivity().getApplicationContext().
-                getString(com.android.settings.R.string.page_tab_title_support))).
-                check(matches(not(isSelected())));
-    }
-
-    private void verifySupportSelected() {
-        onView(withText(mActivityRule.getActivity().getApplicationContext().
-                getString(com.android.settings.R.string.page_tab_title_support))).
-                check(matches(isSelected()));
-    }
-
-    private void launchSettingsWithFlags(String extra, int flags) {
-        Intent intent = new Intent(android.provider.Settings.ACTION_SETTINGS);
-        intent.setFlags(flags);
-        intent.putExtra(DashboardContainerFragment.EXTRA_SELECT_SETTINGS_TAB, extra);
-        mActivityRule.launchActivity(intent);
-    }
-
-    private void launchSettingsNoFlags(String extra) {
-        Intent intent = new Intent(android.provider.Settings.ACTION_SETTINGS);
-        intent.putExtra(DashboardContainerFragment.EXTRA_SELECT_SETTINGS_TAB, extra);
-        mActivityRule.launchActivity(intent);
-    }
-}
\ No newline at end of file
diff --git a/tests/app/src/com/android/settings/gesture/GestureSettingsTest.java b/tests/app/src/com/android/settings/gesture/GestureSettingsTest.java
deleted file mode 100644
index 4f3a524..0000000
--- a/tests/app/src/com/android/settings/gesture/GestureSettingsTest.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.settings.gesture;
-
-import android.content.Context;
-import android.content.Intent;
-import android.provider.Settings.Secure;
-import android.support.test.filters.MediumTest;
-import android.support.test.uiautomator.UiDevice;
-import android.support.test.uiautomator.UiObject;
-import android.support.test.uiautomator.UiSelector;
-import android.support.test.uiautomator.UiScrollable;
-import android.test.InstrumentationTestCase;
-import android.util.Log;
-import android.widget.RelativeLayout;
-import android.widget.Switch;
-
-import com.android.settings.R;
-
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-
-import org.junit.Test;
-
-/**
- * Test for Gesture preferences.
- */
-@MediumTest
-public class GestureSettingsTest extends InstrumentationTestCase {
-
-    private static final String TAG = "GestureSettingsTest";
-
-    private UiDevice mDevice;
-    private Context mTargetContext;
-    private String mTargetPackage;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mDevice = UiDevice.getInstance(getInstrumentation());
-        mTargetContext = getInstrumentation().getTargetContext();
-        mTargetPackage = mTargetContext.getPackageName();
-    }
-
-    @Test
-    public void testAmbientDisplaySwitchPreference() throws Exception {
-        launchSettings();
-        UiObject dozeSwitch = getDozeSwitch();
-        assertNotNull(dozeSwitch);
-        assertTrue(dozeSwitch.exists());
-        assertToggleStateMatchesSettingValue(dozeSwitch, Secure.DOZE_ENABLED, 1, 1);
-    }
-
-    @Test
-    public void testGestureSettingsExists() throws Exception {
-        launchMoves();
-        UiObject titleObj = mDevice.findObject(new UiSelector().text(
-                mTargetContext.getResources().getString(R.string.gesture_preference_title)));
-        assertNotNull(titleObj);
-        assertTrue(titleObj.exists());
-    }
-
-    @Test
-    public void testCameraDoubleTapToggle() throws Exception {
-        assertSwitchToggle(mTargetContext.getResources().getString(
-                R.string.double_tap_power_for_camera_title),
-                Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, 0, 0);
-    }
-
-    @Test
-    public void testCameraDoubleTwistToggle() throws Exception {
-        assertSwitchToggle(mTargetContext.getResources().getString(
-                R.string.double_twist_for_camera_mode_title),
-                Secure.CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED, 1, 1);
-    }
-
-    @Test
-    public void testFingerprintSwipeToggle() throws Exception {
-        assertSwitchToggle(mTargetContext.getResources().getString(
-                R.string.fingerprint_swipe_for_notifications_title),
-                Secure.SYSTEM_NAVIGATION_KEYS_ENABLED, 0, 1);
-    }
-
-    @Test
-    public void testDozeDoubleTapToggle() throws Exception {
-        assertSwitchToggle(mTargetContext.getResources().getString(
-                R.string.ambient_display_title),
-                Secure.DOZE_PULSE_ON_DOUBLE_TAP, 1, 1);
-    }
-
-    @Test
-    public void testDozePickupToggle() throws Exception {
-        assertSwitchToggle(mTargetContext.getResources().getString(
-                R.string.ambient_display_pickup_title),
-                Secure.DOZE_PULSE_ON_PICK_UP, 1, 1);
-    }
-
-    private void launchSettings() {
-        Intent settingsIntent = new Intent(Intent.ACTION_MAIN)
-                .addCategory(Intent.CATEGORY_LAUNCHER)
-                .setPackage(mTargetPackage)
-                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        getInstrumentation().getContext().startActivity(settingsIntent);
-    }
-
-    private void launchMoves() throws Exception  {
-        launchSettings();
-        UiScrollable settings = new UiScrollable(
-                new UiSelector().packageName(mTargetPackage).scrollable(true));
-        String titleMoves =
-                mTargetContext.getResources().getString(R.string.gesture_preference_title);
-        settings.scrollTextIntoView(titleMoves);
-        mDevice.findObject(new UiSelector().text(titleMoves)).click();
-    }
-
-    private void navigateToMovesSetting(String title) throws Exception {
-        launchMoves();
-        UiScrollable moves = new UiScrollable(
-                new UiSelector().packageName(mTargetPackage).scrollable(true));
-        moves.scrollTextIntoView(title);
-    }
-
-    private UiScrollable navigateToAmbientDisplay() throws Exception {
-        UiScrollable settings = new UiScrollable(
-                new UiSelector().packageName(mTargetPackage).scrollable(true));
-        String titleDisplay =
-                mTargetContext.getResources().getString(R.string.display_settings_title);
-        settings.scrollTextIntoView(titleDisplay);
-        mDevice.findObject(new UiSelector().text(titleDisplay)).click();
-        settings.scrollTextIntoView(mTargetContext.getResources().getString(R.string.doze_title));
-        return settings;
-    }
-
-    private UiObject getGestureSwitch(String title) throws Exception {
-        UiObject titleView = mDevice.findObject(new UiSelector().text(title));
-        UiObject gestureSwitch =
-            titleView.getFromParent(new UiSelector().className(Switch.class.getName()));
-        assertNotNull(gestureSwitch);
-        assertTrue(gestureSwitch.exists());
-        return gestureSwitch;
-    }
-
-    private UiObject getDozeSwitch() throws Exception {
-        UiScrollable settings = navigateToAmbientDisplay();
-        UiObject dozeSwitch = null;
-        UiSelector relativeLayoutSelector =
-                new UiSelector().className(RelativeLayout.class.getName());
-        String titleDoze = mTargetContext.getResources().getString(R.string.doze_title);
-        for (int i = 0; i <= settings.getChildCount(relativeLayoutSelector); i++) {
-            UiObject relativeLayout = settings.getChild(relativeLayoutSelector.instance(i));
-            if (relativeLayout.getChildCount() != 2) {
-                continue;
-            }
-            UiObject obj1 = relativeLayout.getChild(new UiSelector().index(0));
-            if (obj1.getText() == titleDoze) {
-                return relativeLayout.getFromParent(
-                        new UiSelector().className(Switch.class.getName()));
-            }
-        }
-        return null;
-    }
-
-    private void assertSwitchToggle(String title, String key, int defaultVal, int enabledVal)
-            throws Exception {
-        navigateToMovesSetting(title);
-        assertToggleStateMatchesSettingValue(getGestureSwitch(title), key, defaultVal, enabledVal);
-    }
-
-    private void assertToggleStateMatchesSettingValue (
-            UiObject testSwitch, String key, int defaultVal, int enabledVal) throws Exception {
-        // check initial state
-        int currentValue = Secure.getInt(mTargetContext.getContentResolver(), key, defaultVal);
-        boolean enabled = currentValue == enabledVal;
-        assertEquals(enabled, testSwitch.isChecked());
-        // toggle the preference
-        testSwitch.click();
-        assertEquals(!enabled, testSwitch.isChecked());
-        int newValue = currentValue == 1 ? 0 : 1;
-        assertEquals(newValue, Secure.getInt(mTargetContext.getContentResolver(), key, defaultVal));
-    }
-
-}
diff --git a/tests/robotests/assets/grandfather_not_implementing_index_provider b/tests/robotests/assets/grandfather_not_implementing_index_provider
index 76d1013..a63bd7f 100644
--- a/tests/robotests/assets/grandfather_not_implementing_index_provider
+++ b/tests/robotests/assets/grandfather_not_implementing_index_provider
@@ -3,6 +3,5 @@
 com.android.settings.notification.ZenModePrioritySettings
 com.android.settings.inputmethod.InputAndGestureSettings
 com.android.settings.accounts.AccountDetailDashboardFragment
-com.android.settings.gestures.GestureSettings
 com.android.settings.fuelgauge.PowerUsageDetail
 com.android.settings.deviceinfo.StorageProfileFragment
diff --git a/tests/robotests/src/com/android/settings/SettingsActivityTest.java b/tests/robotests/src/com/android/settings/SettingsActivityTest.java
index 1661947..df7a454 100644
--- a/tests/robotests/src/com/android/settings/SettingsActivityTest.java
+++ b/tests/robotests/src/com/android/settings/SettingsActivityTest.java
@@ -16,18 +16,47 @@
 
 package com.android.settings;
 
+import android.app.FragmentManager;
+import android.app.FragmentTransaction;
+import android.content.Context;
+import android.content.Intent;
+import com.android.settings.testutils.FakeFeatureFactory;
+
+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;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class SettingsActivityTest {
 
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private Context mContext;
+    @Mock
+    private FragmentManager mFragmentManager;
+
     private SettingsActivity mActivity;
 
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        FakeFeatureFactory.setupForTest(mContext);
+        final FakeFeatureFactory factory =
+            (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
+        when(factory.dashboardFeatureProvider.isEnabled()).thenReturn(true);
+    }
+
     @Test
     public void testQueryTextChange_shouldUpdate() {
         final String testQuery = "abc";
@@ -42,4 +71,16 @@
 
         assertThat(mActivity.mSearchQuery).isEqualTo(testQuery);
     }
+
+    @Test
+    public void launchSettingFragment_nullExtraShowFragment_shouldNotCrash()
+            throws ClassNotFoundException {
+        mActivity = spy(new SettingsActivity());
+        when(mActivity.getFragmentManager()).thenReturn(mFragmentManager);
+        when(mFragmentManager.beginTransaction()).thenReturn(mock(FragmentTransaction.class));
+
+        doReturn(RuntimeEnvironment.application.getClassLoader()).when(mActivity).getClassLoader();
+
+        mActivity.launchSettingFragment(null, true, mock(Intent.class));
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/applications/FetchPackageStorageAsyncLoaderTest.java b/tests/robotests/src/com/android/settings/applications/FetchPackageStorageAsyncLoaderTest.java
new file mode 100644
index 0000000..0b1d1aa
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/applications/FetchPackageStorageAsyncLoaderTest.java
@@ -0,0 +1,72 @@
+/*
+ * 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.applications;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.os.UserHandle;
+
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import com.android.settingslib.applications.StorageStatsSource;
+import com.android.settingslib.applications.StorageStatsSource.AppStorageStats;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class FetchPackageStorageAsyncLoaderTest {
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private Context mContext;
+    @Mock
+    private StorageStatsSource mSource;
+
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @Test
+    public void worksForValidPackageNameAndUid() {
+        AppStorageStats stats = mock(AppStorageStats.class);
+        when(stats.getCodeBytes()).thenReturn(1L);
+        when(stats.getDataBytes()).thenReturn(2L);
+        when(stats.getCacheBytes()).thenReturn(3L);
+        when(mSource.getStatsForPackage(anyString(), anyString(), any(UserHandle.class)))
+                .thenReturn(stats);
+        ApplicationInfo info = new ApplicationInfo();
+        info.packageName = "com.test.package";
+
+        FetchPackageStorageAsyncLoader task = new FetchPackageStorageAsyncLoader(
+                mContext, mSource, info, new UserHandle(0));
+        assertThat(task.loadInBackground()).isEqualTo(stats);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java
index 017c5a8..0a74cc4 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java
@@ -29,6 +29,7 @@
 import com.android.settings.DevelopmentSettings;
 import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
+import com.android.settings.core.lifecycle.Lifecycle;
 import com.android.settings.testutils.FakeFeatureFactory;
 
 import org.junit.Before;
@@ -40,6 +41,7 @@
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.util.ReflectionHelpers;
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Answers.RETURNS_DEEP_STUBS;
@@ -47,6 +49,7 @@
 import static org.mockito.Matchers.eq;
 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 static org.mockito.Mockito.when;
 
@@ -65,6 +68,7 @@
     @Mock
     private UserManager mUserManager;
 
+    private Lifecycle mLifecycle;
     private FakeFeatureFactory mFactory;
     private Preference mPreference;
     private BuildNumberPreferenceController mController;
@@ -74,8 +78,10 @@
         MockitoAnnotations.initMocks(this);
         FakeFeatureFactory.setupForTest(mContext);
         mFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
-        when(mActivity.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
-        mController = new BuildNumberPreferenceController(mContext, mActivity, mFragment);
+        mLifecycle = new Lifecycle();
+        when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+        mController = new BuildNumberPreferenceController(
+                mContext, mActivity, mFragment, mLifecycle);
 
         mPreference = new Preference(RuntimeEnvironment.application);
         mPreference.setKey(mController.getPreferenceKey());
@@ -104,11 +110,13 @@
     @Test
     public void handlePrefTreeClick_deviceNotProvisioned_doNothing() {
         when(mUserManager.isAdminUser()).thenReturn(true);
-        final Context context = ShadowApplication.getInstance().getApplicationContext();
+        final Context context = RuntimeEnvironment.application;
         Settings.Global.putInt(context.getContentResolver(),
                 Settings.Global.DEVICE_PROVISIONED, 0);
 
-        mController = new BuildNumberPreferenceController(context, mActivity, mFragment);
+        mController = new BuildNumberPreferenceController(
+                context, mActivity, mFragment, mLifecycle);
+        ReflectionHelpers.setField(mController, "mContext", context);
 
         assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
         verify(mFactory.metricsFeatureProvider).action(
@@ -118,14 +126,17 @@
 
     @Test
     public void handlePrefTreeClick_userHasRestriction_doNothing() {
-        when(mUserManager.isAdminUser()).thenReturn(true);
-        final Context context = ShadowApplication.getInstance().getApplicationContext();
+        final Context context = spy(RuntimeEnvironment.application);
         Settings.Global.putInt(context.getContentResolver(),
                 Settings.Global.DEVICE_PROVISIONED, 1);
+
+        when(mUserManager.isAdminUser()).thenReturn(true);
         when(mUserManager.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES))
                 .thenReturn(true);
 
-        mController = new BuildNumberPreferenceController(context, mActivity, mFragment);
+        mController = new BuildNumberPreferenceController(
+                mContext, mActivity, mFragment, mLifecycle);
+        ReflectionHelpers.setField(mController, "mContext", context);
 
         assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
         verify(mFactory.metricsFeatureProvider).action(
@@ -161,7 +172,8 @@
     public void onActivityResult_confirmPasswordRequestCompleted_enableDevPref() {
         final Context context = ShadowApplication.getInstance().getApplicationContext();
 
-        mController = new BuildNumberPreferenceController(context, mActivity, mFragment);
+        mController = new BuildNumberPreferenceController(
+                context, mActivity, mFragment, mLifecycle);
 
         final boolean activityResultHandled = mController.onActivityResult(
                 BuildNumberPreferenceController.REQUEST_CONFIRM_PASSWORD_FOR_DEV_PREF,
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
index e47aac9..ed7e48b 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
@@ -1,3 +1,18 @@
+/*
+ * 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.fuelgauge;
 
 import android.content.pm.PackageManager;
@@ -70,13 +85,10 @@
     @Test
     public void testExtractUsageType_TypeSystem_ReturnSystem() {
         mBatterySipper.drainType = DrainType.APP;
-        final int uids[] = {Process.SYSTEM_UID, Process.ROOT_UID};
+        when(mPowerUsageFeatureProvider.isTypeSystem(any())).thenReturn(true);
 
-        for (int uid : uids) {
-            when(mBatterySipper.getUid()).thenReturn(uid);
-            assertThat(mPowerUsageAdvanced.extractUsageType(mBatterySipper))
-                    .isEqualTo(UsageType.SYSTEM);
-        }
+        assertThat(mPowerUsageAdvanced.extractUsageType(mBatterySipper))
+                .isEqualTo(UsageType.SYSTEM);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java
new file mode 100644
index 0000000..d467221
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java
@@ -0,0 +1,117 @@
+/*
+ * 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.fuelgauge;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.Process;
+import com.android.internal.os.BatterySipper;
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+
+import static org.mockito.Mockito.when;
+import static com.google.common.truth.Truth.assertThat;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class PowerUsageFeatureProviderImplTest {
+    private static final int UID_OTHER = Process.FIRST_APPLICATION_UID + 2;
+    private static final int UID_CALENDAR = Process.FIRST_APPLICATION_UID + 3;
+    private static final int UID_MEDIA = Process.FIRST_APPLICATION_UID + 4;
+    private static final String[] PACKAGES_CALENDAR = {"com.android.providers.calendar"};
+    private static final String[] PACKAGES_MEDIA = {"com.android.providers.media"};
+    @Mock
+    private Context mContext;
+    @Mock
+    private BatterySipper mBatterySipper;
+    @Mock
+    private PackageManager mPackageManager;
+    private PowerUsageFeatureProviderImpl mPowerFeatureProvider;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mPowerFeatureProvider = new PowerUsageFeatureProviderImpl(mContext);
+        when(mPackageManager.getPackagesForUid(UID_CALENDAR)).thenReturn(PACKAGES_CALENDAR);
+        when(mPackageManager.getPackagesForUid(UID_MEDIA)).thenReturn(PACKAGES_MEDIA);
+        mPowerFeatureProvider.mPackageManager = mPackageManager;
+        mBatterySipper.uidObj = new FakeUid(UID_OTHER);
+    }
+
+    @Test
+    public void testIsTypeSystem_UidRoot_ReturnTrue() {
+        mBatterySipper.drainType = BatterySipper.DrainType.APP;
+        when(mBatterySipper.getUid()).thenReturn(Process.ROOT_UID);
+
+        assertThat(mPowerFeatureProvider.isTypeSystem(mBatterySipper)).isTrue();
+    }
+
+    @Test
+    public void testIsTypeSystem_UidSystem_ReturnTrue() {
+        mBatterySipper.drainType = BatterySipper.DrainType.APP;
+        when(mBatterySipper.getUid()).thenReturn(Process.SYSTEM_UID);
+
+        assertThat(mPowerFeatureProvider.isTypeSystem(mBatterySipper)).isTrue();
+    }
+
+    @Test
+    public void testIsTypeSystem_UidMedia_ReturnTrue() {
+        mBatterySipper.drainType = BatterySipper.DrainType.APP;
+        when(mBatterySipper.getUid()).thenReturn(Process.MEDIA_UID);
+
+        assertThat(mPowerFeatureProvider.isTypeSystem(mBatterySipper)).isTrue();
+    }
+
+    @Test
+    public void testIsTypeSystem_AppCalendar_ReturnTrue() {
+        mBatterySipper.drainType = BatterySipper.DrainType.APP;
+        when(mBatterySipper.getUid()).thenReturn(UID_CALENDAR);
+
+        assertThat(mPowerFeatureProvider.isTypeSystem(mBatterySipper)).isTrue();
+    }
+
+    @Test
+    public void testIsTypeSystem_AppMedia_ReturnTrue() {
+        mBatterySipper.drainType = BatterySipper.DrainType.APP;
+        when(mBatterySipper.getUid()).thenReturn(UID_MEDIA);
+
+        assertThat(mPowerFeatureProvider.isTypeSystem(mBatterySipper)).isTrue();
+    }
+
+    @Test
+    public void testIsTypeSystem_UidOther_ReturnFalse() {
+        mBatterySipper.drainType = BatterySipper.DrainType.APP;
+        when(mBatterySipper.getUid()).thenReturn(UID_OTHER);
+
+        assertThat(mPowerFeatureProvider.isTypeSystem(mBatterySipper)).isFalse();
+    }
+
+    @Test
+    public void testIsTypeSystem_UidObjNull_ReturnFalse() {
+        mBatterySipper.drainType = BatterySipper.DrainType.APP;
+        mBatterySipper.uidObj = null;
+
+        assertThat(mPowerFeatureProvider.isTypeSystem(mBatterySipper)).isFalse();
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
index 0755a36..1a0f3fa 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
@@ -17,6 +17,7 @@
 
 import android.content.Context;
 import android.content.Intent;
+import android.os.PowerManager;
 import android.os.Process;
 import android.support.v7.preference.Preference;
 import android.text.TextUtils;
@@ -54,6 +55,7 @@
 import static com.android.settings.fuelgauge.PowerUsageSummary.MENU_TOGGLE_APPS;
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.doReturn;
@@ -124,12 +126,13 @@
     private Preference mCellularNetworkPref;
     @Mock
     private BatteryStatsHelper mBatteryHelper;
+    @Mock
+    private PowerManager mPowerManager;
 
+    private List<BatterySipper> mUsageList;
     private Context mRealContext;
     private TestFragment mFragment;
     private FakeFeatureFactory mFeatureFactory;
-    private PowerUsageSummary mPowerUsageSummary;
-    private List<BatterySipper> mUsageList;
 
     @Before
     public void setUp() {
@@ -138,8 +141,10 @@
         mRealContext = RuntimeEnvironment.application;
         FakeFeatureFactory.setupForTest(mContext);
         mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
+        when(mContext.getSystemService(Context.POWER_SERVICE)).thenReturn(mPowerManager);
 
-        mFragment = new TestFragment(mContext);
+        mFragment = spy(new TestFragment(mContext));
+        mFragment.initFeatureProvider();
 
         when(mAdditionalBatteryInfoMenu.getItemId())
                 .thenReturn(MENU_ADDITIONAL_BATTERY_INFO);
@@ -148,9 +153,6 @@
                 .thenReturn(ADDITIONAL_BATTERY_INFO_INTENT);
         when(mBatteryHelper.getTotalPower()).thenReturn(TOTAL_POWER);
 
-        mPowerUsageSummary = spy(new PowerUsageSummary());
-
-        when(mPowerUsageSummary.getContext()).thenReturn(mRealContext);
         when(mNormalBatterySipper.getPackages()).thenReturn(PACKAGE_NAMES);
         when(mNormalBatterySipper.getUid()).thenReturn(UID);
         mNormalBatterySipper.totalPowerMah = POWER_MAH;
@@ -164,7 +166,7 @@
         when(mBatteryLayoutPref.findViewById(R.id.time)).thenReturn(mTimeText);
         when(mBatteryLayoutPref.findViewById(R.id.battery_header_icon))
                 .thenReturn(mBatteryMeterView);
-        mPowerUsageSummary.setBatteryLayoutPreference(mBatteryLayoutPref);
+        mFragment.setBatteryLayoutPreference(mBatteryLayoutPref);
 
         mScreenBatterySipper.drainType = BatterySipper.DrainType.SCREEN;
         mScreenBatterySipper.totalPowerMah = BATTERY_SCREEN_USAGE;
@@ -179,11 +181,11 @@
         mUsageList.add(mScreenBatterySipper);
         mUsageList.add(mCellBatterySipper);
 
-        mPowerUsageSummary.mStatsHelper = mBatteryHelper;
+        mFragment.mStatsHelper = mBatteryHelper;
         when(mBatteryHelper.getUsageList()).thenReturn(mUsageList);
-        mPowerUsageSummary.mScreenUsagePref = mScreenUsagePref;
-        mPowerUsageSummary.mScreenConsumptionPref = mScreenConsumptionPref;
-        mPowerUsageSummary.mCellularNetworkPref = mCellularNetworkPref;
+        mFragment.mScreenUsagePref = mScreenUsagePref;
+        mFragment.mScreenConsumptionPref = mScreenConsumptionPref;
+        mFragment.mCellularNetworkPref = mCellularNetworkPref;
     }
 
     @Test
@@ -235,7 +237,7 @@
         mNormalBatterySipper.uidObj = null;
         mNormalBatterySipper.drainType = BatterySipper.DrainType.APP;
 
-        final String key = mPowerUsageSummary.extractKeyFromSipper(mNormalBatterySipper);
+        final String key = mFragment.extractKeyFromSipper(mNormalBatterySipper);
         assertThat(key).isEqualTo(TextUtils.concat(mNormalBatterySipper.getPackages()).toString());
     }
 
@@ -244,7 +246,7 @@
         mNormalBatterySipper.uidObj = null;
         mNormalBatterySipper.drainType = BatterySipper.DrainType.BLUETOOTH;
 
-        final String key = mPowerUsageSummary.extractKeyFromSipper(mNormalBatterySipper);
+        final String key = mFragment.extractKeyFromSipper(mNormalBatterySipper);
         assertThat(key).isEqualTo(mNormalBatterySipper.drainType.toString());
     }
 
@@ -253,7 +255,7 @@
         mNormalBatterySipper.uidObj = new BatteryStatsImpl.Uid(new BatteryStatsImpl(), UID);
         mNormalBatterySipper.drainType = BatterySipper.DrainType.APP;
 
-        final String key = mPowerUsageSummary.extractKeyFromSipper(mNormalBatterySipper);
+        final String key = mFragment.extractKeyFromSipper(mNormalBatterySipper);
         assertThat(key).isEqualTo(Integer.toString(mNormalBatterySipper.getUid()));
     }
 
@@ -263,8 +265,10 @@
         sippers.add(mNormalBatterySipper);
         sippers.add(mScreenBatterySipper);
         sippers.add(mSystemBatterySipper);
+        when(mFeatureFactory.powerUsageFeatureProvider.isTypeSystem(mSystemBatterySipper))
+                .thenReturn(true);
 
-        final double totalUsage = mPowerUsageSummary.removeHiddenBatterySippers(sippers);
+        final double totalUsage = mFragment.removeHiddenBatterySippers(sippers);
         assertThat(sippers).containsExactly(mNormalBatterySipper);
         assertThat(totalUsage).isWithin(PRECISION).of(BATTERY_SCREEN_USAGE + BATTERY_SYSTEM_USAGE);
     }
@@ -272,47 +276,58 @@
     @Test
     public void testShouldHideSipper_TypeIdle_ReturnTrue() {
         mNormalBatterySipper.drainType = BatterySipper.DrainType.IDLE;
-        assertThat(mPowerUsageSummary.shouldHideSipper(mNormalBatterySipper)).isTrue();
+        assertThat(mFragment.shouldHideSipper(mNormalBatterySipper)).isTrue();
     }
 
     @Test
     public void testShouldHideSipper_TypeCell_ReturnTrue() {
         mNormalBatterySipper.drainType = BatterySipper.DrainType.CELL;
-        assertThat(mPowerUsageSummary.shouldHideSipper(mNormalBatterySipper)).isTrue();
+        assertThat(mFragment.shouldHideSipper(mNormalBatterySipper)).isTrue();
     }
 
     @Test
     public void testShouldHideSipper_TypeScreen_ReturnTrue() {
         mNormalBatterySipper.drainType = BatterySipper.DrainType.SCREEN;
-        assertThat(mPowerUsageSummary.shouldHideSipper(mNormalBatterySipper)).isTrue();
+        assertThat(mFragment.shouldHideSipper(mNormalBatterySipper)).isTrue();
     }
 
     @Test
-    public void testShouldHideSipper_UidRoot_ReturnTrue() {
+    public void testShouldHideSipper_TypeBluetooth_ReturnTrue() {
+        mNormalBatterySipper.drainType = BatterySipper.DrainType.BLUETOOTH;
+        assertThat(mFragment.shouldHideSipper(mNormalBatterySipper)).isTrue();
+    }
+
+    @Test
+    public void testShouldHideSipper_TypeSystem_ReturnTrue() {
         mNormalBatterySipper.drainType = BatterySipper.DrainType.APP;
         when(mNormalBatterySipper.getUid()).thenReturn(Process.ROOT_UID);
-        assertThat(mPowerUsageSummary.shouldHideSipper(mNormalBatterySipper)).isTrue();
-    }
-
-    @Test
-    public void testShouldHideSipper_UidSystem_ReturnTrue() {
-        mNormalBatterySipper.drainType = BatterySipper.DrainType.APP;
-        when(mNormalBatterySipper.getUid()).thenReturn(Process.SYSTEM_UID);
-        assertThat(mPowerUsageSummary.shouldHideSipper(mNormalBatterySipper)).isTrue();
+        when(mFeatureFactory.powerUsageFeatureProvider.isTypeSystem(Matchers.<BatterySipper>any()))
+                .thenReturn(true);
+        assertThat(mFragment.shouldHideSipper(mNormalBatterySipper)).isTrue();
     }
 
     @Test
     public void testShouldHideSipper_UidNormal_ReturnFalse() {
         mNormalBatterySipper.drainType = BatterySipper.DrainType.APP;
         when(mNormalBatterySipper.getUid()).thenReturn(UID);
-        assertThat(mPowerUsageSummary.shouldHideSipper(mNormalBatterySipper)).isFalse();
+        assertThat(mFragment.shouldHideSipper(mNormalBatterySipper)).isFalse();
+    }
+
+    @Test
+    public void testShouldHideSipper_TypeService_ReturnTrue() {
+        mNormalBatterySipper.drainType = BatterySipper.DrainType.APP;
+        when(mNormalBatterySipper.getUid()).thenReturn(UID);
+        when(mFeatureFactory.powerUsageFeatureProvider.isTypeService(Matchers.<BatterySipper>any()))
+                .thenReturn(true);
+
+        assertThat(mFragment.shouldHideSipper(mNormalBatterySipper)).isTrue();
     }
 
     @Test
     public void testSetUsageSummary_TimeLessThanOneMinute_DoNotSetSummary() {
         final long usageTimeMs = 59 * DateUtils.SECOND_IN_MILLIS;
 
-        mPowerUsageSummary.setUsageSummary(mPreference, "", usageTimeMs);
+        mFragment.setUsageSummary(mPreference, "", usageTimeMs);
         verify(mPreference, never()).setSummary(anyString());
     }
 
@@ -320,7 +335,7 @@
     public void testSetUsageSummary_TimeMoreThanOneMinute_SetSummary() {
         final long usageTimeMs = 2 * DateUtils.MINUTE_IN_MILLIS;
 
-        mPowerUsageSummary.setUsageSummary(mPreference, "", usageTimeMs);
+        mFragment.setUsageSummary(mPreference, "", usageTimeMs);
         verify(mPreference).setSummary(anyString());
     }
 
@@ -328,7 +343,7 @@
     public void testUpdatePreference_NoEstimatedTime_DoNotShowSummary() {
         mBatteryInfo.remainingTimeUs = 0;
         mBatteryInfo.remainingLabel = TIME_LEFT;
-        mPowerUsageSummary.updateHeaderPreference(mBatteryInfo);
+        mFragment.updateHeaderPreference(mBatteryInfo);
 
         verify(mSummary1).setVisibility(View.INVISIBLE);
         verify(mSummary2).setVisibility(View.INVISIBLE);
@@ -338,7 +353,7 @@
     public void testUpdatePreference_HasEstimatedTime_ShowSummary() {
         mBatteryInfo.remainingTimeUs = REMAINING_TIME_US;
         mBatteryInfo.remainingLabel = TIME_LEFT;
-        mPowerUsageSummary.updateHeaderPreference(mBatteryInfo);
+        mFragment.updateHeaderPreference(mBatteryInfo);
 
         verify(mSummary1).setVisibility(View.VISIBLE);
         verify(mSummary2).setVisibility(View.VISIBLE);
@@ -349,7 +364,7 @@
         mBatteryInfo.remainingTimeUs = REMAINING_TIME_US;
         mBatteryInfo.mDischarging = false;
 
-        mPowerUsageSummary.updateHeaderPreference(mBatteryInfo);
+        mFragment.updateHeaderPreference(mBatteryInfo);
         verify(mSummary1).setText(R.string.estimated_charging_time_left);
     }
 
@@ -358,17 +373,17 @@
         mBatteryInfo.remainingTimeUs = REMAINING_TIME_US;
         mBatteryInfo.mDischarging = true;
 
-        mPowerUsageSummary.updateHeaderPreference(mBatteryInfo);
+        mFragment.updateHeaderPreference(mBatteryInfo);
         verify(mSummary1).setText(R.string.estimated_time_left);
     }
 
     @Test
     public void testUpdateHeaderPreference_AsyncUpdate_ShouldNotCrash() {
-        when(mPowerUsageSummary.getContext()).thenReturn(null);
+        when(mFragment.getContext()).thenReturn(null);
         mBatteryInfo.remainingTimeUs = REMAINING_TIME_US;
 
         //Should not crash
-        mPowerUsageSummary.updateHeaderPreference(mBatteryInfo);
+        mFragment.updateHeaderPreference(mBatteryInfo);
     }
 
     private void testToggleAllApps(final boolean isShowApps) {
@@ -380,7 +395,7 @@
 
     @Test
     public void testFindBatterySipperByType_findTypeScreen() {
-        BatterySipper sipper = mPowerUsageSummary.findBatterySipperByType(mUsageList,
+        BatterySipper sipper = mFragment.findBatterySipperByType(mUsageList,
                 BatterySipper.DrainType.SCREEN);
 
         assertThat(sipper).isSameAs(mScreenBatterySipper);
@@ -388,7 +403,7 @@
 
     @Test
     public void testFindBatterySipperByType_findTypeApp() {
-        BatterySipper sipper = mPowerUsageSummary.findBatterySipperByType(mUsageList,
+        BatterySipper sipper = mFragment.findBatterySipperByType(mUsageList,
                 BatterySipper.DrainType.APP);
 
         assertThat(sipper).isSameAs(mNormalBatterySipper);
@@ -399,9 +414,9 @@
         final double percent = POWER_MAH / TOTAL_POWER * DISCHARGE_AMOUNT;
         final String expectedSummary = mRealContext.getString(R.string.battery_overall_usage,
                 Utils.formatPercentage((int) percent));
-        doReturn(expectedSummary).when(mPowerUsageSummary)
+        doReturn(expectedSummary).when(mFragment)
                 .getString(eq(R.string.battery_overall_usage), anyInt());
-        mPowerUsageSummary.updateCellularPreference(DISCHARGE_AMOUNT);
+        mFragment.updateCellularPreference(DISCHARGE_AMOUNT);
 
         verify(mCellularNetworkPref).setSummary(expectedSummary);
     }
@@ -413,12 +428,12 @@
         final double percent = BATTERY_SCREEN_USAGE / TOTAL_POWER * DISCHARGE_AMOUNT;
         final String expectedOverallUsage = mRealContext.getString(R.string.battery_overall_usage,
                 Utils.formatPercentage((int) percent));
-        doReturn(expectedUsedTime).when(mPowerUsageSummary).getString(
+        doReturn(expectedUsedTime).when(mFragment).getString(
                 eq(R.string.battery_used_for), anyInt());
-        doReturn(expectedOverallUsage).when(mPowerUsageSummary).getString(
+        doReturn(expectedOverallUsage).when(mFragment).getString(
                 eq(R.string.battery_overall_usage), anyInt());
 
-        mPowerUsageSummary.updateScreenPreference(DISCHARGE_AMOUNT);
+        mFragment.updateScreenPreference(DISCHARGE_AMOUNT);
 
         verify(mScreenUsagePref).setSummary(expectedUsedTime);
         verify(mScreenConsumptionPref).setSummary(expectedOverallUsage);
@@ -427,16 +442,16 @@
     @Test
     public void testUpdatePreference_UsageListEmpty_ShouldNotCrash() {
         when(mBatteryHelper.getUsageList()).thenReturn(new ArrayList<BatterySipper>());
-        doReturn("").when(mPowerUsageSummary).getString(anyInt(), Matchers.anyObject());
+        doReturn("").when(mFragment).getString(anyInt(), Matchers.anyObject());
 
         // Should not crash when update
-        mPowerUsageSummary.updateScreenPreference(DISCHARGE_AMOUNT);
-        mPowerUsageSummary.updateCellularPreference(DISCHARGE_AMOUNT);
+        mFragment.updateScreenPreference(DISCHARGE_AMOUNT);
+        mFragment.updateCellularPreference(DISCHARGE_AMOUNT);
     }
 
     @Test
     public void testCalculatePercentage() {
-        final double percent = mPowerUsageSummary.calculatePercentage(POWER_MAH, DISCHARGE_AMOUNT);
+        final double percent = mFragment.calculatePercentage(POWER_MAH, DISCHARGE_AMOUNT);
         assertThat(percent).isWithin(PRECISION).of(POWER_USAGE_PERCENTAGE);
     }
 
diff --git a/tests/robotests/src/com/android/settings/network/TetherPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/TetherPreferenceControllerTest.java
index 3d6a233..a856e8c 100644
--- a/tests/robotests/src/com/android/settings/network/TetherPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/TetherPreferenceControllerTest.java
@@ -51,8 +51,6 @@
     @Mock
     private BluetoothAdapter mBluetoothAdapter;
     @Mock
-    private UserManager mUserManager;
-    @Mock
     private Preference mPreference;
 
     private TetherPreferenceController mController;
@@ -64,7 +62,6 @@
         ReflectionHelpers.setField(mController, "mContext", mContext);
         ReflectionHelpers.setField(mController, "mConnectivityManager", mConnectivityManager);
         ReflectionHelpers.setField(mController, "mBluetoothAdapter", mBluetoothAdapter);
-        ReflectionHelpers.setField(mController, "mUserManager", mUserManager);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/notification/CastPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/CastPreferenceControllerTest.java
index 5fe4c42..fc9867e 100644
--- a/tests/robotests/src/com/android/settings/notification/CastPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/CastPreferenceControllerTest.java
@@ -22,9 +22,6 @@
 import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -33,8 +30,10 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.when;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
@@ -61,8 +60,7 @@
     }
 
     @Test
-    public void updateNonIndexableKeys_voiceCapable_shouldNotUpdate() {
-        when(mTelephonyManager.isVoiceCapable()).thenReturn(true);
+    public void updateNonIndexableKeys_shouldNotUpdate() {
         final List<String> keys = new ArrayList<>();
 
         mController.updateNonIndexableKeys(keys);
@@ -70,14 +68,4 @@
         assertThat(keys).isEmpty();
     }
 
-    @Test
-    public void updateNonIndexableKeys_voiceIncapable_shouldUpdate() {
-        when(mTelephonyManager.isVoiceCapable()).thenReturn(false);
-        final List<String> keys = new ArrayList<>();
-
-        mController.updateNonIndexableKeys(keys);
-
-        assertThat(keys).isNotEmpty();
-    }
-
 }
diff --git a/tests/robotests/src/com/android/settings/notification/SettingPrefControllerTest.java b/tests/robotests/src/com/android/settings/notification/SettingPrefControllerTest.java
index b36b19b..25581b9 100644
--- a/tests/robotests/src/com/android/settings/notification/SettingPrefControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/SettingPrefControllerTest.java
@@ -53,7 +53,7 @@
     @Mock
     private PreferenceScreen mScreen;
     @Mock
-    private OtherSoundSettings mSetting;
+    private SoundSettings mSetting;
     @Mock
     private Activity mActivity;
     @Mock
diff --git a/tests/robotests/src/com/android/settings/search/BaseSearchIndexProviderTest.java b/tests/robotests/src/com/android/settings/search/BaseSearchIndexProviderTest.java
new file mode 100644
index 0000000..818f8a2
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/search/BaseSearchIndexProviderTest.java
@@ -0,0 +1,99 @@
+/*
+ * 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.search;
+
+
+import android.content.Context;
+
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import com.android.settings.core.PreferenceController;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class BaseSearchIndexProviderTest {
+
+    private static final String TEST_PREF_KEY = "test_pref_key";
+
+    @Mock
+    private Context mContext;
+    private BaseSearchIndexProvider mIndexProvider;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mIndexProvider = spy(BaseSearchIndexProvider.class);
+    }
+
+    @Test
+    public void getNonIndexableKeys_noPreferenceController_shouldReturnEmptyList() {
+        assertThat(mIndexProvider.getNonIndexableKeys(mContext)).isEqualTo(Collections.EMPTY_LIST);
+    }
+
+    @Test
+    public void getNonIndexableKeys_preferenceIsAvailable_shouldReturnEmptyList() {
+        List<PreferenceController> controllers = new ArrayList<>();
+        controllers.add(new PreferenceController(mContext) {
+            @Override
+            public boolean isAvailable() {
+                return true;
+            }
+
+            @Override
+            public String getPreferenceKey() {
+                return TEST_PREF_KEY;
+            }
+        });
+        doReturn(controllers).when(mIndexProvider).getPreferenceControllers(mContext);
+
+        assertThat(mIndexProvider.getNonIndexableKeys(mContext)).isEqualTo(Collections.EMPTY_LIST);
+    }
+
+    @Test
+    public void getNonIndexableKeys_preferenceIsNotAvailable_shouldReturnKey() {
+        List<PreferenceController> controllers = new ArrayList<>();
+        controllers.add(new PreferenceController(mContext) {
+            @Override
+            public boolean isAvailable() {
+                return false;
+            }
+
+            @Override
+            public String getPreferenceKey() {
+                return TEST_PREF_KEY;
+            }
+        });
+        doReturn(controllers).when(mIndexProvider).getPreferenceControllers(mContext);
+
+        assertThat(mIndexProvider.getNonIndexableKeys(mContext)).contains(TEST_PREF_KEY);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/search/DynamicIndexableContentMonitorTest.java b/tests/robotests/src/com/android/settings/search/DynamicIndexableContentMonitorTest.java
index 5ebc4b9..0bd651a 100644
--- a/tests/robotests/src/com/android/settings/search/DynamicIndexableContentMonitorTest.java
+++ b/tests/robotests/src/com/android/settings/search/DynamicIndexableContentMonitorTest.java
@@ -58,9 +58,9 @@
 import com.android.settings.TestConfig;
 import com.android.settings.accessibility.AccessibilitySettings;
 import com.android.settings.inputmethod.AvailableVirtualKeyboardFragment;
-import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
 import com.android.settings.inputmethod.PhysicalKeyboardFragment;
 import com.android.settings.inputmethod.VirtualKeyboardFragment;
+import com.android.settings.language.LanguageAndInputSettings;
 import com.android.settings.print.PrintSettingsFragment;
 import com.android.settings.testutils.shadow.ShadowActivityWithLoadManager;
 import com.android.settings.testutils.shadow.ShadowContextImplWithRegisterReceiver;
@@ -417,7 +417,7 @@
         final ContentObserver observer = extractContentObserver(UserDictionary.Words.CONTENT_URI);
         assertThat(observer).isNotNull();
 
-        verifyRebuildIndexing(InputMethodAndLanguageSettings.class);
+        verifyRebuildIndexing(LanguageAndInputSettings.class);
 
         /*
          * When user dictionary content is changed, rebuild indexing happens.
@@ -426,7 +426,7 @@
 
         observer.onChange(false /* selfChange */, UserDictionary.Words.CONTENT_URI);
 
-        verifyRebuildIndexing(InputMethodAndLanguageSettings.class);
+        verifyRebuildIndexing(LanguageAndInputSettings.class);
     }
 
     /*
diff --git a/tests/robotests/src/com/android/settings/search/XmlParserUtilTest.java b/tests/robotests/src/com/android/settings/search/XmlParserUtilTest.java
index 300aaaf..028cbb0 100644
--- a/tests/robotests/src/com/android/settings/search/XmlParserUtilTest.java
+++ b/tests/robotests/src/com/android/settings/search/XmlParserUtilTest.java
@@ -56,40 +56,40 @@
 
     @Test
     public void testDataTitleValid_ReturnsPreferenceTitle() {
-        XmlResourceParser parser = getChildByType(R.xml.gesture_settings,
-                "com.android.settings.gestures.GesturePreference");
+        XmlResourceParser parser = getChildByType(R.xml.ia_display_settings,
+                "com.android.settings.TimeoutListPreference");
         final AttributeSet attrs = Xml.asAttributeSet(parser);
         String title = XmlParserUtils.getDataTitle(mContext, attrs);
-        String expTitle = mContext.getString(R.string.assist_gesture_title);
+        String expTitle = mContext.getString(R.string.screen_timeout);
         assertThat(title).isEqualTo(expTitle);
     }
 
     @Test
     public void testDataKeywordsValid_ReturnsPreferenceKeywords() {
-        XmlResourceParser parser = getParentPrimedParser(R.xml.gesture_settings);
+        XmlResourceParser parser = getParentPrimedParser(R.xml.ia_display_settings);
         final AttributeSet attrs = Xml.asAttributeSet(parser);
         String keywords = XmlParserUtils.getDataKeywords(mContext, attrs);
-        String expKeywords = mContext.getString(R.string.keywords_gesture);
+        String expKeywords = mContext.getString(R.string.keywords_display);
         assertThat(keywords).isEqualTo(expKeywords);
     }
 
     @Test
     public void testDataKeyValid_ReturnsPreferenceKey() {
-        XmlResourceParser parser = getChildByType(R.xml.gesture_settings,
-                "com.android.settings.gestures.GesturePreference");
+        XmlResourceParser parser = getChildByType(R.xml.ia_display_settings,
+                "com.android.settings.TimeoutListPreference");
         final AttributeSet attrs = Xml.asAttributeSet(parser);
         String key = XmlParserUtils.getDataKey(mContext, attrs);
-        String expKey = "gesture_assist";
+        String expKey = "screen_timeout";
         assertThat(key).isEqualTo(expKey);
     }
 
     @Test
     public void testDataSummaryValid_ReturnsPreferenceSummary() {
-        XmlResourceParser parser = getChildByType(R.xml.gesture_settings,
-                "com.android.settings.gestures.GesturePreference");
+        XmlResourceParser parser = getChildByType(R.xml.ia_display_settings,
+                "com.android.settings.TimeoutListPreference");
         final AttributeSet attrs = Xml.asAttributeSet(parser);
         String summary = XmlParserUtils.getDataSummary(mContext, attrs);
-        String expSummary = mContext.getString(R.string.assist_gesture_summary);
+        String expSummary = mContext.getString(R.string.screen_timeout_summary);
         assertThat(summary).isEqualTo(expSummary);
 
     }
@@ -128,7 +128,7 @@
 
     @Test
     public void testDataKeyInvalid_ReturnsNull() {
-        XmlResourceParser parser = getParentPrimedParser(R.xml.gesture_settings);
+        XmlResourceParser parser = getParentPrimedParser(R.xml.ia_display_settings);
         final AttributeSet attrs = Xml.asAttributeSet(parser);
         String key = XmlParserUtils.getDataKey(mContext, attrs);
         assertThat(key).isNull();
@@ -136,7 +136,7 @@
 
     @Test
     public void testDataSummaryInvalid_ReturnsNull() {
-        XmlResourceParser parser = getParentPrimedParser(R.xml.gesture_settings);
+        XmlResourceParser parser = getParentPrimedParser(R.xml.ia_display_settings);
         final AttributeSet attrs = Xml.asAttributeSet(parser);
         String summary = XmlParserUtils.getDataSummary(mContext, attrs);
         assertThat(summary).isNull();
@@ -144,7 +144,7 @@
 
     @Test
     public void testDataSummaryOffInvalid_ReturnsNull() {
-        XmlResourceParser parser = getParentPrimedParser(R.xml.gesture_settings);
+        XmlResourceParser parser = getParentPrimedParser(R.xml.ia_display_settings);
         final AttributeSet attrs = Xml.asAttributeSet(parser);
         String summaryOff = XmlParserUtils.getDataSummaryOff(mContext, attrs);
         assertThat(summaryOff).isNull();
@@ -152,7 +152,7 @@
 
     @Test
     public void testDataEntriesInvalid_ReturnsNull() {
-        XmlResourceParser parser = getParentPrimedParser(R.xml.gesture_settings);
+        XmlResourceParser parser = getParentPrimedParser(R.xml.ia_display_settings);
         final AttributeSet attrs = Xml.asAttributeSet(parser);
         String entries = XmlParserUtils.getDataEntries(mContext, attrs);
         assertThat(entries).isNull();
diff --git a/tests/robotests/src/com/android/settings/search2/CursorToSearchResultConverterTest.java b/tests/robotests/src/com/android/settings/search2/CursorToSearchResultConverterTest.java
index d69ba3e..6f326ab 100644
--- a/tests/robotests/src/com/android/settings/search2/CursorToSearchResultConverterTest.java
+++ b/tests/robotests/src/com/android/settings/search2/CursorToSearchResultConverterTest.java
@@ -29,7 +29,7 @@
 import com.android.settings.SubSettings;
 import com.android.settings.TestConfig;
 import com.android.settings.dashboard.SiteMapManager;
-import com.android.settings.gestures.GestureSettings;
+import com.android.settings.gestures.SwipeToNotificationSettings;
 import com.android.settings.search2.ResultPayload.PayloadType;
 
 import org.junit.Before;
@@ -155,7 +155,7 @@
                 TITLES[0], // Title
                 SUMMARY, // Summary on
                 SUMMARY, // summary off
-                GestureSettings.class.getName(),
+                SwipeToNotificationSettings.class.getName(),
                 BLANK,   // screen title
                 null,    // icon
                 BLANK,   // action
@@ -226,7 +226,7 @@
                 TITLES[0], // Title
                 SUMMARY, // Summary on
                 SUMMARY, // summary off
-                GestureSettings.class.getName(),
+                SwipeToNotificationSettings.class.getName(),
                 BLANK,   // screen title
                 null,    // icon
                 BLANK,   // action
diff --git a/tests/robotests/src/com/android/settings/search2/DatabaseIndexingManagerTest.java b/tests/robotests/src/com/android/settings/search2/DatabaseIndexingManagerTest.java
index eaaa00e..fdc1052 100644
--- a/tests/robotests/src/com/android/settings/search2/DatabaseIndexingManagerTest.java
+++ b/tests/robotests/src/com/android/settings/search2/DatabaseIndexingManagerTest.java
@@ -205,25 +205,25 @@
 
     @Test
     public void testAddResource_RowsInserted() {
-        SearchIndexableResource resource = getFakeResource(R.xml.gesture_settings);
+        SearchIndexableResource resource = getFakeResource(R.xml.ia_display_settings);
         mManager.indexOneSearchIndexableData(mDb, localeStr, resource,
                 new HashMap<>());
         Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index", null);
-        assertThat(cursor.getCount()).isEqualTo(7);
+        assertThat(cursor.getCount()).isEqualTo(16);
     }
 
     @Test
     public void testAddResourceWithNIKs_RowsInsertedDisabled() {
-        SearchIndexableResource resource = getFakeResource(R.xml.gesture_settings);
-        // Only add 2 of 6 items to be disabled.
-        String[] keys = {"gesture_double_tap_power", "gesture_swipe_down_fingerprint"};
+        SearchIndexableResource resource = getFakeResource(R.xml.ia_display_settings);
+        // Only add 2 of 16 items to be disabled.
+        String[] keys = {"brightness", "wallpaper"};
         Map<String, List<String>> niks = getNonIndexableKeys(keys);
         mManager.indexOneSearchIndexableData(mDb, localeStr, resource, niks);
 
         Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 0", null);
         assertThat(cursor.getCount()).isEqualTo(2);
         cursor = mDb.rawQuery("SELECT * FROM prefs_index WHERE enabled = 1", null);
-        assertThat(cursor.getCount()).isEqualTo(5);
+        assertThat(cursor.getCount()).isEqualTo(14);
     }
 
     @Test
@@ -306,7 +306,7 @@
 
     @Test
     public void testAddResourceCustomSetting_RowsMatch() {
-        SearchIndexableResource resource = getFakeResource(R.xml.gesture_settings);
+        SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings);
         mManager.indexOneSearchIndexableData(mDb, localeStr, resource,
                 new HashMap<>());
         final String prefTitle =
@@ -339,7 +339,7 @@
         assertThat(cursor.getString(9)).isEmpty();
         // Screen Title
         assertThat(cursor.getString(10)).isEqualTo(
-                mContext.getString(R.string.gesture_preference_title));
+                mContext.getString(R.string.fingerprint_swipe_for_notifications_title));
         // Class Name
         assertThat(cursor.getString(11)).isEqualTo(className);
         // Icon
@@ -477,7 +477,7 @@
 
     @Test
     public void testResourceProvider_RowInserted() {
-        SearchIndexableResource resource = getFakeResource(R.xml.gesture_settings);
+        SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings);
         resource.xmlResId = 0;
         resource.className = "com.android.settings.display.ScreenZoomSettings";
 
@@ -489,7 +489,7 @@
 
     @Test
     public void testResourceProvider_Matches() {
-        SearchIndexableResource resource = getFakeResource(R.xml.gesture_settings);
+        SearchIndexableResource resource = getFakeResource(R.xml.swipe_to_notification_settings);
         resource.xmlResId = 0;
         resource.className = "com.android.settings.display.ScreenZoomSettings";
 
diff --git a/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java b/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java
index 70e05d6..10ba293 100644
--- a/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java
+++ b/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.eq;
@@ -45,13 +46,14 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 
 @RunWith(AndroidJUnit4.class)
 @SmallTest
 public class StorageAsyncLoaderTest {
     private static final int PRIMARY_USER_ID = 0;
     private static final int SECONDARY_USER_ID = 10;
+    private static final String PACKAGE_NAME_1 = "com.blah.test";
+    private static final String PACKAGE_NAME_2 = "com.blah.test2";
 
     @Mock
     private StorageStatsSource mSource;
@@ -81,8 +83,8 @@
 
     @Test
     public void testLoadingApps() throws Exception {
-        addPackage(1001, 0, 1, 10, ApplicationInfo.CATEGORY_UNDEFINED);
-        addPackage(1002, 0, 100, 1000, ApplicationInfo.CATEGORY_UNDEFINED);
+        addPackage(PACKAGE_NAME_1, 0, 1, 10, ApplicationInfo.CATEGORY_UNDEFINED);
+        addPackage(PACKAGE_NAME_2, 0, 100, 1000, ApplicationInfo.CATEGORY_UNDEFINED);
 
         SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
 
@@ -93,7 +95,7 @@
 
     @Test
     public void testGamesAreFiltered() throws Exception {
-        addPackage(1001, 0, 1, 10, ApplicationInfo.CATEGORY_GAME);
+        addPackage(PACKAGE_NAME_1, 0, 1, 10, ApplicationInfo.CATEGORY_GAME);
 
         SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
 
@@ -103,19 +105,8 @@
     }
 
     @Test
-    public void testDuplicateUidsAreSkipped() throws Exception {
-        addPackage(1001, 0, 1, 10, ApplicationInfo.CATEGORY_UNDEFINED);
-        addPackage(1001, 0, 1, 10, ApplicationInfo.CATEGORY_UNDEFINED);
-
-        SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
-
-        assertThat(result.size()).isEqualTo(1);
-        assertThat(result.get(PRIMARY_USER_ID).otherAppsSize).isEqualTo(11L);
-    }
-
-    @Test
     public void testCacheIsIgnored() throws Exception {
-        addPackage(1001, 100, 1, 10, ApplicationInfo.CATEGORY_UNDEFINED);
+        addPackage(PACKAGE_NAME_1, 100, 1, 10, ApplicationInfo.CATEGORY_UNDEFINED);
 
         SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
 
@@ -140,16 +131,43 @@
         assertThat(result.get(SECONDARY_USER_ID).externalStats.totalBytes).isEqualTo(10L);
     }
 
-    private void addPackage(int uid, long cacheSize, long codeSize, long dataSize, int category) {
+    @Test
+    public void testSystemAppsBaseSizeIsIgnored() throws Exception {
+        ApplicationInfo systemApp =
+                addPackage(PACKAGE_NAME_1, 100, 1, 10, ApplicationInfo.CATEGORY_UNDEFINED);
+        systemApp.flags = ApplicationInfo.FLAG_SYSTEM;
+
+        SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+        assertThat(result.size()).isEqualTo(1);
+        assertThat(result.get(PRIMARY_USER_ID).otherAppsSize).isEqualTo(10L);
+    }
+
+    @Test
+    public void testUpdatedSystemAppCodeSizeIsCounted() throws Exception {
+        ApplicationInfo systemApp =
+                addPackage(PACKAGE_NAME_1, 100, 1, 10, ApplicationInfo.CATEGORY_UNDEFINED);
+        systemApp.flags = ApplicationInfo.FLAG_SYSTEM & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
+
+        SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+        assertThat(result.size()).isEqualTo(1);
+        assertThat(result.get(PRIMARY_USER_ID).otherAppsSize).isEqualTo(11L);
+    }
+
+    private ApplicationInfo addPackage(
+            String packageName, long cacheSize, long codeSize, long dataSize, int category) {
         StorageStatsSource.AppStorageStats storageStats =
                 mock(StorageStatsSource.AppStorageStats.class);
         when(storageStats.getCodeBytes()).thenReturn(codeSize);
         when(storageStats.getDataBytes()).thenReturn(dataSize);
-        when(mSource.getStatsForUid(anyString(), eq(uid))).thenReturn(storageStats);
+        when(mSource.getStatsForPackage(anyString(), eq(packageName), any(UserHandle.class)))
+                .thenReturn(storageStats);
 
         ApplicationInfo info = new ApplicationInfo();
-        info.uid = uid;
+        info.packageName = packageName;
         info.category = category;
         mInfo.add(info);
+        return info;
     }
 }