Merge "Import translations. DO NOT MERGE"
diff --git a/res/layout/preference_category_material_settings.xml b/res/layout/preference_category_material_settings.xml
index 2a25bbc..233f54a 100644
--- a/res/layout/preference_category_material_settings.xml
+++ b/res/layout/preference_category_material_settings.xml
@@ -40,13 +40,26 @@
             android:maxHeight="18dp"/>
     </LinearLayout>
 
-    <TextView
-        android:id="@android:id/title"
+    <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:textAppearance="@android:style/TextAppearance.Material.Body2"
-        android:textColor="?android:attr/textColorPrimary"
         android:paddingStart="60dp"
-        android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"/>
+        android:orientation="vertical">
+        <TextView
+            android:id="@android:id/title"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textAppearance="@android:style/TextAppearance.Material.Body2"
+            android:textColor="?android:attr/textColorPrimary"
+            android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"/>
+        <TextView
+            android:id="@android:id/summary"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textAppearance="?android:attr/textAppearanceListItemSecondary"
+            android:textColor="?android:attr/textColorSecondary"
+            android:ellipsize="end"
+            android:singleLine="true" />
+    </LinearLayout>
 
 </FrameLayout>
\ No newline at end of file
diff --git a/res/layout/restricted_preference_dropdown.xml b/res/layout/restricted_preference_dropdown.xml
index 1a1e191..fd0d07d 100644
--- a/res/layout/restricted_preference_dropdown.xml
+++ b/res/layout/restricted_preference_dropdown.xml
@@ -25,6 +25,6 @@
             android:layout_height="wrap_content"
             android:visibility="invisible" />
 
-    <include layout="@layout/preference_material" />
+    <include layout="@layout/preference_material_settings" />
 
 </FrameLayout>
\ No newline at end of file
diff --git a/res/layout/search_inline_switch_item.xml b/res/layout/search_inline_switch_item.xml
new file mode 100644
index 0000000..998c09c
--- /dev/null
+++ b/res/layout/search_inline_switch_item.xml
@@ -0,0 +1,81 @@
+<?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"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:minHeight="?android:attr/listPreferredItemHeight"
+        android:gravity="center_vertical"
+        android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+        android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+        android:background="?android:attr/selectableItemBackground"
+        android:clipToPadding="false">
+
+    <LinearLayout
+            android:id="@+id/icon_container"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:minWidth="60dp"
+            android:gravity="start|center_vertical"
+            android:orientation="horizontal"
+            android:paddingEnd="12dp"
+            android:paddingTop="4dp"
+            android:paddingBottom="4dp">
+        <com.android.internal.widget.PreferenceImageView
+                android:id="@android:id/icon"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:maxWidth="48dp"
+                android:maxHeight="48dp"/>
+    </LinearLayout>
+
+    <RelativeLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:paddingTop="16dp"
+            android:paddingBottom="16dp">
+
+        <TextView
+                android:id="@android:id/title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:singleLine="true"
+                android:textAppearance="?android:attr/textAppearanceListItem"
+                android:ellipsize="marquee"/>
+
+        <TextView
+                android:id="@android:id/summary"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_below="@android:id/title"
+                android:layout_alignStart="@android:id/title"
+                android:textAppearance="?android:attr/textAppearanceListItemSecondary"
+                android:textColor="?android:attr/textColorSecondary"
+                android:maxLength="60"
+                android:maxLines="10"/>
+
+    </RelativeLayout>
+
+    <Switch
+            android:id="@+id/switchView"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:gravity="end|center_vertical"
+            android:paddingStart="16dp"
+            android:orientation="vertical"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/search_intent_item.xml b/res/layout/search_intent_item.xml
index b68f65b..fcb5532 100644
--- a/res/layout/search_intent_item.xml
+++ b/res/layout/search_intent_item.xml
@@ -14,50 +14,59 @@
      limitations under the License.
 -->
 
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:minHeight="?android:attr/listPreferredItemHeight"
-    android:paddingEnd="?android:attr/scrollbarSize"
-    android:orientation="horizontal">
+<LinearLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:minHeight="?android:attr/listPreferredItemHeight"
+        android:gravity="center_vertical"
+        android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+        android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+        android:background="?android:attr/selectableItemBackground"
+        android:clipToPadding="false">
 
     <LinearLayout
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:gravity="center"
-            android:orientation="horizontal">
-
-        <ImageView
-                android:id="@+id/icon"
-                android:layout_width="@dimen/search_result_item_image_size"
-                android:layout_height="@dimen/search_result_item_image_size"
-                android:layout_marginStart="@dimen/search_result_item_image_margin_start"
-                android:layout_marginEnd="@dimen/search_result_item_image_margin_end"
-                android:scaleType="centerInside"/>
-    </LinearLayout>
-
-    <LinearLayout
+            android:id="@+id/icon_container"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:paddingTop="10dp"
-            android:orientation="vertical">
-
-        <TextView android:id="@+id/title"
-                  android:layout_width="wrap_content"
-                  android:layout_height="wrap_content"
-                  android:singleLine="true"
-                  android:textAppearance="?android:attr/textAppearanceMedium"
-                  android:ellipsize="marquee"
-                  android:fadingEdge="horizontal" />
-
-        <TextView android:id="@+id/summary"
-                  android:layout_width="wrap_content"
-                  android:layout_height="wrap_content"
-                  android:singleLine="true"
-                  android:textAppearance="?android:attr/textAppearanceSmall"
-                  android:ellipsize="marquee"
-                  android:fadingEdge="horizontal" />
-
+            android:minWidth="60dp"
+            android:gravity="start|center_vertical"
+            android:orientation="horizontal"
+            android:paddingEnd="12dp"
+            android:paddingTop="4dp"
+            android:paddingBottom="4dp">
+        <com.android.internal.widget.PreferenceImageView
+                android:id="@android:id/icon"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:maxWidth="48dp"
+                android:maxHeight="48dp"/>
     </LinearLayout>
 
+    <RelativeLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:paddingTop="16dp"
+            android:paddingBottom="16dp">
+
+        <TextView
+                android:id="@android:id/title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:singleLine="true"
+                android:textAppearance="?android:attr/textAppearanceListItem"
+                android:ellipsize="marquee"/>
+
+        <TextView
+                android:id="@android:id/summary"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_below="@android:id/title"
+                android:layout_alignStart="@android:id/title"
+                android:textAppearance="?android:attr/textAppearanceListItemSecondary"
+                android:textColor="?android:attr/textColorSecondary"
+                android:maxLines="10"/>
+
+    </RelativeLayout>
 </LinearLayout>
diff --git a/res/layout/storage_item.xml b/res/layout/storage_item.xml
index 636a4c2..de73543 100644
--- a/res/layout/storage_item.xml
+++ b/res/layout/storage_item.xml
@@ -20,7 +20,7 @@
     android:orientation="vertical"
     android:minHeight="?android:attr/listPreferredItemHeightSmall"
     android:gravity="center_vertical"
-    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingStart="@dimen/preference_no_icon_padding_start"
     android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
     android:paddingTop="16dip"
     android:paddingBottom="16dip"
diff --git a/res/layout/storage_summary.xml b/res/layout/storage_summary.xml
index 7cd5b06..1beb49f 100644
--- a/res/layout/storage_summary.xml
+++ b/res/layout/storage_summary.xml
@@ -20,7 +20,7 @@
     android:orientation="vertical"
     android:minHeight="?android:attr/listPreferredItemHeightSmall"
     android:gravity="center_vertical"
-    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingStart="@dimen/preference_no_icon_padding_start"
     android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
     android:paddingTop="16dip"
     android:paddingBottom="16dip"
diff --git a/res/layout/work_profile_category.xml b/res/layout/work_profile_category.xml
deleted file mode 100644
index 8ca99f1..0000000
--- a/res/layout/work_profile_category.xml
+++ /dev/null
@@ -1,40 +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.
--->
-
-<!-- Layout used for "Work" preference group in Accounts. -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_marginBottom="16dip"
-    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:paddingTop="16dip"
-    android:orientation="vertical">
-    <TextView
-        android:id="@android:id/title"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:textAppearance="@android:style/TextAppearance.Material.Body2"
-        android:textColor="?android:attr/colorAccent" />
-    <TextView
-        android:id="@android:id/summary"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:textAppearance="?android:attr/textAppearanceListItemSecondary"
-        android:textColor="?android:attr/textColorSecondary"
-        android:ellipsize="end"
-        android:singleLine="true" />
-</LinearLayout>
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index ef9cbc4..c1a76b3 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3568,11 +3568,11 @@
     <!-- [CHAR LIMIT=30] Manage applications, label for option to disable app -->
     <string name="app_disable_dlg_positive">Disable app</string>
     <!-- [CHAR LIMIT=200] Manage applications, text for dialog when disabling apps -->
-    <string name="app_disable_dlg_text">If you disable this app, other apps may no longer function as intended.</string>
+    <string name="app_disable_dlg_text">If you disable this app, Android and other apps may no longer function as intended.</string>
     <!-- [CHAR LIMIT=NONE] Manage applications, title for dialog when disabling updated apps -->
     <string name="app_special_disable_dlg_title">Delete data and disable app?</string>
     <!-- [CHAR LIMIT=NONE] Manage applications, text for dialog when disabling update apps -->
-    <string name="app_special_disable_dlg_text">If you disable this app, other apps may no longer function as intended.  Your data will also be deleted.</string>
+    <string name="app_special_disable_dlg_text">If you disable this app, Android and other apps may no longer function as intended.  Your data will also be deleted.</string>
     <!-- [CHAR LIMIT=30] Manage applications, title for dialog when disabling notifications for an app -->
     <string name="app_disable_notifications_dlg_title">Turn off notifications?</string>
     <!-- [CHAR LIMIT=200] Manage applications, text for dialog when disabling notifications for an app -->
@@ -5929,7 +5929,7 @@
     </plurals>
 
     <!-- Title for setting tile leading to network and Internet settings [CHAR LIMIT=40]-->
-    <string name="network_dashboard_title">Network &amp; Internet</string>
+    <string name="network_dashboard_title">Network &amp; internet</string>
     <!-- Title for setting tile leading to Connected devices settings [CHAR LIMIT=40]-->
     <string name="connected_devices_dashboard_title">Connected devices</string>
     <!-- Title for setting tile leading to Apps & Notification settings [CHAR LIMIT=40]-->
@@ -6226,25 +6226,19 @@
     <string name="notification_importance_none">Not set</string>
 
     <!-- [CHAR LIMIT=100] Notification Importance slider: blocked importance level description -->
-    <string name="notification_importance_blocked">Never show notifications from this app</string>
+    <string name="notification_importance_blocked">Never show notifications</string>
 
     <!-- [CHAR LIMIT=100] Notification Importance slider: min importance level description -->
-    <string name="notification_importance_min">No full screen interruption, peeking, sound, or vibration. Show at the bottom of the notification list. Hide from lock screen and status bar.</string>
+    <string name="notification_importance_min">No sound or visual interruption</string>
 
     <!-- [CHAR LIMIT=100] Notification Importance slider: low importance level description -->
-    <string name="notification_importance_low">No full screen interruption, peeking, sound, or vibration.</string>
+    <string name="notification_importance_low">Show silently</string>
 
     <!-- [CHAR LIMIT=100] Notification Importance slider: normal importance level description -->
-    <string name="notification_importance_default">No full screen interruption or peeking.</string>
+    <string name="notification_importance_default">Make sound</string>
 
     <!-- [CHAR LIMIT=100] Notification Importance slider: high importance level description -->
-    <string name="notification_importance_high">Always peek. No full screen interruption.</string>
-
-    <!-- [CHAR LIMIT=100] Notification Importance slider: max importance level description -->
-    <string name="notification_importance_max">Always peek, and allow full screen interruption. Show at the top of the notification list.</string>
-
-    <!-- [CHAR LIMIT=100] Notification Importance slider: max importance level description -->
-    <string name="notification_importance_unspecified">App determines importance for each notification</string>
+    <string name="notification_importance_high">Make sound and pop on screen</string>
 
     <!-- [CHAR LIMIT=60] Notification importance reset button -->
     <string name="importance_reset">Reset</string>
@@ -6335,13 +6329,19 @@
     <string name="app_notification_block_title">Block all</string>
 
     <!-- [CHAR LIMIT=NONE] App notification settings: Block option description-->
-    <string name="app_notification_block_summary">Never show notifications from this app</string>
+    <string name="app_notification_block_summary">Never show these notifications</string>
 
     <!-- [CHAR LIMIT=NONE] Channel notification settings: Block option title -->
-    <string name="channel_notification_block_title">Block all</string>
+    <string name="notification_content_block_title">Show notifications</string>
 
     <!-- [CHAR LIMIT=NONE] Channel notification settings: Block option description-->
-    <string name="channel_notification_block_summary">Never show notifications from this channel</string>
+    <string name="notification_content_block_summary">Never show notifications in the shade or on peripheral devices</string>
+
+    <!-- [CHAR LIMIT=NONE] Channel notification settings: Badging option title -->
+    <string name="notification_badge_title">Show badge</string>
+
+    <!-- [CHAR LIMIT=NONE] Channel notification settings: Badge option description-->
+    <string name="notification_badge_summary">Show notifications as badges on the Home app, if supported.</string>
 
     <!-- [CHAR LIMIT=NONE] App notification settings: Override DND option title -->
     <string name="app_notification_override_dnd_title">Override Do Not Disturb</string>
@@ -6352,7 +6352,7 @@
     <!-- [CHAR LIMIT=NONE] App notification settings: Visibility override option title -->
     <string name="app_notification_visibility_override_title">On the lock screen</string>
 
-    <!-- [CHAR LIMIT=20] Notification settings: App notifications row summary when banned -->
+    <!-- [CHAR LIMIT=20] Notification settings: App notifications row summary when allowed -->
     <string name="app_notification_row_banned">Blocked</string>
 
     <!-- [CHAR LIMIT=40] Notification settings: App notifications row summary when high priority -->
@@ -6794,14 +6794,6 @@
     <string name="filter_notif_blocked_apps">Blocked</string>
     <!-- Label for showing apps with domain URLs (data URI with http or https) in list [CHAR LIMIT=30] -->
     <string name="filter_with_domain_urls_apps">With domain URLs</string>
-    <!-- Label for showing apps with priority notifications in list [CHAR LIMIT=50] -->
-    <string name="filter_notif_priority_apps">Overrides Do Not Disturb</string>
-    <!-- Label for showing apps redacting sensitive notifications in list [CHAR LIMIT=50] -->
-    <string name="filter_notif_sensitive_apps">No sensitive content on lock screen</string>
-    <!-- Label for showing apps hiding notifications from lockscreen [CHAR LIMIT=50] -->
-    <string name="filter_notif_hide_notifications_apps">Never shown on lock screen</string>
-    <!-- Filter label for apps that the user has silenced [CHAR LIMIT=40] -->
-    <string name="filter_notif_silent">Shown silently</string>
 
     <!-- Title for advanced application management settings [CHAR LIMIT=30] -->
     <string name="advanced_apps">Advanced</string>
@@ -7787,6 +7779,9 @@
     <!-- Spinner dropdown text, when selected will try to add account [CHAR LIMIT=60] -->
     <string name="support_account_picker_add_account">Add account</string>
 
+    <!-- Title for the dialog containing system information shown [CHAR LIMIT=30] -->
+    <string name="support_system_information_title">System information</string>
+
     <!-- [CHAR LIMIT=60] Title of work profile setting page -->
     <string name="managed_profile_settings_title">Work profile settings</string>
     <!-- [CHAR LIMIT=60] The preference title for enabling cross-profile remote contact search -->
diff --git a/res/xml/advanced_apps.xml b/res/xml/advanced_apps.xml
index c17da05..0f9f82b 100644
--- a/res/xml/advanced_apps.xml
+++ b/res/xml/advanced_apps.xml
@@ -92,7 +92,7 @@
     <PreferenceCategory
         android:title="@string/advanced_apps">
 
-        <PreferenceScreen
+        <Preference
             android:key="special_access"
             android:fragment="com.android.settings.applications.SpecialAccessSettings"
             android:title="@string/special_access" />
diff --git a/res/xml/app_notification_settings.xml b/res/xml/app_notification_settings.xml
index 2b2fc31..82660dc 100644
--- a/res/xml/app_notification_settings.xml
+++ b/res/xml/app_notification_settings.xml
@@ -18,46 +18,18 @@
         xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
         android:title="@string/app_notifications_title"
         android:key="app_notification_settings">
-
-    <!-- Importance -->
     <!-- Block -->
     <com.android.settingslib.RestrictedSwitchPreference
-            android:key="block"
-            android:title="@string/app_notification_block_title"
-            android:summary="@string/app_notification_block_summary"
-            android:order="2"
-            settings:useAdditionalSummary="true"
-            settings:restrictedSwitchSummary="@string/enabled_by_admin" />
-    <!-- Silent -->
-    <com.android.settingslib.RestrictedSwitchPreference
-            android:key="silent"
-            android:title="@string/show_silently"
-            android:summary="@string/show_silently_summary"
-            android:order="3"
-            settings:useAdditionalSummary="true" />
-    <!-- Slider -->
-    <com.android.settings.notification.ImportanceSeekBarPreference
-            android:key="importance"
-            android:title="@string/notification_importance_title"
-            android:order="4"/>
-
-    <!-- Visibility Override -->
-    <com.android.settings.notification.RestrictedDropDownPreference
-            android:key="visibility_override"
-            android:title="@string/app_notification_visibility_override_title"
-            android:order="5" />
-
-    <!-- Bypass DND -->
-    <com.android.settingslib.RestrictedSwitchPreference
-            android:key="bypass_dnd"
-            android:title="@string/app_notification_override_dnd_title"
-            android:summary="@string/app_notification_override_dnd_summary"
-            android:order="6"
-            settings:useAdditionalSummary="true" />
+        android:key="block"
+        android:title="@string/app_notification_block_title"
+        android:summary="@string/app_notification_block_summary"
+        android:order="2"
+        settings:useAdditionalSummary="true"
+        settings:restrictedSwitchSummary="@string/enabled_by_admin" />
 
     <PreferenceCategory
             android:key="channels"
             android:title="@string/notification_channels"
-            android:order="7" />
+            android:order="3" />
 
 </PreferenceScreen>
diff --git a/res/xml/application_settings.xml b/res/xml/application_settings.xml
index 1afe243..9987fc2 100644
--- a/res/xml/application_settings.xml
+++ b/res/xml/application_settings.xml
@@ -26,26 +26,26 @@
         android:summary="@string/applications_settings_summary"
         android:key="applications_settings">
 
-    <PreferenceScreen
+    <Preference
             android:fragment="com.android.settings.applications.ManageApplications"
             android:title="@string/manageapplications_settings_title"
             android:summary="@string/manageapplications_settings_summary">
-    </PreferenceScreen>
+    </Preference>
 
-    <PreferenceScreen
+    <Preference
             android:fragment="com.android.settings.applications.ManageApplications"
             android:title="@string/runningservices_settings_title"
             android:summary="@string/runningservices_settings_summary">
         <extra android:name="classname" android:value="com.android.settings.Settings$RunningServicesActivity" />
-    </PreferenceScreen>
+    </Preference>
 
-    <PreferenceScreen
+    <Preference
             android:fragment="com.android.settings.applications.ManageApplications"
             android:title="@string/storageuse_settings_title"
             android:summary="@string/storageuse_settings_summary">
         <extra android:name="classname"
                 android:value="com.android.settings.Settings$StorageUseActivity" />
-    </PreferenceScreen>
+    </Preference>
 
     <CheckBoxPreference
             android:key="toggle_advanced_settings"
diff --git a/res/xml/automatic_storage_management_settings.xml b/res/xml/automatic_storage_management_settings.xml
index c597cc8..af79396 100644
--- a/res/xml/automatic_storage_management_settings.xml
+++ b/res/xml/automatic_storage_management_settings.xml
@@ -32,12 +32,10 @@
             android:title="@string/downloads_backup_preference_title"
             android:summary="@string/downloads_backup_text"/>
 
-        <com.android.settings.fuelgauge.WallOfTextPreference
+        <Preference
             android:key="freed_bytes"
             android:persistent="false"
-            android:selectable="false"
-            settings:allowDividerAbove="false"
-            settings:allowDividerBelow="true" />
+            android:selectable="false" />
 
         <DropDownPreference
             android:key="days"
diff --git a/res/xml/battery_saver_settings.xml b/res/xml/battery_saver_settings.xml
index 630016f..1720c73 100644
--- a/res/xml/battery_saver_settings.xml
+++ b/res/xml/battery_saver_settings.xml
@@ -15,7 +15,6 @@
 -->
 
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:settings="http://schemas.android.com/apk/res-auto"
         android:title="@string/battery_saver"
         android:key="battery_saver">
 
@@ -25,12 +24,4 @@
             android:title="@string/battery_saver_turn_on_automatically_title"
             android:summary="%s" />
 
-    <!-- Feature description text -->
-    <com.android.settings.fuelgauge.WallOfTextPreference
-            android:key="description"
-            android:summary="@*android:string/battery_saver_description"
-            android:persistent="false"
-            android:selectable="false"
-            settings:allowDividerAbove="true" />
-
 </PreferenceScreen>
diff --git a/res/xml/channel_notification_settings.xml b/res/xml/channel_notification_settings.xml
index de0b9c7..c2d1f73 100644
--- a/res/xml/channel_notification_settings.xml
+++ b/res/xml/channel_notification_settings.xml
@@ -20,21 +20,33 @@
     <!-- Importance -->
     <!-- Block -->
     <com.android.settingslib.RestrictedSwitchPreference
-            android:key="block"
-            android:title="@string/channel_notification_block_title"
-            android:summary="@string/app_notification_block_summary"
-            android:order="2"
-            settings:useAdditionalSummary="true"
-            settings:restrictedSwitchSummary="@string/enabled_by_admin" />
-    <!-- Silent -->
+        android:key="block"
+        android:title="@string/app_notification_block_title"
+        android:summary="@string/app_notification_block_summary"
+        android:order="1"
+        settings:useAdditionalSummary="true"
+        settings:restrictedSwitchSummary="@string/enabled_by_admin" />
+
+    <!-- Show notification -->
     <com.android.settingslib.RestrictedSwitchPreference
-            android:key="silent"
-            android:title="@string/show_silently"
-            android:summary="@string/show_silently_summary"
-            android:order="3"
-            settings:useAdditionalSummary="true" />
-    <!-- Slider -->
-    <com.android.settings.notification.ImportanceSeekBarPreference
+        android:key="show"
+        android:title="@string/notification_content_block_title"
+        android:summary="@string/notification_content_block_summary"
+        android:order="2"
+        settings:useAdditionalSummary="true"
+        settings:restrictedSwitchSummary="@string/enabled_by_admin" />
+
+    <!-- Show badge -->
+    <com.android.settingslib.RestrictedSwitchPreference
+        android:key="badge"
+        android:title="@string/notification_badge_title"
+        android:summary="@string/notification_badge_summary"
+        android:order="3"
+        settings:useAdditionalSummary="true"
+        settings:restrictedSwitchSummary="@string/enabled_by_admin" />
+
+    <!-- Importance -->
+    <com.android.settings.notification.RestrictedDropDownPreference
             android:key="importance"
             android:title="@string/notification_importance_title"
             android:order="4"/>
diff --git a/res/xml/data_saver.xml b/res/xml/data_saver.xml
index 20ce5c8..0244030 100644
--- a/res/xml/data_saver.xml
+++ b/res/xml/data_saver.xml
@@ -15,7 +15,6 @@
 -->
 
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:settings="http://schemas.android.com/apk/res-auto"
         android:title="@string/data_saver_title">
 
     <Preference
@@ -23,12 +22,4 @@
         android:title="@string/unrestricted_data_saver"
         android:fragment="com.android.settings.datausage.UnrestrictedDataAccess" />
 
-    <!-- Feature description text -->
-    <com.android.settings.fuelgauge.WallOfTextPreference
-            android:key="description"
-            android:summary="@*android:string/data_saver_description"
-            android:persistent="false"
-            android:selectable="false"
-            settings:allowDividerAbove="true" />
-
 </PreferenceScreen>
diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml
index 1440c3f..2632c78 100644
--- a/res/xml/display_settings.xml
+++ b/res/xml/display_settings.xml
@@ -19,12 +19,12 @@
         android:title="@string/display_settings"
         settings:keywords="@string/keywords_display">
 
-        <PreferenceScreen
+        <Preference
                 android:key="brightness"
                 android:title="@string/brightness"
                 settings:keywords="@string/keywords_display_brightness_level">
             <intent android:action="android.intent.action.SHOW_BRIGHTNESS_DIALOG" />
-        </PreferenceScreen>
+        </Preference>
 
         <SwitchPreference
                 android:key="auto_brightness"
@@ -70,7 +70,7 @@
                 android:title="@string/camera_gesture_title"
                 android:summary="@string/camera_gesture_desc" />
 
-        <PreferenceScreen
+        <Preference
                 android:key="screensaver"
                 android:title="@string/screensaver_settings_title"
                 android:fragment="com.android.settings.DreamSettings" />
@@ -89,7 +89,7 @@
                 android:title="@string/tap_to_wake"
                 android:summary="@string/tap_to_wake_summary" />
 
-        <PreferenceScreen
+        <Preference
                 android:key="font_size"
                 android:title="@string/title_font_size"
                 android:fragment="com.android.settings.accessibility.ToggleFontSizePreferenceFragment"
@@ -105,7 +105,7 @@
                 android:summary="%s"
                 android:title="@string/display_auto_rotate_title" />
 
-        <PreferenceScreen
+        <Preference
                 android:key="wifi_display"
                 android:title="@string/wifi_display_settings_title"
                 settings:keywords="@string/keywords_display_cast_screen"
diff --git a/res/xml/language_settings.xml b/res/xml/language_settings.xml
index 992af92..8aa105b 100644
--- a/res/xml/language_settings.xml
+++ b/res/xml/language_settings.xml
@@ -18,7 +18,7 @@
                   android:key="language_keyboard_settings"
                   android:title="@string/language_keyboard_settings_title">
 
-    <PreferenceScreen
+    <Preference
             android:key="phone_language"
             android:title="@string/phone_language"
             android:fragment="com.android.settings.localepicker.LocaleListEditor"
@@ -34,17 +34,17 @@
         android:persistent="false"/>
 
     <!-- User dictionary preference title and fragment will be set programmatically. -->
-    <PreferenceScreen
+    <Preference
             android:key="key_user_dictionary_settings"
             android:title="@string/user_dict_settings_title"
             />
 
     <PreferenceCategory
         android:title="@string/keyboard_and_input_methods_category">
-        <PreferenceScreen
+        <Preference
             android:title="@string/virtual_keyboard_category"
             android:fragment="com.android.settings.inputmethod.VirtualKeyboardFragment" />
-        <PreferenceScreen
+        <Preference
             android:title="@string/physical_keyboard_title"
             android:fragment="com.android.settings.inputmethod.PhysicalKeyboardFragment" />
     </PreferenceCategory>
@@ -53,7 +53,7 @@
             android:key="voice_category"
             android:title="@string/voice_category" >
 
-        <PreferenceScreen
+        <Preference
                 android:key="tts_settings"
                 android:title="@string/tts_settings_title"
                 android:fragment="com.android.settings.tts.TextToSpeechSettings"
diff --git a/res/xml/night_display_settings.xml b/res/xml/night_display_settings.xml
index 76b9323..c0b91ae 100644
--- a/res/xml/night_display_settings.xml
+++ b/res/xml/night_display_settings.xml
@@ -46,9 +46,4 @@
 
     </PreferenceCategory>
 
-    <com.android.settings.fuelgauge.WallOfTextPreference
-            android:summary="@string/night_display_text"
-            android:selectable="false"
-            settings:allowDividerAbove="true" />
-
 </PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/privacy_settings.xml b/res/xml/privacy_settings.xml
index f2af8f3..eeef64c 100644
--- a/res/xml/privacy_settings.xml
+++ b/res/xml/privacy_settings.xml
@@ -19,24 +19,24 @@
     android:title="@string/privacy_settings_title">
 
     <!-- Backup settings -->
-    <PreferenceScreen
+    <Preference
         android:key="backup_data"
         android:title="@string/backup_data_title"
         android:persistent="false"
         android:fragment="com.android.settings.backup.ToggleBackupSettingFragment"/>
 
-    <PreferenceScreen
+    <Preference
         android:key="configure_account"
         android:title="@string/backup_configure_account_title"
         android:persistent="false">
         <!-- the Intent declared here is always overwritten by a real one -->
         <intent android:action="dummy" />
-    </PreferenceScreen>
+    </Preference>
 
-    <PreferenceScreen
+    <Preference
         android:key="data_management"
         android:persistent="false">
-    </PreferenceScreen>
+    </Preference>
 
     <SwitchPreference
         android:key="auto_restore"
diff --git a/res/xml/security_settings_unencrypted.xml b/res/xml/security_settings_unencrypted.xml
index ee87705..7c51d25 100644
--- a/res/xml/security_settings_unencrypted.xml
+++ b/res/xml/security_settings_unencrypted.xml
@@ -21,7 +21,7 @@
         android:key="security_category"
         android:title="@string/crypt_keeper_settings_title">
 
-        <PreferenceScreen
+        <Preference
             android:key="encryption"
             android:title="@string/crypt_keeper_encrypt_title"
             android:fragment="com.android.settings.CryptKeeperSettings" />
diff --git a/res/xml/special_access.xml b/res/xml/special_access.xml
index 31789fb..4de167a 100644
--- a/res/xml/special_access.xml
+++ b/res/xml/special_access.xml
@@ -18,7 +18,7 @@
         xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:settings="http://schemas.android.com/apk/res/com.android.settings">
 
-    <PreferenceScreen
+    <Preference
         android:key="high_power_apps"
         android:title="@string/high_power_apps"
         android:fragment="com.android.settings.applications.ManageApplications"
@@ -26,19 +26,19 @@
         <extra
             android:name="classname"
             android:value="com.android.settings.Settings$HighPowerApplicationsActivity" />
-    </PreferenceScreen>
+    </Preference>
 
-    <PreferenceScreen
+    <Preference
         android:key="device_administrators"
         android:title="@string/manage_device_admin"
         android:fragment="com.android.settings.DeviceAdminSettings" />
 
-    <PreferenceScreen
+    <Preference
         android:key="zen_access"
         android:title="@string/manage_zen_access_title"
         android:fragment="com.android.settings.notification.ZenAccessSettings" />
 
-    <PreferenceScreen
+    <Preference
         android:key="system_alert_window"
         android:title="@string/system_alert_window_settings"
         android:fragment="com.android.settings.applications.ManageApplications"
@@ -46,9 +46,9 @@
         <extra
             android:name="classname"
             android:value="com.android.settings.Settings$OverlaySettingsActivity" />
-    </PreferenceScreen>
+    </Preference>
 
-    <PreferenceScreen
+    <Preference
         android:key="enabled_vr_listeners"
         android:title="@string/vr_listeners_title"
         android:fragment="com.android.settings.applications.VrListenerSettings"
@@ -56,9 +56,9 @@
         <extra
             android:name="classname"
             android:value="com.android.settings.Settings$VrListenersSettingsActivity" />
-    </PreferenceScreen>
+    </Preference>
 
-    <PreferenceScreen
+    <Preference
         android:key="write_settings_apps"
         android:title="@string/write_settings"
         android:fragment="com.android.settings.applications.ManageApplications"
@@ -66,24 +66,24 @@
         <extra
             android:name="classname"
             android:value="com.android.settings.Settings$WriteSettingsActivity" />
-    </PreferenceScreen>
+    </Preference>
 
-    <PreferenceScreen
+    <Preference
         android:key="notification_access"
         android:title="@string/manage_notification_access_title"
         android:fragment="com.android.settings.notification.NotificationAccessSettings" />
 
-    <PreferenceScreen
+    <Preference
         android:key="premium_sms"
         android:title="@string/premium_sms_access"
         android:fragment="com.android.settings.applications.PremiumSmsAccess" />
 
-    <PreferenceScreen
+    <Preference
         android:key="data_saver"
         android:title="@string/unrestricted_data_saver"
         android:fragment="com.android.settings.datausage.UnrestrictedDataAccess" />
 
-    <PreferenceScreen
+    <Preference
         android:key="usage_access"
         android:title="@string/usage_access"
         android:fragment="com.android.settings.applications.ManageApplications"
@@ -91,5 +91,5 @@
         <extra
             android:name="classname"
             android:value="com.android.settings.Settings$UsageAccessSettingsActivity" />
-    </PreferenceScreen>
+    </Preference>
 </PreferenceScreen>
diff --git a/res/xml/virtual_keyboard_settings.xml b/res/xml/virtual_keyboard_settings.xml
index e5a5f38..d5f0496 100644
--- a/res/xml/virtual_keyboard_settings.xml
+++ b/res/xml/virtual_keyboard_settings.xml
@@ -16,7 +16,7 @@
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
     android:title="@string/virtual_keyboard_category">
     <!-- Enabled input method list will be populated programmatically here. -->
-    <PreferenceScreen
+    <Preference
         android:key="add_virtual_keyboard_screen"
         android:title="@string/add_virtual_keyboard"
         android:fragment="com.android.settings.inputmethod.AvailableVirtualKeyboardFragment" />
diff --git a/res/xml/zen_mode_settings.xml b/res/xml/zen_mode_settings.xml
index d8ad10d..b22ad6a 100644
--- a/res/xml/zen_mode_settings.xml
+++ b/res/xml/zen_mode_settings.xml
@@ -20,19 +20,19 @@
     android:title="@string/zen_mode_settings_title" >
 
     <!-- Priority only allows -->
-    <PreferenceScreen
+    <Preference
             android:key="priority_settings"
             android:title="@string/zen_mode_priority_settings_title"
             android:fragment="com.android.settings.notification.ZenModePrioritySettings" />
 
     <!-- Automated rules -->
-    <PreferenceScreen
+    <Preference
             android:key="automation_settings"
             android:title="@string/zen_mode_automation_settings_title"
             android:fragment="com.android.settings.notification.ZenModeAutomationSettings" />
 
     <!-- Visual interruptions -->
-    <PreferenceScreen
+    <Preference
             android:key="visual_interruptions_settings"
             android:title="@string/zen_mode_visual_interruptions_settings_title"
             android:fragment="com.android.settings.notification.ZenModeVisualInterruptionSettings" />
diff --git a/src/com/android/settings/BandMode.java b/src/com/android/settings/BandMode.java
index 6f83fbc..b130295 100644
--- a/src/com/android/settings/BandMode.java
+++ b/src/com/android/settings/BandMode.java
@@ -164,7 +164,12 @@
             int size = bands[0];
 
             if (size > 0) {
+                mBandListAdapter.add(
+                        new BandListItem(Phone.BM_UNSPECIFIED)); //Always include AUTOMATIC
                 for (int i=1; i<=size; i++) {
+                    if (bands[i] == Phone.BM_UNSPECIFIED) {
+                        continue;
+                    }
                     item = new BandListItem(bands[i]);
                     mBandListAdapter.add(item);
                     if (DBG) log("Add " + item.toString());
diff --git a/src/com/android/settings/PrivacySettings.java b/src/com/android/settings/PrivacySettings.java
index 560b160..e9d810a 100644
--- a/src/com/android/settings/PrivacySettings.java
+++ b/src/com/android/settings/PrivacySettings.java
@@ -16,7 +16,6 @@
 
 package com.android.settings;
 
-import android.app.Activity;
 import android.app.backup.IBackupManager;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -30,6 +29,7 @@
 import android.os.UserManager;
 import android.provider.SearchIndexableResource;
 import android.provider.Settings;
+import android.support.annotation.VisibleForTesting;
 import android.support.v14.preference.SwitchPreference;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.Preference.OnPreferenceChangeListener;
@@ -37,11 +37,9 @@
 import android.util.Log;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 import com.android.settingslib.RestrictedLockUtils;
-import com.android.settingslib.RestrictedPreference;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -56,18 +54,22 @@
 
     // Vendor specific
     private static final String GSETTINGS_PROVIDER = "com.google.settings";
-    private static final String BACKUP_DATA = "backup_data";
-    private static final String AUTO_RESTORE = "auto_restore";
-    private static final String CONFIGURE_ACCOUNT = "configure_account";
-    private static final String DATA_MANAGEMENT = "data_management";
+    @VisibleForTesting
+    static final String BACKUP_DATA = "backup_data";
+    @VisibleForTesting
+    static final String AUTO_RESTORE = "auto_restore";
+    @VisibleForTesting
+    static final String CONFIGURE_ACCOUNT = "configure_account";
+    @VisibleForTesting
+    static final String DATA_MANAGEMENT = "data_management";
     private static final String BACKUP_INACTIVE = "backup_inactive";
     private static final String FACTORY_RESET = "factory_reset";
     private static final String TAG = "PrivacySettings";
     private IBackupManager mBackupManager;
-    private PreferenceScreen mBackup;
+    private Preference mBackup;
     private SwitchPreference mAutoRestore;
-    private PreferenceScreen mConfigure;
-    private PreferenceScreen mManageData;
+    private Preference mConfigure;
+    private Preference mManageData;
     private boolean mEnabled;
 
     @Override
@@ -90,13 +92,7 @@
         mBackupManager = IBackupManager.Stub.asInterface(
                 ServiceManager.getService(Context.BACKUP_SERVICE));
 
-        mBackup = (PreferenceScreen) screen.findPreference(BACKUP_DATA);
-
-        mAutoRestore = (SwitchPreference) screen.findPreference(AUTO_RESTORE);
-        mAutoRestore.setOnPreferenceChangeListener(preferenceChangeListener);
-
-        mConfigure = (PreferenceScreen) screen.findPreference(CONFIGURE_ACCOUNT);
-        mManageData = (PreferenceScreen) screen.findPreference(DATA_MANAGEMENT);
+        setPreferenceReferences(screen);
 
         Set<String> keysToRemove = new HashSet<>();
         getNonVisibleKeys(getActivity(), keysToRemove);
@@ -121,6 +117,17 @@
         }
     }
 
+    @VisibleForTesting
+    void setPreferenceReferences(PreferenceScreen screen) {
+        mBackup = screen.findPreference(BACKUP_DATA);
+
+        mAutoRestore = (SwitchPreference) screen.findPreference(AUTO_RESTORE);
+        mAutoRestore.setOnPreferenceChangeListener(preferenceChangeListener);
+
+        mConfigure = screen.findPreference(CONFIGURE_ACCOUNT);
+        mManageData = screen.findPreference(DATA_MANAGEMENT);
+    }
+
     private OnPreferenceChangeListener preferenceChangeListener = new OnPreferenceChangeListener() {
         @Override
         public boolean onPreferenceChange(Preference preference, Object newValue) {
diff --git a/src/com/android/settings/WallOfTextPreference.java b/src/com/android/settings/WallOfTextPreference.java
deleted file mode 100644
index 4cc2f67..0000000
--- a/src/com/android/settings/WallOfTextPreference.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.fuelgauge;
-
-import android.content.Context;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceViewHolder;
-import android.util.AttributeSet;
-import android.widget.TextView;
-import com.android.settings.DividerPreference;
-
-public class WallOfTextPreference extends DividerPreference {
-
-    public WallOfTextPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    @Override
-    public void onBindViewHolder(PreferenceViewHolder view) {
-        super.onBindViewHolder(view);
-        final TextView summary = (TextView) view.findViewById(android.R.id.summary);
-        summary.setMaxLines(20);
-    }
-}
diff --git a/src/com/android/settings/accounts/AccountPreferenceController.java b/src/com/android/settings/accounts/AccountPreferenceController.java
index 219dd3a..723a1ec 100644
--- a/src/com/android/settings/accounts/AccountPreferenceController.java
+++ b/src/com/android/settings/accounts/AccountPreferenceController.java
@@ -271,7 +271,6 @@
         } else {
             List<UserInfo> profiles = mUm.getProfiles(UserHandle.myUserId());
             final int profilesCount = profiles.size();
-            final boolean addCategory = profilesCount > 1;
             for (int i = 0; i < profilesCount; i++) {
                 updateProfileUi(profiles.get(i));
             }
@@ -298,7 +297,6 @@
             preferenceGroup.setContentDescription(
                 mContext.getString(R.string.account_settings));
         } else if (userInfo.isManagedProfile()) {
-            preferenceGroup.setLayoutResource(R.layout.work_profile_category);
             preferenceGroup.setTitle(R.string.category_work);
             String workGroupSummary = getWorkGroupSummary(context, userInfo);
             preferenceGroup.setSummary(workGroupSummary);
diff --git a/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java b/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java
index 45b472a..5942897 100644
--- a/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java
+++ b/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.provider.SearchIndexableResource;
 
+import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
@@ -35,7 +36,7 @@
 
     @Override
     public int getMetricsCategory() {
-        return APP_AND_NOTIFICATION_CATEGORY_FRAGMENT;
+        return MetricsProto.MetricsEvent.SETTINGS_APP_NOTIF_CATEGORY;
     }
 
     @Override
diff --git a/src/com/android/settings/applications/AppStateNotificationBridge.java b/src/com/android/settings/applications/AppStateNotificationBridge.java
index 5fff175..b0c065a 100644
--- a/src/com/android/settings/applications/AppStateNotificationBridge.java
+++ b/src/com/android/settings/applications/AppStateNotificationBridge.java
@@ -81,64 +81,4 @@
             return false;
         }
     };
-
-    public static final AppFilter FILTER_APP_NOTIFICATION_SILENCED = new AppFilter() {
-        @Override
-        public void init() {
-        }
-
-        @Override
-        public boolean filterApp(AppEntry info) {
-            if (info == null || info.extraInfo == null) {
-                return false;
-            }
-            AppRow row = (AppRow) info.extraInfo;
-            return row.appImportance > NotificationManager.IMPORTANCE_NONE
-                    && row.appImportance < NotificationManager.IMPORTANCE_DEFAULT;
-        }
-    };
-
-    public static final AppFilter FILTER_APP_NOTIFICATION_PRIORITY = new AppFilter() {
-        @Override
-        public void init() {
-        }
-
-        @Override
-        public boolean filterApp(AppEntry info) {
-            if (info == null || info.extraInfo == null) {
-                return false;
-            }
-            return ((AppRow) info.extraInfo).appBypassDnd;
-        }
-    };
-
-    public static final AppFilter FILTER_APP_NOTIFICATION_HIDE_SENSITIVE = new AppFilter() {
-        @Override
-        public void init() {
-        }
-
-        @Override
-        public boolean filterApp(AppEntry info) {
-            if (info == null || info.extraInfo == null) {
-                return false;
-            }
-            return ((AppRow) info.extraInfo).lockScreenSecure
-                    && ((AppRow) info.extraInfo).appVisOverride == Notification.VISIBILITY_PRIVATE;
-        }
-    };
-
-    public static final AppFilter FILTER_APP_NOTIFICATION_HIDE_ALL = new AppFilter() {
-        @Override
-        public void init() {
-        }
-
-        @Override
-        public boolean filterApp(AppEntry info) {
-            if (info == null || info.extraInfo == null) {
-                return false;
-            }
-            return ((AppRow) info.extraInfo).lockScreenSecure
-                    && ((AppRow) info.extraInfo).appVisOverride == Notification.VISIBILITY_SECRET;
-        }
-    };
 }
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index 2569eac..d689ee4 100755
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -1088,10 +1088,6 @@
         return NetworkTemplate.buildTemplateEthernet();
     }
 
-    public static CharSequence getNotificationSummary(AppEntry appEntry, Context context) {
-        return getNotificationSummary(appEntry, context, new NotificationBackend());
-    }
-
     public static CharSequence getNotificationSummary(AppEntry appEntry, Context context,
             NotificationBackend backend) {
         AppRow appRow = backend.loadAppRow(context, context.getPackageManager(), appEntry.info);
@@ -1099,43 +1095,8 @@
     }
 
     public static CharSequence getNotificationSummary(AppRow appRow, Context context) {
-        boolean showSlider = Settings.Secure.getInt(
-                context.getContentResolver(), NOTIFICATION_TUNER_SETTING, 0) == 1;
-        List<String> summaryAttributes = new ArrayList<>();
-        StringBuffer summary = new StringBuffer();
-        if (showSlider) {
-            if (appRow.appImportance != NotificationManager.IMPORTANCE_UNSPECIFIED) {
-                summaryAttributes.add(context.getString(
-                        R.string.notification_summary_level, appRow.appImportance));
-            }
-        } else {
-            if (appRow.banned) {
-                summaryAttributes.add(context.getString(R.string.notifications_disabled));
-            } else if (appRow.appImportance > NotificationManager.IMPORTANCE_NONE
-                    && appRow.appImportance < NotificationManager.IMPORTANCE_DEFAULT) {
-                summaryAttributes.add(context.getString(R.string.notifications_silenced));
-            }
-        }
-        final boolean lockscreenSecure = new LockPatternUtils(context).isSecure(
-                UserHandle.myUserId());
-        if (lockscreenSecure) {
-            if (appRow.appVisOverride == Notification.VISIBILITY_PRIVATE) {
-                summaryAttributes.add(context.getString(R.string.notifications_redacted));
-            } else if (appRow.appVisOverride == Notification.VISIBILITY_SECRET) {
-                summaryAttributes.add(context.getString(R.string.notifications_hidden));
-            }
-        }
-        if (appRow.appBypassDnd) {
-            summaryAttributes.add(context.getString(R.string.notifications_priority));
-        }
-        final int N = summaryAttributes.size();
-        for (int i = 0; i < N; i++) {
-            if (i > 0) {
-                summary.append(context.getString(R.string.notifications_summary_divider));
-            }
-            summary.append(summaryAttributes.get(i));
-        }
-        return summary.toString();
+        // TODO: implement summary when it is known what it should say
+        return "";
     }
 
     @Override
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index 099d30e..d8ee6b7 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -131,15 +131,11 @@
     public static final int FILTER_APPS_ENABLED = 3;
     public static final int FILTER_APPS_DISABLED = 4;
     public static final int FILTER_APPS_BLOCKED = 5;
-    public static final int FILTER_APPS_SILENT = 6;
-    public static final int FILTER_APPS_SENSITIVE = 7;
-    public static final int FILTER_APPS_HIDE_NOTIFICATIONS = 8;
-    public static final int FILTER_APPS_PRIORITY = 9;
-    public static final int FILTER_APPS_PERSONAL = 10;
-    public static final int FILTER_APPS_WORK = 11;
-    public static final int FILTER_APPS_USAGE_ACCESS = 13;
-    public static final int FILTER_APPS_WITH_OVERLAY = 14;
-    public static final int FILTER_APPS_WRITE_SETTINGS = 15;
+    public static final int FILTER_APPS_PERSONAL = 6;
+    public static final int FILTER_APPS_WORK = 7;
+    public static final int FILTER_APPS_USAGE_ACCESS = 8;
+    public static final int FILTER_APPS_WITH_OVERLAY = 9;
+    public static final int FILTER_APPS_WRITE_SETTINGS = 10;
 
     // This is the string labels for the filter modes above, the order must be kept in sync.
     public static final int[] FILTER_LABELS = new int[]{
@@ -149,10 +145,6 @@
             R.string.filter_enabled_apps,  // Enabled
             R.string.filter_apps_disabled, // Disabled
             R.string.filter_notif_blocked_apps,   // Blocked Notifications
-            R.string.filter_notif_silent,    // Silenced Notifications
-            R.string.filter_notif_sensitive_apps, // Sensitive Notifications
-            R.string.filter_notif_hide_notifications_apps, // Sensitive Notifications
-            R.string.filter_notif_priority_apps,  // Priority Notifications
             R.string.filter_personal_apps, // Personal
             R.string.filter_work_apps,     // Work
             R.string.filter_with_domain_urls_apps,     // Domain URLs
@@ -171,10 +163,6 @@
             ApplicationsState.FILTER_ALL_ENABLED, // Enabled
             ApplicationsState.FILTER_DISABLED,    // Disabled
             AppStateNotificationBridge.FILTER_APP_NOTIFICATION_BLOCKED,   // Blocked Notifications
-            AppStateNotificationBridge.FILTER_APP_NOTIFICATION_SILENCED,   // Silenced Notifications
-            AppStateNotificationBridge.FILTER_APP_NOTIFICATION_HIDE_SENSITIVE, // Sensitive Notifications
-            AppStateNotificationBridge.FILTER_APP_NOTIFICATION_HIDE_ALL, // Hide all Notifications
-            AppStateNotificationBridge.FILTER_APP_NOTIFICATION_PRIORITY,  // Priority Notifications
             ApplicationsState.FILTER_PERSONAL,    // Personal
             ApplicationsState.FILTER_WORK,        // Work
             ApplicationsState.FILTER_WITH_DOMAIN_URLS,   // Apps with Domain URLs
@@ -356,10 +344,6 @@
         }
         if (mListType == LIST_TYPE_NOTIFICATION) {
             mFilterAdapter.enableFilter(FILTER_APPS_BLOCKED);
-            mFilterAdapter.enableFilter(FILTER_APPS_SILENT);
-            mFilterAdapter.enableFilter(FILTER_APPS_SENSITIVE);
-            mFilterAdapter.enableFilter(FILTER_APPS_HIDE_NOTIFICATIONS);
-            mFilterAdapter.enableFilter(FILTER_APPS_PRIORITY);
         }
         if (mListType == LIST_TYPE_HIGH_POWER) {
             mFilterAdapter.enableFilter(FILTER_APPS_POWER_WHITELIST_ALL);
diff --git a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
index db541d5..b8ee1ff 100644
--- a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
+++ b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
@@ -18,6 +18,7 @@
 import android.content.Context;
 import android.provider.SearchIndexableResource;
 
+import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
@@ -39,7 +40,7 @@
 
     @Override
     public int getMetricsCategory() {
-        return CONNECTED_DEVICE_CATEGORY_FRAGMENT;
+        return MetricsProto.MetricsEvent.SETTINGS_CONNECTED_DEVICE_CATEGORY;
     }
 
     @Override
diff --git a/src/com/android/settings/core/InstrumentedPreferenceFragment.java b/src/com/android/settings/core/InstrumentedPreferenceFragment.java
index 3a4d0c2..29ba287 100644
--- a/src/com/android/settings/core/InstrumentedPreferenceFragment.java
+++ b/src/com/android/settings/core/InstrumentedPreferenceFragment.java
@@ -43,18 +43,6 @@
 
     // metrics placeholder value. Only use this for development.
     protected final int PLACEHOLDER_METRIC = 10000;
-    protected final int SYSTEM_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 1;
-    protected final int STORAGE_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 2;
-    protected final int NETWORK_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 3;
-    protected final int CONNECTED_DEVICE_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 4;
-    protected final int APP_AND_NOTIFICATION_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 5;
-    protected final int INPUT_AND_GESTURE_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 6;
-    protected final int LANGUAGE_AND_REGION_CATEGORY_FRAGMENT = PLACEHOLDER_METRIC + 7;
-    protected final int GESTURE_SWIPE_TO_NOTIFICATION = PLACEHOLDER_METRIC + 8;
-    protected final int GESTURE_DOUBLE_TAP_POWER = PLACEHOLDER_METRIC + 9;
-    protected final int GESTURE_PICKUP = PLACEHOLDER_METRIC + 10;
-    protected final int GESTURE_DOUBLE_TAP_SCREEN = PLACEHOLDER_METRIC + 11;
-    protected final int GESTURE_DOUBLE_TWIST = PLACEHOLDER_METRIC + 12;
 
     private final PreferenceDividerDecoration mDividerDecoration =
             new PreferenceDividerDecoration();
diff --git a/src/com/android/settings/datausage/DataSaverSummary.java b/src/com/android/settings/datausage/DataSaverSummary.java
index b0304fc..b424fa2 100644
--- a/src/com/android/settings/datausage/DataSaverSummary.java
+++ b/src/com/android/settings/datausage/DataSaverSummary.java
@@ -54,6 +54,8 @@
         super.onCreate(icicle);
 
         addPreferencesFromResource(R.xml.data_saver);
+        mFooterPreferenceMixin.createFooterPreference()
+                .setTitle(com.android.internal.R.string.data_saver_description);
         mUnrestrictedAccess = findPreference(KEY_UNRESTRICTED_ACCESS);
         mApplicationsState = ApplicationsState.getInstance(
                 (Application) getContext().getApplicationContext());
diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
index b0685cf..e63a1df 100644
--- a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
+++ b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
@@ -18,7 +18,6 @@
 
 import android.app.AlertDialog;
 import android.app.Dialog;
-import android.app.DialogFragment;
 import android.app.Fragment;
 import android.content.ActivityNotFoundException;
 import android.content.Context;
@@ -37,7 +36,6 @@
 import android.os.storage.VolumeInfo;
 import android.os.storage.VolumeRecord;
 import android.provider.DocumentsContract;
-import android.provider.Settings;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceCategory;
 import android.support.v7.preference.PreferenceGroup;
@@ -65,9 +63,9 @@
 import com.android.settingslib.deviceinfo.StorageMeasurement;
 import com.android.settingslib.deviceinfo.StorageMeasurement.MeasurementDetails;
 import com.android.settingslib.deviceinfo.StorageMeasurement.MeasurementReceiver;
+
 import com.google.android.collect.Lists;
 
-import java.io.File;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Objects;
@@ -107,9 +105,6 @@
             R.string.storage_detail_other,
     };
 
-    private static final int DELETION_HELPER_SETTINGS = 1;
-    private static final int DELETION_HELPER_CLEAR = 1;
-
     private StorageManager mStorageManager;
     private UserManager mUserManager;
 
@@ -285,8 +280,7 @@
         if (mHeaderPoolIndex < mHeaderPreferencePool.size()) {
             category = mHeaderPreferencePool.get(mHeaderPoolIndex);
         } else {
-            category = new PreferenceCategory(getPrefContext(), null,
-                    com.android.internal.R.attr.preferenceCategoryStyle);
+            category = new PreferenceCategory(getPrefContext());
             mHeaderPreferencePool.add(category);
         }
         category.setTitle(title);
diff --git a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
index aa4d834..8992830 100644
--- a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
+++ b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.provider.SearchIndexableResource;
 
+import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
@@ -37,7 +38,7 @@
 
     @Override
     public int getMetricsCategory() {
-        return STORAGE_CATEGORY_FRAGMENT;
+        return MetricsProto.MetricsEvent.SETTINGS_STORAGE_CATEGORY;
     }
 
     @Override
diff --git a/src/com/android/settings/display/NightDisplaySettings.java b/src/com/android/settings/display/NightDisplaySettings.java
index 1ff4297..619c0d4 100644
--- a/src/com/android/settings/display/NightDisplaySettings.java
+++ b/src/com/android/settings/display/NightDisplaySettings.java
@@ -73,7 +73,7 @@
 
         // Load the preferences from xml.
         addPreferencesFromResource(R.xml.night_display_settings);
-
+        mFooterPreferenceMixin.createFooterPreference().setTitle(R.string.night_display_text);
         mAutoModePreference = (DropDownPreference) findPreference(KEY_NIGHT_DISPLAY_AUTO_MODE);
         mStartTimePreference = findPreference(KEY_NIGHT_DISPLAY_START_TIME);
         mEndTimePreference = findPreference(KEY_NIGHT_DISPLAY_END_TIME);
diff --git a/src/com/android/settings/fuelgauge/BatterySaverSettings.java b/src/com/android/settings/fuelgauge/BatterySaverSettings.java
index 4dc8f87..6b7ddf9 100644
--- a/src/com/android/settings/fuelgauge/BatterySaverSettings.java
+++ b/src/com/android/settings/fuelgauge/BatterySaverSettings.java
@@ -78,7 +78,8 @@
         }
         mCreated = true;
         addPreferencesFromResource(R.xml.battery_saver_settings);
-
+        mFooterPreferenceMixin.createFooterPreference()
+                .setTitle(com.android.internal.R.string.battery_saver_description);
         mContext = getActivity();
         mSwitchBar = ((SettingsActivity) mContext).getSwitchBar();
         mSwitch = mSwitchBar.getSwitch();
diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
index 2219e33..de16fe5 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.fuelgauge;
 
+import android.content.Intent;
+
 /**
  * Feature Provider used in power usage
  */
@@ -25,5 +27,13 @@
    */
   boolean isLocationSettingEnabled(String[] packages);
 
+  /**
+   * Check whether additional battery info feature is enabled.
+   */
   boolean isAdditionalBatteryInfoEnabled();
+
+  /**
+   * Gets an {@link Intent} to show additional battery info.
+   */
+  Intent getAdditionalBatteryInfoIntent();
 }
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 1100a2c..14e6693 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -175,6 +175,11 @@
                 sa.startPreferencePanel(ManageApplications.class.getName(), args,
                         R.string.high_power_apps, null, null, 0);
                 return true;
+            case MENU_ADDITIONAL_BATTERY_INFO:
+                startActivity(FeatureFactory.getFactory(getContext())
+                        .getPowerUsageFeatureProvider(getContext())
+                        .getAdditionalBatteryInfoIntent());
+                return true;
             default:
                 return super.onOptionsItemSelected(item);
         }
diff --git a/src/com/android/settings/gestures/DoubleTapPowerPreferenceController.java b/src/com/android/settings/gestures/DoubleTapPowerPreferenceController.java
index cb36879..213259b 100644
--- a/src/com/android/settings/gestures/DoubleTapPowerPreferenceController.java
+++ b/src/com/android/settings/gestures/DoubleTapPowerPreferenceController.java
@@ -20,7 +20,10 @@
 import android.provider.Settings;
 import android.support.v7.preference.Preference;
 
+import android.util.ArrayMap;
 import com.android.settings.core.lifecycle.Lifecycle;
+import com.android.settings.search2.InlineSwitchPayload;
+import com.android.settings.search2.ResultPayload;
 
 public class DoubleTapPowerPreferenceController extends GesturePreferenceController {
 
@@ -61,4 +64,14 @@
                 Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED, 0);
         return cameraDisabled == 0;
     }
+
+    @Override
+    public ResultPayload getResultPayload() {
+        ArrayMap<Integer, Boolean> valueMap = new ArrayMap<>();
+        valueMap.put(0, true);
+        valueMap.put(1, false);
+
+        return new InlineSwitchPayload(Settings.Secure.CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED,
+                ResultPayload.SettingsSource.SECURE, valueMap);
+    }
 }
diff --git a/src/com/android/settings/gestures/DoubleTapPowerSettings.java b/src/com/android/settings/gestures/DoubleTapPowerSettings.java
index b4319f1..c31e999 100644
--- a/src/com/android/settings/gestures/DoubleTapPowerSettings.java
+++ b/src/com/android/settings/gestures/DoubleTapPowerSettings.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.provider.SearchIndexableResource;
 
+import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
@@ -35,7 +36,7 @@
 
     @Override
     public int getMetricsCategory() {
-        return GESTURE_DOUBLE_TAP_POWER;
+        return MetricsProto.MetricsEvent.SETTINGS_GESTURE_DOUBLE_TAP_POWER;
     }
 
     @Override
diff --git a/src/com/android/settings/gestures/DoubleTapScreenPreferenceController.java b/src/com/android/settings/gestures/DoubleTapScreenPreferenceController.java
index 722d66a..02d8dd7 100644
--- a/src/com/android/settings/gestures/DoubleTapScreenPreferenceController.java
+++ b/src/com/android/settings/gestures/DoubleTapScreenPreferenceController.java
@@ -21,8 +21,11 @@
 import android.provider.Settings;
 import android.support.v7.preference.Preference;
 
+import android.util.ArrayMap;
 import com.android.internal.hardware.AmbientDisplayConfiguration;
 import com.android.settings.core.lifecycle.Lifecycle;
+import com.android.settings.search2.InlineSwitchPayload;
+import com.android.settings.search2.ResultPayload;
 
 public class DoubleTapScreenPreferenceController extends GesturePreferenceController {
 
@@ -67,4 +70,14 @@
     protected boolean isSwitchPrefEnabled() {
         return mAmbientConfig.pulseOnDoubleTapEnabled(mUserId);
     }
+
+    @Override
+    public ResultPayload getResultPayload() {
+        ArrayMap<Integer, Boolean> valueMap = new ArrayMap<>();
+        valueMap.put(1, true);
+        valueMap.put(0, false);
+
+        return new InlineSwitchPayload(Settings.Secure.DOZE_PULSE_ON_DOUBLE_TAP,
+                ResultPayload.SettingsSource.SECURE, valueMap);
+    }
 }
diff --git a/src/com/android/settings/gestures/DoubleTapScreenSettings.java b/src/com/android/settings/gestures/DoubleTapScreenSettings.java
index c10fbb7..d203fbc 100644
--- a/src/com/android/settings/gestures/DoubleTapScreenSettings.java
+++ b/src/com/android/settings/gestures/DoubleTapScreenSettings.java
@@ -21,6 +21,7 @@
 import android.provider.SearchIndexableResource;
 
 import com.android.internal.hardware.AmbientDisplayConfiguration;
+import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
@@ -37,7 +38,7 @@
 
     @Override
     public int getMetricsCategory() {
-        return GESTURE_DOUBLE_TAP_SCREEN;
+        return MetricsProto.MetricsEvent.SETTINGS_GESTURE_DOUBLE_TAP_SCREEN;
     }
 
     @Override
diff --git a/src/com/android/settings/gestures/DoubleTwistGestureSettings.java b/src/com/android/settings/gestures/DoubleTwistGestureSettings.java
index c11f4a5..1303ca1 100644
--- a/src/com/android/settings/gestures/DoubleTwistGestureSettings.java
+++ b/src/com/android/settings/gestures/DoubleTwistGestureSettings.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.provider.SearchIndexableResource;
 
+import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
@@ -35,7 +36,7 @@
 
     @Override
     public int getMetricsCategory() {
-        return GESTURE_DOUBLE_TWIST;
+        return MetricsProto.MetricsEvent.SETTINGS_GESTURE_DOUBLE_TWIST;
     }
 
     @Override
diff --git a/src/com/android/settings/gestures/DoubleTwistPreferenceController.java b/src/com/android/settings/gestures/DoubleTwistPreferenceController.java
index 5192484..fea1c9d 100644
--- a/src/com/android/settings/gestures/DoubleTwistPreferenceController.java
+++ b/src/com/android/settings/gestures/DoubleTwistPreferenceController.java
@@ -24,8 +24,11 @@
 import android.support.v7.preference.Preference;
 import android.text.TextUtils;
 
+import android.util.ArrayMap;
 import com.android.settings.R;
 import com.android.settings.core.lifecycle.Lifecycle;
+import com.android.settings.search2.InlineSwitchPayload;
+import com.android.settings.search2.ResultPayload;
 
 public class DoubleTwistPreferenceController extends GesturePreferenceController {
 
@@ -82,4 +85,14 @@
         }
         return false;
     }
+
+    @Override
+    public ResultPayload getResultPayload() {
+        ArrayMap<Integer, Boolean> valueMap = new ArrayMap<>();
+        valueMap.put(1, true);
+        valueMap.put(0, false);
+
+        return new InlineSwitchPayload(Settings.Secure.CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED,
+                ResultPayload.SettingsSource.SECURE, valueMap);
+    }
 }
diff --git a/src/com/android/settings/gestures/GestureSettings.java b/src/com/android/settings/gestures/GestureSettings.java
index 98ed5fb..9b71b96 100644
--- a/src/com/android/settings/gestures/GestureSettings.java
+++ b/src/com/android/settings/gestures/GestureSettings.java
@@ -167,21 +167,32 @@
                 @Override
                 public List<String> getNonIndexableKeys(Context context) {
                     ArrayList<String> result = new ArrayList<String>();
+
+                    List<PreferenceController> preferenceControllers =
+                            getPreferenceControllers(context);
+                    for(PreferenceController controller : preferenceControllers) {
+                        controller.updateNonIndexableKeys(result);
+                    }
+                    return result;
+                }
+
+                @Override
+                public List<PreferenceController> getPreferenceControllers(Context context) {
+                    List<PreferenceController> controllers = new ArrayList<>();
                     AmbientDisplayConfiguration ambientConfig
                             = new AmbientDisplayConfiguration(context);
-                    new DoubleTapPowerPreferenceController(context, null /* lifecycle */)
-                            .updateNonIndexableKeys(result);
-                    new PickupGesturePreferenceController(
-                            context, null /* lifecycle */, ambientConfig, UserHandle.myUserId())
-                            .updateNonIndexableKeys(result);
-                    new DoubleTapScreenPreferenceController(
-                            context, null /* lifecycle */, ambientConfig, UserHandle.myUserId())
-                            .updateNonIndexableKeys(result);
-                    new SwipeToNotificationPreferenceController(context, null /* lifecycle */)
-                            .updateNonIndexableKeys(result);
-                    new DoubleTwistPreferenceController(context, null /* lifecycle */)
-                            .updateNonIndexableKeys(result);
-                    return result;
+
+                    controllers.add(new DoubleTapPowerPreferenceController(context,
+                            null /* lifecycle */));
+                    controllers.add(new PickupGesturePreferenceController(context,
+                            null /* lifecycle */, ambientConfig, UserHandle.myUserId()));
+                    controllers.add(new DoubleTapScreenPreferenceController(context,
+                            null /* lifecycle */, ambientConfig, UserHandle.myUserId()));
+                    controllers.add(new SwipeToNotificationPreferenceController(context,
+                            null /* lifecycle */));
+                    controllers.add(new DoubleTwistPreferenceController(context,
+                            null /* lifecycle */));
+                    return controllers;
                 }
             };
 }
diff --git a/src/com/android/settings/gestures/PickupGesturePreferenceController.java b/src/com/android/settings/gestures/PickupGesturePreferenceController.java
index 225e1d0..f48551e 100644
--- a/src/com/android/settings/gestures/PickupGesturePreferenceController.java
+++ b/src/com/android/settings/gestures/PickupGesturePreferenceController.java
@@ -21,8 +21,11 @@
 import android.provider.Settings;
 import android.support.v7.preference.Preference;
 
+import android.util.ArrayMap;
 import com.android.internal.hardware.AmbientDisplayConfiguration;
 import com.android.settings.core.lifecycle.Lifecycle;
+import com.android.settings.search2.InlineSwitchPayload;
+import com.android.settings.search2.ResultPayload;
 
 public class PickupGesturePreferenceController extends GesturePreferenceController {
 
@@ -68,4 +71,13 @@
         return true;
     }
 
+    @Override
+    public ResultPayload getResultPayload() {
+        ArrayMap<Integer, Boolean> valueMap = new ArrayMap<>();
+        valueMap.put(1, true);
+        valueMap.put(0, false);
+
+        return new InlineSwitchPayload(Settings.Secure.DOZE_PULSE_ON_PICK_UP,
+                ResultPayload.SettingsSource.SECURE, valueMap);
+    }
 }
diff --git a/src/com/android/settings/gestures/PickupGestureSettings.java b/src/com/android/settings/gestures/PickupGestureSettings.java
index 63d3968..8c0f74c 100644
--- a/src/com/android/settings/gestures/PickupGestureSettings.java
+++ b/src/com/android/settings/gestures/PickupGestureSettings.java
@@ -21,6 +21,7 @@
 import android.provider.SearchIndexableResource;
 
 import com.android.internal.hardware.AmbientDisplayConfiguration;
+import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
@@ -37,7 +38,7 @@
 
     @Override
     public int getMetricsCategory() {
-        return GESTURE_PICKUP;
+        return MetricsProto.MetricsEvent.SETTINGS_GESTURE_PICKUP;
     }
 
     @Override
diff --git a/src/com/android/settings/gestures/SwipeToNotificationPreferenceController.java b/src/com/android/settings/gestures/SwipeToNotificationPreferenceController.java
index 08dc614..67c8e14 100644
--- a/src/com/android/settings/gestures/SwipeToNotificationPreferenceController.java
+++ b/src/com/android/settings/gestures/SwipeToNotificationPreferenceController.java
@@ -20,7 +20,10 @@
 import android.provider.Settings;
 import android.support.v7.preference.Preference;
 
+import android.util.ArrayMap;
 import com.android.settings.core.lifecycle.Lifecycle;
+import com.android.settings.search2.InlineSwitchPayload;
+import com.android.settings.search2.ResultPayload;
 
 public class SwipeToNotificationPreferenceController extends GesturePreferenceController {
 
@@ -60,4 +63,14 @@
                 Settings.Secure.SYSTEM_NAVIGATION_KEYS_ENABLED, 0)
                 == 1;
     }
+
+    @Override
+    public ResultPayload getResultPayload() {
+        ArrayMap<Integer, Boolean> valueMap = new ArrayMap<>();
+        valueMap.put(1, true);
+        valueMap.put(0, false);
+
+        return new InlineSwitchPayload(Settings.Secure.SYSTEM_NAVIGATION_KEYS_ENABLED,
+                ResultPayload.SettingsSource.SECURE, valueMap);
+    }
 }
diff --git a/src/com/android/settings/gestures/SwipeToNotificationSettings.java b/src/com/android/settings/gestures/SwipeToNotificationSettings.java
index 57796a6..fba074e 100644
--- a/src/com/android/settings/gestures/SwipeToNotificationSettings.java
+++ b/src/com/android/settings/gestures/SwipeToNotificationSettings.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.provider.SearchIndexableResource;
 
+import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
@@ -35,7 +36,7 @@
 
     @Override
     public int getMetricsCategory() {
-        return GESTURE_SWIPE_TO_NOTIFICATION;
+        return MetricsProto.MetricsEvent.SETTINGS_GESTURE_SWIPE_TO_NOTIFICATION;
     }
 
     @Override
diff --git a/src/com/android/settings/inputmethod/InputAndGestureSettings.java b/src/com/android/settings/inputmethod/InputAndGestureSettings.java
index eecfd31..43d8b230b 100644
--- a/src/com/android/settings/inputmethod/InputAndGestureSettings.java
+++ b/src/com/android/settings/inputmethod/InputAndGestureSettings.java
@@ -21,6 +21,7 @@
 import android.support.annotation.VisibleForTesting;
 
 import com.android.internal.hardware.AmbientDisplayConfiguration;
+import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.core.lifecycle.Lifecycle;
@@ -43,7 +44,7 @@
 
     @Override
     public int getMetricsCategory() {
-        return INPUT_AND_GESTURE_CATEGORY_FRAGMENT;
+        return MetricsProto.MetricsEvent.SETTINGS_INPUT_CATEGORY;
     }
 
     @Override
diff --git a/src/com/android/settings/language/LanguageAndRegionSettings.java b/src/com/android/settings/language/LanguageAndRegionSettings.java
index 5741255..7e92e05 100644
--- a/src/com/android/settings/language/LanguageAndRegionSettings.java
+++ b/src/com/android/settings/language/LanguageAndRegionSettings.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.speech.tts.TtsEngines;
 
+import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
@@ -34,7 +35,7 @@
 
     @Override
     public int getMetricsCategory() {
-        return LANGUAGE_AND_REGION_CATEGORY_FRAGMENT;
+        return MetricsProto.MetricsEvent.SETTINGS_LANGUAGE_CATEGORY;
     }
 
     @Override
diff --git a/src/com/android/settings/network/NetworkDashboardFragment.java b/src/com/android/settings/network/NetworkDashboardFragment.java
index a58a879..89dfa02 100644
--- a/src/com/android/settings/network/NetworkDashboardFragment.java
+++ b/src/com/android/settings/network/NetworkDashboardFragment.java
@@ -43,7 +43,7 @@
 
     @Override
     public int getMetricsCategory() {
-        return NETWORK_CATEGORY_FRAGMENT;
+        return MetricsProto.MetricsEvent.SETTINGS_NETWORK_CATEGORY;
     }
 
     @Override
diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java
index c38a72f..c720bb5 100644
--- a/src/com/android/settings/notification/AppNotificationSettings.java
+++ b/src/com/android/settings/notification/AppNotificationSettings.java
@@ -54,12 +54,12 @@
                 .addCategory(Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES);
 
     private static final String KEY_CHANNELS = "channels";
+    private static final String KEY_BLOCK = "block";
 
     private DashboardFeatureProvider mDashboardFeatureProvider;
     private PreferenceCategory mChannels;
     private List<NotificationChannel> mChannelList;
 
-
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
@@ -84,28 +84,17 @@
 
         addPreferencesFromResource(R.xml.app_notification_settings);
 
-        mImportance = (ImportanceSeekBarPreference) findPreference(KEY_IMPORTANCE);
-        mPriority =
-                (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_BYPASS_DND);
-        mVisibilityOverride =
-                (RestrictedDropDownPreference) getPreferenceScreen().findPreference(
-                        KEY_VISIBILITY_OVERRIDE);
         mBlock = (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_BLOCK);
-        mSilent = (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_SILENT);
         mChannels = (PreferenceCategory) findPreference(KEY_CHANNELS);
 
         if (mPkgInfo != null) {
+            setupBlock(mAppRow.systemApp, mAppRow.banned);
             // load settings intent
             ArrayMap<String, AppRow> rows = new ArrayMap<String, AppRow>();
             rows.put(mAppRow.pkg, mAppRow);
             collectConfigActivities(rows);
             mChannelList = mBackend.getChannels(mPkg, mUid).getList();
 
-            setupImportancePrefs(mAppRow.systemApp, mAppRow.appImportance, mAppRow.banned,
-                    NotificationManager.IMPORTANCE_HIGH);
-            setupPriorityPref(mAppRow.appBypassDnd);
-            setupVisOverridePref(mAppRow.appVisOverride);
-
             if (mChannelList.isEmpty()) {
                 setVisible(mChannels, false);
             } else {
@@ -129,7 +118,7 @@
                     mChannels.addPreference(channelPref);
                 }
             }
-            updateDependents(mAppRow.appImportance);
+            updateDependents(mAppRow.banned);
         }
         if (mDashboardFeatureProvider.isEnabled()) {
             final Preference pref = FeatureFactory.getFactory(activity)
@@ -148,10 +137,40 @@
     }
 
     @Override
-    protected void updateDependents(int importance) {
-        super.updateDependents(importance);
-        setVisible(mChannels,
-                !(mChannelList.isEmpty() || importance == NotificationManager.IMPORTANCE_NONE));
+    public void onResume() {
+        super.onResume();
+        if ((mUid != -1 && getPackageManager().getPackagesForUid(mUid) == null)) {
+            // App isn't around anymore, must have been removed.
+            finish();
+            return;
+        }
+        if (mBlock != null) {
+            mBlock.setDisabledByAdmin(mSuspendedAppsAdmin);
+        }
+    }
+
+    private void setupBlock(boolean notBlockable, boolean banned) {
+        if (notBlockable) {
+            setVisible(mBlock, false);
+        } else {
+            mBlock.setChecked(banned);
+            mBlock.setOnPreferenceChangeListener(
+                    new Preference.OnPreferenceChangeListener() {
+                        @Override
+                        public boolean onPreferenceChange(Preference preference,
+                                Object newValue) {
+                            final boolean blocked = (Boolean) newValue;
+                            mBackend.setNotificationsEnabledForPackage(mPkgInfo.packageName, mUid,
+                                    !blocked);
+                            updateDependents(blocked);
+                            return true;
+                        }
+                    });
+        }
+    }
+
+    private void updateDependents(boolean banned) {
+        setVisible(mChannels, !(mChannelList.isEmpty() || banned));
     }
 
     private List<ResolveInfo> queryNotificationConfigActivities() {
diff --git a/src/com/android/settings/notification/ChannelNotificationSettings.java b/src/com/android/settings/notification/ChannelNotificationSettings.java
index 02cc436..77bf6be 100644
--- a/src/com/android/settings/notification/ChannelNotificationSettings.java
+++ b/src/com/android/settings/notification/ChannelNotificationSettings.java
@@ -16,17 +16,27 @@
 
 package com.android.settings.notification;
 
+import static android.app.NotificationManager.IMPORTANCE_HIGH;
+import static android.app.NotificationManager.IMPORTANCE_LOW;
+import static android.app.NotificationManager.IMPORTANCE_MIN;
+import static android.app.NotificationManager.IMPORTANCE_NONE;
+
 import android.app.Activity;
+import android.app.Notification;
 import android.app.NotificationChannel;
 import android.app.NotificationManager;
+import android.app.admin.DevicePolicyManager;
 import android.content.Intent;
+import android.content.pm.UserInfo;
 import android.net.Uri;
 import android.os.Bundle;
+import android.os.UserHandle;
 import android.provider.Settings;
 import android.service.notification.NotificationListenerService.Ranking;
 import android.support.v7.preference.Preference;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.AppHeader;
 import com.android.settings.R;
 import com.android.settings.RingtonePreference;
@@ -36,17 +46,26 @@
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.RestrictedSwitchPreference;
 
+import java.util.ArrayList;
+
 public class ChannelNotificationSettings extends NotificationSettingsBase {
+    protected static final String KEY_BYPASS_DND = "bypass_dnd";
+    protected static final String KEY_VISIBILITY_OVERRIDE = "visibility_override";
+    protected static final String KEY_IMPORTANCE = "importance";
     protected static final String KEY_LIGHTS = "lights";
     protected static final String KEY_VIBRATE = "vibrate";
     protected static final String KEY_RINGTONE = "ringtone";
+    protected static final String KEY_SHOW = "show";
+    protected static final String KEY_BADGE = "badge";
 
     protected RestrictedSwitchPreference mLights;
     protected RestrictedSwitchPreference mVibrate;
     protected DefaultNotificationTonePreference mRingtone;
+    protected RestrictedDropDownPreference mImportance;
+    protected RestrictedSwitchPreference mPriority;
+    protected RestrictedDropDownPreference mVisibilityOverride;
 
     private DashboardFeatureProvider mDashboardFeatureProvider;
-    private int mMaxImportance;
 
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
@@ -71,34 +90,26 @@
                 FeatureFactory.getFactory(activity).getDashboardFeatureProvider(activity);
         addPreferencesFromResource(R.xml.channel_notification_settings);
 
-        mImportance = (ImportanceSeekBarPreference) findPreference(KEY_IMPORTANCE);
+        mBlock = (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_BLOCK);
+        mShow = (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_SHOW);
+        mBadge = (RestrictedSwitchPreference) getPreferenceScreen().findPreference(KEY_BADGE);
+        mImportance = (RestrictedDropDownPreference) findPreference(KEY_IMPORTANCE);
         mPriority =
                 (RestrictedSwitchPreference) findPreference(KEY_BYPASS_DND);
         mVisibilityOverride =
                 (RestrictedDropDownPreference) findPreference(KEY_VISIBILITY_OVERRIDE);
-        mBlock = (RestrictedSwitchPreference) findPreference(KEY_BLOCK);
-        mSilent = (RestrictedSwitchPreference) findPreference(KEY_SILENT);
         mLights = (RestrictedSwitchPreference) findPreference(KEY_LIGHTS);
         mVibrate = (RestrictedSwitchPreference) findPreference(KEY_VIBRATE);
         mRingtone = (DefaultNotificationTonePreference) findPreference(KEY_RINGTONE);
 
         if (mPkgInfo != null) {
             setupPriorityPref(mChannel.canBypassDnd());
-            if (mAppRow.appBypassDnd) {
-                mPriority.setShouldDisableView(true);
-            }
             setupVisOverridePref(mChannel.getLockscreenVisibility());
-            if (mAppRow.appVisOverride != Ranking.VISIBILITY_NO_OVERRIDE) {
-                mVisibilityOverride.setShouldDisableView(true);
-            }
             setupLights();
             setupVibrate();
             setupRingtone();
-            mMaxImportance = mAppRow.appImportance == NotificationManager.IMPORTANCE_UNSPECIFIED
-                    ? NotificationManager.IMPORTANCE_HIGH : mAppRow.appImportance;
-            setupImportancePrefs(false, mChannel.getImportance(),
-                    mChannel.getImportance() == NotificationManager.IMPORTANCE_NONE,
-                    mMaxImportance);
+            setupBlockAndImportance();
+            updateDependents();
         }
         if (mDashboardFeatureProvider.isEnabled()) {
             final Preference pref = FeatureFactory.getFactory(activity)
@@ -124,14 +135,14 @@
             finish();
             return;
         }
-        mSuspendedAppsAdmin = RestrictedLockUtils.checkIfApplicationIsSuspended(
-                mContext, mPkg, mUserId);
-        if (mLights != null) {
-            mLights.setDisabledByAdmin(mSuspendedAppsAdmin);
-        }
-        if (mVibrate != null) {
-            mVibrate.setDisabledByAdmin(mSuspendedAppsAdmin);
-        }
+        mLights.setDisabledByAdmin(mSuspendedAppsAdmin);
+        mVibrate.setDisabledByAdmin(mSuspendedAppsAdmin);
+        mImportance.setDisabledByAdmin(mSuspendedAppsAdmin);
+        mPriority.setDisabledByAdmin(mSuspendedAppsAdmin);
+        mVisibilityOverride.setDisabledByAdmin(mSuspendedAppsAdmin);
+        mBlock.setDisabledByAdmin(mSuspendedAppsAdmin);
+        mShow.setDisabledByAdmin(mSuspendedAppsAdmin);
+        mBadge.setDisabledByAdmin(mSuspendedAppsAdmin);
     }
 
     private void setupLights() {
@@ -179,6 +190,209 @@
         });
     }
 
+    protected void setupBlockAndImportance() {
+        mBlock.setDisabledByAdmin(mSuspendedAppsAdmin);
+        mBlock.setChecked(!mChannel.isAllowed());
+        mBlock.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
+            @Override
+            public boolean onPreferenceChange(Preference preference, Object newValue) {
+                final boolean value = (Boolean) newValue;
+                mChannel.setAllowed(!value);
+                mChannel.lockFields(NotificationChannel.USER_LOCKED_ALLOWED);
+                mBackend.updateChannel(mPkg, mUid, mChannel);
+                updateDependents();
+                return true;
+            }
+        });
+
+        mShow.setDisabledByAdmin(mSuspendedAppsAdmin);
+        mShow.setChecked(mChannel.getImportance() != NotificationManager.IMPORTANCE_NONE);
+        mShow.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
+            @Override
+            public boolean onPreferenceChange(Preference preference, Object newValue) {
+                final boolean value = (Boolean) newValue;
+                int importance = value ? IMPORTANCE_LOW : IMPORTANCE_NONE;
+                mImportance.setValue(String.valueOf(importance));
+                mChannel.setImportance(importance);
+                mChannel.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE);
+                mBackend.updateChannel(mPkg, mUid, mChannel);
+                updateDependents();
+                return true;
+            }
+        });
+        mBadge.setDisabledByAdmin(mSuspendedAppsAdmin);
+        mBadge.setChecked(mChannel.canShowBadge());
+        mBadge.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
+            @Override
+            public boolean onPreferenceChange(Preference preference, Object newValue) {
+                final boolean value = (Boolean) newValue;
+                mChannel.setShowBadge(value);
+                mChannel.lockFields(NotificationChannel.USER_LOCKED_SHOW_BADGE);
+                mBackend.updateChannel(mPkg, mUid, mChannel);
+                return true;
+            }
+        });
+
+        mImportance.setDisabledByAdmin(mSuspendedAppsAdmin);
+        final int numImportances = IMPORTANCE_HIGH - IMPORTANCE_MIN + 1;
+        String[] summaries = new String[numImportances];
+        String[] values = new String[numImportances];
+        for (int i = 0; i < numImportances; i++) {
+            int importance = i + 1;
+            summaries[i] = getSummary(importance);
+            values[i] = String.valueOf(importance);
+        }
+        mImportance.setEntryValues(values);
+        mImportance.setEntries(summaries);
+        mImportance.setValue(String.valueOf(mChannel.getImportance()));
+        mImportance.setSummary("%s");
+
+        mImportance.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
+            @Override
+            public boolean onPreferenceChange(Preference preference, Object newValue) {
+                int importance = Integer.parseInt((String) newValue);
+                mChannel.setImportance(importance);
+                mChannel.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE);
+                mBackend.updateChannel(mPkg, mUid, mChannel);
+                updateDependents();
+                return true;
+            }
+        });
+    }
+
+    private String getSummary(int importance) {
+        switch (importance) {
+            case NotificationManager.IMPORTANCE_NONE:
+                return getContext().getString(R.string.notification_importance_blocked);
+            case NotificationManager.IMPORTANCE_MIN:
+                return getContext().getString(R.string.notification_importance_min);
+            case NotificationManager.IMPORTANCE_LOW:
+                return getContext().getString(R.string.notification_importance_low);
+            case NotificationManager.IMPORTANCE_DEFAULT:
+                return getContext().getString(R.string.notification_importance_default);
+            case NotificationManager.IMPORTANCE_HIGH:
+            case NotificationManager.IMPORTANCE_MAX:
+            default:
+                return getContext().getString(R.string.notification_importance_high);
+        }
+    }
+
+    protected void setupPriorityPref(boolean priority) {
+        mPriority.setDisabledByAdmin(mSuspendedAppsAdmin);
+        mPriority.setChecked(priority);
+        mPriority.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
+            @Override
+            public boolean onPreferenceChange(Preference preference, Object newValue) {
+                final boolean bypassZenMode = (Boolean) newValue;
+                mChannel.setBypassDnd(bypassZenMode);
+                mChannel.lockFields(NotificationChannel.USER_LOCKED_PRIORITY);
+                mBackend.updateChannel(mPkg, mUid, mChannel);
+                return true;
+            }
+        });
+    }
+
+    protected void setupVisOverridePref(int sensitive) {
+        ArrayList<CharSequence> entries = new ArrayList<>();
+        ArrayList<CharSequence> values = new ArrayList<>();
+
+        mVisibilityOverride.clearRestrictedItems();
+        if (getLockscreenNotificationsEnabled() && getLockscreenAllowPrivateNotifications()) {
+            final String summaryShowEntry =
+                    getString(R.string.lock_screen_notifications_summary_show);
+            final String summaryShowEntryValue =
+                    Integer.toString(NotificationManager.VISIBILITY_NO_OVERRIDE);
+            entries.add(summaryShowEntry);
+            values.add(summaryShowEntryValue);
+            setRestrictedIfNotificationFeaturesDisabled(summaryShowEntry, summaryShowEntryValue,
+                    DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS
+                            | DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS);
+        }
+
+        final String summaryHideEntry = getString(R.string.lock_screen_notifications_summary_hide);
+        final String summaryHideEntryValue = Integer.toString(Notification.VISIBILITY_PRIVATE);
+        entries.add(summaryHideEntry);
+        values.add(summaryHideEntryValue);
+        setRestrictedIfNotificationFeaturesDisabled(summaryHideEntry, summaryHideEntryValue,
+                DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS);
+        entries.add(getString(R.string.lock_screen_notifications_summary_disable));
+        values.add(Integer.toString(Notification.VISIBILITY_SECRET));
+        mVisibilityOverride.setEntries(entries.toArray(new CharSequence[entries.size()]));
+        mVisibilityOverride.setEntryValues(values.toArray(new CharSequence[values.size()]));
+
+        if (sensitive == Ranking.VISIBILITY_NO_OVERRIDE) {
+            mVisibilityOverride.setValue(Integer.toString(getGlobalVisibility()));
+        } else {
+            mVisibilityOverride.setValue(Integer.toString(sensitive));
+        }
+        mVisibilityOverride.setSummary("%s");
+
+        mVisibilityOverride.setOnPreferenceChangeListener(
+                new Preference.OnPreferenceChangeListener() {
+                    @Override
+                    public boolean onPreferenceChange(Preference preference, Object newValue) {
+                        int sensitive = Integer.parseInt((String) newValue);
+                        if (sensitive == getGlobalVisibility()) {
+                            sensitive = Ranking.VISIBILITY_NO_OVERRIDE;
+                        }
+                        mChannel.setLockscreenVisibility(sensitive);
+                        mChannel.lockFields(NotificationChannel.USER_LOCKED_VISIBILITY);
+                        mBackend.updateChannel(mPkg, mUid, mChannel);
+                        return true;
+                    }
+                });
+    }
+
+    private void setRestrictedIfNotificationFeaturesDisabled(CharSequence entry,
+            CharSequence entryValue, int keyguardNotificationFeatures) {
+        RestrictedLockUtils.EnforcedAdmin admin =
+                RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(
+                        mContext, keyguardNotificationFeatures, mUserId);
+        if (admin != null) {
+            RestrictedDropDownPreference.RestrictedItem item =
+                    new RestrictedDropDownPreference.RestrictedItem(entry, entryValue, admin);
+            mVisibilityOverride.addRestrictedItem(item);
+        }
+    }
+
+    private int getGlobalVisibility() {
+        int globalVis = Ranking.VISIBILITY_NO_OVERRIDE;
+        if (!getLockscreenNotificationsEnabled()) {
+            globalVis = Notification.VISIBILITY_SECRET;
+        } else if (!getLockscreenAllowPrivateNotifications()) {
+            globalVis = Notification.VISIBILITY_PRIVATE;
+        }
+        return globalVis;
+    }
+
+    private boolean getLockscreenNotificationsEnabled() {
+        return Settings.Secure.getInt(getContentResolver(),
+                Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0) != 0;
+    }
+
+    private boolean getLockscreenAllowPrivateNotifications() {
+        return Settings.Secure.getInt(getContentResolver(),
+                Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0) != 0;
+    }
+
+    private boolean isLockScreenSecure() {
+        LockPatternUtils utils = new LockPatternUtils(getActivity());
+        boolean lockscreenSecure = utils.isSecure(UserHandle.myUserId());
+        UserInfo parentUser = mUm.getProfileParent(UserHandle.myUserId());
+        if (parentUser != null){
+            lockscreenSecure |= utils.isSecure(parentUser.id);
+        }
+
+        return lockscreenSecure;
+    }
+
+    protected boolean checkCanBeVisible(int minImportanceVisible, int importance) {
+        if (importance == NotificationManager.IMPORTANCE_UNSPECIFIED) {
+            return true;
+        }
+        return importance >= minImportanceVisible;
+    }
+
     @Override
     public boolean onPreferenceTreeClick(Preference preference) {
         if (preference instanceof RingtonePreference) {
@@ -205,22 +419,24 @@
                 Settings.System.NOTIFICATION_LIGHT_PULSE, 0) == 1;
     }
 
-    @Override
-    protected void updateDependents(int importance) {
-        if (importance == NotificationManager.IMPORTANCE_UNSPECIFIED) {
-            importance = mMaxImportance;
-        }
-        importance = Math.min(mMaxImportance, importance);
-
-        super.updateDependents(importance);
-        setVisible(mLights, checkCanBeVisible(
+    private void updateDependents() {
+        boolean allowed = mChannel.isAllowed();
+        int importance = mChannel.getImportance();
+        setVisible(mShow, allowed);
+        setVisible(mBadge, allowed);
+        setVisible(mImportance, allowed && importance != NotificationManager.IMPORTANCE_NONE);
+        setVisible(mLights, allowed && checkCanBeVisible(
                 NotificationManager.IMPORTANCE_LOW, importance) && canPulseLight());
-        setVisible(mVibrate, checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT, importance));
-        setVisible(mRingtone, checkCanBeVisible(
+        setVisible(mVibrate, allowed
+                && checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT, importance));
+        setVisible(mRingtone, allowed && checkCanBeVisible(
                 NotificationManager.IMPORTANCE_DEFAULT, importance));
-        if (mMaxImportance == NotificationManager.IMPORTANCE_LOW
-                && getPreferenceScreen().findPreference(mBlock.getKey()) != null) {
-            setVisible(mSilent, false);
-        }
+        setVisible(mPriority, allowed
+                && (checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT, importance)
+                || (checkCanBeVisible(NotificationManager.IMPORTANCE_LOW, importance)
+                        && mDndVisualEffectsSuppressed)));
+        setVisible(mVisibilityOverride, allowed
+                && checkCanBeVisible(NotificationManager.IMPORTANCE_MIN, importance)
+                && isLockScreenSecure());
     }
 }
diff --git a/src/com/android/settings/notification/ImportanceSeekBarPreference.java b/src/com/android/settings/notification/ImportanceSeekBarPreference.java
deleted file mode 100644
index 568dc1c..0000000
--- a/src/com/android/settings/notification/ImportanceSeekBarPreference.java
+++ /dev/null
@@ -1,204 +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.notification;
-
-import com.android.settings.R;
-import com.android.settings.SeekBarPreference;
-
-import android.app.NotificationManager;
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.content.res.TypedArray;
-import android.graphics.drawable.Drawable;
-import android.os.Handler;
-import android.service.notification.NotificationListenerService;
-import android.support.v7.preference.PreferenceViewHolder;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.SeekBar;
-import android.widget.TextView;
-import com.android.settings.Utils;
-
-/**
- * A slider preference that controls notification importance.
- **/
-public class ImportanceSeekBarPreference extends SeekBarPreference implements
-        SeekBar.OnSeekBarChangeListener {
-    private static final String TAG = "ImportanceSeekBarPref";
-
-    private Callback mCallback;
-    private int mMinProgress;
-    private TextView mSummaryTextView;
-    private String mSummary;
-    private SeekBar mSeekBar;
-    private ColorStateList mActiveSliderTint;
-    private ColorStateList mInactiveSliderTint;
-    private float mActiveSliderAlpha = 1.0f;
-    private float mInactiveSliderAlpha;
-    private boolean mAutoOn;
-    private Handler mHandler;
-
-    public ImportanceSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr,
-            int defStyleRes) {
-        super(context, attrs, defStyleAttr, defStyleRes);
-        setLayoutResource(R.layout.preference_importance_slider);
-        mActiveSliderTint = ColorStateList.valueOf(Utils.getColorAccent(context));
-        mInactiveSliderTint = ColorStateList.valueOf(
-                context.getColor(R.color.importance_disabled_slider_color));
-        mHandler = new Handler();
-        final TypedArray ta =
-                context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.Theme, 0, 0);
-        mInactiveSliderAlpha =
-                ta.getFloat(com.android.internal.R.styleable.Theme_disabledAlpha, 0.5f);
-        ta.recycle();
-    }
-
-    public ImportanceSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr) {
-        this(context, attrs, defStyleAttr, 0);
-    }
-
-    public ImportanceSeekBarPreference(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public ImportanceSeekBarPreference(Context context) {
-        this(context, null);
-    }
-
-    public void setCallback(Callback callback) {
-        mCallback = callback;
-    }
-
-    public void setMinimumProgress(int minProgress) {
-        mMinProgress = minProgress;
-        notifyChanged();
-    }
-
-    @Override
-    public void setProgress(int progress) {
-        mSummary = getProgressSummary(progress);
-        super.setProgress(progress);
-    }
-
-    public void setAutoOn(boolean autoOn) {
-        mAutoOn = autoOn;
-        notifyChanged();
-    }
-
-    @Override
-    public void onBindViewHolder(PreferenceViewHolder view) {
-        super.onBindViewHolder(view);
-        mSummaryTextView = (TextView) view.findViewById(com.android.internal.R.id.summary);
-        mSeekBar = (SeekBar) view.findViewById(
-                com.android.internal.R.id.seekbar);
-
-        final ImageView autoButton = (ImageView) view.findViewById(R.id.auto_importance);
-        applyAutoUi(autoButton);
-        autoButton.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                applyAuto(autoButton);
-            }
-        });
-    }
-
-    private void applyAuto(ImageView autoButton) {
-        mAutoOn = !mAutoOn;
-        if (!mAutoOn) {
-            setProgress(NotificationManager.IMPORTANCE_DEFAULT);
-            mCallback.onImportanceChanged(NotificationManager.IMPORTANCE_DEFAULT, true);
-        } else {
-            mCallback.onImportanceChanged(NotificationManager.IMPORTANCE_UNSPECIFIED, true);
-        }
-        applyAutoUi(autoButton);
-    }
-
-    private void applyAutoUi(ImageView autoButton) {
-        mSeekBar.setEnabled(!mAutoOn);
-
-        final float alpha = mAutoOn ? mInactiveSliderAlpha : mActiveSliderAlpha;
-        final ColorStateList starTint = mAutoOn ?  mActiveSliderTint : mInactiveSliderTint;
-        Drawable icon = autoButton.getDrawable().mutate();
-        icon.setTintList(starTint);
-        autoButton.setImageDrawable(icon);
-        mSeekBar.setAlpha(alpha);
-
-        if (mAutoOn) {
-            setProgress(NotificationManager.IMPORTANCE_DEFAULT);
-            mSummary = getProgressSummary(NotificationManager.IMPORTANCE_UNSPECIFIED);
-        }
-        mSummaryTextView.setText(mSummary);
-    }
-
-    @Override
-    public CharSequence getSummary() {
-        return mSummary;
-    }
-
-    @Override
-    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
-        super.onProgressChanged(seekBar, progress, fromTouch);
-        if (progress < mMinProgress) {
-            seekBar.setProgress(mMinProgress);
-            progress = mMinProgress;
-        }
-        if (mSummaryTextView != null) {
-            mSummary = getProgressSummary(progress);
-            mSummaryTextView.setText(mSummary);
-        }
-        mCallback.onImportanceChanged(progress, fromTouch);
-    }
-
-    private String getProgressSummary(int progress) {
-        switch (progress) {
-            case NotificationManager.IMPORTANCE_NONE:
-                return getContext().getString(R.string.notification_importance_blocked);
-            case NotificationManager.IMPORTANCE_MIN:
-                return getContext().getString(R.string.notification_importance_min);
-            case NotificationManager.IMPORTANCE_LOW:
-                return getContext().getString(R.string.notification_importance_low);
-            case NotificationManager.IMPORTANCE_DEFAULT:
-                return getContext().getString(R.string.notification_importance_default);
-            case NotificationManager.IMPORTANCE_HIGH:
-            case NotificationManager.IMPORTANCE_MAX:
-                return getContext().getString(R.string.notification_importance_high);
-            default:
-                return getContext().getString(R.string.notification_importance_unspecified);
-        }
-    }
-
-    @Override
-    protected void notifyChanged() {
-        mHandler.post(mNotifyChanged);
-    }
-
-    private void postNotifyChanged() {
-        super.notifyChanged();
-    }
-
-    private final Runnable mNotifyChanged = new Runnable() {
-        @Override
-        public void run() {
-            postNotifyChanged();
-        }
-    };
-
-    public interface Callback {
-        void onImportanceChanged(int progress, boolean fromTouch);
-    }
-}
diff --git a/src/com/android/settings/notification/NotificationBackend.java b/src/com/android/settings/notification/NotificationBackend.java
index 5d69203..4013971 100644
--- a/src/com/android/settings/notification/NotificationBackend.java
+++ b/src/com/android/settings/notification/NotificationBackend.java
@@ -16,7 +16,6 @@
 package com.android.settings.notification;
 
 import android.app.INotificationManager;
-import android.app.Notification;
 import android.app.NotificationChannel;
 import android.app.NotificationManager;
 import android.content.Context;
@@ -27,11 +26,8 @@
 import android.content.pm.ParceledListSlice;
 import android.graphics.drawable.Drawable;
 import android.os.ServiceManager;
-import android.os.UserHandle;
-import android.service.notification.NotificationListenerService;
 import android.util.Log;
 
-import com.android.internal.widget.LockPatternUtils;
 import com.android.settingslib.Utils;
 
 public class NotificationBackend {
@@ -52,11 +48,6 @@
         }
         row.icon = app.loadIcon(pm);
         row.banned = getNotificationsBanned(row.pkg, row.uid);
-        row.appImportance = getImportance(row.pkg, row.uid);
-        row.appBypassDnd = getBypassZenMode(row.pkg, row.uid);
-        row.appVisOverride = getVisibilityOverride(row.pkg, row.uid);
-        row.lockScreenSecure = new LockPatternUtils(context).isSecure(
-                UserHandle.myUserId());
         return row;
     }
 
@@ -86,19 +77,9 @@
         }
     }
 
-    public boolean getBypassZenMode(String pkg, int uid) {
+    public boolean setNotificationsEnabledForPackage(String pkg, int uid, boolean enabled) {
         try {
-            return sINM.getPriority(pkg, uid) == Notification.PRIORITY_MAX;
-        } catch (Exception e) {
-            Log.w(TAG, "Error calling NoMan", e);
-            return false;
-        }
-    }
-
-    public boolean setBypassZenMode(String pkg, int uid, boolean bypassZen) {
-        try {
-            sINM.setPriority(pkg, uid,
-                    bypassZen ? Notification.PRIORITY_MAX : Notification.PRIORITY_DEFAULT);
+            sINM.setNotificationsEnabledForPackage(pkg, uid, enabled);
             return true;
         } catch (Exception e) {
             Log.w(TAG, "Error calling NoMan", e);
@@ -106,44 +87,6 @@
         }
     }
 
-    public int getVisibilityOverride(String pkg, int uid) {
-        try {
-            return sINM.getVisibilityOverride(pkg, uid);
-        } catch (Exception e) {
-            Log.w(TAG, "Error calling NoMan", e);
-            return NotificationListenerService.Ranking.VISIBILITY_NO_OVERRIDE;
-        }
-    }
-
-    public boolean setVisibilityOverride(String pkg, int uid, int override) {
-        try {
-            sINM.setVisibilityOverride(pkg, uid, override);
-            return true;
-        } catch (Exception e) {
-            Log.w(TAG, "Error calling NoMan", e);
-            return false;
-        }
-    }
-
-    public boolean setImportance(String pkg, int uid, int importance) {
-        try {
-            sINM.setImportance(pkg, uid, importance);
-            return true;
-        } catch (Exception e) {
-            Log.w(TAG, "Error calling NoMan", e);
-            return false;
-        }
-    }
-
-    public int getImportance(String pkg, int uid) {
-        try {
-            return sINM.getImportance(pkg, uid);
-        } catch (Exception e) {
-            Log.w(TAG, "Error calling NoMan", e);
-            return NotificationManager.IMPORTANCE_UNSPECIFIED;
-        }
-    }
-
     public NotificationChannel getChannel(String pkg, int uid, String channelId) {
         if (channelId == null) {
             return null;
@@ -186,10 +129,6 @@
         public boolean banned;
         public boolean first;  // first app in section
         public boolean systemApp;
-        public int appImportance;
-        public boolean appBypassDnd;
-        public int appVisOverride;
-        public boolean lockScreenSecure;
     }
 
     public static class ChannelRow extends AppRow {
diff --git a/src/com/android/settings/notification/NotificationSettingsBase.java b/src/com/android/settings/notification/NotificationSettingsBase.java
index 5d6f598..046c5e6 100644
--- a/src/com/android/settings/notification/NotificationSettingsBase.java
+++ b/src/com/android/settings/notification/NotificationSettingsBase.java
@@ -51,15 +51,10 @@
 abstract public class NotificationSettingsBase extends SettingsPreferenceFragment {
     private static final String TAG = "NotifiSettingsBase";
     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-    private static final String TUNER_SETTING = "show_importance_slider";
 
     protected static final String ARG_CHANNEL = "channel";
 
-    protected static final String KEY_BYPASS_DND = "bypass_dnd";
-    protected static final String KEY_VISIBILITY_OVERRIDE = "visibility_override";
-    protected static final String KEY_IMPORTANCE = "importance";
     protected static final String KEY_BLOCK = "block";
-    protected static final String KEY_SILENT = "silent";
 
     protected PackageManager mPm;
     protected UserManager mUm;
@@ -70,13 +65,10 @@
     protected int mUserId;
     protected String mPkg;
     protected PackageInfo mPkgInfo;
-    protected ImportanceSeekBarPreference mImportance;
-    protected RestrictedSwitchPreference mPriority;
-    protected RestrictedDropDownPreference mVisibilityOverride;
     protected RestrictedSwitchPreference mBlock;
-    protected RestrictedSwitchPreference mSilent;
+    protected RestrictedSwitchPreference mShow;
+    protected RestrictedSwitchPreference mBadge;
     protected EnforcedAdmin mSuspendedAppsAdmin;
-    protected boolean mShowSlider = false;
     protected boolean mDndVisualEffectsSuppressed;
 
     protected NotificationChannel mChannel;
@@ -138,7 +130,6 @@
 
         mSuspendedAppsAdmin = RestrictedLockUtils.checkIfApplicationIsSuspended(
                 mContext, mPkg, mUserId);
-        mShowSlider = Settings.Secure.getInt(getContentResolver(), TUNER_SETTING, 0) == 1;
         NotificationManager.Policy policy =
                 NotificationManager.from(mContext).getNotificationPolicy();
         mDndVisualEffectsSuppressed = policy == null ? false : policy.suppressedVisualEffects != 0;
@@ -154,237 +145,7 @@
         }
         mSuspendedAppsAdmin = RestrictedLockUtils.checkIfApplicationIsSuspended(
                 mContext, mPkg, mUserId);
-        if (mImportance != null) {
-            mImportance.setDisabledByAdmin(mSuspendedAppsAdmin);
-        }
-        if (mPriority != null) {
-            mPriority.setDisabledByAdmin(mSuspendedAppsAdmin);
-        }
-        if (mBlock != null) {
-            mBlock.setDisabledByAdmin(mSuspendedAppsAdmin);
-        }
-        if (mSilent != null) {
-            mSilent.setDisabledByAdmin(mSuspendedAppsAdmin);
-        }
-        if (mVisibilityOverride != null) {
-            mVisibilityOverride.setDisabledByAdmin(mSuspendedAppsAdmin);
-        }
-    }
-
-    protected void setupImportancePrefs(boolean notBlockable, int importance, boolean banned,
-            int maxImportance) {
-        if (mShowSlider) {
-            setVisible(mBlock, false);
-            setVisible(mSilent, false);
-            mImportance.setDisabledByAdmin(mSuspendedAppsAdmin);
-            mImportance.setMinimumProgress(
-                    notBlockable ? NotificationManager.IMPORTANCE_MIN
-                            : NotificationManager.IMPORTANCE_NONE);
-            mImportance.setMax(maxImportance);
-            mImportance.setProgress(Math.min(importance, maxImportance));
-            mImportance.setAutoOn(importance == NotificationManager.IMPORTANCE_UNSPECIFIED);
-            mImportance.setCallback(new ImportanceSeekBarPreference.Callback() {
-                @Override
-                public void onImportanceChanged(int progress, boolean fromUser) {
-                    if (fromUser) {
-                        if (mChannel != null) {
-                            mChannel.setImportance(progress);
-                            mChannel.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE);
-                            mBackend.updateChannel(mPkg, mUid, mChannel);
-                        } else {
-                            mBackend.setImportance(mPkg, mUid, progress);
-                        }
-                    }
-                    updateDependents(progress);
-                }
-            });
-        } else {
-            setVisible(mImportance, false);
-            if (notBlockable) {
-                setVisible(mBlock, false);
-            } else {
-                mBlock.setChecked(banned);
-                mBlock.setOnPreferenceChangeListener(
-                        new Preference.OnPreferenceChangeListener() {
-                            @Override
-                            public boolean onPreferenceChange(Preference preference,
-                                    Object newValue) {
-                                final boolean blocked = (Boolean) newValue;
-                                final int importance = blocked
-                                        ? NotificationManager.IMPORTANCE_NONE
-                                        : NotificationManager.IMPORTANCE_UNSPECIFIED;
-                                if (mChannel != null) {
-                                    mChannel.setImportance(importance);
-                                    mChannel.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE);
-                                    mBackend.updateChannel(mPkg, mUid, mChannel);
-                                } else {
-                                    mBackend.setImportance(mPkgInfo.packageName, mUid,
-                                            importance);
-                                }
-                                updateDependents(importance);
-                                return true;
-                            }
-                        });
-            }
-            // app silenced; cannot un-silence a channel
-            if (maxImportance == NotificationManager.IMPORTANCE_LOW) {
-                setVisible(mSilent, false);
-                updateDependents(banned ? NotificationManager.IMPORTANCE_NONE
-                        : NotificationManager.IMPORTANCE_LOW);
-            } else {
-                mSilent.setChecked(importance == NotificationManager.IMPORTANCE_LOW);
-                mSilent.setOnPreferenceChangeListener(
-                        new Preference.OnPreferenceChangeListener() {
-                            @Override
-                            public boolean onPreferenceChange(Preference preference,
-                                    Object newValue) {
-                                final boolean silenced = (Boolean) newValue;
-                                final int importance = silenced
-                                        ? NotificationManager.IMPORTANCE_LOW
-                                        : NotificationManager.IMPORTANCE_UNSPECIFIED;
-                                if (mChannel != null) {
-                                    mChannel.setImportance(importance);
-                                    mChannel.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE);
-                                    mBackend.updateChannel(mPkg, mUid, mChannel);
-                                } else {
-                                    mBackend.setImportance(mPkgInfo.packageName, mUid,
-                                            importance);
-                                }
-                                updateDependents(importance);
-                                return true;
-                            }
-                        });
-                updateDependents(banned ? NotificationManager.IMPORTANCE_NONE : importance);
-            }
-        }
-    }
-
-    protected void setupPriorityPref(boolean priority) {
-        mPriority.setDisabledByAdmin(mSuspendedAppsAdmin);
-        mPriority.setChecked(priority);
-        mPriority.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
-            @Override
-            public boolean onPreferenceChange(Preference preference, Object newValue) {
-                final boolean bypassZenMode = (Boolean) newValue;
-                if (mChannel != null) {
-                    mChannel.setBypassDnd(bypassZenMode);
-                    mChannel.lockFields(NotificationChannel.USER_LOCKED_PRIORITY);
-                    mBackend.updateChannel(mPkg, mUid, mChannel);
-                    return true;
-                } else {
-                    return mBackend.setBypassZenMode(mPkgInfo.packageName, mUid, bypassZenMode);
-                }
-            }
-        });
-    }
-
-    protected void setupVisOverridePref(int sensitive) {
-        ArrayList<CharSequence> entries = new ArrayList<>();
-        ArrayList<CharSequence> values = new ArrayList<>();
-
-        mVisibilityOverride.clearRestrictedItems();
-        if (getLockscreenNotificationsEnabled() && getLockscreenAllowPrivateNotifications()) {
-            final String summaryShowEntry =
-                    getString(R.string.lock_screen_notifications_summary_show);
-            final String summaryShowEntryValue =
-                    Integer.toString(NotificationManager.VISIBILITY_NO_OVERRIDE);
-            entries.add(summaryShowEntry);
-            values.add(summaryShowEntryValue);
-            setRestrictedIfNotificationFeaturesDisabled(summaryShowEntry, summaryShowEntryValue,
-                    DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS
-                            | DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS);
-        }
-
-        final String summaryHideEntry = getString(R.string.lock_screen_notifications_summary_hide);
-        final String summaryHideEntryValue = Integer.toString(Notification.VISIBILITY_PRIVATE);
-        entries.add(summaryHideEntry);
-        values.add(summaryHideEntryValue);
-        setRestrictedIfNotificationFeaturesDisabled(summaryHideEntry, summaryHideEntryValue,
-                DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS);
-        entries.add(getString(R.string.lock_screen_notifications_summary_disable));
-        values.add(Integer.toString(Notification.VISIBILITY_SECRET));
-        mVisibilityOverride.setEntries(entries.toArray(new CharSequence[entries.size()]));
-        mVisibilityOverride.setEntryValues(values.toArray(new CharSequence[values.size()]));
-
-        if (sensitive == Ranking.VISIBILITY_NO_OVERRIDE) {
-            mVisibilityOverride.setValue(Integer.toString(getGlobalVisibility()));
-        } else {
-            mVisibilityOverride.setValue(Integer.toString(sensitive));
-        }
-        mVisibilityOverride.setSummary("%s");
-
-        mVisibilityOverride.setOnPreferenceChangeListener(
-                new Preference.OnPreferenceChangeListener() {
-            @Override
-            public boolean onPreferenceChange(Preference preference, Object newValue) {
-                int sensitive = Integer.parseInt((String) newValue);
-                if (sensitive == getGlobalVisibility()) {
-                    sensitive = Ranking.VISIBILITY_NO_OVERRIDE;
-                }
-                if (mChannel != null) {
-                    mChannel.setLockscreenVisibility(sensitive);
-                    mChannel.lockFields(NotificationChannel.USER_LOCKED_VISIBILITY);
-                    mBackend.updateChannel(mPkg, mUid, mChannel);
-                } else {
-                    mBackend.setVisibilityOverride(mPkgInfo.packageName, mUid, sensitive);
-                }
-                return true;
-            }
-        });
-    }
-
-    private void setRestrictedIfNotificationFeaturesDisabled(CharSequence entry,
-            CharSequence entryValue, int keyguardNotificationFeatures) {
-        EnforcedAdmin admin = RestrictedLockUtils.checkIfKeyguardFeaturesDisabled(
-                mContext, keyguardNotificationFeatures, mUserId);
-        if (admin != null) {
-            RestrictedItem item = new RestrictedItem(entry, entryValue, admin);
-            mVisibilityOverride.addRestrictedItem(item);
-        }
-    }
-
-    private int getGlobalVisibility() {
-        int globalVis = Ranking.VISIBILITY_NO_OVERRIDE;
-        if (!getLockscreenNotificationsEnabled()) {
-            globalVis = Notification.VISIBILITY_SECRET;
-        } else if (!getLockscreenAllowPrivateNotifications()) {
-            globalVis = Notification.VISIBILITY_PRIVATE;
-        }
-        return globalVis;
-    }
-
-    private boolean getLockscreenNotificationsEnabled() {
-        return Settings.Secure.getInt(getContentResolver(),
-                Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0) != 0;
-    }
-
-    private boolean getLockscreenAllowPrivateNotifications() {
-        return Settings.Secure.getInt(getContentResolver(),
-                Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0) != 0;
-    }
-
-    private boolean isLockScreenSecure() {
-        LockPatternUtils utils = new LockPatternUtils(getActivity());
-        boolean lockscreenSecure = utils.isSecure(UserHandle.myUserId());
-        UserInfo parentUser = mUm.getProfileParent(UserHandle.myUserId());
-        if (parentUser != null){
-            lockscreenSecure |= utils.isSecure(parentUser.id);
-        }
-
-        return lockscreenSecure;
-    }
-
-    protected void updateDependents(int importance) {
-        if (getPreferenceScreen().findPreference(mBlock.getKey()) != null) {
-            setVisible(mSilent, checkCanBeVisible(NotificationManager.IMPORTANCE_MIN, importance));
-            mSilent.setChecked(importance == NotificationManager.IMPORTANCE_LOW);
-        }
-        setVisible(mPriority, checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT, importance)
-                || (checkCanBeVisible(NotificationManager.IMPORTANCE_LOW, importance)
-                && mDndVisualEffectsSuppressed));
-        setVisible(mVisibilityOverride,
-                checkCanBeVisible(NotificationManager.IMPORTANCE_MIN, importance)
-                        && isLockScreenSecure());
+        mBlock.setDisabledByAdmin(mSuspendedAppsAdmin);
     }
 
     protected void setVisible(Preference p, boolean visible) {
@@ -397,13 +158,6 @@
         }
     }
 
-    protected boolean checkCanBeVisible(int minImportanceVisible, int importance) {
-        if (importance == NotificationManager.IMPORTANCE_UNSPECIFIED) {
-            return true;
-        }
-        return importance >= minImportanceVisible;
-    }
-
     protected void toastAndFinish() {
         Toast.makeText(mContext, R.string.app_not_found_dlg_text, Toast.LENGTH_SHORT).show();
         getActivity().finish();
diff --git a/src/com/android/settings/overlay/SupportFeatureProvider.java b/src/com/android/settings/overlay/SupportFeatureProvider.java
index 24ec7b5..0f8d424 100644
--- a/src/com/android/settings/overlay/SupportFeatureProvider.java
+++ b/src/com/android/settings/overlay/SupportFeatureProvider.java
@@ -21,9 +21,11 @@
 import android.annotation.NonNull;
 import android.annotation.StringRes;
 import android.app.Activity;
+import android.app.FragmentManager;
 import android.content.Context;
 import android.content.Intent;
 
+import android.os.Bundle;
 import com.android.settings.support.SupportPhone;
 
 import java.lang.annotation.Retention;
@@ -142,8 +144,13 @@
     Intent getTipsAndTricksIntent(Context context);
 
     /**
-     * Returns the string for the disclaimer in the Support dialog
+     * Returns the string for the disclaimer in the Support dialog.
      */
     @StringRes
     int getDisclaimerStringResId();
+
+    /**
+     * launches the fragment that displays the system information being sent to support agents.
+     */
+    void launchSystemInfoFragment(Bundle args, FragmentManager manager);
 }
diff --git a/src/com/android/settings/search2/CursorToSearchResultConverter.java b/src/com/android/settings/search2/CursorToSearchResultConverter.java
new file mode 100644
index 0000000..3d29323
--- /dev/null
+++ b/src/com/android/settings/search2/CursorToSearchResultConverter.java
@@ -0,0 +1,190 @@
+/*
+ * 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.search2;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.database.Cursor;
+import android.graphics.drawable.Drawable;
+import android.os.BadParcelableException;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Log;
+import com.android.settings.SettingsActivity;
+import com.android.settings.Utils;
+import com.android.settings.search.Index;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.android.settings.search2.DatabaseResultLoader.COLUMN_INDEX_RANK;
+import static com.android.settings.search2.DatabaseResultLoader.COLUMN_INDEX_TITLE;
+import static com.android.settings.search2.DatabaseResultLoader.COLUMN_INDEX_SUMMARY_ON;
+import static com.android.settings.search2.DatabaseResultLoader.COLUMN_INDEX_CLASS_NAME;
+import static com.android.settings.search2.DatabaseResultLoader.COLUMN_INDEX_ICON;
+import static com.android.settings.search2.DatabaseResultLoader.COLUMN_INDEX_INTENT_ACTION;
+import static com.android.settings.search2.DatabaseResultLoader.COLUMN_INDEX_INTENT_ACTION_TARGET_PACKAGE;
+import static com.android.settings.search2.DatabaseResultLoader.COLUMN_INDEX_KEY;
+import static com.android.settings.search2.DatabaseResultLoader.COLUMN_INDEX_PAYLOAD_TYPE;
+import static com.android.settings.search2.DatabaseResultLoader.COLUMN_INDEX_PAYLOAD;
+
+/**
+ * Controller to Build search results from {@link Cursor} Objects.
+ *
+ * Each converted {@link Cursor} has the following fields:
+ * - String Title
+ * - String Summary
+ * - int rank
+ * - {@link Drawable} icon
+ * - {@link ResultPayload} payload
+ */
+class CursorToSearchResultConverter {
+
+    private final String TAG = "CursorConverter";
+
+    private final Context mContext;
+
+    public CursorToSearchResultConverter(Context context) {
+        mContext = context;
+    }
+
+    public List<SearchResult> convertCursor(Cursor cursorResults) {
+        if (cursorResults == null) {
+            return null;
+        }
+        final Map<String, Context> contextMap = new HashMap<>();
+        final ArrayList<SearchResult> results = new ArrayList<>();
+
+        while (cursorResults.moveToNext()) {
+            SearchResult result = buildSingleSearchResultFromCursor(contextMap, cursorResults);
+            if (result != null) {
+                results.add(result);
+            }
+        }
+        Collections.sort(results);
+        return results;
+    }
+
+    private SearchResult buildSingleSearchResultFromCursor(Map<String, Context> contextMap,
+            Cursor cursor) {
+        final String pkgName = cursor.getString(COLUMN_INDEX_INTENT_ACTION_TARGET_PACKAGE);
+        final String action = cursor.getString(COLUMN_INDEX_INTENT_ACTION);
+        final String title = cursor.getString(COLUMN_INDEX_TITLE);
+        final String summaryOn = cursor.getString(COLUMN_INDEX_SUMMARY_ON);
+        final String className = cursor.getString(COLUMN_INDEX_CLASS_NAME);
+        final int rank = cursor.getInt(COLUMN_INDEX_RANK);
+        final String key = cursor.getString(COLUMN_INDEX_KEY);
+        final String iconResStr = cursor.getString(COLUMN_INDEX_ICON);
+        final int payloadType = cursor.getInt(COLUMN_INDEX_PAYLOAD_TYPE);
+        final byte[] marshalledPayload = cursor.getBlob(COLUMN_INDEX_PAYLOAD);
+        final ResultPayload payload;
+
+        if (marshalledPayload != null) {
+            payload = getUnmarshalledPayload(marshalledPayload, payloadType);
+        } else if (payloadType == ResultPayload.PayloadType.INTENT) {
+            payload = getIntentPayload(cursor, action, key, className, pkgName);
+        } else {
+            Log.w(TAG, "Error creating payload - bad marshalling data or mismatched types");
+            return null;
+        }
+
+        final SearchResult.Builder builder = new SearchResult.Builder();
+        builder.addTitle(title)
+                .addSummary(summaryOn)
+                .addRank(rank)
+                .addIcon(getIconForPackage(contextMap, pkgName, className, iconResStr))
+                .addPayload(payload);
+        return builder.build();
+    }
+
+    private Drawable getIconForPackage(Map<String, Context> contextMap, String pkgName,
+            String className, String iconResStr) {
+        final int iconId = TextUtils.isEmpty(iconResStr)
+                ? 0 : Integer.parseInt(iconResStr);
+        Drawable icon;
+        Context packageContext;
+        if (iconId == 0) {
+            icon = null;
+        } else {
+            if (TextUtils.isEmpty(className) && !TextUtils.isEmpty(pkgName)) {
+                packageContext = contextMap.get(pkgName);
+                if (packageContext == null) {
+                    try {
+                        packageContext = mContext.createPackageContext(pkgName, 0);
+                    } catch (PackageManager.NameNotFoundException e) {
+                        Log.e(TAG, "Cannot create Context for package: " + pkgName);
+                        return null;
+                    }
+                    contextMap.put(pkgName, packageContext);
+                }
+            } else {
+                packageContext = mContext;
+            }
+            try {
+                icon = packageContext.getDrawable(iconId);
+            } catch (Resources.NotFoundException nfe) {
+                icon = null;
+            }
+        }
+        return icon;
+    }
+
+    private IntentPayload getIntentPayload(Cursor cursor, String action, String key,
+            String className, String pkgName ) {
+        IntentPayload payload;
+        if (TextUtils.isEmpty(action)) {
+            final String screenTitle = cursor.getString(Index.COLUMN_INDEX_SCREEN_TITLE);
+            // Action is null, we will launch it as a sub-setting
+            final Bundle args = new Bundle();
+            args.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, key);
+            final Intent intent = Utils.onBuildStartFragmentIntent(mContext,
+                    className, args, null, 0, screenTitle, false);
+            payload = new IntentPayload(intent);
+        } else {
+            final Intent intent = new Intent(action);
+            final String targetClass = cursor.getString(
+                    Index.COLUMN_INDEX_INTENT_ACTION_TARGET_CLASS);
+            if (!TextUtils.isEmpty(pkgName) && !TextUtils.isEmpty(targetClass)) {
+                final ComponentName component = new ComponentName(pkgName, targetClass);
+                intent.setComponent(component);
+            }
+            intent.putExtra(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, key);
+            payload = new IntentPayload(intent);
+        }
+        return payload;
+    }
+
+    private ResultPayload getUnmarshalledPayload(byte[] unmarshalledPayload, int payloadType) {
+        try {
+            switch (payloadType) {
+                case ResultPayload.PayloadType.INLINE_SWITCH:
+                    return ResultPayloadUtils.unmarshall(unmarshalledPayload,
+                            InlineSwitchPayload.CREATOR);
+            }
+        } catch (BadParcelableException e) {
+            Log.w(TAG, "Error creating parcelable: " + e);
+        }
+        return null;
+    }
+}
diff --git a/src/com/android/settings/search2/DatabaseIndexingUtils.java b/src/com/android/settings/search2/DatabaseIndexingUtils.java
index c7a7f92..9fdf732 100644
--- a/src/com/android/settings/search2/DatabaseIndexingUtils.java
+++ b/src/com/android/settings/search2/DatabaseIndexingUtils.java
@@ -66,6 +66,10 @@
      */
     public static Map<String, PreferenceController> getPreferenceControllerUriMap(
             String className, Context context) {
+        if (context == null) {
+            return null;
+        }
+
         final Class<?> clazz = getIndexableClass(className);
 
         if (clazz == null) {
@@ -77,6 +81,7 @@
         // Will be non null only for a Local provider implementing a
         // SEARCH_INDEX_DATA_PROVIDER field
         final Indexable.SearchIndexProvider provider = getSearchIndexProvider(clazz);
+
         List<PreferenceController> controllers =
                 provider.getPreferenceControllers(context);
 
@@ -94,8 +99,9 @@
     }
 
     /**
-     * @param uriMap Map between the {@link PreferenceController} keys and the controllers themselves.
-     * @param key The look up key
+     * @param uriMap Map between the {@link PreferenceController} keys
+     *               and the controllers themselves.
+     * @param key The look-up key
      * @return The Payload from the {@link PreferenceController} specified by the key, if it exists.
      * Otherwise null.
      */
@@ -135,15 +141,13 @@
         } catch (NoSuchFieldException e) {
             Log.d(TAG, "Cannot find field '" + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
         } catch (SecurityException se) {
-            Log.d(TAG,
-                    "Security exception for field '" + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
+            Log.d(TAG, "Security exception for field '" +
+                    FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
         } catch (IllegalAccessException e) {
-            Log.d(TAG,
-                    "Illegal access to field '" + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
+            Log.d(TAG, "Illegal access to field '" + FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
         } catch (IllegalArgumentException e) {
-            Log.d(TAG,
-                    "Illegal argument when accessing field '" +
-                            FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
+            Log.d(TAG, "Illegal argument when accessing field '" +
+                    FIELD_NAME_SEARCH_INDEX_DATA_PROVIDER + "'");
         }
         return null;
     }
diff --git a/src/com/android/settings/search2/DatabaseResultLoader.java b/src/com/android/settings/search2/DatabaseResultLoader.java
index b268f6a..201d76f 100644
--- a/src/com/android/settings/search2/DatabaseResultLoader.java
+++ b/src/com/android/settings/search2/DatabaseResultLoader.java
@@ -48,14 +48,36 @@
 public class DatabaseResultLoader extends AsyncLoader<List<SearchResult>> {
     private static final String LOG = "DatabaseResultLoader";
     private final String mQueryText;
-    private final Context mContext;
+
     protected final SQLiteDatabase mDatabase;
 
+    private final CursorToSearchResultConverter mConverter;
+
+    /* These indices are used to match the columns of the this loader's SELECT statement.
+     These are not necessarily the same order or coverage as the schema defined in
+     IndexDatabaseHelper */
+    public static final int COLUMN_INDEX_RANK = 0;
+    public static final int COLUMN_INDEX_TITLE = 1;
+    public static final int COLUMN_INDEX_SUMMARY_ON = 2;
+    public static final int COLUMN_INDEX_SUMMARY_OFF = 3;
+    public static final int COLUMN_INDEX_ENTRIES = 4;
+    public static final int COLUMN_INDEX_KEYWORDS = 5;
+    public static final int COLUMN_INDEX_CLASS_NAME = 6;
+    public static final int COLUMN_INDEX_SCREEN_TITLE = 7;
+    public static final int COLUMN_INDEX_ICON = 8;
+    public static final int COLUMN_INDEX_INTENT_ACTION = 9;
+    public static final int COLUMN_INDEX_INTENT_ACTION_TARGET_PACKAGE = 10;
+    public static final int COLUMN_INDEX_INTENT_ACTION_TARGET_CLASS = 11;
+    public static final int COLUMN_INDEX_ENABLED = 12;
+    public static final int COLUMN_INDEX_KEY = 13;
+    public static final int COLUMN_INDEX_PAYLOAD_TYPE = 14;
+    public static final int COLUMN_INDEX_PAYLOAD = 15;
+
     public DatabaseResultLoader(Context context, String queryText) {
         super(context);
         mDatabase = IndexDatabaseHelper.getInstance(context).getReadableDatabase();
         mQueryText = queryText;
-        mContext = context;
+        mConverter = new CursorToSearchResultConverter(context);
     }
 
     @Override
@@ -72,7 +94,7 @@
         String query = getSQLQuery();
         Cursor result = mDatabase.rawQuery(query, null);
 
-        return parseCursorForSearch(result);
+        return mConverter.convertCursor(result);
     }
 
     @Override
@@ -86,100 +108,12 @@
                         "data_summary_off, data_entries, data_keywords, class_name, screen_title,"
                         + " icon, " +
                         "intent_action, intent_target_package, intent_target_class, enabled, " +
-                        "data_key_reference FROM prefs_index WHERE prefs_index MATCH "
+                        "data_key_reference, payload_type, payload FROM prefs_index WHERE prefs_index MATCH "
                         + "'data_title:%s* " +
                         "OR data_title_normalized:%s* OR data_keywords:%s*' AND locale = 'en_US'",
                 mQueryText, mQueryText, mQueryText);
     }
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
-    public ArrayList<SearchResult> parseCursorForSearch(Cursor cursorResults) {
-        if (cursorResults == null) {
-            return null;
-        }
-        final Map<String, Context> contextMap = new HashMap<>();
-        final ArrayList<SearchResult> results = new ArrayList<>();
 
-        while (cursorResults.moveToNext()) {
-            SearchResult result = buildSingleSearchResultFromCursor(contextMap, cursorResults);
-            if (result != null) {
-                results.add(result);
-            }
-        }
-        Collections.sort(results);
-        return results;
-    }
-
-    private SearchResult buildSingleSearchResultFromCursor(Map<String, Context> contextMap,
-            Cursor cursor) {
-        final String pkgName = cursor.getString(Index.COLUMN_INDEX_INTENT_ACTION_TARGET_PACKAGE);
-        final String action = cursor.getString(Index.COLUMN_INDEX_INTENT_ACTION);
-        final String title = cursor.getString(Index.COLUMN_INDEX_TITLE);
-        final String summaryOn = cursor.getString(Index.COLUMN_INDEX_SUMMARY_ON);
-        final String className = cursor.getString(Index.COLUMN_INDEX_CLASS_NAME);
-        final int rank = cursor.getInt(Index.COLUMN_INDEX_RANK);
-        final String key = cursor.getString(Index.COLUMN_INDEX_KEY);
-        final String iconResStr = cursor.getString(Index.COLUMN_INDEX_ICON);
-
-        final ResultPayload payload;
-        if (TextUtils.isEmpty(action)) {
-            final String screenTitle = cursor.getString(Index.COLUMN_INDEX_SCREEN_TITLE);
-            // Action is null, we will launch it as a sub-setting
-            final Bundle args = new Bundle();
-            args.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, key);
-            final Intent intent = Utils.onBuildStartFragmentIntent(mContext,
-                    className, args, null, 0, screenTitle, false);
-            payload = new IntentPayload(intent);
-        } else {
-            final Intent intent = new Intent(action);
-            final String targetClass = cursor.getString(
-                    Index.COLUMN_INDEX_INTENT_ACTION_TARGET_CLASS);
-            if (!TextUtils.isEmpty(pkgName) && !TextUtils.isEmpty(targetClass)) {
-                final ComponentName component = new ComponentName(pkgName, targetClass);
-                intent.setComponent(component);
-            }
-            intent.putExtra(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, key);
-            payload = new IntentPayload(intent);
-        }
-        SearchResult.Builder builder = new SearchResult.Builder();
-        builder.addTitle(title)
-                .addSummary(summaryOn)
-                .addRank(rank)
-                .addIcon(getIconForPackage(contextMap, pkgName, className, iconResStr))
-                .addPayload(payload);
-        return builder.build();
-    }
-
-    private Drawable getIconForPackage(Map<String, Context> contextMap, String pkgName,
-            String className, String iconResStr) {
-        final int iconId = TextUtils.isEmpty(iconResStr)
-                ? 0 : Integer.parseInt(iconResStr);
-        Drawable icon;
-        Context packageContext;
-        if (iconId == 0) {
-            icon = null;
-        } else {
-            if (TextUtils.isEmpty(className) && !TextUtils.isEmpty(pkgName)) {
-                packageContext = contextMap.get(pkgName);
-                if (packageContext == null) {
-                    try {
-                        packageContext = mContext.createPackageContext(pkgName, 0);
-                    } catch (PackageManager.NameNotFoundException e) {
-                        Log.e(LOG, "Cannot create Context for package: " + pkgName);
-                        return null;
-                    }
-                    contextMap.put(pkgName, packageContext);
-                }
-            } else {
-                packageContext = mContext;
-            }
-            try {
-                icon = packageContext.getDrawable(iconId);
-            } catch (Resources.NotFoundException nfe) {
-                icon = null;
-            }
-        }
-        return icon;
-    }
 
 }
diff --git a/src/com/android/settings/search2/InlinePayload.java b/src/com/android/settings/search2/InlinePayload.java
new file mode 100644
index 0000000..4b1c168
--- /dev/null
+++ b/src/com/android/settings/search2/InlinePayload.java
@@ -0,0 +1,43 @@
+/*
+ * 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.search2;
+
+/**
+ * Abstract Payload for inline settings results.
+ */
+public abstract class InlinePayload extends ResultPayload {
+    /**
+     * Defines the URI to access and store the Setting the inline result represents
+     */
+    public String settingsUri;
+
+    /**
+     * The UI type for the inline result.
+     */
+    @PayloadType public int inlineType;
+
+    /**
+     * Defines where the Setting is stored.
+     */
+    @SettingsSource public int settingSource;
+
+    public InlinePayload(String uri, @PayloadType int type, @SettingsSource int source) {
+        settingsUri = uri;
+        inlineType = type;
+        settingSource = source;
+    }
+}
diff --git a/src/com/android/settings/search2/InlineSliderPayload.java b/src/com/android/settings/search2/InlineSliderPayload.java
deleted file mode 100644
index 8f08d59..0000000
--- a/src/com/android/settings/search2/InlineSliderPayload.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.search2;
-
-import android.net.Uri;
-import android.os.Parcel;
-
-/**
- * Payload for Inline Settings results represented by a Slider.
- */
-public class InlineSliderPayload extends ResultPayload {
-    public final Uri uri;
-
-    private InlineSliderPayload(Parcel in) {
-        uri = in.readParcelable(InlineSliderPayload.class.getClassLoader());
-    }
-
-    public InlineSliderPayload(Uri newUri) {
-        uri = newUri;
-    }
-
-    @Override
-    public int getType() {
-        return PayloadType.INLINE_SLIDER;
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeParcelable(uri, flags);
-    }
-
-    public static final Creator<InlineSliderPayload> CREATOR = new Creator<InlineSliderPayload>() {
-        @Override
-        public InlineSliderPayload createFromParcel(Parcel in) {
-            return new InlineSliderPayload(in);
-        }
-
-        @Override
-        public InlineSliderPayload[] newArray(int size) {
-            return new InlineSliderPayload[size];
-        }
-    };
-}
\ No newline at end of file
diff --git a/src/com/android/settings/search2/InlineSwitchPayload.java b/src/com/android/settings/search2/InlineSwitchPayload.java
new file mode 100644
index 0000000..76fb048
--- /dev/null
+++ b/src/com/android/settings/search2/InlineSwitchPayload.java
@@ -0,0 +1,138 @@
+/*
+ * 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.search2;
+
+import android.content.Context;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.provider.Settings;
+import android.util.ArrayMap;
+
+import java.util.Map;
+
+/**
+ * Payload for inline Switch results. Mappings from integer to boolean.
+ */
+public class InlineSwitchPayload extends InlinePayload {
+    /**
+     * Maps Inline values to UI-consumable Values.
+     * For example, if you have a switch preference whose values are stored as ints, the two valid
+     * list of mappings would be:
+     * < (0,True), (1, false) >
+     * < (1,True), (0, false) >
+     */
+    public final Map<Integer, Boolean> valueMap;
+
+    public InlineSwitchPayload(String newUri, @SettingsSource int settingsSource,
+            ArrayMap<Integer, Boolean> map) {
+        super(newUri, PayloadType.INLINE_SWITCH, settingsSource);
+        valueMap = map;
+    }
+
+    private InlineSwitchPayload(Parcel in) {
+        super(in.readString() /* Uri */ , in.readInt() /* Payload Type */,
+                in.readInt() /* Settings Source */);
+        valueMap = in.readHashMap(Integer.class.getClassLoader());
+    }
+
+    @Override
+    public int getType() {
+        return inlineType;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(settingsUri);
+        dest.writeInt(inlineType);
+        dest.writeInt(settingSource);
+        dest.writeMap(valueMap);
+    }
+
+    public static final Parcelable.Creator<InlineSwitchPayload> CREATOR =
+            new Parcelable.Creator<InlineSwitchPayload>() {
+        @Override
+        public InlineSwitchPayload createFromParcel(Parcel in) {
+            return new InlineSwitchPayload(in);
+        }
+
+        @Override
+        public InlineSwitchPayload[] newArray(int size) {
+            return new InlineSwitchPayload[size];
+        }
+    };
+
+    public boolean getSwitchValue(Context context) {
+        if (valueMap == null) {
+            throw new IllegalStateException("Value map is null");
+        }
+
+        int settingsValue = -1;
+        switch(settingSource) {
+            case SettingsSource.SECURE:
+                settingsValue = Settings.Secure.getInt(context.getContentResolver(),
+                        settingsUri, 0);
+        }
+
+        if (settingsValue == -1) {
+            throw new IllegalStateException("Unable to find setting from uri: "
+                    + settingsUri.toString());
+        }
+
+        for (Integer key : valueMap.keySet()) {
+            if ((key == settingsValue)) {
+                return valueMap.get(key);
+            }
+        }
+
+        throw new IllegalStateException("No results matched the key: " + settingsValue);
+    }
+
+    public void setSwitchValue(Context context, boolean isChecked) {
+        if (valueMap == null) {
+            throw new IllegalStateException("Value map is null");
+        }
+        int switchValue = -1;
+
+        for (Map.Entry<Integer, Boolean> pair : valueMap.entrySet()) {
+            if (pair.getValue() == isChecked) {
+                switchValue = pair.getKey();
+                break;
+            }
+        }
+
+        if (switchValue == -1) {
+            throw new IllegalStateException("Switch value is not set");
+        }
+
+        switch(settingSource) {
+            case SettingsSource.GLOBAL:
+                return;
+            case SettingsSource.SECURE:
+                Settings.Secure.putInt(context.getContentResolver(), settingsUri, switchValue);
+            case SettingsSource.SYSTEM:
+                return;
+            case SettingsSource.UNKNOWN:
+                return;
+        }
+    }
+}
diff --git a/src/com/android/settings/search2/InlineSwitchViewHolder.java b/src/com/android/settings/search2/InlineSwitchViewHolder.java
new file mode 100644
index 0000000..54d3523
--- /dev/null
+++ b/src/com/android/settings/search2/InlineSwitchViewHolder.java
@@ -0,0 +1,73 @@
+/*
+ * 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.search2;
+
+import android.app.Fragment;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewParent;
+import android.widget.CompoundButton;
+import android.widget.Switch;
+import android.widget.TextView;
+import android.content.Context;
+
+import com.android.internal.widget.PreferenceImageView;
+import com.android.settings.R;
+
+/**
+ * ViewHolder for Settings represented as SwitchPreferences.
+ */
+public class InlineSwitchViewHolder extends SearchViewHolder {
+    public final TextView titleView;
+    public final TextView summaryView;
+    public final PreferenceImageView iconView;
+    public final Switch switchView;
+
+    private final Context mContext;
+
+    private final String TAG = "SwitchViewHolder";
+
+    public InlineSwitchViewHolder(View view, Context context) {
+        super(view);
+        mContext = context;
+        titleView = (TextView) view.findViewById(android.R.id.title);
+        summaryView = (TextView) view.findViewById(android.R.id.summary);
+        iconView = (PreferenceImageView) view.findViewById(android.R.id.icon);
+        switchView = (Switch) view.findViewById(R.id.switchView);
+    }
+
+    @Override
+    public void onBind(Fragment fragment, SearchResult result) {
+        if (mContext == null) {
+            return;
+        }
+        final InlineSwitchPayload payload = (InlineSwitchPayload) result.payload;
+        switchView.setChecked(payload.getSwitchValue(mContext));
+
+        switchView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+                payload.setSwitchValue(mContext, isChecked);
+            }
+        });
+
+        titleView.setText(result.title);
+        summaryView.setText(result.summary);
+        iconView.setImageDrawable(result.icon);
+    }
+}
diff --git a/src/com/android/settings/search2/IntentSearchViewHolder.java b/src/com/android/settings/search2/IntentSearchViewHolder.java
index 0ef27d0..da3f724 100644
--- a/src/com/android/settings/search2/IntentSearchViewHolder.java
+++ b/src/com/android/settings/search2/IntentSearchViewHolder.java
@@ -34,13 +34,13 @@
 
     public IntentSearchViewHolder(View view) {
         super(view);
-        titleView = (TextView) view.findViewById(R.id.title);
-        summaryView = (TextView) view.findViewById(R.id.summary);
-        iconView = (ImageView) view.findViewById(R.id.icon);
+        titleView = (TextView) view.findViewById(android.R.id.title);
+        summaryView = (TextView) view.findViewById(android.R.id.summary);
+        iconView = (ImageView) view.findViewById(android.R.id.icon);
     }
 
     @Override
-    public void onBind(Fragment fragment, SearchResult result) {
+    public void onBind(final Fragment fragment, final SearchResult result) {
         titleView.setText(result.title);
         summaryView.setText(result.summary);
         iconView.setImageDrawable(result.icon);
diff --git a/src/com/android/settings/search2/ResultPayload.java b/src/com/android/settings/search2/ResultPayload.java
index 84df7b6..3842def 100644
--- a/src/com/android/settings/search2/ResultPayload.java
+++ b/src/com/android/settings/search2/ResultPayload.java
@@ -28,7 +28,8 @@
  */
 public abstract class ResultPayload implements Parcelable {
 
-    @IntDef({PayloadType.INLINE_SLIDER, PayloadType.INLINE_SWITCH, PayloadType.INTENT})
+    @IntDef({PayloadType.INLINE_SLIDER, PayloadType.INLINE_SWITCH,
+            PayloadType.INTENT})
     @Retention(RetentionPolicy.SOURCE)
     public @interface PayloadType {
         /**
@@ -47,5 +48,16 @@
         int INLINE_SWITCH = 2;
     }
 
+    @IntDef({SettingsSource.UNKNOWN, SettingsSource.SYSTEM, SettingsSource.SECURE,
+            SettingsSource.GLOBAL})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface SettingsSource {
+        int UNKNOWN = 0;
+        int SYSTEM = 1;
+        int SECURE = 2;
+        int GLOBAL = 3;
+    }
+
+
     @ResultPayload.PayloadType public abstract int getType();
 }
diff --git a/src/com/android/settings/search2/SearchResultsAdapter.java b/src/com/android/settings/search2/SearchResultsAdapter.java
index b588496..c318b41 100644
--- a/src/com/android/settings/search2/SearchResultsAdapter.java
+++ b/src/com/android/settings/search2/SearchResultsAdapter.java
@@ -16,8 +16,10 @@
 
 package com.android.settings.search2;
 
+import android.content.Context;
 import android.support.annotation.VisibleForTesting;
 import android.support.v7.widget.RecyclerView.Adapter;
+import android.util.ArrayMap;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -26,7 +28,6 @@
 import com.android.settings.search2.ResultPayload.PayloadType;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -38,22 +39,23 @@
     public SearchResultsAdapter(SearchFragment fragment) {
         mFragment = fragment;
         mSearchResults = new ArrayList<>();
-        mResultsMap = new HashMap<>();
+        mResultsMap = new ArrayMap<>();
 
         setHasStableIds(true);
     }
 
     @Override
     public SearchViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
-        final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
-        switch (viewType) {
+        final Context context = parent.getContext();
+        final LayoutInflater inflater = LayoutInflater.from(context);
+        final View view;
+        switch(viewType) {
             case PayloadType.INTENT:
-                View view = inflater.inflate(R.layout.search_intent_item, parent, false);
+                view = inflater.inflate(R.layout.search_intent_item, parent, false);
                 return new IntentSearchViewHolder(view);
-            case PayloadType.INLINE_SLIDER:
-                return null;
             case PayloadType.INLINE_SWITCH:
-                return null;
+                view = inflater.inflate(R.layout.search_inline_switch_item, parent, false);
+                return new InlineSwitchViewHolder(view, context);
             default:
                 return null;
         }
diff --git a/src/com/android/settings/support/SupportDisclaimerDialogFragment.java b/src/com/android/settings/support/SupportDisclaimerDialogFragment.java
index 8ab607f..3a7102c 100644
--- a/src/com/android/settings/support/SupportDisclaimerDialogFragment.java
+++ b/src/com/android/settings/support/SupportDisclaimerDialogFragment.java
@@ -23,14 +23,18 @@
 import android.app.DialogFragment;
 import android.content.DialogInterface;
 import android.os.Bundle;
+import android.text.Annotation;
 import android.text.Spannable;
+import android.text.Spanned;
 import android.text.TextPaint;
+import android.text.TextUtils;
 import android.text.style.URLSpan;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.CheckBox;
 import android.widget.TextView;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
@@ -44,8 +48,8 @@
         implements DialogInterface.OnClickListener {
 
     public static final String TAG = "SupportDisclaimerDialog";
-    private static final String EXTRA_TYPE = "extra_type";
-    private static final String EXTRA_ACCOUNT = "extra_account";
+    public static final String EXTRA_TYPE = "extra_type";
+    public static final String EXTRA_ACCOUNT = "extra_account";
 
     public static SupportDisclaimerDialogFragment newInstance(Account account,
             @SupportFeatureProvider.SupportType int type) {
@@ -69,8 +73,13 @@
         final Activity activity = getActivity();
         final SupportFeatureProvider supportFeatureProvider =
                 FeatureFactory.getFactory(activity).getSupportFeatureProvider(activity);
+
+        // sets the two links that go to privacy policy and terms of service
         disclaimer.setText(supportFeatureProvider.getDisclaimerStringResId());
-        stripUnderlines((Spannable) disclaimer.getText());
+        Spannable viewText = (Spannable) disclaimer.getText();
+        stripUnderlines(viewText);
+        SystemInformationSpan.linkify(viewText, this);
+        // sets the link that launches a dialog to expose the signals we are sending
         return builder
                 .setView(content)
                 .create();
@@ -112,9 +121,11 @@
         for (URLSpan span : urls) {
             final int start = input.getSpanStart(span);
             final int end = input.getSpanEnd(span);
-            input.removeSpan(span);
-            input.setSpan(new NoUnderlineUrlSpan(span.getURL()), start, end,
-                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+            if (!TextUtils.isEmpty(span.getURL())) {
+                input.removeSpan(span);
+                input.setSpan(new NoUnderlineUrlSpan(span.getURL()), start, end,
+                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+            }
         }
     }
 
@@ -138,4 +149,69 @@
             ds.setUnderlineText(false);
         }
     }
+
+    /**
+     * A {@link URLSpan} that opens a dialog when clicked
+     */
+    public static class SystemInformationSpan extends URLSpan {
+
+        private static final String ANNOTATION_URL = "url";
+        private final DialogFragment mDialog;
+        private SupportFeatureProvider mSupport;
+
+        public SystemInformationSpan(DialogFragment parent) {
+            // sets the url to empty string so we can prevent the NoUnderlineUrlSpan from stripping
+            // this one
+            super("");
+            mSupport  = FeatureFactory.getFactory(parent.getContext())
+                    .getSupportFeatureProvider(parent.getContext());
+            mDialog = parent;
+        }
+
+        @Override
+        public void onClick(View widget) {
+            Activity activity =  mDialog.getActivity();
+            if (mSupport != null && activity != null) {
+                // launch the system info fragment
+                mSupport.launchSystemInfoFragment(mDialog.getArguments(),
+                        activity.getFragmentManager());
+
+                // dismiss this fragment
+                mDialog.dismiss();
+            }
+        }
+
+        @Override
+        public void updateDrawState(TextPaint ds) {
+            super.updateDrawState(ds);
+            // remove underline
+            ds.setUnderlineText(false);
+        }
+
+        /**
+         * This method takes a string and turns it into a url span that will launch a
+         * SupportSystemInformationDialogFragment
+         * @param msg The text to turn into a link
+         * @param parent The dialog the text is in
+         * @return A CharSequence containing the original text content as a url
+         */
+        public static CharSequence linkify(Spannable msg, DialogFragment parent) {
+            Annotation[] spans = msg.getSpans(0, msg.length(), Annotation.class);
+            for (Annotation annotation : spans) {
+                int start = msg.getSpanStart(annotation);
+                int end = msg.getSpanEnd(annotation);
+                if (ANNOTATION_URL.equals(annotation.getValue())) {
+                    SystemInformationSpan link = new SystemInformationSpan(parent);
+                    msg.removeSpan(annotation);
+                    msg.setSpan(link, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+                }
+            }
+            return msg;
+        }
+
+        @VisibleForTesting
+        public void setSupportProvider(SupportFeatureProvider prov) {
+            mSupport = prov;
+        }
+    }
 }
diff --git a/src/com/android/settings/survey/SurveyMixin.java b/src/com/android/settings/survey/SurveyMixin.java
index 5e0754a..74b7f10 100644
--- a/src/com/android/settings/survey/SurveyMixin.java
+++ b/src/com/android/settings/survey/SurveyMixin.java
@@ -62,7 +62,7 @@
                 if (provider.getSurveyExpirationDate(activity, id) <= -1) {
                     // register the receiver to show the survey on completion.
                     mReceiver = provider.createAndRegisterReceiver(activity);
-                    provider.downloadSurvey(activity, id, "fakeData");
+                    provider.downloadSurvey(activity, id, null /* data */);
                 } else {
                     provider.showSurveyIfAvailable(activity, id);
                 }
diff --git a/src/com/android/settings/system/SystemDashboardFragment.java b/src/com/android/settings/system/SystemDashboardFragment.java
index 5e0a202..b06d403 100644
--- a/src/com/android/settings/system/SystemDashboardFragment.java
+++ b/src/com/android/settings/system/SystemDashboardFragment.java
@@ -19,6 +19,7 @@
 import android.os.UserManager;
 import android.provider.SearchIndexableResource;
 
+import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
@@ -42,7 +43,7 @@
 
     @Override
     public int getMetricsCategory() {
-        return SYSTEM_CATEGORY_FRAGMENT;
+        return MetricsProto.MetricsEvent.SETTINGS_SYSTEM_CATEGORY;
     }
 
     @Override
diff --git a/tests/robotests/src/com/android/internal/hardware/AmbientDisplayConfiguration.java b/tests/robotests/src/com/android/internal/hardware/AmbientDisplayConfiguration.java
index bea9358..ffa6d96 100644
--- a/tests/robotests/src/com/android/internal/hardware/AmbientDisplayConfiguration.java
+++ b/tests/robotests/src/com/android/internal/hardware/AmbientDisplayConfiguration.java
@@ -17,6 +17,7 @@
 package com.android.internal.hardware;
 
 import android.provider.Settings;
+import android.content.Context;
 
 /**
  * Fake controller to make robolectric test compile. Should be removed when Robolectric supports
@@ -24,6 +25,8 @@
  */
 public class AmbientDisplayConfiguration {
 
+    public AmbientDisplayConfiguration(Context context) {}
+
     public boolean pulseOnPickupAvailable() {
         return false;
     }
diff --git a/tests/robotests/src/com/android/settings/PrivacySettingsTest.java b/tests/robotests/src/com/android/settings/PrivacySettingsTest.java
new file mode 100644
index 0000000..4aac314
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/PrivacySettingsTest.java
@@ -0,0 +1,60 @@
+/*
+ * 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.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class PrivacySettingsTest {
+
+    @Mock
+    private PreferenceScreen mScreen;
+    private PrivacySettings mSettings;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        when(mScreen.findPreference(PrivacySettings.BACKUP_DATA))
+                .thenReturn(mock(Preference.class));
+        when(mScreen.findPreference(PrivacySettings.CONFIGURE_ACCOUNT))
+                .thenReturn(mock(Preference.class));
+        when(mScreen.findPreference(PrivacySettings.DATA_MANAGEMENT))
+                .thenReturn(mock(Preference.class));
+        when(mScreen.findPreference(PrivacySettings.AUTO_RESTORE))
+                .thenReturn(mock(SwitchPreference.class));
+        mSettings = new PrivacySettings();
+    }
+
+    @Test
+    public void testSetPreference_noCrash() {
+        mSettings.setPreferenceReferences(mScreen);
+    }
+
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
index ba4a9e3..ff84741 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
@@ -1,6 +1,7 @@
 package com.android.settings.fuelgauge;
 
 import android.content.Context;
+import android.content.Intent;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
@@ -9,6 +10,7 @@
 import com.android.settings.testutils.FakeFeatureFactory;
 import org.junit.Before;
 import org.junit.Test;
+
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
 import org.mockito.Mock;
@@ -18,6 +20,7 @@
 
 import static com.android.settings.fuelgauge.PowerUsageBase.MENU_STATS_REFRESH;
 import static com.android.settings.fuelgauge.PowerUsageSummary.MENU_ADDITIONAL_BATTERY_INFO;
+import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -25,16 +28,22 @@
 /**
  * Unit tests for {@link PowerUsageSummary}.
  */
+// TODO: Improve this test class so that it starts up the real activity and fragment.
 @RunWith(RobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class PowerUsageSummaryTest {
 
+    private static final Intent ADDITIONAL_BATTERY_INFO_INTENT =
+            new Intent("com.example.app.ADDITIONAL_BATTERY_INFO");
+
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private Context mContext;
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private Menu mMenu;
     @Mock
-    private MenuItem mRefresh;
+    private MenuItem mRefreshMenu;
+    @Mock
+    private MenuItem mAdditionalBatteryInfoMenu;
     @Mock
     private MenuInflater mMenuInflater;
 
@@ -49,15 +58,19 @@
 
         mFragment = new TestFragment(mContext);
 
-        when(mMenu.add(Menu.NONE, PowerUsageBase.MENU_STATS_REFRESH, Menu.NONE,
+        when(mMenu.add(Menu.NONE, MENU_STATS_REFRESH, Menu.NONE,
                 R.string.menu_stats_refresh)
                 .setIcon(com.android.internal.R.drawable.ic_menu_refresh)
                 .setAlphabeticShortcut('r'))
-                .thenReturn(mRefresh);
+                .thenReturn(mRefreshMenu);
+        when(mAdditionalBatteryInfoMenu.getItemId())
+                .thenReturn(MENU_ADDITIONAL_BATTERY_INFO);
+        when(mFeatureFactory.powerUsageFeatureProvider.getAdditionalBatteryInfoIntent())
+                .thenReturn(ADDITIONAL_BATTERY_INFO_INTENT);
     }
 
     @Test
-    public void testOnCreateOptionsMenu_additionalBatteryInfoEnabled() {
+    public void testOptionsMenu_additionalBatteryInfoEnabled() {
         when(mFeatureFactory.powerUsageFeatureProvider.isAdditionalBatteryInfoEnabled())
                 .thenReturn(true);
 
@@ -65,10 +78,15 @@
 
         verify(mMenu).add(Menu.NONE, MENU_ADDITIONAL_BATTERY_INFO,
                 Menu.NONE, R.string.additional_battery_info);
+
+        mFragment.onOptionsItemSelected(mAdditionalBatteryInfoMenu);
+
+        assertThat(mFragment.mStartActivityCalled).isTrue();
+        assertThat(mFragment.mStartActivityIntent).isEqualTo(ADDITIONAL_BATTERY_INFO_INTENT);
     }
 
     @Test
-    public void testOnCreateOptionsMenu_additionalBatteryInfoDisabled() {
+    public void testOptionsMenu_additionalBatteryInfoDisabled() {
         when(mFeatureFactory.powerUsageFeatureProvider.isAdditionalBatteryInfoEnabled())
                 .thenReturn(false);
 
@@ -81,6 +99,8 @@
     public static class TestFragment extends PowerUsageSummary {
 
         private Context mContext;
+        private boolean mStartActivityCalled;
+        private Intent mStartActivityIntent;
 
         public TestFragment(Context context) {
             mContext = context;
@@ -90,5 +110,11 @@
         public Context getContext() {
             return mContext;
         }
+
+        @Override
+        public void startActivity(Intent intent) {
+            mStartActivityCalled = true;
+            mStartActivityIntent = intent;
+        }
     }
 }
diff --git a/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerPreferenceControllerTest.java
index 6a2e4ea..5f7d8b5 100644
--- a/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/DoubleTapPowerPreferenceControllerTest.java
@@ -23,6 +23,8 @@
 import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 
+import com.android.settings.search2.InlineSwitchPayload;
+import com.android.settings.search2.ResultPayload;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -91,4 +93,23 @@
 
         assertThat(mController.isSwitchPrefEnabled()).isFalse();
     }
+
+    @Test
+    public void testPreferenceController_ProperResultPayloadType() {
+        final Context context = ShadowApplication.getInstance().getApplicationContext();
+        mController = new DoubleTapPowerPreferenceController(context, null);
+        ResultPayload payload = mController.getResultPayload();
+        assertThat(payload).isInstanceOf(InlineSwitchPayload.class);
+    }
+
+    @Test
+    public void testPreferenceController_CorrectPayload() {
+        final Context context = ShadowApplication.getInstance().getApplicationContext();
+        mController = new DoubleTapPowerPreferenceController(context, null);
+        InlineSwitchPayload payload = (InlineSwitchPayload) mController.getResultPayload();
+        assertThat(payload.settingsUri).isEqualTo("camera_double_tap_power_gesture_disabled");
+        assertThat(payload.settingSource).isEqualTo(ResultPayload.SettingsSource.SECURE);
+        assertThat(payload.valueMap.get(0)).isEqualTo(true);
+        assertThat(payload.valueMap.get(1)).isEqualTo(false);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/gestures/DoubleTapScreenPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/DoubleTapScreenPreferenceControllerTest.java
index a25d34b..2f922d5 100644
--- a/tests/robotests/src/com/android/settings/gestures/DoubleTapScreenPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/DoubleTapScreenPreferenceControllerTest.java
@@ -22,6 +22,8 @@
 import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 
+import com.android.settings.search2.InlineSwitchPayload;
+import com.android.settings.search2.ResultPayload;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -79,4 +81,19 @@
 
         assertThat(mController.isSwitchPrefEnabled()).isFalse();
     }
+
+    @Test
+    public void testPreferenceController_ProperResultPayloadType() {
+        ResultPayload payload = mController.getResultPayload();
+        assertThat(payload).isInstanceOf(InlineSwitchPayload.class);
+    }
+
+    @Test
+    public void testPreferenceController_CorrectPayload() {
+        InlineSwitchPayload payload = (InlineSwitchPayload) mController.getResultPayload();
+        assertThat(payload.settingsUri).isEqualTo("doze_pulse_on_double_tap");
+        assertThat(payload.settingSource).isEqualTo(ResultPayload.SettingsSource.SECURE);
+        assertThat(payload.valueMap.get(1)).isEqualTo(true);
+        assertThat(payload.valueMap.get(0)).isEqualTo(false);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/gestures/DoubleTwistPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/DoubleTwistPreferenceControllerTest.java
index 5b02182..ad682b2 100644
--- a/tests/robotests/src/com/android/settings/gestures/DoubleTwistPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/DoubleTwistPreferenceControllerTest.java
@@ -24,6 +24,8 @@
 import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 
+import com.android.settings.search2.InlineSwitchPayload;
+import com.android.settings.search2.ResultPayload;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -111,4 +113,19 @@
 
         assertThat(mController.isSwitchPrefEnabled()).isFalse();
     }
+
+    @Test
+    public void testPreferenceController_ProperResultPayloadType() {
+        ResultPayload payload = mController.getResultPayload();
+        assertThat(payload).isInstanceOf(InlineSwitchPayload.class);
+    }
+
+    @Test
+    public void testPreferenceController_CorrectPayload() {
+        InlineSwitchPayload payload = (InlineSwitchPayload) mController.getResultPayload();
+        assertThat(payload.settingsUri).isEqualTo("camera_double_twist_to_flip_enabled");
+        assertThat(payload.settingSource).isEqualTo(ResultPayload.SettingsSource.SECURE);
+        assertThat(payload.valueMap.get(1)).isEqualTo(true);
+        assertThat(payload.valueMap.get(0)).isEqualTo(false);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/gestures/PIckupGesturePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/PIckupGesturePreferenceControllerTest.java
index 66ae679..f112b9e 100644
--- a/tests/robotests/src/com/android/settings/gestures/PIckupGesturePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/PIckupGesturePreferenceControllerTest.java
@@ -22,6 +22,8 @@
 import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 
+import com.android.settings.search2.InlineSwitchPayload;
+import com.android.settings.search2.ResultPayload;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -82,4 +84,18 @@
         assertThat(mController.isSwitchPrefEnabled()).isFalse();
     }
 
+    @Test
+    public void testPreferenceController_ProperResultPayloadType() {
+        ResultPayload payload = mController.getResultPayload();
+        assertThat(payload).isInstanceOf(InlineSwitchPayload.class);
+    }
+
+    @Test
+    public void testPreferenceController_CorrectPayload() {
+        InlineSwitchPayload payload = (InlineSwitchPayload) mController.getResultPayload();
+        assertThat(payload.settingsUri).isEqualTo("doze_pulse_on_pick_up");
+        assertThat(payload.settingSource).isEqualTo(ResultPayload.SettingsSource.SECURE);
+        assertThat(payload.valueMap.get(1)).isEqualTo(true);
+        assertThat(payload.valueMap.get(0)).isEqualTo(false);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationPreferenceControllerTest.java
index 7b34666..49d73ea 100644
--- a/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationPreferenceControllerTest.java
@@ -22,6 +22,8 @@
 import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 
+import com.android.settings.search2.InlineSwitchPayload;
+import com.android.settings.search2.ResultPayload;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -87,4 +89,19 @@
 
         assertThat(mController.isSwitchPrefEnabled()).isFalse();
     }
+
+    @Test
+    public void testPreferenceController_ProperResultPayloadType() {
+        ResultPayload payload = mController.getResultPayload();
+        assertThat(payload).isInstanceOf(InlineSwitchPayload.class);
+    }
+
+    @Test
+    public void testPreferenceController_CorrectPayload() {
+        InlineSwitchPayload payload = (InlineSwitchPayload) mController.getResultPayload();
+        assertThat(payload.settingsUri).isEqualTo("system_navigation_keys_enabled");
+        assertThat(payload.settingSource).isEqualTo(ResultPayload.SettingsSource.SECURE);
+        assertThat(payload.valueMap.get(1)).isEqualTo(true);
+        assertThat(payload.valueMap.get(0)).isEqualTo(false);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/search/DatabaseIndexingUtilsTest.java b/tests/robotests/src/com/android/settings/search/DatabaseIndexingUtilsTest.java
new file mode 100644
index 0000000..5b6824d
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/search/DatabaseIndexingUtilsTest.java
@@ -0,0 +1,130 @@
+/*
+ * 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.search;
+
+import android.content.Context;
+
+import android.util.ArrayMap;
+import com.android.internal.hardware.AmbientDisplayConfiguration;
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import com.android.settings.core.PreferenceController;
+import com.android.settings.gestures.DoubleTapPowerPreferenceController;
+import com.android.settings.gestures.DoubleTapScreenPreferenceController;
+import com.android.settings.gestures.DoubleTwistPreferenceController;
+import com.android.settings.gestures.PickupGesturePreferenceController;
+import com.android.settings.gestures.SwipeToNotificationPreferenceController;
+import com.android.settings.search2.DatabaseIndexingUtils;
+
+import com.android.settings.search2.IntentPayload;
+import com.android.settings.search2.ResultPayload;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+import java.util.Map;
+
+import static com.google.common.truth.Truth.assertThat;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class DatabaseIndexingUtilsTest {
+
+    private Context mContext;
+    @Mock
+    private AmbientDisplayConfiguration mAmbientDisplayConfiguration;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = ShadowApplication.getInstance().getApplicationContext();
+    }
+
+    @Test
+    public void testGetPreferenceControllerUriMap_BadClassName_ReturnsNull() {
+        Map map = DatabaseIndexingUtils.getPreferenceControllerUriMap("dummy", mContext);
+        assertThat(map).isNull();
+    }
+
+    @Test
+    public void testGetPreferenceControllerUriMap_NullContext_ReturnsNull() {
+        Map map = DatabaseIndexingUtils.getPreferenceControllerUriMap("dummy", null);
+        assertThat(map).isNull();
+    }
+
+    @Test
+    public void testGetPreferenceControllerUriMap_CompatibleClass_ReturnsNotNull() {
+        String className = "com.android.settings.gestures.GestureSettings";
+
+        Map map = DatabaseIndexingUtils.getPreferenceControllerUriMap(className, mContext);
+        assertThat(map).isNotNull();
+    }
+
+    @Test
+    public void testGetPreferenceControllerUriMap_CompatibleClass_ReturnsValidMap() {
+        String className = "com.android.settings.gestures.GestureSettings";
+
+        Map map = DatabaseIndexingUtils.getPreferenceControllerUriMap(className, mContext);
+        assertThat(map.get("gesture_double_twist"))
+                .isInstanceOf(DoubleTwistPreferenceController.class);
+        assertThat(map.get("gesture_swipe_down_fingerprint"))
+                .isInstanceOf(SwipeToNotificationPreferenceController.class);
+        assertThat(map.get("gesture_double_tap_screen"))
+                .isInstanceOf(DoubleTapScreenPreferenceController.class);
+        assertThat(map.get("gesture_pick_up"))
+                .isInstanceOf(PickupGesturePreferenceController.class);
+        assertThat(map.get("gesture_double_tap_power"))
+                .isInstanceOf(DoubleTapPowerPreferenceController.class);
+    }
+
+    @Test
+    public void testGetPayloadFromMap_NullMap_ReturnsNull() {
+        ResultPayload payload = DatabaseIndexingUtils.getPayloadFromUriMap(null, "");
+        assertThat(payload).isNull();
+    }
+
+    @Test
+    public void testGetPayloadFromMap_MatchingKey_ReturnsPayloa() {
+        final String key = "key";
+        PreferenceController prefController = new PreferenceController(mContext) {
+            @Override
+            public boolean isAvailable() {
+                return false;
+            }
+
+            @Override
+            public String getPreferenceKey() {
+                return key;
+            }
+
+            @Override
+            public ResultPayload getResultPayload() {
+                return new IntentPayload(null);
+            }
+        };
+        ArrayMap<String,PreferenceController> map = new ArrayMap<>();
+        map.put(key, prefController);
+
+        ResultPayload payload = DatabaseIndexingUtils.getPayloadFromUriMap(map, key);
+        assertThat(payload).isInstanceOf(IntentPayload.class);
+    }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/search/InlineSliderPayloadTest.java b/tests/robotests/src/com/android/settings/search/InlineSliderPayloadTest.java
deleted file mode 100644
index d52eb94..0000000
--- a/tests/robotests/src/com/android/settings/search/InlineSliderPayloadTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package com.android.settings.search;
-
-import android.net.Uri;
-import android.os.Parcel;
-import com.android.settings.SettingsRobolectricTestRunner;
-import com.android.settings.TestConfig;
-import com.android.settings.search2.InlineSliderPayload;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import org.robolectric.annotation.Config;
-
-import static com.google.common.truth.Truth.assertThat;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class InlineSliderPayloadTest {
-    private InlineSliderPayload mPayload;
-
-    @Test
-    public void testParcelOrdering_StaysValid() {
-        Uri uri = Uri.parse("http://www.TESTURI.com");
-        Parcel parcel = Parcel.obtain();
-
-        mPayload = new InlineSliderPayload(uri);
-        mPayload.writeToParcel(parcel, 0);
-        // Reset parcel for reading
-        parcel.setDataPosition(0);
-        InlineSliderPayload newPayload = InlineSliderPayload.CREATOR.createFromParcel(parcel);
-
-        String originalUri = mPayload.uri.toString();
-        String copiedUri = newPayload.uri.toString();
-        assertThat(originalUri).isEqualTo(copiedUri);
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/search/InlineSwitchPayloadTest.java b/tests/robotests/src/com/android/settings/search/InlineSwitchPayloadTest.java
new file mode 100644
index 0000000..701679c
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/search/InlineSwitchPayloadTest.java
@@ -0,0 +1,113 @@
+/*
+ * 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.search;
+
+import android.os.Parcel;
+import android.util.ArrayMap;
+import android.content.Context;
+
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import com.android.settings.search2.InlineSwitchPayload;
+import com.android.settings.search2.ResultPayload;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.fail;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class InlineSwitchPayloadTest {
+
+    @Test
+    public void testGetSwitch_EmptyMap_ExceptionThrown() {
+        final String uri = "test.com";
+        final int source = ResultPayload.SettingsSource.SECURE;
+
+        final Context context = ShadowApplication.getInstance().getApplicationContext();
+        InlineSwitchPayload payload = new InlineSwitchPayload(uri, source, null);
+        try {
+            payload.getSwitchValue(context);
+            fail("Should have thrown exception for null map");
+        } catch (IllegalStateException e) {
+            assertThat(e).isNotNull();
+        }
+    }
+
+    @Test
+    public void testGetSwitch_BadMap_ExceptionThrown() {
+        final String uri = "test.com";
+        final int source = ResultPayload.SettingsSource.SECURE;
+        final ArrayMap<Integer, Boolean> map = new ArrayMap<>();
+
+        final Context context = ShadowApplication.getInstance().getApplicationContext();
+        InlineSwitchPayload payload = new InlineSwitchPayload(uri, source, map);
+        try {
+            payload.getSwitchValue(context);
+            fail("Should have thrown exception for bad map");
+        } catch (IllegalStateException e) {
+            assertThat(e).isNotNull();
+        }
+    }
+
+    @Test
+    public void testConstructor_DataRetained() {
+        final String uri = "test.com";
+        final int type = ResultPayload.PayloadType.INLINE_SWITCH;
+        final int source = ResultPayload.SettingsSource.SECURE;
+        final ArrayMap<Integer, Boolean> map = new ArrayMap<>();
+        map.put(1, true);
+        map.put(0, false);
+
+        InlineSwitchPayload payload = new InlineSwitchPayload(uri, source, map);
+        assertThat(payload.settingsUri).isEqualTo(uri);
+        assertThat(payload.inlineType).isEqualTo(type);
+        assertThat(payload.settingSource).isEqualTo(source);
+        assertThat(payload.valueMap.get(1)).isTrue();
+        assertThat(payload.valueMap.get(0)).isFalse();
+    }
+
+    @Test
+    public void testParcelConstructor_DataRetained() {
+        String uri = "test.com";
+        int type = ResultPayload.PayloadType.INLINE_SWITCH;
+        int source = ResultPayload.SettingsSource.SECURE;
+        final ArrayMap<Integer, Boolean> map = new ArrayMap<>();
+        map.put(1, true);
+        map.put(0, false);
+
+        Parcel parcel = Parcel.obtain();
+        parcel.writeString(uri);
+        parcel.writeInt(type);
+        parcel.writeInt(source);
+        parcel.writeMap(map);
+        parcel.setDataPosition(0);
+
+        InlineSwitchPayload payload = InlineSwitchPayload.CREATOR.createFromParcel(parcel);
+        assertThat(payload.settingsUri).isEqualTo(uri);
+        assertThat(payload.inlineType).isEqualTo(type);
+        assertThat(payload.settingSource).isEqualTo(source);
+        assertThat(payload.valueMap.get(1)).isTrue();
+        assertThat(payload.valueMap.get(0)).isFalse();
+    }
+
+
+}
diff --git a/tests/robotests/src/com/android/settings/search/InlineSwitchViewHolderTest.java b/tests/robotests/src/com/android/settings/search/InlineSwitchViewHolderTest.java
new file mode 100644
index 0000000..efbad2f
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/search/InlineSwitchViewHolderTest.java
@@ -0,0 +1,106 @@
+/*
+ * 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.search;
+
+import android.app.Fragment;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.view.LayoutInflater;
+import android.view.View;
+
+import com.android.settings.R;
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import com.android.settings.search2.InlineSwitchPayload;
+import com.android.settings.search2.InlineSwitchViewHolder;
+import com.android.settings.search2.IntentPayload;
+import com.android.settings.search2.SearchResult;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+import java.util.ArrayList;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.when;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class InlineSwitchViewHolderTest {
+
+    private static final String TITLE = "title";
+    private static final String SUMMARY = "summary";
+
+    @Mock
+    private Fragment mFragment;
+
+    @Mock
+    private InlineSwitchPayload mPayload;
+    private InlineSwitchViewHolder mHolder;
+    private Drawable mIcon;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        final Context context = ShadowApplication.getInstance().getApplicationContext();
+        View view = LayoutInflater.from(context).inflate(R.layout.search_inline_switch_item, null);
+        mHolder = new InlineSwitchViewHolder(view, context);
+
+        mIcon = context.getDrawable(R.drawable.ic_search_history);
+    }
+
+    @Test
+    public void testConstructor_MembersNotNull() {
+        assertThat(mHolder.titleView).isNotNull();
+        assertThat(mHolder.summaryView).isNotNull();
+        assertThat(mHolder.iconView).isNotNull();
+        assertThat(mHolder.switchView).isNotNull();
+    }
+
+    @Test
+    public void testBindViewElements_AllUpdated() {
+        when(mPayload.getSwitchValue(any(Context.class))).thenReturn(true);
+        SearchResult result = getSearchResult();
+        mHolder.onBind(mFragment, result);
+        mHolder.switchView.setChecked(true);
+
+        assertThat(mHolder.titleView.getText()).isEqualTo(TITLE);
+        assertThat(mHolder.summaryView.getText()).isEqualTo(SUMMARY);
+        assertThat(mHolder.iconView.getDrawable()).isEqualTo(mIcon);
+        assertThat(mHolder.switchView.isChecked()).isTrue();
+    }
+
+    private SearchResult getSearchResult() {
+        SearchResult.Builder builder = new SearchResult.Builder();
+        builder.addTitle(TITLE)
+                .addSummary(SUMMARY)
+                .addRank(1)
+                .addPayload(new InlineSwitchPayload("", 0, null))
+                .addBreadcrumbs(new ArrayList<String>())
+                .addIcon(mIcon)
+                .addPayload(mPayload);
+
+        return builder.build();
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java b/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java
index 805c7cb..ed503d8 100644
--- a/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java
+++ b/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java
@@ -93,7 +93,7 @@
                 .addSummary(SUMMARY)
                 .addRank(1)
                 .addPayload(new IntentPayload(null))
-                .addBreadcrumbs(new ArrayList<>())
+                .addBreadcrumbs(new ArrayList<String>())
                 .addIcon(mIcon);
 
         return builder.build();
diff --git a/tests/robotests/src/com/android/settings/search/SearchAdapterTest.java b/tests/robotests/src/com/android/settings/search/SearchAdapterTest.java
index 0756d3f..3627898 100644
--- a/tests/robotests/src/com/android/settings/search/SearchAdapterTest.java
+++ b/tests/robotests/src/com/android/settings/search/SearchAdapterTest.java
@@ -21,17 +21,22 @@
 import android.content.Context;
 import android.graphics.drawable.Drawable;
 
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
 import com.android.settings.R;
 import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
 import com.android.settings.search2.DatabaseResultLoader;
+import com.android.settings.search2.InlineSwitchViewHolder;
 import com.android.settings.search2.IntentPayload;
+import com.android.settings.search2.IntentSearchViewHolder;
 import com.android.settings.search2.ResultPayload;
 import com.android.settings.search2.SearchFragment;
 import com.android.settings.search2.SearchResult;
 import com.android.settings.search2.SearchResult.Builder;
 import com.android.settings.search2.SearchResultsAdapter;
 
+import com.android.settings.search2.SearchViewHolder;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -39,6 +44,8 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
 import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.shadows.ShadowViewGroup;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -63,6 +70,47 @@
         mLoaderClassName = DatabaseResultLoader.class.getName();
     }
 
+    @Test
+    public void testNoResultsAdded_EmptyListReturned() {
+        List<SearchResult> updatedResults = mAdapter.getSearchResults();
+        assertThat(updatedResults).isEmpty();
+    }
+
+    @Test
+    public void testSingleSourceMerge_ExactCopyReturned() {
+        ArrayList<SearchResult> intentResults = getIntentSampleResults();
+        mAdapter.mergeResults(intentResults, mLoaderClassName);
+
+        List<SearchResult> updatedResults = mAdapter.getSearchResults();
+        assertThat(updatedResults).containsAllIn(intentResults);
+    }
+
+    @Test
+    public void testDuplicateSourceMerge_ExactCopyReturned() {
+        ArrayList<SearchResult> intentResults = getIntentSampleResults();
+        mAdapter.mergeResults(intentResults, mLoaderClassName);
+        mAdapter.mergeResults(intentResults, mLoaderClassName);
+
+        List<SearchResult> updatedResults = mAdapter.getSearchResults();
+        assertThat(updatedResults).containsAllIn(intentResults);
+    }
+
+    @Test
+    public void testCreatViewHolder_ReturnsIntentResult() {
+        ViewGroup group = new FrameLayout(mContext);
+        SearchViewHolder view = mAdapter.onCreateViewHolder(group,
+                ResultPayload.PayloadType.INTENT);
+        assertThat(view).isInstanceOf(IntentSearchViewHolder.class);
+    }
+
+    @Test
+    public void testCreatViewHolder_ReturnsInlineSwitchResult() {
+        ViewGroup group = new FrameLayout(mContext);
+        SearchViewHolder view = mAdapter.onCreateViewHolder(group,
+                ResultPayload.PayloadType.INLINE_SWITCH);
+        assertThat(view).isInstanceOf(InlineSwitchViewHolder.class);
+    }
+
     private ArrayList<SearchResult> getIntentSampleResults() {
         ArrayList<SearchResult> sampleResults = new ArrayList<>();
         ArrayList<String> breadcrumbs = new ArrayList<>();
@@ -84,31 +132,4 @@
         sampleResults.add(builder.build());
         return sampleResults;
     }
-
-
-    @Test
-    public void testNoResultsAdded_EmptyListReturned() {
-        List<SearchResult> updatedResults = mAdapter.getSearchResults();
-        assertThat(updatedResults).isEmpty();
-    }
-
-
-    @Test
-    public void testSingleSourceMerge_ExactCopyReturned() {
-        ArrayList<SearchResult> intentResults = getIntentSampleResults();
-        mAdapter.mergeResults(intentResults, mLoaderClassName);
-
-        List<SearchResult> updatedResults = mAdapter.getSearchResults();
-        assertThat(updatedResults).containsAllIn(intentResults);
-    }
-
-    @Test
-    public void testDuplicateSourceMerge_ExactCopyReturned() {
-        ArrayList<SearchResult> intentResults = getIntentSampleResults();
-        mAdapter.mergeResults(intentResults, mLoaderClassName);
-        mAdapter.mergeResults(intentResults, mLoaderClassName);
-
-        List<SearchResult> updatedResults = mAdapter.getSearchResults();
-        assertThat(updatedResults).containsAllIn(intentResults);
-    }
 }
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/search/DatabaseResultLoaderTest.java b/tests/robotests/src/com/android/settings/search2/CursorToSearchResultConverterTest.java
similarity index 66%
rename from tests/robotests/src/com/android/settings/search/DatabaseResultLoaderTest.java
rename to tests/robotests/src/com/android/settings/search2/CursorToSearchResultConverterTest.java
index 1df7b1f..98b250d 100644
--- a/tests/robotests/src/com/android/settings/search/DatabaseResultLoaderTest.java
+++ b/tests/robotests/src/com/android/settings/search2/CursorToSearchResultConverterTest.java
@@ -15,7 +15,7 @@
  *
  */
 
-package com.android.settings.search;
+package com.android.settings.search2;
 
 import android.app.Activity;
 import android.content.Context;
@@ -23,16 +23,13 @@
 import android.database.MatrixCursor;
 import android.graphics.drawable.Drawable;
 
+import android.util.ArrayMap;
 import com.android.settings.R;
 import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.SubSettings;
 import com.android.settings.TestConfig;
 import com.android.settings.gestures.GestureSettings;
-import com.android.settings.search2.DatabaseResultLoader;
-import com.android.settings.search2.IntentPayload;
-import com.android.settings.search2.ResultPayload;
 import com.android.settings.search2.ResultPayload.PayloadType;
-import com.android.settings.search2.SearchResult;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -47,12 +44,14 @@
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class DatabaseResultLoaderTest {
-    private DatabaseResultLoader mLoader;
+public class CursorToSearchResultConverterTest {
+
+    private CursorToSearchResultConverter mConverter;
 
     private static final String[] COLUMNS = new String[]{"rank", "title", "summary_on",
             "summary off", "entries", "keywords", "class name", "screen title", "icon",
-            "intent action", "target package", "target class", "enabled", "key", "user id"};
+            "intent action", "target package", "target class", "enabled", "key",
+            "payload_type", "payload"};
 
     private static final String[] TITLES = new String[]{"title1", "title2", "title3"};
     private static final String SUMMARY = "SUMMARY";
@@ -66,24 +65,24 @@
     public void setUp() {
         Context context = Robolectric.buildActivity(Activity.class).get();
         mDrawable = context.getDrawable(mIcon);
-        mLoader = new DatabaseResultLoader(context, "");
+        mConverter = new CursorToSearchResultConverter(context);
     }
 
     @Test
     public void testParseNullResults_ReturnsNull() {
-        List<SearchResult> results = mLoader.parseCursorForSearch(null);
+        List<SearchResult> results = mConverter.convertCursor(null);
         assertThat(results).isNull();
     }
 
     @Test
     public void testParseCursor_NotNull() {
-        List<SearchResult> results = mLoader.parseCursorForSearch(getDummyCursor());
+        List<SearchResult> results = mConverter.convertCursor(getDummyCursor());
         assertThat(results).isNotNull();
     }
 
     @Test
     public void testParseCursor_MatchesRank() {
-        List<SearchResult> results = mLoader.parseCursorForSearch(getDummyCursor());
+        List<SearchResult> results = mConverter.convertCursor(getDummyCursor());
         for (int i = 0; i < EXAMPLES; i++) {
             assertThat(results.get(i).rank).isEqualTo(i);
         }
@@ -91,7 +90,7 @@
 
     @Test
     public void testParseCursor_MatchesTitle() {
-        List<SearchResult> results = mLoader.parseCursorForSearch(getDummyCursor());
+        List<SearchResult> results = mConverter.convertCursor(getDummyCursor());
         for (int i = 0; i < EXAMPLES; i++) {
             assertThat(results.get(i).title).isEqualTo(TITLES[i]);
         }
@@ -99,7 +98,7 @@
 
     @Test
     public void testParseCursor_MatchesSummary() {
-        List<SearchResult> results = mLoader.parseCursorForSearch(getDummyCursor());
+        List<SearchResult> results = mConverter.convertCursor(getDummyCursor());
         for (int i = 0; i < EXAMPLES; i++) {
             assertThat(results.get(i).summary).isEqualTo(SUMMARY);
         }
@@ -107,7 +106,7 @@
 
     @Test
     public void testParseCursor_MatchesIcon() {
-        List<SearchResult> results = mLoader.parseCursorForSearch(getDummyCursor());
+        List<SearchResult> results = mConverter.convertCursor(getDummyCursor());
         for (int i = 0; i < EXAMPLES; i++) {
             Drawable resultDrawable = results.get(i).icon;
             assertThat(resultDrawable.toString()).isEqualTo(mDrawable.toString());
@@ -116,7 +115,7 @@
 
     @Test
     public void testParseCursor_NoIcon() {
-        List<SearchResult> results = mLoader.parseCursorForSearch(
+        List<SearchResult> results = mConverter.convertCursor(
                 getDummyCursor(false /* hasIcon */));
         for (int i = 0; i < EXAMPLES; i++) {
             Drawable resultDrawable = results.get(i).icon;
@@ -126,7 +125,7 @@
 
     @Test
     public void testParseCursor_MatchesPayloadType() {
-        List<SearchResult> results = mLoader.parseCursorForSearch(getDummyCursor());
+        List<SearchResult> results = mConverter.convertCursor(getDummyCursor());
         ResultPayload payload;
         for (int i = 0; i < EXAMPLES; i++) {
             payload = results.get(i).payload;
@@ -153,9 +152,10 @@
                 BLANK,   // target class
                 BLANK,   // enabled
                 BLANK,   // key
-                BLANK    // user id
+                0,       // Payload Type
+                null     // Payload
         });
-        List<SearchResult> results = mLoader.parseCursorForSearch(cursor);
+        List<SearchResult> results = mConverter.convertCursor(cursor);
         IntentPayload payload = (IntentPayload) results.get(0).payload;
         Intent intent = payload.intent;
         assertThat(intent.getComponent().getClassName()).isEqualTo(SubSettings.class.getName());
@@ -163,7 +163,7 @@
 
     @Test
     public void testParseCursor_MatchesIntentPayload() {
-        List<SearchResult> results = mLoader.parseCursorForSearch(getDummyCursor());
+        List<SearchResult> results = mConverter.convertCursor(getDummyCursor());
         IntentPayload payload;
         for (int i = 0; i < EXAMPLES; i++) {
             payload = (IntentPayload) results.get(i).payload;
@@ -172,6 +172,46 @@
         }
     }
 
+    @Test
+    public void testParseCursor_MatchesInlineSwitchPayload() {
+        MatrixCursor cursor = new MatrixCursor(COLUMNS);
+        final String BLANK = "";
+        final String uri = "test.com";
+        final int type = ResultPayload.PayloadType.INLINE_SWITCH;
+        final int source = ResultPayload.SettingsSource.SECURE;
+        final ArrayMap<Integer, Boolean> map = new ArrayMap<>();
+        map.put(1, true);
+        map.put(0, false);
+        final InlineSwitchPayload payload = new InlineSwitchPayload(uri, source, map);
+
+        cursor.addRow(new Object[]{
+                0,       // rank
+                TITLES[0],
+                SUMMARY,
+                SUMMARY, // summary off
+                BLANK,   // entries
+                BLANK,   // Keywords
+                GestureSettings.class.getName(),
+                BLANK,   // screen title
+                null,    // icon
+                BLANK,   // action
+                null,    // target package
+                BLANK,   // target class
+                BLANK,   // enabled
+                BLANK,   // key
+                type,    // Payload Type
+                ResultPayloadUtils.marshall(payload) // Payload
+        });
+        List<SearchResult> results = mConverter.convertCursor(cursor);
+        InlineSwitchPayload newPayload = (InlineSwitchPayload) results.get(0).payload;
+
+        assertThat(newPayload.settingsUri).isEqualTo(uri);
+        assertThat(newPayload.inlineType).isEqualTo(type);
+        assertThat(newPayload.settingSource).isEqualTo(source);
+        assertThat(newPayload.valueMap.get(1)).isTrue();
+        assertThat(newPayload.valueMap.get(0)).isFalse();
+    }
+
     private MatrixCursor getDummyCursor() {
         return getDummyCursor(true /* hasIcon */);
     }
@@ -196,7 +236,10 @@
             item.add(BLANK); // target class
             item.add(BLANK); // enabled
             item.add(BLANK); // key
-            item.add(BLANK); // user id
+                             // Note there is no user id. This is omitted because it is not being
+                             // queried. Should the queries change, so should this method.
+            item.add(Integer.toString(0));     // Payload Type
+            item.add(null); // Payload
 
             cursor.addRow(item);
         }