diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 61b62cb..32ec381 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2768,7 +2768,7 @@
             </intent-filter>
         </activity>
 
-        <activity android:name="Settings$ManageDefaultAppsActivity"
+        <activity android:name="Settings$AdvancedAppsActivity"
                   android:taskAffinity=""
                   android:exported="true">
             <intent-filter android:priority="1">
@@ -2780,7 +2780,7 @@
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                       android:value="com.android.settings.applications.ManageDefaultApps" />
+                       android:value="com.android.settings.applications.AdvancedAppSettings" />
         </activity>
 
         <service
diff --git a/res/layout/battery_active_view.xml b/res/layout/battery_active_view.xml
new file mode 100644
index 0000000..b5ada00
--- /dev/null
+++ b/res/layout/battery_active_view.xml
@@ -0,0 +1,37 @@
+<?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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:paddingEnd="56dp"
+    android:paddingTop="4dp"
+    android:orientation="vertical">
+
+    <TextView
+        android:id="@android:id/title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:textColor="?android:attr/textColorSecondary" />
+
+    <com.android.settings.fuelgauge.BatteryActiveView
+        android:id="@+id/battery_active"
+        android:layout_width="match_parent"
+        android:layout_height="6dp" />
+
+</LinearLayout>
diff --git a/res/layout/battery_history_detail.xml b/res/layout/battery_history_detail.xml
new file mode 100644
index 0000000..d1563bf
--- /dev/null
+++ b/res/layout/battery_history_detail.xml
@@ -0,0 +1,93 @@
+<?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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+    android:orientation="vertical">
+
+    <TextView
+        android:id="@+id/charge"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:textAppearance="?android:attr/textAppearanceLarge"
+        android:textSize="36sp"
+        android:textColor="?android:attr/colorAccent" />
+
+    <TextView
+        android:id="@+id/estimation"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingBottom="8dp"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:textColor="?android:attr/textColorSecondary" />
+
+    <com.android.settingslib.graph.UsageView
+        android:id="@+id/battery_usage"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        settings:sideLabels="@array/battery_labels"
+        android:colorAccent="?android:attr/colorAccent"
+        android:gravity="end"
+        settings:textColor="?android:attr/textColorSecondary" />
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:layout_marginTop="2dp"
+        android:background="?android:attr/listDivider" />
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:orientation="vertical">
+
+            <include android:id="@+id/cell_network_group"
+                layout="@layout/battery_active_view" />
+
+            <include android:id="@+id/camera_group"
+                layout="@layout/battery_active_view" />
+
+            <include android:id="@+id/flashlight_group"
+                layout="@layout/battery_active_view" />
+
+            <include android:id="@+id/gps_group"
+                layout="@layout/battery_active_view" />
+
+            <include android:id="@+id/wifi_group"
+                layout="@layout/battery_active_view" />
+
+            <include android:id="@+id/cpu_group"
+                layout="@layout/battery_active_view" />
+
+            <include android:id="@+id/screen_on_group"
+                layout="@layout/battery_active_view" />
+
+            <include android:id="@+id/charging_group"
+                layout="@layout/battery_active_view" />
+
+        </LinearLayout>
+
+    </ScrollView>
+
+</LinearLayout>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index c6dd246..94d7df8 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -126,4 +126,8 @@
     <!-- Confirm device credentials screen -->
     <attr name="confirmDeviceCredentialsSideMargin" format="dimension" />
     <attr name="confirmDeviceCredentialsTopMargin" format="dimension" />
+
+    <declare-styleable name="WorkPreference">
+        <attr name="forWork" format="boolean" />
+    </declare-styleable>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index b6ef7b7..5538a11 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6511,7 +6511,10 @@
     <string name="fingerprint_not_recognized">Not recognized</string>
 
     <!-- Title for Default Apps settings [CHAR LIMIT=30] -->
-    <string name="default_apps_title">Default Apps</string>
+    <string name="default_apps_title">Default</string>
+
+    <!-- Title for Default Apps settings for work [CHAR LIMIT=30] -->
+    <string name="default_for_work">Default for work</string>
 
     <!-- Title for Assist and voice input settings [CHAR LIMIT=30] -->
     <string name="assist_and_voice_input_title">Assist &amp; voice input</string>
@@ -7252,4 +7255,8 @@
     <string name="notification_log_details_default">default</string>
     <!-- Notification log debug tool: the word 'none' -->
     <string name="notification_log_details_none">none</string>
+
+    <!-- [CHAR_LIMIT=60] Label for special access screen -->
+    <string name="special_access">Special access</string>
+
 </resources>
diff --git a/res/xml/advanced_apps.xml b/res/xml/advanced_apps.xml
index 70b6856..99e81a6 100644
--- a/res/xml/advanced_apps.xml
+++ b/res/xml/advanced_apps.xml
@@ -24,52 +24,80 @@
         android:title="@string/app_permissions"
         settings:keywords="@string/keywords_app_permissions" />
 
-    <PreferenceScreen
+    <PreferenceCategory
+        android:title="@string/default_apps_title">
+
+        <PreferenceScreen
             android:key="domain_urls"
             android:title="@string/domain_urls_title"
             android:fragment="com.android.settings.applications.ManageApplications">
-        <extra
+            <extra
                 android:name="classname"
                 android:value="com.android.settings.Settings$DomainsURLsAppListActivity" />
-    </PreferenceScreen>
+        </PreferenceScreen>
+
+        <Preference
+            android:key="assist_and_voice_input"
+            android:fragment="com.android.settings.applications.ManageAssist"
+            android:title="@string/assist_and_voice_input_title" />
+
+        <com.android.settings.applications.DefaultHomePreference
+            android:key="default_home"
+            android:title="@string/home_app"
+            android:summary="@string/no_default_home" />
+
+        <com.android.settings.applications.DefaultBrowserPreference
+            android:key="default_browser"
+            android:title="@string/default_browser_title"
+            android:summary="@string/default_browser_title_none" />
+
+        <com.android.settings.applications.DefaultPhonePreference
+            android:key="default_phone_app"
+            android:title="@string/default_phone_title"
+            settings:keywords="@string/keywords_default_phone_app" />
+
+        <com.android.settings.applications.DefaultEmergencyPreference
+            android:key="default_emergency_app"
+            android:title="@string/default_emergency_app"
+            settings:keywords="@string/keywords_emergency_app" />
+
+        <com.android.settings.applications.DefaultSmsPreference
+            android:key="default_sms_app"
+            android:title="@string/sms_application_title"
+            settings:keywords="@string/keywords_more_default_sms_app" />
+
+        <com.android.settings.applications.DefaultNotificationAssistantPreference
+            android:key="default_notification_asst_app"
+            android:title="@string/default_notification_assistant" />
+
+
+    </PreferenceCategory>
+
+    <com.android.settings.WorkOnlyCategory
+        android:key="work_defaults"
+        android:title="@string/default_for_work">
+
+        <com.android.settings.applications.DefaultBrowserPreference
+            android:key="work_default_browser"
+            android:title="@string/default_browser_title"
+            android:summary="@string/default_browser_title_none"
+            settings:forWork="true" />
+
+        <com.android.settings.applications.DefaultPhonePreference
+            android:key="work_default_phone_app"
+            android:title="@string/default_phone_title"
+            settings:keywords="@string/keywords_default_phone_app"
+            settings:forWork="true" />
+
+    </com.android.settings.WorkOnlyCategory>
 
     <PreferenceCategory
-        android:title="@string/advanced_apps" />
+        android:title="@string/advanced_apps">
 
-    <PreferenceScreen
-        android:key="default_apps"
-        android:fragment="com.android.settings.applications.ManageDefaultApps"
-        android:title="@string/default_apps_title"
-        settings:keywords="@string/keywords_default_apps" />
+        <PreferenceScreen
+            android:key="special_access"
+            android:fragment="com.android.settings.applications.SpecialAccessSettings"
+            android:title="@string/special_access" />
 
-    <PreferenceScreen
-        android:key="system_alert_window"
-        android:title="@string/system_alert_window_settings"
-        android:fragment="com.android.settings.applications.ManageApplications"
-        settings:keywords="@string/keywords_system_alert_window">
-        <extra
-            android:name="classname"
-            android:value="com.android.settings.Settings$OverlaySettingsActivity" />
-    </PreferenceScreen>
-
-    <PreferenceScreen
-        android:key="write_settings_apps"
-        android:title="@string/write_settings"
-        android:fragment="com.android.settings.applications.ManageApplications"
-        settings:keywords="@string/keywords_write_settings">
-        <extra
-            android:name="classname"
-            android:value="com.android.settings.Settings$WriteSettingsActivity" />
-    </PreferenceScreen>
-
-    <PreferenceScreen
-        android:key="high_power_apps"
-        android:title="@string/high_power_apps"
-        android:fragment="com.android.settings.applications.ManageApplications"
-        settings:keywords="@string/keywords_ignore_optimizations">
-        <extra
-            android:name="classname"
-            android:value="com.android.settings.Settings$HighPowerApplicationsActivity" />
-    </PreferenceScreen>
-
+    </PreferenceCategory>
 </PreferenceScreen>
diff --git a/res/xml/default_apps.xml b/res/xml/default_apps.xml
deleted file mode 100644
index 76d0e8c..0000000
--- a/res/xml/default_apps.xml
+++ /dev/null
@@ -1,62 +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:key="default_apps">
-
-    <Preference
-        android:key="assist_and_voice_input"
-        android:fragment="com.android.settings.applications.ManageAssist"
-        android:title="@string/assist_and_voice_input_title"
-        />
-
-    <com.android.settings.applications.DefaultHomePreference
-            android:key="default_home"
-            android:title="@string/home_app"
-            android:summary="@string/no_default_home"
-            />
-
-    <com.android.settings.applications.DefaultBrowserPreference
-            android:key="default_browser"
-            android:title="@string/default_browser_title"
-            android:summary="@string/default_browser_title_none"
-            />
-
-    <com.android.settings.applications.DefaultPhonePreference
-            android:key="default_phone_app"
-            android:title="@string/default_phone_title"
-            settings:keywords="@string/keywords_default_phone_app"
-            />
-
-    <com.android.settings.applications.DefaultEmergencyPreference
-            android:key="default_emergency_app"
-            android:title="@string/default_emergency_app"
-            settings:keywords="@string/keywords_emergency_app"
-            />
-
-    <com.android.settings.applications.DefaultSmsPreference
-            android:key="default_sms_app"
-            android:title="@string/sms_application_title"
-            settings:keywords="@string/keywords_more_default_sms_app"
-            />
-
-    <com.android.settings.applications.DefaultNotificationAssistantPreference
-            android:key="default_notification_asst_app"
-            android:title="@string/default_notification_assistant" />
-
-</PreferenceScreen>
diff --git a/res/xml/special_access.xml b/res/xml/special_access.xml
new file mode 100644
index 0000000..9b404df
--- /dev/null
+++ b/res/xml/special_access.xml
@@ -0,0 +1,80 @@
+<?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/com.android.settings">
+
+    <PreferenceScreen
+        android:key="high_power_apps"
+        android:title="@string/high_power_apps"
+        android:fragment="com.android.settings.applications.ManageApplications"
+        settings:keywords="@string/keywords_ignore_optimizations">
+        <extra
+            android:name="classname"
+            android:value="com.android.settings.Settings$HighPowerApplicationsActivity" />
+    </PreferenceScreen>
+
+    <PreferenceScreen
+        android:key="device_administrators"
+        android:title="@string/manage_device_admin"
+        android:fragment="com.android.settings.DeviceAdminSettings" />
+
+    <PreferenceScreen
+        android:key="zen_access"
+        android:title="@string/manage_zen_access_title"
+        android:fragment="com.android.settings.notification.ZenAccessSettings" />
+
+    <PreferenceScreen
+        android:key="system_alert_window"
+        android:title="@string/system_alert_window_settings"
+        android:fragment="com.android.settings.applications.ManageApplications"
+        settings:keywords="@string/keywords_system_alert_window">
+        <extra
+            android:name="classname"
+            android:value="com.android.settings.Settings$OverlaySettingsActivity" />
+    </PreferenceScreen>
+
+    <PreferenceScreen
+        android:key="write_settings_apps"
+        android:title="@string/write_settings"
+        android:fragment="com.android.settings.applications.ManageApplications"
+        settings:keywords="@string/keywords_write_settings">
+        <extra
+            android:name="classname"
+            android:value="com.android.settings.Settings$WriteSettingsActivity" />
+    </PreferenceScreen>
+
+    <PreferenceScreen
+        android:key="notification_access"
+        android:title="@string/manage_notification_access_title"
+        android:fragment="com.android.settings.notification.NotificationAccessSettings" />
+
+    <PreferenceScreen
+        android:key="data_saver"
+        android:title="@string/unrestricted_data_saver"
+        android:fragment="com.android.settings.datausage.UnrestrictedDataAccess" />
+
+    <PreferenceScreen
+        android:key="usage_access"
+        android:title="@string/usage_access"
+        android:fragment="com.android.settings.applications.ManageApplications"
+        settings:keywords="@string/keywords_write_settings">
+        <extra
+            android:name="classname"
+            android:value="com.android.settings.Settings$UsageAccessSettingsActivity" />
+    </PreferenceScreen>
+</PreferenceScreen>
diff --git a/src/com/android/settings/AppListPreference.java b/src/com/android/settings/AppListPreference.java
index 1c1ccd7..8dee7b8 100644
--- a/src/com/android/settings/AppListPreference.java
+++ b/src/com/android/settings/AppListPreference.java
@@ -23,9 +23,12 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.TypedArray;
 import android.graphics.drawable.Drawable;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.os.UserHandle;
+import android.os.UserManager;
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -47,6 +50,9 @@
 
     public static final String ITEM_NONE_VALUE = "";
 
+    protected final boolean mForWork;
+    protected final int mUserId;
+
     private Drawable[] mEntryDrawables;
     private boolean mShowItemNone = false;
     private CharSequence[] mSummaries;
@@ -91,13 +97,24 @@
         }
     }
 
-    public AppListPreference(Context context, AttributeSet attrs,
-            int defStyleAttr, int defStyleRes) {
-        super(context, attrs, defStyleAttr, defStyleRes);
+    public AppListPreference(Context context, AttributeSet attrs, int defStyle, int defAttrs) {
+        super(context, attrs, defStyle, defAttrs);
+
+        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.WorkPreference, 0, 0);
+        mForWork = a.getBoolean(R.styleable.WorkPreference_forWork, false);
+        final UserHandle managedProfile = Utils.getManagedProfile(UserManager.get(context));
+        mUserId = mForWork && managedProfile != null ? managedProfile.getIdentifier()
+                : UserHandle.myUserId();
     }
 
     public AppListPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
+
+        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.WorkPreference, 0, 0);
+        mForWork = a.getBoolean(R.styleable.WorkPreference_forWork, false);
+        final UserHandle managedProfile = Utils.getManagedProfile(UserManager.get(context));
+        mUserId = mForWork && managedProfile != null ? managedProfile.getIdentifier()
+                : UserHandle.myUserId();
     }
 
     public void setShowItemNone(boolean showItemNone) {
@@ -114,7 +131,8 @@
         int selectedIndex = -1;
         for (int i = 0; i < packageNames.length; i++) {
             try {
-                ApplicationInfo appInfo = pm.getApplicationInfo(packageNames[i].toString(), 0);
+                ApplicationInfo appInfo = pm.getApplicationInfoAsUser(packageNames[i].toString(), 0,
+                        mUserId);
                 applicationNames.add(appInfo.loadLabel(pm));
                 validatedPackageNames.add(appInfo.packageName);
                 entryDrawables.add(appInfo.loadIcon(pm));
@@ -162,8 +180,8 @@
         int selectedIndex = -1;
         for (int i = 0; i < componentNames.length; i++) {
             try {
-                ApplicationInfo appInfo = pm.getApplicationInfo(
-                        componentNames[i].getPackageName().toString(), 0);
+                ApplicationInfo appInfo = pm.getApplicationInfoAsUser(
+                        componentNames[i].getPackageName().toString(), 0, mUserId);
                 applicationNames.add(appInfo.loadLabel(pm));
                 validatedComponentNames.add(componentNames[i].flattenToString());
                 entryDrawables.add(appInfo.loadIcon(pm));
diff --git a/src/com/android/settings/InstrumentedFragment.java b/src/com/android/settings/InstrumentedFragment.java
index b5f99b5..9c0c9be 100644
--- a/src/com/android/settings/InstrumentedFragment.java
+++ b/src/com/android/settings/InstrumentedFragment.java
@@ -47,6 +47,7 @@
     // Used for generic logging of Settings Preference Persistence, should not be used
     // outside SharedPreferencesLogger.
     public static final int ACTION_GENERIC_PACKAGE = UNDECLARED + 16;
+    public static final int SPECIAL_ACCESS = UNDECLARED + 17;
 
     /**
      * Declare the view of this category.
diff --git a/src/com/android/settings/PreferenceAvailabilityProvider.java b/src/com/android/settings/SelfAvailablePreference.java
similarity index 94%
rename from src/com/android/settings/PreferenceAvailabilityProvider.java
rename to src/com/android/settings/SelfAvailablePreference.java
index bb33aee..8e4e56d 100644
--- a/src/com/android/settings/PreferenceAvailabilityProvider.java
+++ b/src/com/android/settings/SelfAvailablePreference.java
@@ -21,7 +21,7 @@
 /**
  * Interface for classes whose instances can provide the availability of the preference.
  */
-public interface PreferenceAvailabilityProvider {
+public interface SelfAvailablePreference {
     /**
      * @return the availability of the preference. Please make sure the availability in managed
      * profile is taken into account.
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 494fd3b..95aa700 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -124,7 +124,7 @@
     public static class WriteSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AppDrawOverlaySettingsActivity extends SettingsActivity { /* empty */ }
     public static class AppWriteSettingsActivity extends SettingsActivity { /* empty */ }
-    public static class ManageDefaultAppsActivity extends SettingsActivity { /* empty */ }
+    public static class AdvancedAppsActivity extends SettingsActivity { /* empty */ }
 
     public static class WifiCallingSuggestionActivity extends SettingsActivity { /* empty */ }
     public static class ZenModeAutomationSuggestionActivity extends SettingsActivity { /* empty */ }
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index b875823..3f69a36 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -56,11 +56,11 @@
 import com.android.settings.accessibility.CaptionPropertiesFragment;
 import com.android.settings.accounts.AccountSettings;
 import com.android.settings.accounts.AccountSyncSettings;
+import com.android.settings.applications.AdvancedAppSettings;
 import com.android.settings.applications.DrawOverlayDetails;
 import com.android.settings.applications.InstalledAppDetails;
 import com.android.settings.applications.ManageApplications;
 import com.android.settings.applications.ManageAssist;
-import com.android.settings.applications.ManageDefaultApps;
 import com.android.settings.applications.ProcessStatsSummary;
 import com.android.settings.applications.ProcessStatsUi;
 import com.android.settings.applications.UsageAccessDetails;
@@ -315,7 +315,7 @@
             ProcessStatsSummary.class.getName(),
             DrawOverlayDetails.class.getName(),
             WriteSettingsDetails.class.getName(),
-            ManageDefaultApps.class.getName(),
+            AdvancedAppSettings.class.getName(),
             WallpaperTypeSettings.class.getName(),
     };
 
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index e871c82..6144f72 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -25,6 +25,7 @@
 import android.content.DialogInterface;
 import android.content.pm.PackageManager;
 import android.os.Bundle;
+import android.support.annotation.XmlRes;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceGroup;
 import android.support.v7.preference.PreferenceGroupAdapter;
@@ -132,6 +133,25 @@
     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
     }
 
+    @Override
+    public void addPreferencesFromResource(@XmlRes int preferencesResId) {
+        super.addPreferencesFromResource(preferencesResId);
+        checkAvailablePrefs(getPreferenceScreen());
+    }
+
+    private void checkAvailablePrefs(PreferenceGroup preferenceGroup) {
+        if (preferenceGroup == null) return;
+        for (int i = 0; i < preferenceGroup.getPreferenceCount(); i++) {
+            Preference pref = preferenceGroup.getPreference(i);
+            if (pref instanceof SelfAvailablePreference
+                    && !((SelfAvailablePreference) pref).isAvailable(getContext())) {
+                preferenceGroup.removePreference(pref);
+            } else if (pref instanceof PreferenceGroup) {
+                checkAvailablePrefs((PreferenceGroup) pref);
+            }
+        }
+    }
+
     public FloatingActionButton getFloatingActionButton() {
         return mFloatingActionButton;
     }
diff --git a/src/com/android/settings/ShowAdminSupportDetailsDialog.java b/src/com/android/settings/ShowAdminSupportDetailsDialog.java
index f44c4b8..2f2379a 100644
--- a/src/com/android/settings/ShowAdminSupportDetailsDialog.java
+++ b/src/com/android/settings/ShowAdminSupportDetailsDialog.java
@@ -60,7 +60,7 @@
 
         mDialogView = LayoutInflater.from(this).inflate(
                 R.layout.admin_support_details_dialog, null);
-        setAdminSupportDetails(this, mDialogView, mEnforcedAdmin, true);
+        initializeDialogViews(mDialogView, mEnforcedAdmin.component, mEnforcedAdmin.userId);
 
         new AlertDialog.Builder(this)
                 .setView(mDialogView)
@@ -75,7 +75,7 @@
         EnforcedAdmin admin = getAdminDetailsFromIntent(intent);
         if (!mEnforcedAdmin.equals(admin)) {
             mEnforcedAdmin = admin;
-            setAdminSupportDetails(this, mDialogView, mEnforcedAdmin, true);
+            initializeDialogViews(mDialogView, mEnforcedAdmin.component, mEnforcedAdmin.userId);
         }
     }
 
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index b54c414..c6af8fb 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -64,6 +64,8 @@
 import android.service.persistentdata.PersistentDataBlockManager;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceGroup;
+import android.support.v7.preference.PreferenceManager;
+import android.support.v7.preference.PreferenceScreen;
 import android.telephony.TelephonyManager;
 import android.text.Spannable;
 import android.text.SpannableString;
@@ -83,7 +85,6 @@
 import android.widget.ListView;
 import android.widget.TabWidget;
 import com.android.internal.util.UserIcons;
-import com.android.settings.datausage.DataUsageList;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -1025,5 +1026,41 @@
                     .toString();
         }
     }
+
+    public static List<String> getNonIndexable(int xml, Context context) {
+        List<String> ret = new ArrayList<>();
+        PreferenceManager manager = new PreferenceManager(context);
+        PreferenceScreen screen = manager.inflateFromResource(context, xml, null);
+        checkPrefs(screen, ret);
+
+        return ret;
+    }
+
+    private static void checkPrefs(PreferenceGroup group, List<String> ret) {
+        if (group == null) return;
+        for (int i = 0; i < group.getPreferenceCount(); i++) {
+            Preference pref = group.getPreference(i);
+            if (pref instanceof SelfAvailablePreference
+                    && !((SelfAvailablePreference) pref).isAvailable(group.getContext())) {
+                ret.add(pref.getKey());
+                if (pref instanceof PreferenceGroup) {
+                    addAll((PreferenceGroup) pref, ret);
+                }
+            } else if (pref instanceof PreferenceGroup) {
+                checkPrefs((PreferenceGroup) pref, ret);
+            }
+        }
+    }
+
+    private static void addAll(PreferenceGroup group, List<String> ret) {
+        if (group == null) return;
+        for (int i = 0; i < group.getPreferenceCount(); i++) {
+            Preference pref = group.getPreference(i);
+            ret.add(pref.getKey());
+            if (pref instanceof PreferenceGroup) {
+                addAll((PreferenceGroup) pref, ret);
+            }
+        }
+    }
 }
 
diff --git a/src/com/android/settings/WorkOnlyCategory.java b/src/com/android/settings/WorkOnlyCategory.java
new file mode 100644
index 0000000..ca4c82d
--- /dev/null
+++ b/src/com/android/settings/WorkOnlyCategory.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.content.Context;
+import android.os.UserManager;
+import android.support.v7.preference.PreferenceCategory;
+import android.util.AttributeSet;
+
+/**
+ * A PreferenceCategory that is only visible when the device has a work profile.
+ */
+public class WorkOnlyCategory extends PreferenceCategory implements SelfAvailablePreference {
+
+    public WorkOnlyCategory(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    public boolean isAvailable(Context context) {
+        return Utils.getManagedProfile(UserManager.get(context)) != null;
+    }
+}
diff --git a/src/com/android/settings/applications/AdvancedAppSettings.java b/src/com/android/settings/applications/AdvancedAppSettings.java
index 50f9a5b..6edbf60 100644
--- a/src/com/android/settings/applications/AdvancedAppSettings.java
+++ b/src/com/android/settings/applications/AdvancedAppSettings.java
@@ -16,23 +16,29 @@
 package com.android.settings.applications;
 
 import android.content.BroadcastReceiver;
+import android.content.Context;
 import android.content.Intent;
 import android.os.AsyncTask;
 import android.os.Bundle;
+import android.provider.SearchIndexableResource;
 import android.support.v7.preference.Preference;
-
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.Utils;
 import com.android.settings.applications.PermissionsSummaryHelper.PermissionsResultCallback;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Indexable;
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.applications.ApplicationsState.AppEntry;
 import com.android.settingslib.applications.ApplicationsState.Session;
 
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 public class AdvancedAppSettings extends SettingsPreferenceFragment implements
-        ApplicationsState.Callbacks {
+        ApplicationsState.Callbacks, Indexable {
 
     static final String TAG = "AdvancedAppSettings";
 
@@ -176,4 +182,20 @@
             }
         }
     }
+
+    public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+            new BaseSearchIndexProvider() {
+                @Override
+                public List<SearchIndexableResource> getXmlResourcesToIndex(
+                        Context context, boolean enabled) {
+                    SearchIndexableResource sir = new SearchIndexableResource(context);
+                    sir.xmlResId = R.xml.advanced_apps;
+                    return Arrays.asList(sir);
+                }
+
+                @Override
+                public List<String> getNonIndexableKeys(Context context) {
+                    return Utils.getNonIndexable(R.xml.advanced_apps, context);
+                }
+            };
 }
diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java
index 76729ab..8a99e03 100644
--- a/src/com/android/settings/applications/AppInfoBase.java
+++ b/src/com/android/settings/applications/AppInfoBase.java
@@ -136,7 +136,8 @@
                 mPackageInfo = mPm.getPackageInfo(mAppEntry.info.packageName,
                         PackageManager.GET_DISABLED_COMPONENTS |
                         PackageManager.GET_UNINSTALLED_PACKAGES |
-                        PackageManager.GET_SIGNATURES);
+                        PackageManager.GET_SIGNATURES |
+                        PackageManager.GET_PERMISSIONS);
             } catch (NameNotFoundException e) {
                 Log.e(TAG, "Exception when retrieving package:" + mAppEntry.info.packageName, e);
             }
diff --git a/src/com/android/settings/applications/AppStateBaseBridge.java b/src/com/android/settings/applications/AppStateBaseBridge.java
index 1e04e13..d0b8431 100644
--- a/src/com/android/settings/applications/AppStateBaseBridge.java
+++ b/src/com/android/settings/applications/AppStateBaseBridge.java
@@ -43,7 +43,8 @@
         // Running on the same background thread as the ApplicationsState lets
         // us run in the background and make sure they aren't doing updates at
         // the same time as us as well.
-        mHandler = new BackgroundHandler(mAppState.getBackgroundLooper());
+        mHandler = new BackgroundHandler(mAppState != null ? mAppState.getBackgroundLooper()
+                : Looper.getMainLooper());
         mMainHandler = new MainHandler();
     }
 
diff --git a/src/com/android/settings/applications/DefaultBrowserPreference.java b/src/com/android/settings/applications/DefaultBrowserPreference.java
index a9a4e2a..d25e224 100644
--- a/src/com/android/settings/applications/DefaultBrowserPreference.java
+++ b/src/com/android/settings/applications/DefaultBrowserPreference.java
@@ -21,17 +21,26 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.net.Uri;
+import android.os.Handler;
 import android.os.UserHandle;
+import android.text.TextUtils;
 import android.util.AttributeSet;
-
+import android.util.Log;
+import com.android.internal.content.PackageMonitor;
 import com.android.settings.AppListPreference;
-import com.android.settings.PreferenceAvailabilityProvider;
+import com.android.settings.R;
 
 import java.util.ArrayList;
 import java.util.List;
 
 public class DefaultBrowserPreference extends AppListPreference {
 
+    private static final String TAG = "DefaultBrowserPref";
+
+    private static final long DELAY_UPDATE_BROWSER_MILLIS = 500;
+
+    private final Handler mHandler = new Handler();
+
     final private PackageManager mPm;
 
     public DefaultBrowserPreference(Context context, AttributeSet attrs) {
@@ -41,12 +50,70 @@
         refreshBrowserApps();
     }
 
+    @Override
+    public void onAttached() {
+        super.onAttached();
+        updateDefaultBrowserPreference();
+        mPackageMonitor.register(getContext(), getContext().getMainLooper(), false);
+    }
+
+    @Override
+    public void onDetached() {
+        mPackageMonitor.unregister();
+        super.onDetached();
+    }
+
+    @Override
+    protected boolean persistString(String newValue) {
+
+        if (newValue == null) {
+            return false;
+        }
+        final CharSequence packageName = (CharSequence) newValue;
+        if (TextUtils.isEmpty(packageName)) {
+            return false;
+        }
+        boolean result = mPm.setDefaultBrowserPackageNameAsUser(
+                packageName.toString(), mUserId);
+        if (result) {
+            setSummary("%s");
+        }
+        return result && super.persistString(newValue);
+    }
+
     public void refreshBrowserApps() {
         List<String> browsers = resolveBrowserApps();
 
         setPackageNames(browsers.toArray(new String[browsers.size()]), null);
     }
 
+    private void updateDefaultBrowserPreference() {
+        refreshBrowserApps();
+
+        final PackageManager pm = getContext().getPackageManager();
+
+        String packageName = pm.getDefaultBrowserPackageNameAsUser(mUserId);
+        if (!TextUtils.isEmpty(packageName)) {
+            // Check if the default Browser package is still there
+            Intent intent = new Intent();
+            intent.setPackage(packageName);
+            intent.setAction(Intent.ACTION_VIEW);
+            intent.addCategory(Intent.CATEGORY_BROWSABLE);
+            intent.setData(Uri.parse("http:"));
+
+            ResolveInfo info = mPm.resolveActivityAsUser(intent, 0, mUserId);
+            if (info != null) {
+                setValue(packageName);
+                setSummary("%s");
+            } else {
+                setSummary(R.string.default_browser_title_none);
+            }
+        } else {
+            setSummary(R.string.default_browser_title_none);
+            Log.d(TAG, "Cannot set empty default Browser value!");
+        }
+    }
+
     private List<String> resolveBrowserApps() {
         List<String> result = new ArrayList<>();
 
@@ -58,7 +125,7 @@
 
         // Resolve that intent and check that the handleAllWebDataURI boolean is set
         List<ResolveInfo> list = mPm.queryIntentActivitiesAsUser(intent, PackageManager.MATCH_ALL,
-                UserHandle.myUserId());
+                mUserId);
 
         final int count = list.size();
         for (int i=0; i<count; i++) {
@@ -74,10 +141,53 @@
         return result;
     }
 
-    public static class AvailabilityProvider implements PreferenceAvailabilityProvider {
+    private final Runnable mUpdateRunnable = new Runnable() {
         @Override
-        public boolean isAvailable(Context context) {
-            return true;
+        public void run() {
+            updateDefaultBrowserPreference();
         }
+    };
+
+    private final PackageMonitor mPackageMonitor = new PackageMonitor() {
+        @Override
+        public void onPackageAdded(String packageName, int uid) {
+            sendUpdate();
+        }
+
+        @Override
+        public void onPackageAppeared(String packageName, int reason) {
+            sendUpdate();
+        }
+
+        @Override
+        public void onPackageDisappeared(String packageName, int reason) {
+            sendUpdate();
+        }
+
+        @Override
+        public void onPackageRemoved(String packageName, int uid) {
+            sendUpdate();
+        }
+
+        private void sendUpdate() {
+            mHandler.postDelayed(mUpdateRunnable, DELAY_UPDATE_BROWSER_MILLIS);
+        }
+    };
+
+    public static boolean hasBrowserPreference(String pkg, Context context) {
+        Intent intent = new Intent();
+        intent.setAction(Intent.ACTION_VIEW);
+        intent.addCategory(Intent.CATEGORY_BROWSABLE);
+        intent.setData(Uri.parse("http:"));
+        intent.setPackage(pkg);
+        final List<ResolveInfo> resolveInfos =
+                context.getPackageManager().queryIntentActivities(intent, 0);
+        return resolveInfos != null && resolveInfos.size() != 0;
+    }
+
+    public static boolean isBrowserDefault(String pkg, Context context) {
+        String defaultPackage = context.getPackageManager()
+                .getDefaultBrowserPackageNameAsUser(UserHandle.myUserId());
+        return defaultPackage != null && defaultPackage.equals(pkg);
     }
 }
diff --git a/src/com/android/settings/applications/DefaultEmergencyPreference.java b/src/com/android/settings/applications/DefaultEmergencyPreference.java
index bb6e84d..2a37633 100644
--- a/src/com/android/settings/applications/DefaultEmergencyPreference.java
+++ b/src/com/android/settings/applications/DefaultEmergencyPreference.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.applications;
 
+import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
@@ -24,16 +25,14 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.os.AsyncTask;
-import android.os.UserManager;
 import android.provider.Settings;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.ArraySet;
 import android.util.AttributeSet;
-
+import com.android.internal.telephony.SmsApplication;
 import com.android.settings.AppListPreference;
-import com.android.settings.PreferenceAvailabilityProvider;
-import com.android.settings.Utils;
+import com.android.settings.SelfAvailablePreference;
 
 import java.util.List;
 import java.util.Objects;
@@ -42,7 +41,8 @@
 /**
  * A preference for choosing the default emergency app
  */
-public class DefaultEmergencyPreference extends AppListPreference {
+public class DefaultEmergencyPreference extends AppListPreference
+        implements SelfAvailablePreference {
 
     private final ContentResolver mContentResolver;
 
@@ -144,12 +144,22 @@
                 && (info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
     }
 
-    public static class AvailabilityProvider implements PreferenceAvailabilityProvider {
-        @Override
-        public boolean isAvailable(Context context) {
-            return isCapable(context)
-                    && context.getPackageManager().resolveActivity(QUERY_INTENT, 0) != null
-                    && !Utils.isManagedProfile(UserManager.get(context));
-        }
+    public boolean isAvailable(Context context) {
+        return isCapable(context)
+                && context.getPackageManager().resolveActivity(QUERY_INTENT, 0) != null;
+    }
+
+    public static boolean hasEmergencyPreference(String pkg, Context context) {
+        Intent i = new Intent(QUERY_INTENT);
+        i.setPackage(pkg);
+        final List<ResolveInfo> resolveInfos =
+                context.getPackageManager().queryIntentActivities(i, 0);
+        return resolveInfos != null && resolveInfos.size() != 0;
+    }
+
+    public static boolean isEmergencyDefault(String pkg, Context context) {
+        String defaultPackage = Settings.Secure.getString(context.getContentResolver(),
+                Settings.Secure.EMERGENCY_ASSISTANCE_APPLICATION);
+        return defaultPackage != null && defaultPackage.equals(pkg);
     }
 }
diff --git a/src/com/android/settings/applications/DefaultHomePreference.java b/src/com/android/settings/applications/DefaultHomePreference.java
index 2837a97..9f4a913 100644
--- a/src/com/android/settings/applications/DefaultHomePreference.java
+++ b/src/com/android/settings/applications/DefaultHomePreference.java
@@ -26,11 +26,8 @@
 import android.os.Build;
 import android.os.UserManager;
 import android.util.AttributeSet;
-
 import com.android.settings.AppListPreference;
-import com.android.settings.PreferenceAvailabilityProvider;
 import com.android.settings.R;
-import com.android.settings.Utils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -118,10 +115,23 @@
         return false;
     }
 
-    public static class AvailabilityProvider implements PreferenceAvailabilityProvider {
-        @Override
-        public boolean isAvailable(Context context) {
-            return !Utils.isManagedProfile(UserManager.get(context));
+    public static boolean hasHomePreference(String pkg, Context context) {
+        ArrayList<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>();
+        PackageManager pm = context.getPackageManager();
+        pm.getHomeActivities(homeActivities);
+        for (int i = 0; i < homeActivities.size(); i++) {
+            if (homeActivities.get(i).activityInfo.packageName.equals(pkg)) {
+                return true;
+            }
         }
+        return false;
+    }
+
+    public static boolean isHomeDefault(String pkg, Context context) {
+        ArrayList<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>();
+        PackageManager pm = context.getPackageManager();
+        ComponentName def = pm.getHomeActivities(homeActivities);
+
+        return def != null && def.getPackageName().equals(pkg);
     }
 }
diff --git a/src/com/android/settings/applications/DefaultNotificationAssistantPreference.java b/src/com/android/settings/applications/DefaultNotificationAssistantPreference.java
index ab3a0b2..53fc391 100644
--- a/src/com/android/settings/applications/DefaultNotificationAssistantPreference.java
+++ b/src/com/android/settings/applications/DefaultNotificationAssistantPreference.java
@@ -16,8 +16,6 @@
 
 package com.android.settings.applications;
 
-import com.android.settings.AppListPreference;
-
 import android.app.ActivityManager;
 import android.content.ComponentName;
 import android.content.Context;
@@ -25,20 +23,17 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
-import android.os.UserManager;
 import android.provider.Settings;
 import android.service.notification.NotificationAssistantService;
 import android.util.AttributeSet;
 import android.util.Slog;
+import com.android.settings.AppListPreference;
+import com.android.settings.R;
+import com.android.settings.notification.ManagedServiceSettings;
 
 import java.util.ArrayList;
 import java.util.List;
 
-import com.android.settings.PreferenceAvailabilityProvider;
-import com.android.settings.R;
-import com.android.settings.Utils;
-import com.android.settings.notification.ManagedServiceSettings;
-
 public class DefaultNotificationAssistantPreference extends AppListPreference {
     private static final String TAG = "DefaultNotiAssist";
 
@@ -111,11 +106,4 @@
         c.emptyText = R.string.no_notification_listeners;
         return c;
     }
-
-    public static class AvailabilityProvider implements PreferenceAvailabilityProvider {
-        @Override
-        public boolean isAvailable(Context context) {
-            return !Utils.isManagedProfile(UserManager.get(context));
-        }
-    }
 }
diff --git a/src/com/android/settings/applications/DefaultPhonePreference.java b/src/com/android/settings/applications/DefaultPhonePreference.java
index 7ab6325..23f3929 100644
--- a/src/com/android/settings/applications/DefaultPhonePreference.java
+++ b/src/com/android/settings/applications/DefaultPhonePreference.java
@@ -17,21 +17,19 @@
 package com.android.settings.applications;
 
 import android.content.Context;
+import android.os.UserHandle;
 import android.os.UserManager;
 import android.telecom.DefaultDialerManager;
-import android.telecom.TelecomManager;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.AttributeSet;
-
 import com.android.settings.AppListPreference;
-import com.android.settings.PreferenceAvailabilityProvider;
-import com.android.settings.Utils;
+import com.android.settings.SelfAvailablePreference;
 
 import java.util.List;
 import java.util.Objects;
 
-public class DefaultPhonePreference extends AppListPreference {
+public class DefaultPhonePreference extends AppListPreference implements SelfAvailablePreference {
     private final Context mContext;
 
     public DefaultPhonePreference(Context context, AttributeSet attrs) {
@@ -44,7 +42,7 @@
     @Override
     protected boolean persistString(String value) {
         if (!TextUtils.isEmpty(value) && !Objects.equals(value, getDefaultPackage())) {
-            TelecomManager.from(mContext).setDefaultDialer(value);
+            DefaultDialerManager.setDefaultDialerApplication(getContext(), value, mUserId);
         }
         setSummary(getEntry());
         return true;
@@ -52,7 +50,7 @@
 
     private void loadDialerApps() {
         List<String> dialerPackages =
-                DefaultDialerManager.getInstalledDialerApplications(getContext());
+                DefaultDialerManager.getInstalledDialerApplications(getContext(), mUserId);
 
         final String[] dialers = new String[dialerPackages.size()];
         for (int i = 0; i < dialerPackages.size(); i++) {
@@ -62,22 +60,31 @@
     }
 
     private String getDefaultPackage() {
-        return DefaultDialerManager.getDefaultDialerApplication(getContext());
+        return DefaultDialerManager.getDefaultDialerApplication(getContext(), mUserId);
     }
 
-    public static class AvailabilityProvider implements PreferenceAvailabilityProvider {
-        @Override
-        public boolean isAvailable(Context context) {
-
-            final TelephonyManager tm =
-                    (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
-            if (!tm.isVoiceCapable()) {
-                return false;
-            }
-
-            final UserManager um =
-                    (UserManager) context.getSystemService(Context.USER_SERVICE);
-            return !um.hasUserRestriction(UserManager.DISALLOW_OUTGOING_CALLS);
+    @Override
+    public boolean isAvailable(Context context) {
+        final TelephonyManager tm =
+                (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
+        if (!tm.isVoiceCapable()) {
+            return false;
         }
+
+        final UserManager um =
+                (UserManager) context.getSystemService(Context.USER_SERVICE);
+        return !um.hasUserRestriction(UserManager.DISALLOW_OUTGOING_CALLS);
+    }
+
+    public static boolean hasPhonePreference(String pkg, Context context) {
+        List<String> dialerPackages =
+                DefaultDialerManager.getInstalledDialerApplications(context, UserHandle.myUserId());
+        return dialerPackages.contains(pkg);
+    }
+
+    public static boolean isPhoneDefault(String pkg, Context context) {
+        String def = DefaultDialerManager.getDefaultDialerApplication(context,
+                UserHandle.myUserId());
+        return def != null && def.equals(pkg);
     }
 }
diff --git a/src/com/android/settings/applications/DefaultSmsPreference.java b/src/com/android/settings/applications/DefaultSmsPreference.java
index 73404bb..9315102 100644
--- a/src/com/android/settings/applications/DefaultSmsPreference.java
+++ b/src/com/android/settings/applications/DefaultSmsPreference.java
@@ -22,17 +22,15 @@
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.AttributeSet;
-
 import com.android.internal.telephony.SmsApplication;
 import com.android.internal.telephony.SmsApplication.SmsApplicationData;
 import com.android.settings.AppListPreference;
-import com.android.settings.PreferenceAvailabilityProvider;
-import com.android.settings.Utils;
+import com.android.settings.SelfAvailablePreference;
 
 import java.util.Collection;
 import java.util.Objects;
 
-public class DefaultSmsPreference extends AppListPreference {
+public class DefaultSmsPreference extends AppListPreference implements SelfAvailablePreference {
 
     public DefaultSmsPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -70,18 +68,29 @@
         return true;
     }
 
-    public static class AvailabilityProvider implements PreferenceAvailabilityProvider {
-        @Override
-        public boolean isAvailable(Context context) {
-            boolean isRestrictedUser =
-                    UserManager.get(context)
-                            .getUserInfo(UserHandle.myUserId()).isRestricted();
-            TelephonyManager tm =
-                    (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
-            return !isRestrictedUser
-                    && tm.isSmsCapable()
-                    && !Utils.isManagedProfile(UserManager.get(context));
-        }
+    @Override
+    public boolean isAvailable(Context context) {
+        boolean isRestrictedUser =
+                UserManager.get(context)
+                        .getUserInfo(UserHandle.myUserId()).isRestricted();
+        TelephonyManager tm =
+                (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
+        return !isRestrictedUser && tm.isSmsCapable();
     }
 
+    public static boolean hasSmsPreference(String pkg, Context context) {
+        Collection<SmsApplicationData> smsApplications =
+                SmsApplication.getApplicationCollection(context);
+        for (SmsApplicationData data : smsApplications) {
+            if (data.mPackageName.equals(pkg)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public static boolean isSmsDefault(String pkg, Context context) {
+        ComponentName appName = SmsApplication.getDefaultSmsApplication(context, true);
+        return appName != null && appName.getPackageName().equals(pkg);
+    }
 }
diff --git a/src/com/android/settings/applications/DrawOverlayDetails.java b/src/com/android/settings/applications/DrawOverlayDetails.java
index 92ff480..7e87d8e 100644
--- a/src/com/android/settings/applications/DrawOverlayDetails.java
+++ b/src/com/android/settings/applications/DrawOverlayDetails.java
@@ -156,13 +156,17 @@
     }
 
     public static CharSequence getSummary(Context context, AppEntry entry) {
-        if (entry.extraInfo != null) {
-            return getSummary(context, new OverlayState((PermissionState)entry.extraInfo));
+        OverlayState state;
+        if (entry.extraInfo instanceof OverlayState) {
+            state = (OverlayState) entry.extraInfo;
+        } else if (entry.extraInfo instanceof PermissionState) {
+            state = new OverlayState((PermissionState) entry.extraInfo);
+        } else {
+            state = new AppStateOverlayBridge(context, null, null).getOverlayInfo(
+                    entry.info.packageName, entry.info.uid);
         }
 
-        // fallback if for whatever reason entry.extrainfo is null - the result
-        // may be less accurate
-        return getSummary(context, entry.info.packageName);
+        return getSummary(context, state);
     }
 
     public static CharSequence getSummary(Context context, OverlayState overlayState) {
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index 7ba6c7f..197da7c 100755
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.applications;
 
+import android.Manifest.permission;
 import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.AlertDialog;
@@ -51,6 +52,8 @@
 import android.os.UserManager;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.Preference.OnPreferenceClickListener;
+import android.support.v7.preference.PreferenceCategory;
+import android.support.v7.preference.PreferenceScreen;
 import android.text.TextUtils;
 import android.text.format.DateUtils;
 import android.text.format.Formatter;
@@ -285,6 +288,7 @@
 
         setHasOptionsMenu(true);
         addPreferencesFromResource(R.xml.installed_app_details);
+        addDynamicPrefs();
 
         if (Utils.isBandwidthControlEnabled()) {
             INetworkStatsService statsService = INetworkStatsService.Stub.asInterface(
@@ -321,6 +325,7 @@
         }
         new BatteryUpdater().execute();
         new MemoryUpdater().execute();
+        updateDynamicPrefs();
     }
 
     @Override
@@ -806,6 +811,119 @@
         return true;
     }
 
+    private void addDynamicPrefs() {
+        if (Utils.isManagedProfile(UserManager.get(getContext()))) {
+            return;
+        }
+        final PreferenceScreen screen = getPreferenceScreen();
+        if (DefaultHomePreference.hasHomePreference(mPackageName, getContext())) {
+            screen.addPreference(new ShortcutPreference(getPrefContext(),
+                    AdvancedAppSettings.class, "default_home", R.string.home_app,
+                    R.string.configure_apps));
+        }
+        if (DefaultBrowserPreference.hasBrowserPreference(mPackageName, getContext())) {
+            screen.addPreference(new ShortcutPreference(getPrefContext(),
+                    AdvancedAppSettings.class, "default_browser", R.string.default_browser_title,
+                    R.string.configure_apps));
+        }
+        if (DefaultPhonePreference.hasPhonePreference(mPackageName, getContext())) {
+            screen.addPreference(new ShortcutPreference(getPrefContext(),
+                    AdvancedAppSettings.class, "default_phone_app", R.string.default_phone_title,
+                    R.string.configure_apps));
+        }
+        if (DefaultEmergencyPreference.hasEmergencyPreference(mPackageName, getContext())) {
+            screen.addPreference(new ShortcutPreference(getPrefContext(),
+                    AdvancedAppSettings.class, "default_emergency_app",
+                    R.string.default_emergency_app, R.string.configure_apps));
+        }
+        if (DefaultSmsPreference.hasSmsPreference(mPackageName, getContext())) {
+            screen.addPreference(new ShortcutPreference(getPrefContext(),
+                    AdvancedAppSettings.class, "default_sms_app", R.string.sms_application_title,
+                    R.string.configure_apps));
+        }
+        boolean hasDrawOverOtherApps = hasPermission(permission.SYSTEM_ALERT_WINDOW);
+        boolean hasWriteSettings = hasPermission(permission.WRITE_SETTINGS);
+        if (hasDrawOverOtherApps || hasWriteSettings) {
+            PreferenceCategory category = new PreferenceCategory(getPrefContext());
+            category.setTitle(R.string.advanced_apps);
+            screen.addPreference(category);
+
+            if (hasDrawOverOtherApps) {
+                Preference pref = new Preference(getPrefContext());
+                pref.setTitle(R.string.draw_overlay);
+                pref.setKey("system_alert_window");
+                pref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
+                    @Override
+                    public boolean onPreferenceClick(Preference preference) {
+                        startAppInfoFragment(DrawOverlayDetails.class,
+                                getString(R.string.draw_overlay));
+                        return true;
+                    }
+                });
+                category.addPreference(pref);
+            }
+            if (hasWriteSettings) {
+                Preference pref = new Preference(getPrefContext());
+                pref.setTitle(R.string.write_settings);
+                pref.setKey("write_settings_apps");
+                pref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
+                    @Override
+                    public boolean onPreferenceClick(Preference preference) {
+                        startAppInfoFragment(WriteSettingsDetails.class,
+                                getString(R.string.write_settings));
+                        return true;
+                    }
+                });
+                category.addPreference(pref);
+            }
+        }
+    }
+
+    private boolean hasPermission(String permission) {
+        for (int i = 0; i < mPackageInfo.requestedPermissions.length; i++) {
+            if (mPackageInfo.requestedPermissions[i].equals(permission)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private void updateDynamicPrefs() {
+        Preference pref = findPreference("default_home");
+        if (pref != null) {
+            pref.setSummary(DefaultHomePreference.isHomeDefault(mPackageName, getContext())
+                    ? R.string.yes : R.string.no);
+        }
+        pref = findPreference("default_browser");
+        if (pref != null) {
+            pref.setSummary(DefaultBrowserPreference.isBrowserDefault(mPackageName, getContext())
+                    ? R.string.yes : R.string.no);
+        }
+        pref = findPreference("default_phone_app");
+        if (pref != null) {
+            pref.setSummary(DefaultPhonePreference.isPhoneDefault(mPackageName, getContext())
+                    ? R.string.yes : R.string.no);
+        }
+        pref = findPreference("default_emergency_app");
+        if (pref != null) {
+            pref.setSummary(DefaultEmergencyPreference.isEmergencyDefault(mPackageName,
+                    getContext()) ? R.string.yes : R.string.no);
+        }
+        pref = findPreference("default_sms_app");
+        if (pref != null) {
+            pref.setSummary(DefaultSmsPreference.isSmsDefault(mPackageName, getContext())
+                    ? R.string.yes : R.string.no);
+        }
+        pref = findPreference("system_alert_window");
+        if (pref != null) {
+            pref.setSummary(DrawOverlayDetails.getSummary(getContext(), mAppEntry));
+        }
+        pref = findPreference("write_settings_apps");
+        if (pref != null) {
+            pref.setSummary(WriteSettingsDetails.getSummary(getContext(), mAppEntry));
+        }
+    }
+
     public static void setupAppSnippet(View appSnippet, CharSequence label, Drawable icon,
             CharSequence versionName) {
         LayoutInflater.from(appSnippet.getContext()).inflate(R.layout.widget_text_views,
diff --git a/src/com/android/settings/applications/ManageAssist.java b/src/com/android/settings/applications/ManageAssist.java
index 5a17a31..7af967c 100644
--- a/src/com/android/settings/applications/ManageAssist.java
+++ b/src/com/android/settings/applications/ManageAssist.java
@@ -18,20 +18,15 @@
 
 import android.app.AlertDialog;
 import android.content.ComponentName;
-import android.content.Context;
 import android.content.DialogInterface;
 import android.os.Bundle;
 import android.os.Handler;
-import android.os.UserManager;
 import android.provider.Settings;
 import android.support.v14.preference.SwitchPreference;
 import android.support.v7.preference.Preference;
-
 import com.android.internal.logging.MetricsProto.MetricsEvent;
-import com.android.settings.PreferenceAvailabilityProvider;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
-import com.android.settings.Utils;
 import com.android.settings.voice.VoiceInputListPreference;
 
 /**
@@ -179,11 +174,4 @@
         mDefaultAssitPref.setValue(assistPackage);
         updateUi();
     }
-
-    public static class AvailabilityProvider implements PreferenceAvailabilityProvider {
-        @Override
-        public boolean isAvailable(Context context) {
-            return !Utils.isManagedProfile(UserManager.get(context));
-        }
-    }
 }
diff --git a/src/com/android/settings/applications/ManageDefaultApps.java b/src/com/android/settings/applications/ManageDefaultApps.java
deleted file mode 100644
index 327c98b..0000000
--- a/src/com/android/settings/applications/ManageDefaultApps.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.applications;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.UserHandle;
-import android.provider.SearchIndexableResource;
-import android.provider.Settings;
-import android.support.v4.util.ArrayMap;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.internal.content.PackageMonitor;
-import com.android.internal.logging.MetricsProto.MetricsEvent;
-import com.android.settings.PreferenceAvailabilityProvider;
-import com.android.settings.R;
-import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settings.search.Index;
-import com.android.settings.search.Indexable;
-import com.android.settings.utils.ProfileSettingsPreferenceFragment;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-public class ManageDefaultApps extends ProfileSettingsPreferenceFragment
-        implements Preference.OnPreferenceClickListener, Indexable {
-
-    private static final String TAG = ManageDefaultApps.class.getSimpleName();
-
-    private static final String KEY_DEFAULT_HOME = "default_home";
-    private static final String KEY_ASSIST_AND_VOICE_INPUT = "assist_and_voice_input";
-    private static final String KEY_DEFAULT_BROWSER = "default_browser";
-    private static final String KEY_DEFAULT_PHONE_APP = "default_phone_app";
-    private static final String KEY_DEFAULT_EMERGENCY_APP = "default_emergency_app";
-    private static final String KEY_SMS_APPLICATION = "default_sms_app";
-    private static final String KEY_DEFAULT_NOTIFICATION_ASST = "default_notification_asst_app";
-    private static final String[] PREFERENCE_KEYS = new String[] {
-            KEY_DEFAULT_HOME, KEY_ASSIST_AND_VOICE_INPUT, KEY_DEFAULT_BROWSER,
-            KEY_DEFAULT_PHONE_APP, KEY_DEFAULT_EMERGENCY_APP, KEY_SMS_APPLICATION,
-            KEY_DEFAULT_NOTIFICATION_ASST
-    };
-
-    private DefaultBrowserPreference mDefaultBrowserPreference;
-    private PackageManager mPm;
-    private int myUserId;
-
-    private static final long DELAY_UPDATE_BROWSER_MILLIS = 500;
-
-    private final Handler mHandler = new Handler();
-
-    private final Runnable mUpdateRunnable = new Runnable() {
-        @Override
-        public void run() {
-            updateDefaultBrowserPreference();
-        }
-    };
-
-    private final PackageMonitor mPackageMonitor = new PackageMonitor() {
-        @Override
-        public void onPackageAdded(String packageName, int uid) {
-            sendUpdate();
-        }
-
-        @Override
-        public void onPackageAppeared(String packageName, int reason) {
-            sendUpdate();
-        }
-
-        @Override
-        public void onPackageDisappeared(String packageName, int reason) {
-            sendUpdate();
-        }
-
-        @Override
-        public void onPackageRemoved(String packageName, int uid) {
-            sendUpdate();
-        }
-
-        private void sendUpdate() {
-            mHandler.postDelayed(mUpdateRunnable, DELAY_UPDATE_BROWSER_MILLIS);
-        }
-    };
-
-    private void updateDefaultBrowserPreference() {
-        mDefaultBrowserPreference.refreshBrowserApps();
-
-        final PackageManager pm = getPackageManager();
-
-        String packageName = pm.getDefaultBrowserPackageNameAsUser(UserHandle.myUserId());
-        if (!TextUtils.isEmpty(packageName)) {
-            // Check if the default Browser package is still there
-            Intent intent = new Intent();
-            intent.setPackage(packageName);
-            intent.setAction(Intent.ACTION_VIEW);
-            intent.addCategory(Intent.CATEGORY_BROWSABLE);
-            intent.setData(Uri.parse("http:"));
-
-            ResolveInfo info = mPm.resolveActivityAsUser(intent, 0, myUserId);
-            if (info != null) {
-                mDefaultBrowserPreference.setValue(packageName);
-                CharSequence label = info.loadLabel(pm);
-                mDefaultBrowserPreference.setSummary(label);
-            } else {
-                mDefaultBrowserPreference.setSummary(R.string.default_browser_title_none);
-            }
-        } else {
-            mDefaultBrowserPreference.setSummary(R.string.default_browser_title_none);
-            Log.d(TAG, "Cannot set empty default Browser value!");
-        }
-    }
-
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-
-        addPreferencesFromResource(R.xml.default_apps);
-
-        mPm = getPackageManager();
-        myUserId = UserHandle.myUserId();
-
-
-        mDefaultBrowserPreference = (DefaultBrowserPreference) findPreference(KEY_DEFAULT_BROWSER);
-        mDefaultBrowserPreference.setOnPreferenceChangeListener(
-                new Preference.OnPreferenceChangeListener() {
-                    @Override
-                    public boolean onPreferenceChange(Preference preference, Object newValue) {
-
-                        if (newValue == null) {
-                            return false;
-                        }
-                        final CharSequence packageName = (CharSequence) newValue;
-                        if (TextUtils.isEmpty(packageName)) {
-                            return false;
-                        }
-                        boolean result = mPm.setDefaultBrowserPackageNameAsUser(
-                                packageName.toString(), myUserId);
-                        if (result) {
-                            mDefaultBrowserPreference.setValue(packageName.toString());
-                            final CharSequence appName = mDefaultBrowserPreference.getEntry();
-                            mDefaultBrowserPreference.setSummary(appName);
-                        }
-                        return result;
-                    }
-                });
-
-        updatePreferenceVisibility();
-        // Update the index.
-        Index.getInstance(getActivity()).updateFromClassNameResource(
-                ManageDefaultApps.class.getName(), true, true);
-    }
-
-    /**
-     * Iterate all preferences and hide it if it is unavailable.
-     */
-    private void updatePreferenceVisibility() {
-        PreferenceScreen preferenceScreen = getPreferenceScreen();
-        int count = preferenceScreen.getPreferenceCount();
-        List<String> preferenceKeys = new ArrayList<>();
-        for (int i = 0; i < count; i++) {
-            String preferenceKey = preferenceScreen.getPreference(i).getKey();
-            if (!TextUtils.isEmpty(preferenceKey)) {
-                preferenceKeys.add(preferenceKey);
-            }
-        }
-        for (String preferenceKey : preferenceKeys) {
-            boolean isAvailable = getPreferenceAvailability(getContext(), preferenceKey);
-            if (!isAvailable) {
-                Preference preference = preferenceScreen.findPreference(preferenceKey);
-                preferenceScreen.removePreference(preference);
-            }
-        }
-    }
-
-    /**
-     * Get availability of preference from {@link PreferenceAvailabilityProvider}.
-     */
-    private static boolean getPreferenceAvailability(Context context,
-                                              String preferenceKey) {
-        // Consider the preference is unavailable if no corresponding provider is found.
-        PreferenceAvailabilityProvider provider = getPreferenceAvailabilityProvider(preferenceKey);
-        return (provider == null) ? false : provider.isAvailable(context);
-    }
-
-    private static PreferenceAvailabilityProvider getPreferenceAvailabilityProvider(
-            String preferenceKey) {
-        switch (preferenceKey) {
-            case KEY_ASSIST_AND_VOICE_INPUT:
-                return new ManageAssist.AvailabilityProvider();
-            case KEY_DEFAULT_BROWSER:
-                return new DefaultBrowserPreference.AvailabilityProvider();
-            case KEY_DEFAULT_EMERGENCY_APP:
-                return new DefaultEmergencyPreference.AvailabilityProvider();
-            case KEY_DEFAULT_HOME:
-                return new DefaultHomePreference.AvailabilityProvider();
-            case KEY_DEFAULT_NOTIFICATION_ASST:
-                return new DefaultNotificationAssistantPreference.AvailabilityProvider();
-            case KEY_DEFAULT_PHONE_APP:
-                return new DefaultPhonePreference.AvailabilityProvider();
-            case KEY_SMS_APPLICATION:
-                return new DefaultSmsPreference.AvailabilityProvider();
-        }
-        Log.w(TAG, "getPreferenceAvailabilityProvider: Cannot find provider for " + preferenceKey);
-        return null;
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        updateDefaultBrowserPreference();
-        mPackageMonitor.register(getActivity(), getActivity().getMainLooper(), false);
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-
-        mPackageMonitor.unregister();
-    }
-
-    @Override
-    protected int getMetricsCategory() {
-        return MetricsEvent.APPLICATIONS_DEFAULT_APPS;
-    }
-
-    @Override
-    public boolean onPreferenceClick(Preference preference) {
-        return false;
-    }
-
-    public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
-            new BaseSearchIndexProvider() {
-                @Override
-                public List<SearchIndexableResource> getXmlResourcesToIndex(
-                        Context context, boolean enabled) {
-                    SearchIndexableResource sir = new SearchIndexableResource(context);
-                    sir.xmlResId = R.xml.default_apps;
-                    return Arrays.asList(sir);
-                }
-
-                @Override
-                public List<String> getNonIndexableKeys(Context context) {
-                    // Iterate all preferences to see which is not available.
-                    final ArrayList<String> result = new ArrayList<>();
-                    for (String key : PREFERENCE_KEYS) {
-                        boolean isAvailable = getPreferenceAvailability(context, key);
-                        if (!isAvailable) {
-                            result.add(key);
-                        }
-                    }
-                    return result;
-                }
-            };
-
-    protected String getIntentActionString() {
-        return Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS;
-    }
-
-}
diff --git a/src/com/android/settings/applications/ShortcutPreference.java b/src/com/android/settings/applications/ShortcutPreference.java
new file mode 100644
index 0000000..e3db57a
--- /dev/null
+++ b/src/com/android/settings/applications/ShortcutPreference.java
@@ -0,0 +1,47 @@
+/*
+ * 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.applications;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.support.v7.preference.Preference;
+import com.android.settings.SettingsActivity;
+import com.android.settings.Utils;
+
+public class ShortcutPreference extends Preference {
+
+    private final Class mTarget;
+    private final String mPrefKey;
+    private final int mTitle;
+
+    public ShortcutPreference(Context context, Class target, String prefKey, int prefTitle,
+            int title) {
+        super(context);
+        mTarget = target;
+        mPrefKey = prefKey;
+        mTitle = title;
+        setTitle(prefTitle);
+        setKey(mPrefKey);
+    }
+
+    @Override
+    public void performClick() {
+        super.performClick();
+        Bundle bundle = new Bundle();
+        bundle.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, mPrefKey);
+        Utils.startWithFragment(getContext(), mTarget.getName(), bundle, null, 0,
+                mTitle, null);
+    }
+}
diff --git a/src/com/android/settings/applications/SpecialAccessSettings.java b/src/com/android/settings/applications/SpecialAccessSettings.java
new file mode 100644
index 0000000..8320b29
--- /dev/null
+++ b/src/com/android/settings/applications/SpecialAccessSettings.java
@@ -0,0 +1,33 @@
+/*
+ * 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.applications;
+
+import android.os.Bundle;
+import com.android.settings.InstrumentedFragment;
+import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
+
+public class SpecialAccessSettings extends SettingsPreferenceFragment {
+
+    @Override
+    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+        addPreferencesFromResource(R.xml.special_access);
+    }
+
+    @Override
+    protected int getMetricsCategory() {
+        return InstrumentedFragment.SPECIAL_ACCESS;
+    }
+}
diff --git a/src/com/android/settings/applications/WriteSettingsDetails.java b/src/com/android/settings/applications/WriteSettingsDetails.java
index a4200d7..d310d2b 100644
--- a/src/com/android/settings/applications/WriteSettingsDetails.java
+++ b/src/com/android/settings/applications/WriteSettingsDetails.java
@@ -158,13 +158,17 @@
     }
 
     public static CharSequence getSummary(Context context, AppEntry entry) {
-        if (entry.extraInfo != null) {
-            return getSummary(context, new WriteSettingsState((PermissionState)entry
-                    .extraInfo));
+        WriteSettingsState state;
+        if (entry.extraInfo instanceof WriteSettingsState) {
+            state = (WriteSettingsState) entry.extraInfo;
+        } else if (entry.extraInfo instanceof PermissionState) {
+            state = new WriteSettingsState((PermissionState) entry.extraInfo);
+        } else {
+            state = new AppStateWriteSettingsBridge(context, null, null).getWriteSettingsInfo(
+                    entry.info.packageName, entry.info.uid);
         }
 
-        // fallback if entry.extrainfo is null - although this should not happen
-        return getSummary(context, entry.info.packageName);
+        return getSummary(context, state);
     }
 
     public static CharSequence getSummary(Context context, WriteSettingsState writeSettingsState) {
diff --git a/src/com/android/settings/fuelgauge/BatteryActiveView.java b/src/com/android/settings/fuelgauge/BatteryActiveView.java
new file mode 100644
index 0000000..4856b3d
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/BatteryActiveView.java
@@ -0,0 +1,75 @@
+/*
+ * 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.fuelgauge;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.util.AttributeSet;
+import android.util.SparseIntArray;
+import android.view.View;
+
+public class BatteryActiveView extends View {
+
+    private final Paint mPaint = new Paint();
+    private BatteryActiveProvider mProvider;
+
+    public BatteryActiveView(Context context, @Nullable AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public void setProvider(BatteryActiveProvider provider) {
+        mProvider = provider;
+        if (getWidth() != 0) {
+            postInvalidate();
+        }
+    }
+
+    @Override
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        super.onSizeChanged(w, h, oldw, oldh);
+        if (getWidth() != 0) {
+            postInvalidate();
+        }
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        if (mProvider == null) {
+            return;
+        }
+        SparseIntArray array = mProvider.getColorArray();
+        float period = mProvider.getPeriod();
+        for (int i = 0; i < array.size() - 1; i++) {
+            drawColor(canvas, array.keyAt(i), array.keyAt(i + 1), array.valueAt(i), period);
+        }
+    }
+
+    private void drawColor(Canvas canvas, int start, int end, int color, float period) {
+        if (color == 0) {
+            return;
+        }
+        mPaint.setColor(color);
+        canvas.drawRect(start / period * getWidth(), 0, end / period * getWidth(), getHeight(),
+                mPaint);
+    }
+
+    public interface BatteryActiveProvider {
+        boolean hasData();
+        long getPeriod();
+        SparseIntArray getColorArray();
+    }
+}
diff --git a/src/com/android/settings/fuelgauge/BatteryCellParser.java b/src/com/android/settings/fuelgauge/BatteryCellParser.java
new file mode 100644
index 0000000..aaac024f
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/BatteryCellParser.java
@@ -0,0 +1,101 @@
+/*
+ * 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.fuelgauge;
+
+import android.os.BatteryStats.HistoryItem;
+import android.telephony.ServiceState;
+import android.util.SparseIntArray;
+import com.android.settings.Utils;
+import com.android.settings.fuelgauge.BatteryActiveView.BatteryActiveProvider;
+import com.android.settingslib.BatteryInfo;
+
+public class BatteryCellParser implements BatteryInfo.BatteryDataParser, BatteryActiveProvider {
+
+    private final SparseIntArray mData = new SparseIntArray();
+
+    private int mLastValue;
+    private long mLength;
+    private long mLastTime;
+
+    protected int getValue(HistoryItem rec) {
+        int bin;
+        if (((rec.states & HistoryItem.STATE_PHONE_STATE_MASK)
+                >> HistoryItem.STATE_PHONE_STATE_SHIFT)
+                == ServiceState.STATE_POWER_OFF) {
+            bin = 0;
+        } else if ((rec.states & HistoryItem.STATE_PHONE_SCANNING_FLAG) != 0) {
+            bin = 1;
+        } else {
+            bin = (rec.states & HistoryItem.STATE_PHONE_SIGNAL_STRENGTH_MASK)
+                    >> HistoryItem.STATE_PHONE_SIGNAL_STRENGTH_SHIFT;
+            bin += 2;
+        }
+        return bin;
+    }
+
+    @Override
+    public void onParsingStarted(long startTime, long endTime) {
+        mLength = endTime - startTime;
+    }
+
+    @Override
+    public void onDataPoint(long time, HistoryItem record) {
+        int value = getValue(record);
+        if (value != mLastValue) {
+            mData.put((int) time, value);
+            mLastValue = value;
+        }
+        mLastTime = time;
+    }
+
+    @Override
+    public void onDataGap() {
+        if (mLastValue != 0) {
+            mData.put((int) mLastTime, 0);
+            mLastValue = 0;
+        }
+    }
+
+    @Override
+    public void onParsingDone() {
+        if (mLastValue != 0) {
+            mData.put((int) mLastTime, 0);
+            mLastValue = 0;
+        }
+    }
+
+    @Override
+    public long getPeriod() {
+        return mLength;
+    }
+
+    @Override
+    public boolean hasData() {
+        return mData.size() > 1;
+    }
+
+    @Override
+    public SparseIntArray getColorArray() {
+        SparseIntArray ret = new SparseIntArray();
+        for (int i = 0; i < mData.size(); i++) {
+            ret.put(mData.keyAt(i), getColor(mData.valueAt(i)));
+        }
+        return ret;
+    }
+
+    private int getColor(int i) {
+        return Utils.BADNESS_COLORS[i];
+    }
+}
diff --git a/src/com/android/settings/fuelgauge/BatteryFlagParser.java b/src/com/android/settings/fuelgauge/BatteryFlagParser.java
new file mode 100644
index 0000000..cd5d89b
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/BatteryFlagParser.java
@@ -0,0 +1,100 @@
+/*
+ * 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.fuelgauge;
+
+import android.os.BatteryStats.HistoryItem;
+import android.util.SparseBooleanArray;
+import android.util.SparseIntArray;
+import com.android.settings.fuelgauge.BatteryActiveView.BatteryActiveProvider;
+import com.android.settingslib.BatteryInfo;
+
+public class BatteryFlagParser implements BatteryInfo.BatteryDataParser, BatteryActiveProvider {
+
+    private final SparseBooleanArray mData = new SparseBooleanArray();
+    private final int mFlag;
+    private final boolean mState2;
+    private final int mAccentColor;
+
+    private boolean mLastSet;
+    private long mLength;
+    private long mLastTime;
+
+    public BatteryFlagParser(int accent, boolean state2, int flag) {
+        mAccentColor = accent;
+        mFlag = flag;
+        mState2 = state2;
+    }
+
+    protected boolean isSet(HistoryItem record) {
+        return ((mState2 ? record.states2 : record.states) & mFlag) != 0;
+    }
+
+    @Override
+    public void onParsingStarted(long startTime, long endTime) {
+        mLength = endTime - startTime;
+    }
+
+    @Override
+    public void onDataPoint(long time, HistoryItem record) {
+        boolean isSet = isSet(record);
+        if (isSet != mLastSet) {
+            mData.put((int) time, isSet);
+            mLastSet = isSet;
+        }
+        mLastTime = time;
+    }
+
+    @Override
+    public void onDataGap() {
+        if (mLastSet) {
+            mData.put((int) mLastTime, false);
+            mLastSet = false;
+        }
+    }
+
+    @Override
+    public void onParsingDone() {
+        if (mLastSet) {
+            mData.put((int) mLastTime, false);
+            mLastSet = false;
+        }
+    }
+
+    @Override
+    public long getPeriod() {
+        return mLength;
+    }
+
+    @Override
+    public boolean hasData() {
+        return mData.size() > 1;
+    }
+
+    @Override
+    public SparseIntArray getColorArray() {
+        SparseIntArray ret = new SparseIntArray();
+        for (int i = 0; i < mData.size(); i++) {
+            ret.put(mData.keyAt(i), getColor(mData.valueAt(i)));
+        }
+        return ret;
+    }
+
+    private int getColor(boolean b) {
+        if (b) {
+            return mAccentColor;
+        }
+        return 0;
+    }
+}
diff --git a/src/com/android/settings/fuelgauge/BatteryHistoryDetail.java b/src/com/android/settings/fuelgauge/BatteryHistoryDetail.java
index af13551..b2cb73a 100644
--- a/src/com/android/settings/fuelgauge/BatteryHistoryDetail.java
+++ b/src/com/android/settings/fuelgauge/BatteryHistoryDetail.java
@@ -18,15 +18,21 @@
 
 import android.content.Intent;
 import android.os.BatteryStats;
+import android.os.BatteryStats.HistoryItem;
 import android.os.Bundle;
+import android.os.SystemClock;
+import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-
+import android.widget.TextView;
 import com.android.internal.logging.MetricsProto.MetricsEvent;
 import com.android.internal.os.BatteryStatsHelper;
 import com.android.settings.InstrumentedFragment;
 import com.android.settings.R;
+import com.android.settings.fuelgauge.BatteryActiveView.BatteryActiveProvider;
+import com.android.settingslib.BatteryInfo;
+import com.android.settingslib.graph.UsageView;
 
 public class BatteryHistoryDetail extends InstrumentedFragment {
     public static final String EXTRA_STATS = "stats";
@@ -35,21 +41,80 @@
     private BatteryStats mStats;
     private Intent mBatteryBroadcast;
 
+    private BatteryFlagParser mChargingParser;
+    private BatteryFlagParser mScreenOn;
+    private BatteryFlagParser mGpsParser;
+    private BatteryFlagParser mFlashlightParser;
+    private BatteryFlagParser mCameraParser;
+    private BatteryWifiParser mWifiParser;
+    private BatteryFlagParser mCpuParser;
+    private BatteryCellParser mPhoneParser;
+
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         String histFile = getArguments().getString(EXTRA_STATS);
         mStats = BatteryStatsHelper.statsFromFile(getActivity(), histFile);
         mBatteryBroadcast = getArguments().getParcelable(EXTRA_BROADCAST);
+
+        TypedValue value = new TypedValue();
+        getContext().getTheme().resolveAttribute(android.R.attr.colorAccent, value, true);
+        int accentColor = getContext().getColor(value.resourceId);
+
+        mChargingParser = new BatteryFlagParser(accentColor, false,
+                HistoryItem.STATE_BATTERY_PLUGGED_FLAG);
+        mScreenOn = new BatteryFlagParser(accentColor, false,
+                HistoryItem.STATE_SCREEN_ON_FLAG);
+        mGpsParser = new BatteryFlagParser(accentColor, false,
+                HistoryItem.STATE_GPS_ON_FLAG);
+        mFlashlightParser = new BatteryFlagParser(accentColor, true,
+                HistoryItem.STATE2_FLASHLIGHT_FLAG);
+        mCameraParser = new BatteryFlagParser(accentColor, true,
+                HistoryItem.STATE2_CAMERA_FLAG);
+        mWifiParser = new BatteryWifiParser(accentColor);
+        mCpuParser = new BatteryFlagParser(accentColor, false,
+                HistoryItem.STATE_CPU_RUNNING_FLAG);
+        mPhoneParser = new BatteryCellParser();
     }
     
     @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-        View view = inflater.inflate(R.layout.battery_history_chart, null);
-        BatteryHistoryChart chart = (BatteryHistoryChart)view.findViewById(
-                R.id.battery_history_chart);
-        chart.setStats(mStats, mBatteryBroadcast);
-        return view;
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        return inflater.inflate(R.layout.battery_history_detail, container, false);
+    }
+
+    @Override
+    public void onViewCreated(View view, Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        updateEverything();
+    }
+
+    private void updateEverything() {
+        BatteryInfo info = BatteryInfo.getBatteryInfo(getContext(), mBatteryBroadcast, mStats,
+                SystemClock.elapsedRealtime() * 1000);
+        final View view = getView();
+        info.bindHistory((UsageView) view.findViewById(R.id.battery_usage), mChargingParser,
+                mScreenOn, mGpsParser, mFlashlightParser, mCameraParser, mWifiParser, mCpuParser,
+                mPhoneParser);
+        ((TextView) view.findViewById(R.id.charge)).setText(info.batteryPercentString);
+        ((TextView) view.findViewById(R.id.estimation)).setText(info.remainingLabel);
+
+        bindData(mChargingParser, R.string.battery_stats_charging_label, R.id.charging_group);
+        bindData(mScreenOn, R.string.battery_stats_screen_on_label, R.id.screen_on_group);
+        bindData(mGpsParser, R.string.battery_stats_gps_on_label, R.id.gps_group);
+        bindData(mFlashlightParser, R.string.battery_stats_flashlight_on_label,
+                R.id.flashlight_group);
+        bindData(mCameraParser, R.string.battery_stats_camera_on_label, R.id.camera_group);
+        bindData(mWifiParser, R.string.battery_stats_wifi_running_label, R.id.wifi_group);
+        bindData(mCpuParser, R.string.battery_stats_wake_lock_label, R.id.cpu_group);
+        bindData(mPhoneParser, R.string.battery_stats_phone_signal_label, R.id.cell_network_group);
+    }
+
+    private void bindData(BatteryActiveProvider provider, int label, int groupId) {
+        View group = getView().findViewById(groupId);
+        group.setVisibility(provider.hasData() ? View.VISIBLE : View.GONE);
+        ((TextView) group.findViewById(android.R.id.title)).setText(label);
+        ((BatteryActiveView) group.findViewById(R.id.battery_active)).setProvider(provider);
     }
 
     @Override
diff --git a/src/com/android/settings/fuelgauge/BatteryHistoryPreference.java b/src/com/android/settings/fuelgauge/BatteryHistoryPreference.java
index 7aafeba..ba93f98 100644
--- a/src/com/android/settings/fuelgauge/BatteryHistoryPreference.java
+++ b/src/com/android/settings/fuelgauge/BatteryHistoryPreference.java
@@ -44,10 +44,11 @@
     public BatteryHistoryPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
         setLayoutResource(R.layout.battery_usage_graph);
+        setSelectable(true);
     }
 
     @Override
-    protected void onClick() {
+    public void performClick() {
         mHelper.storeStatsHistoryInFile(BATTERY_HISTORY_FILE);
         Bundle args = new Bundle();
         args.putString(BatteryHistoryDetail.EXTRA_STATS, BATTERY_HISTORY_FILE);
@@ -66,9 +67,11 @@
 
     @Override
     public void onBindViewHolder(PreferenceViewHolder view) {
+        super.onBindViewHolder(view);
         if (mBatteryInfo == null) {
             return;
         }
+        view.itemView.setClickable(true);
         view.setDividerAllowedAbove(true);
         ((TextView) view.findViewById(R.id.charge)).setText(mBatteryInfo.batteryPercentString);
         ((TextView) view.findViewById(R.id.estimation)).setText(mBatteryInfo.remainingLabel);
diff --git a/src/com/android/settings/fuelgauge/BatteryWifiParser.java b/src/com/android/settings/fuelgauge/BatteryWifiParser.java
new file mode 100644
index 0000000..014c069
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/BatteryWifiParser.java
@@ -0,0 +1,40 @@
+/*
+ * 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.fuelgauge;
+
+import android.os.BatteryStats;
+import android.os.BatteryStats.HistoryItem;
+
+public class BatteryWifiParser extends BatteryFlagParser {
+
+    public BatteryWifiParser(int accentColor) {
+        super(accentColor, false, 0);
+    }
+
+    @Override
+    protected boolean isSet(HistoryItem record) {
+        switch ((record.states2 & HistoryItem.STATE2_WIFI_SUPPL_STATE_MASK)
+                >> HistoryItem.STATE2_WIFI_SUPPL_STATE_SHIFT) {
+            case BatteryStats.WIFI_SUPPL_STATE_DISCONNECTED:
+            case BatteryStats.WIFI_SUPPL_STATE_DORMANT:
+            case BatteryStats.WIFI_SUPPL_STATE_INACTIVE:
+            case BatteryStats.WIFI_SUPPL_STATE_INTERFACE_DISABLED:
+            case BatteryStats.WIFI_SUPPL_STATE_INVALID:
+            case BatteryStats.WIFI_SUPPL_STATE_UNINITIALIZED:
+                return false;
+        }
+        return true;
+    }
+}
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index a0d276f..bc44eeb 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -116,7 +116,7 @@
     @Override
     public boolean onPreferenceTreeClick(Preference preference) {
         if (!(preference instanceof PowerGaugePreference)) {
-            return false;
+            return super.onPreferenceTreeClick(preference);
         }
         PowerGaugePreference pgp = (PowerGaugePreference) preference;
         BatteryEntry entry = pgp.getInfo();
diff --git a/src/com/android/settings/search/Ranking.java b/src/com/android/settings/search/Ranking.java
index 59f83ec..e961474 100644
--- a/src/com/android/settings/search/Ranking.java
+++ b/src/com/android/settings/search/Ranking.java
@@ -32,7 +32,7 @@
 import com.android.settings.accessibility.AccessibilitySettings;
 import com.android.settings.accounts.AccountSettings;
 import com.android.settings.applications.AdvancedAppSettings;
-import com.android.settings.applications.ManageDefaultApps;
+import com.android.settings.applications.SpecialAccessSettings;
 import com.android.settings.bluetooth.BluetoothSettings;
 import com.android.settings.datausage.DataUsageMeteredSettings;
 import com.android.settings.datausage.DataUsageSummary;
@@ -148,7 +148,7 @@
 
         // Advanced app settings
         sRankMap.put(AdvancedAppSettings.class.getName(), RANK_APPS);
-        sRankMap.put(ManageDefaultApps.class.getName(), RANK_APPS);
+        sRankMap.put(SpecialAccessSettings.class.getName(), RANK_APPS);
 
         // Users
         sRankMap.put(UserSettings.class.getName(), RANK_USERS);
diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java
index 1d55b55..6aeb2a6 100644
--- a/src/com/android/settings/search/SearchIndexableResources.java
+++ b/src/com/android/settings/search/SearchIndexableResources.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.search;
 
+import android.provider.SearchIndexableResource;
 import com.android.settings.DateTimeSettings;
 import com.android.settings.DevelopmentSettings;
 import com.android.settings.DeviceInfoSettings;
@@ -32,7 +33,7 @@
 import com.android.settings.accessibility.AccessibilitySettings;
 import com.android.settings.accounts.AccountSettings;
 import com.android.settings.applications.AdvancedAppSettings;
-import com.android.settings.applications.ManageDefaultApps;
+import com.android.settings.applications.SpecialAccessSettings;
 import com.android.settings.bluetooth.BluetoothSettings;
 import com.android.settings.datausage.DataUsageMeteredSettings;
 import com.android.settings.datausage.DataUsageSummary;
@@ -56,8 +57,6 @@
 import com.android.settings.wifi.SavedAccessPointsWifiSettings;
 import com.android.settings.wifi.WifiSettings;
 
-import android.provider.SearchIndexableResource;
-
 import java.util.Collection;
 import java.util.HashMap;
 
@@ -212,15 +211,15 @@
         sResMap.put(AdvancedAppSettings.class.getName(),
                 new SearchIndexableResource(
                         Ranking.getRankForClassName(AdvancedAppSettings.class.getName()),
-                        R.xml.advanced_apps,
+                        NO_DATA_RES_ID,
                         AdvancedAppSettings.class.getName(),
                         R.drawable.ic_settings_applications));
 
-        sResMap.put(ManageDefaultApps.class.getName(),
+        sResMap.put(SpecialAccessSettings.class.getName(),
                 new SearchIndexableResource(
-                        Ranking.getRankForClassName(ManageDefaultApps.class.getName()),
-                        NO_DATA_RES_ID,
-                        ManageDefaultApps.class.getName(),
+                        Ranking.getRankForClassName(SpecialAccessSettings.class.getName()),
+                        R.xml.special_access,
+                        SpecialAccessSettings.class.getName(),
                         R.drawable.ic_settings_applications));
 
         sResMap.put(UserSettings.class.getName(),
