diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 10b91cb..7b853cc 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -272,7 +272,7 @@
                 android:configChanges="orientation|keyboardHidden|screenSize"
                 android:parentActivityName="Settings$WifiSettingsActivity">
             <intent-filter android:priority="1">
-                <action android:name="android.settings.CONFIGURE_WIFI_SETTINGS" />
+                <action android:name="android.settings.WIFI_IP_SETTINGS" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
             <intent-filter>
diff --git a/res/drawable/ic_apps_vd_theme_24.xml b/res/drawable/ic_apps_vd_theme_24.xml
new file mode 100644
index 0000000..ba59e83
--- /dev/null
+++ b/res/drawable/ic_apps_vd_theme_24.xml
@@ -0,0 +1,25 @@
+<!--
+    Copyright (C) 2017 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0"
+        android:tint="?android:attr/colorControlNormal">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M4,8h4L8,4L4,4v4zM10,20h4v-4h-4v4zM4,20h4v-4L4,16v4zM4,14h4v-4L4,10v4zM10,14h4v-4h-4v4zM16,4v4h4L20,4h-4zM10,8h4L14,4h-4v4zM16,14h4v-4h-4v4zM16,20h4v-4h-4v4z"/>
+</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_folder_vd_theme_24.xml b/res/drawable/ic_folder_vd_theme_24.xml
new file mode 100644
index 0000000..0d27773
--- /dev/null
+++ b/res/drawable/ic_folder_vd_theme_24.xml
@@ -0,0 +1,25 @@
+<!--
+    Copyright (C) 2017 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0"
+        android:tint="?android:attr/colorControlNormal">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M10,4H4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8c0,-1.1 -0.9,-2 -2,-2h-8l-2,-2z"/>
+</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_music_note_vd_theme_24.xml b/res/drawable/ic_music_note_vd_theme_24.xml
new file mode 100644
index 0000000..f31b023
--- /dev/null
+++ b/res/drawable/ic_music_note_vd_theme_24.xml
@@ -0,0 +1,25 @@
+<!--
+    Copyright (C) 2017 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0"
+        android:tint="?android:attr/colorControlNormal">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M12,3v10.55c-0.59,-0.34 -1.27,-0.55 -2,-0.55 -2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4V7h4V3h-6z"/>
+</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_photo_library_vd_theme_24.xml b/res/drawable/ic_photo_library_vd_theme_24.xml
new file mode 100644
index 0000000..3cd97fc
--- /dev/null
+++ b/res/drawable/ic_photo_library_vd_theme_24.xml
@@ -0,0 +1,25 @@
+<!--
+    Copyright (C) 2017 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0"
+        android:tint="?android:attr/colorControlNormal">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M22,16L22,4c0,-1.1 -0.9,-2 -2,-2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2zM11,12l2.03,2.71L16,11l4,5L8,16l3,-4zM2,6v14c0,1.1 0.9,2 2,2h14v-2L4,20L4,6L2,6z"/>
+</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_system_update_vd_theme_24.xml b/res/drawable/ic_system_update_vd_theme_24.xml
new file mode 100644
index 0000000..d68ea13
--- /dev/null
+++ b/res/drawable/ic_system_update_vd_theme_24.xml
@@ -0,0 +1,25 @@
+<!--
+    Copyright (C) 2017 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0"
+        android:tint="?android:attr/colorControlNormal">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M17,1.01L7,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,3c0,-1.1 -0.9,-1.99 -2,-1.99zM17,19L7,19L7,5h10v14zM16,13h-3L13,8h-2v5L8,13l4,4 4,-4z"/>
+</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_videogame_vd_theme_24.xml b/res/drawable/ic_videogame_vd_theme_24.xml
new file mode 100644
index 0000000..8cb9c1c
--- /dev/null
+++ b/res/drawable/ic_videogame_vd_theme_24.xml
@@ -0,0 +1,25 @@
+<!--
+    Copyright (C) 2017 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0"
+        android:tint="?android:attr/colorControlNormal">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M21,6L3,6c-1.1,0 -2,0.9 -2,2v8c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,8c0,-1.1 -0.9,-2 -2,-2zM11,13L8,13v3L6,16v-3L3,13v-2h3L6,8h2v3h3v2zM15.5,15c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM19.5,12c-0.83,0 -1.5,-0.67 -1.5,-1.5S18.67,9 19.5,9s1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5z"/>
+</vector>
\ No newline at end of file
diff --git a/res/layout/storage_item.xml b/res/layout/storage_item.xml
index 520f5ce..33f4f9e 100644
--- a/res/layout/storage_item.xml
+++ b/res/layout/storage_item.xml
@@ -15,22 +15,41 @@
 -->
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical"
-    android:minHeight="?android:attr/listPreferredItemHeightSmall"
-    android:gravity="center_vertical"
-    android:paddingStart="@dimen/preference_no_icon_padding_start"
-    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:paddingTop="16dip"
-    android:paddingBottom="16dip"
-    android:background="?android:attr/selectableItemBackground">
+              android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:orientation="vertical"
+              android:minHeight="?android:attr/listPreferredItemHeightSmall"
+              android:gravity="center_vertical"
+              android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+              android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+              android:paddingTop="16dip"
+              android:paddingBottom="16dip"
+              android:background="?android:attr/selectableItemBackground">
 
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        android:gravity="center_vertical"
         android:orientation="horizontal">
 
+        <LinearLayout
+            android:id="@android:id/icon_frame"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:gravity="start|center_vertical"
+            android:minWidth="60dp"
+            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="24dp"
+                android:maxHeight="24dp"/>
+        </LinearLayout>
+
         <TextView
             android:id="@android:id/title"
             android:layout_width="0dp"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 43313fb..9d46ebf 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -744,6 +744,12 @@
     <string name="security_settings_title">Security &amp; screen lock</string>
     <!-- Security Settings screen setting option title for the item to take you to the encryption and credential screen -->
     <string name="encryption_and_credential_settings_title">Encryption &amp; credentials</string>
+    <!-- Security Settings screen Encryption and crendential summary -->
+    <string name="encryption_and_credential_settings_summary">Phone encrypted</string>
+    <!-- Security Settings screen setting option title for the item to take you to the lock screen preference screen [CHAR LIMIT=60] -->
+    <string name="lockscreen_settings_title">Lock screen preferences</string>
+    <!-- Security Settings screen setting option summary for the item to take you to the lock screen preference screen -->
+    <string name="lockscreen_settings_summary">Show all notification content</string>
 
     <!-- Main Settings screen setting option summary text for the item tot ake you to the security and location screen -->
     <string name="security_settings_summary">Set My Location, screen unlock, SIM card lock, credential storage lock</string>
@@ -1065,6 +1071,12 @@
     <!--  Title for PreferenceScreen to launch picker for security method when there is none [CHAR LIMIT=22] -->
     <string name="unlock_set_unlock_launch_picker_title">Screen lock</string>
 
+    <!--  Summary for PreferenceScreen to launch picker for security method when there is none [CHAR LIMIT=NONE] -->
+    <string name="unlock_set_unlock_launch_picker_summary_lock_immediately"><xliff:g id="unlock_method" example="PIN">%1$s</xliff:g> / Immediately after sleep</string>
+
+    <!--  Summary for PreferenceScreen to launch picker for security method when there is none [CHAR LIMIT=NONE] -->
+    <string name="unlock_set_unlock_launch_picker_summary_lock_after_timeout"><xliff:g id="unlock_method" example="PIN">%1$s</xliff:g> / <xliff:g id="timeout_string">%2$s</xliff:g> after sleep</string>
+
     <!--  Profile Security lock settings --><skip />
     <!--  Title for PreferenceScreen to launch picker for security method for the managed profile when there is none [CHAR LIMIT=22] -->
     <string name="unlock_set_unlock_launch_picker_title_profile">Work profile lock</string>
@@ -1316,8 +1328,14 @@
     <!-- Summary shown when trust agent settings is disabled because the user hasn't set up primary security -->
     <string name="disabled_because_no_backup_security">To use, first set a screen lock</string>
 
-    <!-- Summary of preference to manage device policies -->
-    <string name="manage_trust_agents_summary">View or deactivate trust agents</string>
+    <!-- Summary of preference to manage device policies when there is no trust agents-->
+    <string name="manage_trust_agents_summary">None</string>
+
+    <!-- Summary of preference to manage device policies when there is trust agent-->
+    <plurals name="manage_trust_agents_summary_on">
+        <item quantity="one">1 active trust agent</item>
+        <item quantity="other"><xliff:g id="count" example="3">%d</xliff:g> active trust agents</item>
+    </plurals>
 
     <!-- Bluetooth settings -->
     <!-- Bluetooth settings check box title on Main Settings screen -->
@@ -1593,11 +1611,11 @@
     <!-- Checkbox title for option to notify user when open networks are nearby -->
     <string name="wifi_notify_open_networks">Open network notification</string>
     <!-- Checkbox summary for option to notify user when open networks are nearby-->
-    <string name="wifi_notify_open_networks_summary">Notify when a high\u2011quality open network is available that may require sign\u2011in</string>
+    <string name="wifi_notify_open_networks_summary">Notify when a high\u2011quality public network is available</string>
     <!-- Checkbox title for option to enable Wi-Fi when saved networks are nearby -->
-    <string name="wifi_wakeup">Turn Wi\u2011Fi back on</string>
+    <string name="wifi_wakeup">Turn on Wi\u2011Fi automatically</string>
     <!-- Checkbox summary for option to enable Wi-Fi when high quality saved networks are nearby-->
-    <string name="wifi_wakeup_summary">Automatically turn on Wi\u2011Fi near high\u2011quality saved networks</string>
+    <string name="wifi_wakeup_summary">Wi\u2011Fi will turn back on near high\u2011quality saved networks, like your home network</string>
     <!-- Checkbox title for option to toggle poor network detection -->
     <string name="wifi_poor_network_detection">Avoid poor connections</string>
     <!-- Checkbox summary for option to toggle poor network detection -->
@@ -1607,7 +1625,7 @@
     <!-- Checkbox title for option to connect to open Wi-Fi automatically [CHAR LIMIT=40] -->
     <string name="use_open_wifi_automatically_title">Connect to open networks</string>
     <!-- Checkbox summary for option to connect to open Wi-Fi automatically  [CHAR LIMIT=100] -->
-    <string name="use_open_wifi_automatically_summary">Automatically connect to high\u2011quality open networks </string>
+    <string name="use_open_wifi_automatically_summary">Automatically connect to high\u2011quality public networks</string>
     <!-- Preference title for option to install certificates -->
     <string name="wifi_install_credentials">Install certificates</string>
     <!-- Message to describe "Wi-Fi scan always available feature" when Wi-Fi is off. The
@@ -1643,6 +1661,10 @@
     <string name="wifi_add_network">Add network</string>
     <!-- Action bar title to open additional Wi-Fi settings-->
     <string name="wifi_configure_settings_preference_title">Wi\u2011Fi preferences</string>
+    <!-- Summary for Wi-Fi Preferences that explains that Wi-Fi will be enabled when high quality saved networks are nearby-->
+    <string name="wifi_configure_settings_preference_summary_wakeup_on">Wi\u2011Fi turns back on automatically</string>
+    <!-- Summary for Wi-Fi Preferences that explains that Wi-Fi will not automatically be enabled when high quality saved networks are nearby-->
+    <string name="wifi_configure_settings_preference_summary_wakeup_off">Wi\u2011Fi doesn\u0027t turn back on automatically</string>
     <!-- Header for the list of wifi networks-->
     <string name="wifi_access_points">Wi\u2011Fi networks</string>
     <!-- Menu option to do WPS Push Button [CHAR LIMIT=25]-->
@@ -1828,6 +1850,11 @@
     <!-- Wi-Fi Advanced Settings --> <skip />
     <!-- Wi-Fi settings screen, Saved networks, settings section.  This is a header shown above Saved networks wifi settings. [CHAR LIMIT=30] -->
     <string name="wifi_saved_access_points_titlebar">Saved networks</string>
+    <!-- Wi-Fi settings screen, Saved networks summary.  This shows below the "Saved networks" item and indicates the number of networks a user has saved. -->
+    <plurals name="wifi_saved_access_points_summary">
+        <item quantity="one">1 network</item>
+        <item quantity="other">%d networks</item>
+    </plurals>
     <!-- Wi-Fi settings screen, advanced, settings section.  This is a header shown above advanced wifi settings. [CHAR LIMIT=30] -->
     <string name="wifi_advanced_titlebar">Advanced Wi\u2011Fi</string>
     <!-- Wi-Fi settings screen, configure, settings section.  This is a header shown above configure wifi settings. [CHAR LIMIT=30] -->
@@ -2293,7 +2320,7 @@
     <!-- [CHAR LIMIT=40] Display settings screen, setting option name to change whether the device wakes up when a lift gesture is detected. -->
     <string name="lift_to_wake_title">Lift to wake</string>
     <!-- [CHAR LIMIT=30] Display settings screen, setting option name to change whether the ambient display feature is enabled. -->
-    <string name="doze_title">Ambient display</string>
+    <string name="doze_title">Incoming notification screen</string>
     <!-- [CHAR LIMIT=NONE] Display settings screen, setting description for the ambient display feature. -->
     <string name="doze_summary">Wake screen when you receive notifications</string>
     <!-- [CHAR LIMIT=30] Sound & display settings screen, setting option name to change font size -->
@@ -2305,8 +2332,12 @@
 
     <!-- SIM lock settings title  [CHAR LIMIT=40] -->
     <string name="sim_lock_settings">SIM card lock settings</string>
-    <!-- Security & location settings screen, setting option name  [CHAR LIMIT=40] -->
-    <string name="sim_lock_settings_category">Set up SIM card lock</string>
+    <!-- Security & screen lock settings screen, SIM card lock setting option name  [CHAR LIMIT=40] -->
+    <string name="sim_lock_settings_category">SIM card lock</string>
+    <!-- Security & screen lock settings screen, SIM card lock setting summary when off [CHAR LIMIT=NONE] -->
+    <string name="sim_lock_settings_summary_off">Off</string>
+    <!-- Security & screen lock settings screen, SIM card lock setting summary when on [CHAR LIMIT=NONE] -->
+    <string name="sim_lock_settings_summary_on">Locked</string>
     <!-- Security & location settings screen, section heading for settings related to sim card locking  [CHAR LIMIT=40] -->
     <string name="sim_lock_settings_title">SIM card lock</string>
     <!-- SIM card lock settings screen, setting check box label  [CHAR LIMIT=40] -->
@@ -2704,7 +2735,7 @@
 \n\nTo see the visible contents of this <xliff:g id="name" example="SD card">^1</xliff:g>, tap Explore.</string>
 
     <!-- Body of dialog informing user about the storage used by the Android System [CHAR LIMIT=NONE]-->
-    <string name="storage_detail_dialog_system">System includes files that Android can\u2019t display individually.</string>
+    <string name="storage_detail_dialog_system">System includes files used to run Android version <xliff:g id="version" example="8.0">%s</xliff:g></string>
 
     <!-- Body of dialog informing user about other users on a storage device [CHAR LIMIT=NONE]-->
     <string name="storage_detail_dialog_user"><xliff:g id="user" example="Guest user">^1</xliff:g> may have saved photos, music, apps, or other data, using <xliff:g id="size" example="1.2 GB">^2</xliff:g> of storage.
@@ -3044,7 +3075,7 @@
     <string name="sms_change_default_no_previous_dialog_text" translatable="true">Use <xliff:g id="new_app">%s</xliff:g> as your SMS app?</string>
 
     <!-- Network Scorer Picker title [CHAR LIMIT=40]-->
-    <string name="network_scorer_picker_title">Network Rating Provider</string>
+    <string name="network_scorer_picker_title">Network rating provider</string>
     <string name="network_scorer_picker_none_preference">None</string>
 
     <!-- Wifi Assistant change wi-fi assistant title.  [CHAR LIMIT=40] -->
@@ -4240,12 +4271,12 @@
     <string name="print_settings">Printing</string>
 
     <!-- Print setting summary in settings screen [CHAR LIMIT=50] -->
-    <string name="print_settings_summary_no_service">No print service</string>
+    <string name="print_settings_summary_no_service">Off</string>
 
     <!-- Print setting summary in settings screen [CHAR LIMIT=50] -->
     <plurals name="print_settings_summary">
-        <item quantity="one">1 print service</item>
-        <item quantity="other"><xliff:g id="count">%1$d</xliff:g> print services</item>
+        <item quantity="one">1 print service on</item>
+        <item quantity="other"><xliff:g id="count">%1$d</xliff:g> print services on</item>
     </plurals>
 
     <!-- Title for print service settings screen [CHAR LIMIT=25] -->
@@ -6072,9 +6103,7 @@
     handle actions such as open web page, making phone calls, default SMS apps [CHAR  LIMIT=40]-->
     <string name="app_default_dashboard_title">Default apps</string>
     <!-- Summary text for system preference tile, showing important setting items under system setting [CHAR LIMIT=NONE]-->
-    <string name="system_dashboard_summary" product="default">Languages, backup, updates, about phone</string>
-    <!-- Summary text for system preference tile, showing important setting items under system setting [CHAR LIMIT=NONE]-->
-    <string name="system_dashboard_summary" product="tablet">Languages, backup, updates, about device</string>
+    <string name="system_dashboard_summary">Languages, time, backup, updates</string>
 
     <!-- Search strings -->
     <!-- Text to describe the search results fragment title [CHAR LIMIT=16] -->
@@ -6165,7 +6194,7 @@
     <string name="sound_settings_summary">Ring volume at <xliff:g id="percentage" example="2%">%1$s</xliff:g></string>
 
     <!-- Summary for sound settings, explaining a few important settings under it [CHAR LIMIT=NONE]-->
-    <string name="sound_dashboard_summary">Volume, vibration, Do not disturb</string>
+    <string name="sound_dashboard_summary">Volume, vibration, Do Not Disturb</string>
 
     <!-- Sound: Dashboard summary indicating the volume of ringtone when at 0% with vibrate enabled. [CHAR LIMIT=100] -->
     <string name="sound_settings_summary_vibrate">Ringer set to vibrate</string>
@@ -6288,28 +6317,34 @@
     <string name="work_use_personal_sounds_title">Use personal profile sounds</string>
 
     <!--  Work Sound: Summary for the switch that enables syncing of personal ringtones to work profile. [CHAR LIMIT=160] -->
-    <string name="work_use_personal_sounds_summary">Work profile sounds are the same as personal profile</string>
+    <string name="work_use_personal_sounds_summary">Sounds are the same for work and personal profiles</string>
 
     <!-- Work Sounds: Title for the option defining the work phone ringtone. [CHAR LIMIT=60] -->
     <string name="work_ringtone_title">Work phone ringtone</string>
 
     <!-- Work Sounds: Title for the option defining the default work notification ringtone. [CHAR LIMIT=60] -->
-    <string name="work_notification_ringtone_title">Default work notification tone</string>
+    <string name="work_notification_ringtone_title">Default work notification sound</string>
 
     <!-- Work Sound: Title for the option defining the default work alarm ringtone. [CHAR LIMIT=60] -->
-    <string name="work_alarm_ringtone_title">Default work alarm ringtone</string>
+    <string name="work_alarm_ringtone_title">Default work alarm sound</string>
 
     <!--  Work Sound: Summary for sounds when sync with personal sounds is active [CHAR LIMIT=60] -->
     <string name="work_sound_same_as_personal">Same as personal profile</string>
 
     <!-- Work Sound: Title for dialog shown when enabling sync with personal sounds. [CHAR LIMIT=60] -->
-    <string name="work_sync_dialog_title">Use personal profile sounds?</string>
+    <string name="work_sync_dialog_title">Replace sounds?</string>
 
     <!-- Work Sound: Confirm action text for dialog shown when overriding work notification sounds with personal sounds. [CHAR LIMIT=30] -->
     <string name="work_sync_dialog_yes">Replace</string>
 
     <!-- Work Sound: Message for dialog shown when using the same sounds for work events as for personal events (notifications / ringtones / alarms). [CHAR LIMIT=none] -->
-    <string name="work_sync_dialog_message">Your personal profile sounds will be used instead of your current work profile sounds</string>
+    <string name="work_sync_dialog_message">Your personal profile sounds will be used for your work profile</string>
+
+    <!-- Sound installation: Title for the dialog to confirm that a new sound will be installed to the Ringtones, Notifications, or Alarms folder. [CHAR LIMIT=50] -->
+    <string name="ringtones_install_custom_sound_title">Add custom sound?</string>
+
+    <!-- Sound installation: Message for the dialog to confirm that a new sound will be installed to the Ringtones, Notifications, or Alarms folder. [CHAR LIMIT=none] -->
+    <string name="ringtones_install_custom_sound_content">This file will be copied to the <xliff:g id="folder_name" example="Ringtones">%s</xliff:g> folder</string>
 
     <!-- Ringtones preference category: Title for the Ringotnes preference categories. [CHAR LIMIT=none] -->
     <string name="ringtones_category_preference_title">Ringtones</string>
@@ -6375,9 +6410,11 @@
     <!-- Notification Settings: Title for the option managing notifications per application. [CHAR LIMIT=30] -->
     <string name="app_notifications_title">Notifications</string>
 
-    <!-- Notification Settings: Summary for the option managing notifications per application. [CHAR LIMIT=60] -->
-    <plurals name="app_notifications_summary">
-        <item quantity="zero">On for all apps</item>
+    <!-- Notification Settings: Summary for managing notifications when notifications is on for all apps. [CHAR LIMIT=60] -->
+    <string name="app_notifications_summary_on">On for all apps</string>
+
+    <!-- Notification Settings: Summary for managing notifications when notifications is off for some apps. [CHAR LIMIT=60] -->
+    <plurals name="app_notifications_summary_off">
         <item quantity="one">Off for 1 app</item>
         <item quantity="other">Off for <xliff:g id="off_count" example="10">%d</xliff:g> apps</item>
     </plurals>
@@ -7032,9 +7069,11 @@
     <!-- Summary of an app that can open several domain's URLs [CHAR LIMIT=45] -->
     <string name="domain_urls_summary_some">Open <xliff:g id="domain" example="mail.google.com">%s</xliff:g> and other URLs</string>
 
-    <!-- Description of settings item that leads to list of all apps that can open web links [CHAR LIMIT=NONE] -->
-    <plurals name="domain_urls_apps_summary">
-        <item quantity="zero">No app opening supported links</item>
+    <!-- Summary of open web links settings when no app can open supported links [CHAR LIMIT=NONE] -->
+    <string name="domain_urls_apps_summary_off">No app opening supported links</string>
+
+    <!-- Summary of open web links settings when at least one app can open supported links [CHAR LIMIT=NONE] -->
+    <plurals name="domain_urls_apps_summary_on">
         <item quantity="one">One app opening supported links</item>
         <item quantity="other"><xliff:g id="count" example="10">%d</xliff:g> apps opening supported links</item>
     </plurals>
@@ -7220,7 +7259,7 @@
     <!-- Title of one of the choices in a dialog (with title defined in usb_use) that lets the user
          select what the USB connection for this device should be used for. This choice
          is for charging only. -->
-    <string name="usb_use_charging_only">Charge this device</string>
+    <string name="usb_use_charging_only">Charging this device</string>
     <!-- Decription of one of the choices in a dialog (with title defined in usb_use) that lets the
          user select what the USB connection for this device should be used for. This choice
          is for charging only. -->
@@ -7228,7 +7267,7 @@
     <!-- Title of one of the choices in a dialog (with title defined in usb_use) that lets the user
          select what the USB connection for this device should be used for. This choice
          is for powering the other device only. -->
-    <string name="usb_use_power_only">Supply power</string>
+    <string name="usb_use_power_only">Supplying power</string>
     <!-- Decription of one of the choices in a dialog (with title defined in usb_use) that lets the
          user select what the USB connection for this device should be used for. This choice
          is for powering the other device. -->
@@ -7529,7 +7568,7 @@
     <string name="apps_summary_example">24 apps installed</string>
 
     <!-- Summary of storage usage [CHAR LIMIT=NONE] -->
-    <string name="storage_summary"><xliff:g id="percentage" example="54%">%1$s</xliff:g> used - <xliff:g id="free_space" example="32GB">%2$s</xliff:g> free</string>
+    <string name="storage_summary">Internal storage: <xliff:g id="percentage" example="54%">%1$s</xliff:g> used - <xliff:g id="free_space" example="32GB">%2$s</xliff:g> free</string>
 
     <!-- Summary of display with screen sleep timeout [CHAR LIMIT=NONE] -->
     <string name="display_summary">Sleep after <xliff:g id="timeout_description" example="10 minutes">%1$s</xliff:g> of inactivity</string>
@@ -7541,8 +7580,11 @@
     <!-- Summary of memory screen [CHAR LIMIT=NONE] -->
     <string name="memory_summary">Avg <xliff:g id="used_memory" example="1.7GB">%1$s</xliff:g> of <xliff:g id="total_memory" example="2GB">%2$s</xliff:g> memory used</string>
 
-    <!-- Summary of user screen [CHAR LIMIT=NONE] -->
-    <string name="user_summary">Current user: <xliff:g id="user_name" example="Jason">%1$s</xliff:g></string>
+    <!-- Summary of Users & accounts setting screen [CHAR LIMIT=NONE] -->
+    <string name="users_and_accounts_summary">Current user: <xliff:g id="user_name" example="Jason">%1$s</xliff:g></string>
+
+    <!-- Summary of User settings [CHAR LIMIT=NONE] -->
+    <string name="users_summary">Signed in as <xliff:g id="user_name" example="Jason">%1$s</xliff:g></string>
 
     <!-- Summary of payment screen [CHAR LIMIT=NONE] -->
     <string name="payment_summary"><xliff:g id="app_name" example="Payment App">%1$s</xliff:g> is default</string>
@@ -7928,9 +7970,12 @@
     <!-- Title of screen controlling which apps have access to send premium SMS messages [CHAR LIMIT=60] -->
     <string name="premium_sms_access">Premium SMS access</string>
 
-    <!-- Bluetooth is disabled. -->
+    <!-- Summary for Bluetooth when disabled. [CHAR LIMIT=NONE] -->
     <string name="bluetooth_disabled">Not visible to other devices</string>
 
+    <!-- Summary for Bluetooth when connected. [CHAR LIMIT=NONE] -->
+    <string name="bluetooth_connected_summary">Connected to </string>
+
     <!-- [CHAR LIMIT=60] Name of dev option called "System UI demo mode" -->
     <string name="demo_mode">System UI demo mode</string>
 
@@ -8197,11 +8242,13 @@
     <string name="configure_section_header">Configure</string>
 
     <!-- Switch label to enable auto sync account [CHAR LIMIT=60] -->
-    <string name="auto_sync_account_title">Auto sync account data</string>
+    <string name="auto_sync_account_title">Automatically sync data</string>
     <!-- Switch label to enable auto sync personal account [CHAR LIMIT=60] -->
-    <string name="auto_sync_personal_account_title">Auto sync personal account data</string>
+    <string name="auto_sync_personal_account_title">Automatically sync personal data</string>
     <!-- Switch label to enable auto sync work account [CHAR LIMIT=60] -->
-    <string name="auto_sync_work_account_title">Auto sync work account data</string>
+    <string name="auto_sync_work_account_title">Automatically sync work data</string>
+    <!-- Switch summary to enable auto sync account [CHAR LIMIT=NONE] -->
+    <string name="auto_sync_account_summary">Let apps refresh data automatically</string>
     <!-- Preference label to sync account [CHAR LIMIT=60] -->
     <string name="account_sync_title">Account sync</string>
 
@@ -8225,16 +8272,6 @@
     <string name="enterprise_privacy_enterprise_data">Data associated with your work account, such as email and calendar</string>
     <!-- Label explaining that the admin can see apps installed on the device. [CHAR LIMIT=NONE] -->
     <string name="enterprise_privacy_installed_packages">List of apps on your device</string>
-    <!-- Summary indicating the number of apps that a label (e.g. installed apps or apps granted a particular permission) refers to. [CHAR LIMIT=NONE] -->
-    <plurals name="enterprise_privacy_number_packages">
-        <item quantity="one"><xliff:g id="count">%d</xliff:g> app</item>
-        <item quantity="other"><xliff:g id="count">%d</xliff:g> apps</item>
-    </plurals>
-    <!-- Summary indicating the number of apps that a label (e.g. installed apps or apps granted a particular permission) refers to. [CHAR LIMIT=NONE] -->
-    <plurals name="enterprise_privacy_number_packages_actionable">
-        <item quantity="one"><xliff:g id="count">%d</xliff:g> app. Tap to view.</item>
-        <item quantity="other"><xliff:g id="count">%d</xliff:g> apps. Tap to view.</item>
-    </plurals>
     <!-- Label explaining that the admin can see app usage statistics. [CHAR LIMIT=NONE] -->
     <string name="enterprise_privacy_usage_stats">Time and data spent in each app on your device</string>
     <!-- Label explaining that the admin can retrieve network logs on the device. [CHAR LIMIT=NONE] -->
@@ -8247,6 +8284,11 @@
     <string name="enterprise_privacy_none">None</string>
     <!-- Label indicating that the admin installed one or more apps on the device. -->
     <string name="enterprise_privacy_enterprise_installed_packages">Apps installed</string>
+    <!-- Summary indicating the number of apps that a label (e.g. installed apps or apps granted a particular permission) refers to. The number shown is a minimum as there may be additional apps we do not know about. [CHAR LIMIT=NONE] -->
+    <plurals name="enterprise_privacy_number_packages_lower_bound">
+        <item quantity="one">Minimum <xliff:g id="count">%d</xliff:g> app</item>
+        <item quantity="other">Minimum <xliff:g id="count">%d</xliff:g> apps</item>
+    </plurals>
     <!-- Label indicating that the admin granted one or more apps access to the device's location. [CHAR LIMIT=NONE] -->
     <string name="enterprise_privacy_location_access">Location permissions</string>
     <!-- Label indicating that the admin granted one or more apps access to the microphone. [CHAR LIMIT=NONE] -->
@@ -8255,6 +8297,11 @@
     <string name="enterprise_privacy_camera_access">Camera permissions</string>
     <!-- Label indicating that the admin set one or more apps as defaults for common actions (e.g. open browser, send e-mail). [CHAR LIMIT=NONE] -->
     <string name="enterprise_privacy_enterprise_set_default_apps">Default apps</string>
+    <!-- Summary indicating the number of apps that a label (e.g. installed apps or apps granted a particular permission) refers to. [CHAR LIMIT=NONE] -->
+    <plurals name="enterprise_privacy_number_packages">
+        <item quantity="one"><xliff:g id="count">%d</xliff:g> app</item>
+        <item quantity="other"><xliff:g id="count">%d</xliff:g> apps</item>
+    </plurals>
     <!-- Label explaining that the current input method was set by the admin. [CHAR LIMIT=NONE] -->
     <string name="enterprise_privacy_input_method">Default keyboard</string>
     <!-- Summary indicating the input method set by the admin. [CHAR LIMIT=NONE] -->
@@ -8269,15 +8316,10 @@
     <string name="enterprise_privacy_global_http_proxy">Global HTTP proxy set</string>
     <!-- Label explaining that the admin installed trusted CA certificates. [CHAR LIMIT=NONE] -->
     <string name="enterprise_privacy_ca_certs">Trusted credentials</string>
-    <!-- Summary indicating the number of trusted CA certificates installed by the admin. [CHAR LIMIT=NONE] -->
+    <!-- Summary indicating the number of trusted CA certificates installed by the admin. The number shown is a minimum as there may be additional CA certificates we do not know about. [CHAR LIMIT=NONE] -->
     <plurals name="enterprise_privacy_number_ca_certs">
-        <item quantity="one"><xliff:g id="count">%d</xliff:g> CA certificate</item>
-        <item quantity="other"><xliff:g id="count">%d</xliff:g> CA certificates</item>
-    </plurals>
-    <!-- Summary indicating the number of trusted CA certificates installed by the admin. [CHAR LIMIT=NONE] -->
-    <plurals name="enterprise_privacy_number_ca_certs_actionable">
-        <item quantity="one"><xliff:g id="count">%d</xliff:g> CA certificate. Tap to view.</item>
-        <item quantity="other"><xliff:g id="count">%d</xliff:g> CA certificates. Tap to view.</item>
+        <item quantity="one">Minimum <xliff:g id="count">%d</xliff:g> CA certificate</item>
+        <item quantity="other">Minimum <xliff:g id="count">%d</xliff:g> CA certificates</item>
     </plurals>
     <!-- Label explaining that the admin can lock the device and change the user's password. [CHAR LIMIT=NONE] -->
     <string name="enterprise_privacy_lock_device">Admin can lock the device and reset password</string>
@@ -8324,8 +8366,9 @@
     <string name="storage_size_large_alternate"><xliff:g id="number" example="128">^1</xliff:g><small> <xliff:g id="unit" example="KB">^2</xliff:g></small></string>
     <!-- Summary of a single storage volume total space. [CHAR LIMIT=48]-->
     <string name="storage_volume_total">Used of <xliff:g id="total" example="32GB">%1$s</xliff:g></string>
-    <!-- The percent of storage used by a storage volume. Exposed inside of a donut graph. [CHAR LIMIT=4]-->
-    <string name="storage_percent_used"><xliff:g id="percent" example="50%">%1$s</xliff:g>%%</string>
+    <!-- Follows the percent of storage used by a storage volume. Exposed inside of a donut graph. [CHAR LIMIT=7]-->
+    <string name="storage_percent_full">full</string>
+
 
     <!-- Title of games app storage screen [CHAR LIMIT=30] -->
     <string name="game_storage_settings">Games</string>
diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml
index b4ab7df..c5e5e93 100644
--- a/res/xml/display_settings.xml
+++ b/res/xml/display_settings.xml
@@ -14,115 +14,116 @@
      limitations under the License.
 -->
 
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
-                  xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
-        android:title="@string/display_settings"
-        settings:keywords="@string/keywords_display">
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
+    android:title="@string/display_settings"
+    settings:keywords="@string/keywords_display">
 
-        <Preference
-                android:key="brightness"
-                android:title="@string/brightness"
-                settings:keywords="@string/keywords_display_brightness_level">
-            <intent android:action="android.intent.action.SHOW_BRIGHTNESS_DIALOG" />
-        </Preference>
+    <Preference
+        android:key="brightness"
+        android:title="@string/brightness"
+        settings:keywords="@string/keywords_display_brightness_level">
+        <intent android:action="android.intent.action.SHOW_BRIGHTNESS_DIALOG" />
+    </Preference>
 
-        <com.android.settingslib.RestrictedPreference
-            android:key="wallpaper"
-            android:title="@string/wallpaper_settings_title"
-            settings:keywords="@string/keywords_display_wallpaper"
-            settings:useAdminDisabledSummary="true" >
-                <intent
-                    android:targetPackage="@string/config_wallpaper_picker_package"
-                    android:targetClass="@string/config_wallpaper_picker_class" />
-        </com.android.settingslib.RestrictedPreference>
+    <com.android.settingslib.RestrictedPreference
+        android:key="wallpaper"
+        android:title="@string/wallpaper_settings_title"
+        settings:keywords="@string/keywords_display_wallpaper"
+        settings:useAdminDisabledSummary="true">
+        <intent
+            android:targetPackage="@string/config_wallpaper_picker_package"
+            android:targetClass="@string/config_wallpaper_picker_class" />
+    </com.android.settingslib.RestrictedPreference>
 
-        <com.android.settings.display.NightDisplayPreference
-            android:key="night_display"
-            android:title="@string/night_display_title"
-            android:fragment="com.android.settings.display.NightDisplaySettings"
-            settings:widgetLayout="@null"
-            settings:keywords="@string/keywords_display_night_display" />
+    <com.android.settings.display.NightDisplayPreference
+        android:key="night_display"
+        android:title="@string/night_display_title"
+        android:fragment="com.android.settings.display.NightDisplaySettings"
+        settings:widgetLayout="@null"
+        settings:keywords="@string/keywords_display_night_display" />
 
-        <com.android.settings.TimeoutListPreference
-            android:key="screen_timeout"
-            android:title="@string/screen_timeout"
-            android:summary="@string/screen_timeout_summary"
-            android:entries="@array/screen_timeout_entries"
-            android:entryValues="@array/screen_timeout_values" />
+    <com.android.settings.TimeoutListPreference
+        android:key="screen_timeout"
+        android:title="@string/screen_timeout"
+        android:summary="@string/screen_timeout_summary"
+        android:entries="@array/screen_timeout_entries"
+        android:entryValues="@array/screen_timeout_values" />
 
-        <DropDownPreference
-            android:key="auto_rotate"
-            android:summary="%s"
-            android:title="@string/display_auto_rotate_title" />
+    <DropDownPreference
+        android:key="auto_rotate"
+        android:summary="%s"
+        android:title="@string/display_auto_rotate_title" />
 
-        <SwitchPreference
-            android:key="auto_brightness"
-            android:title="@string/auto_brightness_title"
-            settings:keywords="@string/keywords_display_auto_brightness"
-            android:summary="@string/auto_brightness_summary" />
+    <SwitchPreference
+        android:key="auto_brightness"
+        android:title="@string/auto_brightness_title"
+        settings:keywords="@string/keywords_display_auto_brightness"
+        android:summary="@string/auto_brightness_summary" />
 
-        <Preference
-            android:key="font_size"
-            android:title="@string/title_font_size"
-            android:fragment="com.android.settings.accessibility.ToggleFontSizePreferenceFragment"
-            settings:keywords="@string/keywords_display_font_size" />
+    <Preference
+        android:key="font_size"
+        android:title="@string/title_font_size"
+        android:fragment="com.android.settings.accessibility.ToggleFontSizePreferenceFragment"
+        settings:keywords="@string/keywords_display_font_size" />
 
-        <com.android.settings.display.ScreenZoomPreference
-            android:key="screen_zoom"
-            android:title="@string/screen_zoom_title"
-            settings:keywords="@string/screen_zoom_keywords" />
+    <com.android.settings.display.ScreenZoomPreference
+        android:key="screen_zoom"
+        android:title="@string/screen_zoom_title"
+        settings:keywords="@string/screen_zoom_keywords" />
 
-        <Preference
-            android:key="screensaver"
-            android:title="@string/screensaver_settings_title"
-            android:fragment="com.android.settings.DreamSettings" />
+    <Preference
+        android:key="screensaver"
+        android:title="@string/screensaver_settings_title"
+        android:fragment="com.android.settings.DreamSettings" />
 
-        <!-- Hide night mode for now
-        <ListPreference
-            android:key="night_mode"
-            android:title="@string/night_mode_title"
-            settings:keywords="@string/keywords_display_night_mode"
-            android:summary="@string/night_mode_summary"
-            android:entries="@array/night_mode_entries"
-            android:entryValues="@array/night_mode_values" /> -->
+    <!-- Hide night mode for now
+    <ListPreference
+        android:key="night_mode"
+        android:title="@string/night_mode_title"
+        settings:keywords="@string/keywords_display_night_mode"
+        android:summary="@string/night_mode_summary"
+        android:entries="@array/night_mode_entries"
+        android:entryValues="@array/night_mode_values" /> -->
 
-        <SwitchPreference
-            android:key="camera_gesture"
-            android:title="@string/camera_gesture_title"
-            android:summary="@string/camera_gesture_desc" />
+    <SwitchPreference
+        android:key="camera_gesture"
+        android:title="@string/camera_gesture_title"
+        android:summary="@string/camera_gesture_desc" />
 
-        <SwitchPreference
-            android:key="lift_to_wake"
-            android:title="@string/lift_to_wake_title" />
+    <SwitchPreference
+        android:key="lift_to_wake"
+        android:title="@string/lift_to_wake_title" />
 
-        <Preference
-            android:key="gesture_double_tap_screen"
-            android:title="@string/ambient_display_title"
-            android:fragment="com.android.settings.gestures.DoubleTapScreenSettings"/>
+    <Preference
+        android:key="gesture_double_tap_screen"
+        android:title="@string/ambient_display_title"
+        android:fragment="com.android.settings.gestures.DoubleTapScreenSettings" />
 
-        <Preference
-            android:key="gesture_pick_up"
-            android:title="@string/ambient_display_pickup_title"
-            android:fragment="com.android.settings.gestures.PickupGestureSettings"/>
+    <Preference
+        android:key="gesture_pick_up"
+        android:title="@string/ambient_display_pickup_title"
+        android:fragment="com.android.settings.gestures.PickupGestureSettings" />
 
-        <SwitchPreference
-            android:key="doze"
-            android:title="@string/doze_title"
-            android:summary="@string/doze_summary" />
+    <SwitchPreference
+        android:key="doze"
+        android:title="@string/doze_title"
+        android:summary="@string/doze_summary" />
 
-        <SwitchPreference
-            android:key="tap_to_wake"
-            android:title="@string/tap_to_wake"
-            android:summary="@string/tap_to_wake_summary" />
+    <SwitchPreference
+        android:key="tap_to_wake"
+        android:title="@string/tap_to_wake"
+        android:summary="@string/tap_to_wake_summary" />
 
-        <ListPreference
-            android:key="theme"
-            android:title="@string/device_theme"
-            android:summary="%s" />
+    <ListPreference
+        android:key="theme"
+        android:title="@string/device_theme"
+        android:summary="%s" />
 
-        <DropDownPreference
-            android:key="vr_display_pref"
-            android:summary="%s"
-            android:title="@string/display_vr_pref_title" />
+    <Preference
+        android:key="vr_display_pref"
+        android:title="@string/display_vr_pref_title"
+        android:fragment="com.android.settings.display.VrDisplayPreferencePicker" />
 
 </PreferenceScreen>
diff --git a/res/xml/app_picker_prefs.xml b/res/xml/placeholder_prefs.xml
similarity index 100%
rename from res/xml/app_picker_prefs.xml
rename to res/xml/placeholder_prefs.xml
diff --git a/res/xml/security_lockscreen_settings.xml b/res/xml/security_lockscreen_settings.xml
new file mode 100644
index 0000000..e151b2b
--- /dev/null
+++ b/res/xml/security_lockscreen_settings.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:title="@string/lockscreen_settings_title">
+
+        <com.android.settings.notification.RestrictedDropDownPreference
+            android:key="lock_screen_notifications"
+            android:title="@string/lock_screen_notifications_title"
+            android:summary="%s"/>
+
+        <com.android.settingslib.RestrictedSwitchPreference
+            android:key="add_users_when_locked"
+            android:title="@string/user_add_on_lockscreen_menu"/>
+
+        <com.android.settingslib.RestrictedPreference
+            android:key="owner_info_settings"
+            android:title="@string/owner_info_settings_title"
+            android:summary="@string/owner_info_settings_summary"/>
+
+</PreferenceScreen>
diff --git a/res/xml/security_settings_chooser.xml b/res/xml/security_settings_chooser.xml
index 6438771..dc6e727 100644
--- a/res/xml/security_settings_chooser.xml
+++ b/res/xml/security_settings_chooser.xml
@@ -29,6 +29,11 @@
             settings:keywords="@string/keywords_lockscreen"
             android:persistent="false"/>
 
+        <Preference android:key="lockscreen_preferences"
+            android:title="@string/lockscreen_settings_title"
+            android:summary="@string/lockscreen_settings_summary"
+            android:fragment="com.android.settings.security.LockscreenDashboardFragment"/>
+
     </PreferenceCategory>
 
 </PreferenceScreen>
diff --git a/res/xml/security_settings_password.xml b/res/xml/security_settings_password.xml
index 57f19eb..e3a5dfd 100644
--- a/res/xml/security_settings_password.xml
+++ b/res/xml/security_settings_password.xml
@@ -28,6 +28,11 @@
             android:summary="@string/unlock_set_unlock_mode_password"
             settings:keywords="@string/keywords_lockscreen" />
 
+        <Preference android:key="lockscreen_preferences"
+            android:title="@string/lockscreen_settings_title"
+            android:summary="@string/lockscreen_settings_summary"
+            android:fragment="com.android.settings.security.LockscreenDashboardFragment"/>
+
     </PreferenceCategory>
 
 </PreferenceScreen>
diff --git a/res/xml/security_settings_pattern.xml b/res/xml/security_settings_pattern.xml
index ad57e82..295e896 100644
--- a/res/xml/security_settings_pattern.xml
+++ b/res/xml/security_settings_pattern.xml
@@ -28,6 +28,11 @@
             android:summary="@string/unlock_set_unlock_mode_pattern"
             settings:keywords="@string/keywords_lockscreen" />
 
+        <Preference android:key="lockscreen_preferences"
+            android:title="@string/lockscreen_settings_title"
+            android:summary="@string/lockscreen_settings_summary"
+            android:fragment="com.android.settings.security.LockscreenDashboardFragment"/>
+
     </PreferenceCategory>
 
 </PreferenceScreen>
diff --git a/res/xml/security_settings_pin.xml b/res/xml/security_settings_pin.xml
index 31a57a2..5613177 100644
--- a/res/xml/security_settings_pin.xml
+++ b/res/xml/security_settings_pin.xml
@@ -28,6 +28,11 @@
             android:summary="@string/unlock_set_unlock_mode_pin"
             settings:keywords="@string/keywords_lockscreen" />
 
+        <Preference android:key="lockscreen_preferences"
+            android:title="@string/lockscreen_settings_title"
+            android:summary="@string/lockscreen_settings_summary"
+            android:fragment="com.android.settings.security.LockscreenDashboardFragment"/>
+
     </PreferenceCategory>
 
 </PreferenceScreen>
diff --git a/res/xml/storage_dashboard_fragment.xml b/res/xml/storage_dashboard_fragment.xml
index 64a2aba..354a700 100644
--- a/res/xml/storage_dashboard_fragment.xml
+++ b/res/xml/storage_dashboard_fragment.xml
@@ -33,27 +33,33 @@
     <com.android.settings.deviceinfo.StorageItemPreference
         android:key="pref_photos_videos"
         android:title="@string/storage_photos_videos"
+        android:icon="@drawable/ic_photo_library_vd_theme_24"
         settings:allowDividerAbove="true"
         android:order="2" />
     <com.android.settings.deviceinfo.StorageItemPreference
         android:key="pref_music_audio"
         android:title="@string/storage_music_audio"
+        android:icon="@drawable/ic_music_note_vd_theme_24"
         android:order="3" />
     <com.android.settings.deviceinfo.StorageItemPreference
         android:key="pref_games"
         android:title="@string/storage_games"
+        android:icon="@drawable/ic_videogame_vd_theme_24"
         android:order="4" />
     <com.android.settings.deviceinfo.StorageItemPreference
         android:key="pref_other_apps"
         android:title="@string/storage_other_apps"
+        android:icon="@drawable/ic_apps_vd_theme_24"
         android:order="5" />
     <com.android.settings.deviceinfo.StorageItemPreference
         android:key="pref_files"
         android:title="@string/storage_files"
+        android:icon="@drawable/ic_folder_vd_theme_24"
         android:order="6" />
     <com.android.settings.deviceinfo.StorageItemPreference
         android:key="pref_system"
         android:title="@string/storage_detail_system"
+        android:icon="@drawable/ic_system_update_vd_theme_24"
         android:order="100" />
     <PreferenceCategory
         android:key="pref_secondary_users"
diff --git a/res/xml/user_and_accounts_settings.xml b/res/xml/user_and_accounts_settings.xml
index 6280980..63a5b10 100644
--- a/res/xml/user_and_accounts_settings.xml
+++ b/res/xml/user_and_accounts_settings.xml
@@ -26,25 +26,23 @@
         android:order="100"
         settings:allowDividerAbove="true"/>
 
-    <PreferenceCategory
-        android:key="account_configuration_header"
-        android:title="@string/configure_section_header"
-        android:order="101">
-    </PreferenceCategory>
-
     <SwitchPreference
         android:key="auto_sync_account_data"
         android:title="@string/auto_sync_account_title"
-        android:order="102"/>
+        android:summary="@string/auto_sync_account_summary"
+        android:order="102"
+        settings:allowDividerAbove="true"/>
 
     <SwitchPreference
         android:key="auto_sync_work_account_data"
         android:title="@string/account_settings_menu_auto_sync_work"
+        android:summary="@string/auto_sync_account_summary"
         android:order="103"/>
 
     <SwitchPreference
         android:key="auto_sync_personal_account_data"
         android:title="@string/account_settings_menu_auto_sync_personal"
+        android:summary="@string/auto_sync_account_summary"
         android:order="104"/>
 
     <com.android.settingslib.RestrictedSwitchPreference
diff --git a/src/com/android/settings/OwnerInfoSettings.java b/src/com/android/settings/OwnerInfoSettings.java
index 7314da3..18cfb8e 100644
--- a/src/com/android/settings/OwnerInfoSettings.java
+++ b/src/com/android/settings/OwnerInfoSettings.java
@@ -31,6 +31,7 @@
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settings.security.OwnerInfoPreferenceController.OwnerInfoCallback;
 
 public class OwnerInfoSettings extends InstrumentedDialogFragment implements OnClickListener {
 
@@ -76,8 +77,8 @@
             mLockPatternUtils.setOwnerInfoEnabled(!TextUtils.isEmpty(info), mUserId);
             mLockPatternUtils.setOwnerInfo(info, mUserId);
 
-            if (getTargetFragment() instanceof SecuritySettings.SecuritySubSettings) {
-                ((SecuritySettings.SecuritySubSettings) getTargetFragment()).updateOwnerInfo();
+            if (getTargetFragment() instanceof OwnerInfoCallback) {
+                ((OwnerInfoCallback) getTargetFragment()).onOwnerInfoUpdated();
             }
         }
     }
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 1cb763b..37022f0 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -16,7 +16,6 @@
 
 package com.android.settings;
 
-
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
@@ -67,6 +66,7 @@
 import com.android.settings.search.Indexable;
 import com.android.settings.search.SearchIndexableRaw;
 import com.android.settings.search2.SearchFeatureProvider;
+import com.android.settings.security.OwnerInfoPreferenceController;
 import com.android.settings.security.SecurityFeatureProvider;
 import com.android.settings.trustagent.TrustAgentManager;
 import com.android.settings.widget.GearPreference;
@@ -917,11 +917,10 @@
     }
 
     public static class SecuritySubSettings extends SettingsPreferenceFragment
-            implements OnPreferenceChangeListener {
+            implements OnPreferenceChangeListener, OwnerInfoPreferenceController.OwnerInfoCallback {
 
         private static final String KEY_VISIBLE_PATTERN = "visiblepattern";
         private static final String KEY_LOCK_AFTER_TIMEOUT = "lock_after_timeout";
-        private static final String KEY_OWNER_INFO_SETTINGS = "owner_info_settings";
         private static final String KEY_POWER_INSTANTLY_LOCKS = "power_button_instantly_locks";
 
         // These switch preferences need special handling since they're not all stored in Settings.
@@ -931,11 +930,11 @@
         private TimeoutListPreference mLockAfter;
         private SwitchPreference mVisiblePattern;
         private SwitchPreference mPowerButtonInstantlyLocks;
-        private RestrictedPreference mOwnerInfoPref;
 
         private TrustAgentManager mTrustAgentManager;
         private LockPatternUtils mLockPatternUtils;
         private DevicePolicyManager mDPM;
+        private OwnerInfoPreferenceController mOwnerInfoPreferenceController;
 
         @Override
         public int getMetricsCategory() {
@@ -950,6 +949,8 @@
             mTrustAgentManager = securityFeatureProvider.getTrustAgentManager();
             mLockPatternUtils = new LockPatternUtils(getContext());
             mDPM = getContext().getSystemService(DevicePolicyManager.class);
+            mOwnerInfoPreferenceController =
+                new OwnerInfoPreferenceController(getContext(), this, null /* lifecycle */);
             createPreferenceHierarchy();
         }
 
@@ -968,7 +969,7 @@
                         mLockPatternUtils.getPowerButtonInstantlyLocks(MY_USER_ID));
             }
 
-            updateOwnerInfo();
+            mOwnerInfoPreferenceController.updateSummary();
         }
 
         @Override
@@ -1010,26 +1011,8 @@
                         trustAgentLabel));
             }
 
-            mOwnerInfoPref = (RestrictedPreference) findPreference(KEY_OWNER_INFO_SETTINGS);
-            if (mOwnerInfoPref != null) {
-                if (mLockPatternUtils.isDeviceOwnerInfoEnabled()) {
-                    EnforcedAdmin admin = RestrictedLockUtils.getDeviceOwner(getActivity());
-                    mOwnerInfoPref.setDisabledByAdmin(admin);
-                } else {
-                    mOwnerInfoPref.setDisabledByAdmin(null);
-                    mOwnerInfoPref.setEnabled(!mLockPatternUtils.isLockScreenDisabled(MY_USER_ID));
-                    if (mOwnerInfoPref.isEnabled()) {
-                        mOwnerInfoPref.setOnPreferenceClickListener(
-                                new OnPreferenceClickListener() {
-                                    @Override
-                                    public boolean onPreferenceClick(Preference preference) {
-                                        OwnerInfoSettings.show(SecuritySubSettings.this);
-                                        return true;
-                                    }
-                                });
-                    }
-                }
-            }
+            mOwnerInfoPreferenceController.displayPreference(getPreferenceScreen());
+            mOwnerInfoPreferenceController.updateEnableState();
 
             for (int i = 0; i < SWITCH_PREFERENCE_KEYS.length; i++) {
                 final Preference pref = findPreference(SWITCH_PREFERENCE_KEYS[i]);
@@ -1093,17 +1076,9 @@
             mLockAfter.setSummary(summary);
         }
 
-        public void updateOwnerInfo() {
-            if (mOwnerInfoPref != null) {
-                if (mLockPatternUtils.isDeviceOwnerInfoEnabled()) {
-                    mOwnerInfoPref.setSummary(
-                            mLockPatternUtils.getDeviceOwnerInfo());
-                } else {
-                    mOwnerInfoPref.setSummary(mLockPatternUtils.isOwnerInfoEnabled(MY_USER_ID)
-                            ? mLockPatternUtils.getOwnerInfo(MY_USER_ID)
-                            : getString(R.string.owner_info_settings_summary));
-                }
-            }
+        @Override
+        public void onOwnerInfoUpdated() {
+            mOwnerInfoPreferenceController.updateSummary();
         }
 
         private static int getResIdForLockUnlockSubScreen(Context context,
diff --git a/src/com/android/settings/accounts/UserAndAccountDashboardFragment.java b/src/com/android/settings/accounts/UserAndAccountDashboardFragment.java
index 1b0282f..a5a92ee 100644
--- a/src/com/android/settings/accounts/UserAndAccountDashboardFragment.java
+++ b/src/com/android/settings/accounts/UserAndAccountDashboardFragment.java
@@ -100,8 +100,8 @@
             if (listening) {
                 UserInfo info = mContext.getSystemService(UserManager.class).getUserInfo(
                         UserHandle.myUserId());
-                mSummaryLoader.setSummary(this, mContext.getString(R.string.user_summary,
-                        info.name));
+                mSummaryLoader.setSummary(this,
+                    mContext.getString(R.string.users_and_accounts_summary, info.name));
             }
         }
     }
diff --git a/src/com/android/settings/applications/assist/DefaultAssistPicker.java b/src/com/android/settings/applications/assist/DefaultAssistPicker.java
index 703665a..51cb677 100644
--- a/src/com/android/settings/applications/assist/DefaultAssistPicker.java
+++ b/src/com/android/settings/applications/assist/DefaultAssistPicker.java
@@ -79,31 +79,30 @@
                 continue;
             }
             packages.add(packageName);
-            candidates.add(new DefaultAppInfo(mUserId, info.component));
+            candidates.add(new DefaultAppInfo(mPm, mUserId, info.component));
         }
         return candidates;
     }
 
     @Override
-    protected String getDefaultAppKey() {
+    protected String getDefaultKey() {
         final ComponentName cn = getCurrentAssist();
         if (cn != null) {
-            return new DefaultAppInfo(mUserId, cn).getKey();
+            return new DefaultAppInfo(mPm, mUserId, cn).getKey();
         }
         return null;
     }
 
     @Override
-    protected String getConfirmationMessage(DefaultAppInfo appInfo) {
+    protected String getConfirmationMessage(CandidateInfo appInfo) {
         if (appInfo == null) {
             return null;
         }
-        return getContext().getString(R.string.assistant_security_warning,
-                appInfo.loadLabel(mPm.getPackageManager()));
+        return getContext().getString(R.string.assistant_security_warning, appInfo.loadLabel());
     }
 
     @Override
-    protected boolean setDefaultAppKey(String key) {
+    protected boolean setDefaultKey(String key) {
         if (TextUtils.isEmpty(key)) {
             setAssistNone();
             return true;
diff --git a/src/com/android/settings/applications/assist/DefaultAssistPreferenceController.java b/src/com/android/settings/applications/assist/DefaultAssistPreferenceController.java
index df34501..747ce4d 100644
--- a/src/com/android/settings/applications/assist/DefaultAssistPreferenceController.java
+++ b/src/com/android/settings/applications/assist/DefaultAssistPreferenceController.java
@@ -83,6 +83,6 @@
         if (cn == null) {
             return null;
         }
-        return new DefaultAppInfo(mUserId, cn);
+        return new DefaultAppInfo(mPackageManager, mUserId, cn);
     }
 }
diff --git a/src/com/android/settings/applications/assist/DefaultVoiceInputPicker.java b/src/com/android/settings/applications/assist/DefaultVoiceInputPicker.java
index 7168aa5..f51275e 100644
--- a/src/com/android/settings/applications/assist/DefaultVoiceInputPicker.java
+++ b/src/com/android/settings/applications/assist/DefaultVoiceInputPicker.java
@@ -19,12 +19,12 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
-import android.content.pm.PackageManager;
 import android.provider.Settings;
 import android.text.TextUtils;
 
 import com.android.internal.app.AssistUtils;
 import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.applications.PackageManagerWrapper;
 import com.android.settings.applications.defaultapps.DefaultAppInfo;
 import com.android.settings.applications.defaultapps.DefaultAppPickerFragment;
 
@@ -61,19 +61,19 @@
         for (VoiceInputHelper.InteractionInfo info : mHelper.mAvailableInteractionInfos) {
             final boolean enabled = TextUtils.equals(info.key, mAssistRestrict);
             hasEnabled |= enabled;
-            candidates.add(new VoiceInputDefaultAppInfo(mUserId, info, enabled));
+            candidates.add(new VoiceInputDefaultAppInfo(mPm, mUserId, info, enabled));
         }
 
         final boolean assistIsService = !hasEnabled;
         for (VoiceInputHelper.RecognizerInfo info : mHelper.mAvailableRecognizerInfos) {
             final boolean enabled = !assistIsService;
-            candidates.add(new VoiceInputDefaultAppInfo(mUserId, info, enabled));
+            candidates.add(new VoiceInputDefaultAppInfo(mPm, mUserId, info, enabled));
         }
         return candidates;
     }
 
     @Override
-    protected String getDefaultAppKey() {
+    protected String getDefaultKey() {
         final ComponentName currentService = getCurrentService(mHelper);
         if (currentService == null) {
             return null;
@@ -82,7 +82,7 @@
     }
 
     @Override
-    protected boolean setDefaultAppKey(String value) {
+    protected boolean setDefaultKey(String value) {
         for (VoiceInputHelper.InteractionInfo info : mHelper.mAvailableInteractionInfos) {
             if (TextUtils.equals(value, info.key)) {
                 Settings.Secure.putString(getContext().getContentResolver(),
@@ -132,9 +132,9 @@
 
         public VoiceInputHelper.BaseInfo mInfo;
 
-        public VoiceInputDefaultAppInfo(int userId, VoiceInputHelper.BaseInfo info,
-                boolean enabled) {
-            super(userId, info.componentName, null /* summary */, enabled);
+        public VoiceInputDefaultAppInfo(PackageManagerWrapper pm, int userId,
+                VoiceInputHelper.BaseInfo info, boolean enabled) {
+            super(pm, userId, info.componentName, null /* summary */, enabled);
             mInfo = info;
         }
 
@@ -144,7 +144,7 @@
         }
 
         @Override
-        public CharSequence loadLabel(PackageManager pm) {
+        public CharSequence loadLabel() {
             if (mInfo instanceof VoiceInputHelper.InteractionInfo) {
                 return mInfo.appLabel;
             } else {
diff --git a/src/com/android/settings/applications/assist/DefaultVoiceInputPreferenceController.java b/src/com/android/settings/applications/assist/DefaultVoiceInputPreferenceController.java
index 918ec9c..032fb13 100644
--- a/src/com/android/settings/applications/assist/DefaultVoiceInputPreferenceController.java
+++ b/src/com/android/settings/applications/assist/DefaultVoiceInputPreferenceController.java
@@ -104,14 +104,14 @@
         }
         for (VoiceInputHelper.InteractionInfo info : mHelper.mAvailableInteractionInfos) {
             if (TextUtils.equals(defaultKey, info.key)) {
-                return new DefaultVoiceInputPicker.VoiceInputDefaultAppInfo(
+                return new DefaultVoiceInputPicker.VoiceInputDefaultAppInfo(mPackageManager,
                         mUserId, info, true /* enabled */);
             }
         }
 
         for (VoiceInputHelper.RecognizerInfo info : mHelper.mAvailableRecognizerInfos) {
             if (TextUtils.equals(defaultKey, info.key)) {
-                return new DefaultVoiceInputPicker.VoiceInputDefaultAppInfo(
+                return new DefaultVoiceInputPicker.VoiceInputDefaultAppInfo(mPackageManager,
                         mUserId, info, true /* enabled */);
             }
         }
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppInfo.java b/src/com/android/settings/applications/defaultapps/DefaultAppInfo.java
index d276fd2..e99b106 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAppInfo.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAppInfo.java
@@ -26,91 +26,101 @@
 import android.os.RemoteException;
 import android.os.UserHandle;
 
+import com.android.settings.applications.PackageManagerWrapper;
+import com.android.settings.widget.RadioButtonPickerFragment;
+
 /**
  * Data model representing an app in DefaultAppPicker UI.
  */
-public class DefaultAppInfo {
+public class DefaultAppInfo extends RadioButtonPickerFragment.CandidateInfo {
 
     public final int userId;
     public final ComponentName componentName;
     public final PackageItemInfo packageItemInfo;
     public final String summary;
-    public final boolean enabled;
+    protected final PackageManagerWrapper mPm;
 
-    public DefaultAppInfo(int uid, ComponentName cn) {
-        this(uid, cn, null /* summary */);
+    public DefaultAppInfo(PackageManagerWrapper pm, int uid, ComponentName cn) {
+        this(pm, uid, cn, null /* summary */);
     }
 
-    public DefaultAppInfo(int uid, ComponentName cn, String summary) {
-        this(uid, cn, summary, true /* enabled */);
+    public DefaultAppInfo(PackageManagerWrapper pm, int uid, ComponentName cn, String summary) {
+        this(pm, uid, cn, summary, true /* enabled */);
     }
 
-    public DefaultAppInfo(int uid, ComponentName cn, String summary, boolean enabled) {
+    public DefaultAppInfo(PackageManagerWrapper pm, int uid, ComponentName cn, String summary,
+            boolean enabled) {
+        super(enabled);
+        mPm = pm;
         packageItemInfo = null;
         userId = uid;
         componentName = cn;
         this.summary = summary;
-        this.enabled = enabled;
     }
 
-    public DefaultAppInfo(PackageItemInfo info, String summary, boolean enabled) {
+    public DefaultAppInfo(PackageManagerWrapper pm, PackageItemInfo info, String summary,
+            boolean enabled) {
+        super(enabled);
+        mPm = pm;
         userId = UserHandle.myUserId();
         packageItemInfo = info;
         componentName = null;
         this.summary = summary;
-        this.enabled = enabled;
     }
 
-    public DefaultAppInfo(PackageItemInfo info) {
-        this(info, null /* summary */, true /* enabled */);
+    public DefaultAppInfo(PackageManagerWrapper pm, PackageItemInfo info) {
+        this(pm, info, null /* summary */, true /* enabled */);
     }
 
-    public CharSequence loadLabel(PackageManager pm) {
+    @Override
+    public CharSequence loadLabel() {
         if (componentName != null) {
             try {
                 final ActivityInfo actInfo = AppGlobals.getPackageManager().getActivityInfo(
                         componentName, 0, userId);
                 if (actInfo != null) {
-                    return actInfo.loadLabel(pm);
+                    return actInfo.loadLabel(mPm.getPackageManager());
                 } else {
-                    final ApplicationInfo appInfo = pm.getApplicationInfoAsUser(
+                    final ApplicationInfo appInfo = mPm.getApplicationInfoAsUser(
                             componentName.getPackageName(), 0, userId);
-                    return appInfo.loadLabel(pm);
+                    return appInfo.loadLabel(mPm.getPackageManager());
                 }
             } catch (RemoteException | PackageManager.NameNotFoundException e) {
                 return null;
             }
         } else if (packageItemInfo != null) {
-            return packageItemInfo.loadLabel(pm);
+            return packageItemInfo.loadLabel(mPm.getPackageManager());
         } else {
             return null;
         }
 
     }
 
-    public Drawable loadIcon(PackageManager pm) {
+    @Override
+    public Drawable loadIcon() {
         if (componentName != null) {
             try {
                 final ActivityInfo actInfo = AppGlobals.getPackageManager().getActivityInfo(
                         componentName, 0, userId);
                 if (actInfo != null) {
-                    return actInfo.loadIcon(pm);
+                    return actInfo.loadIcon(mPm.getPackageManager());
                 } else {
-                    final ApplicationInfo appInfo = pm.getApplicationInfoAsUser(
+                    final ApplicationInfo appInfo = mPm.getApplicationInfoAsUser(
                             componentName.getPackageName(), 0, userId);
-                    return appInfo.loadIcon(pm);
+                    return appInfo.loadIcon(mPm.getPackageManager());
                 }
             } catch (RemoteException | PackageManager.NameNotFoundException e) {
                 return null;
             }
         }
         if (packageItemInfo != null) {
-            return packageItemInfo.loadIcon(pm);
+            return packageItemInfo.loadIcon(mPm.getPackageManager());
         } else {
             return null;
         }
     }
 
+    @Override
     public String getKey() {
         if (componentName != null) {
             return componentName.flattenToString();
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
index 785f7ad..d08ac99 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
@@ -24,113 +24,36 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.os.Bundle;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
 import android.text.TextUtils;
-import android.util.ArrayMap;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
-import com.android.settings.Utils;
 import com.android.settings.applications.PackageManagerWrapper;
 import com.android.settings.applications.PackageManagerWrapperImpl;
-import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settings.widget.RadioButtonPickerFragment;
 import com.android.settings.widget.RadioButtonPreference;
 
-import java.util.List;
-import java.util.Map;
-
 /**
  * A generic app picker fragment that shows a list of app as radio button group.
  */
-public abstract class DefaultAppPickerFragment extends InstrumentedPreferenceFragment implements
-        RadioButtonPreference.OnClickListener {
-
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
-    static final String EXTRA_FOR_WORK = "for_work";
-
-    private final Map<String, DefaultAppInfo> mCandidates = new ArrayMap<>();
+public abstract class DefaultAppPickerFragment extends RadioButtonPickerFragment {
 
     protected PackageManagerWrapper mPm;
-    protected UserManager mUserManager;
-    protected int mUserId;
 
     @Override
     public void onAttach(Context context) {
         super.onAttach(context);
         mPm = new PackageManagerWrapperImpl(context.getPackageManager());
-        mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
-        final Bundle arguments = getArguments();
-
-        boolean mForWork = false;
-        if (arguments != null) {
-            mForWork = arguments.getBoolean(EXTRA_FOR_WORK);
-        }
-        final UserHandle managedProfile = Utils.getManagedProfile(mUserManager);
-        mUserId = mForWork && managedProfile != null
-                ? managedProfile.getIdentifier()
-                : UserHandle.myUserId();
-    }
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        final View view = super.onCreateView(inflater, container, savedInstanceState);
-        setHasOptionsMenu(true);
-        return view;
-    }
-
-    @Override
-    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
-        super.onCreatePreferences(savedInstanceState, rootKey);
-        addPreferencesFromResource(R.xml.app_picker_prefs);
-        updateCandidates();
-    }
-
-    @VisibleForTesting
-    public void updateCandidates() {
-        mCandidates.clear();
-        final List<? extends DefaultAppInfo> candidateList = getCandidates();
-        if (candidateList != null) {
-            for (DefaultAppInfo info : candidateList) {
-                mCandidates.put(info.getKey(), info);
-            }
-        }
-        final String defaultAppKey = getDefaultAppKey();
-        final String systemDefaultAppKey = getSystemDefaultAppKey();
-        final PreferenceScreen screen = getPreferenceScreen();
-        screen.removeAll();
-        if (shouldShowItemNone()) {
-            final RadioButtonPreference nonePref = new RadioButtonPreference(getPrefContext());
-            nonePref.setIcon(R.drawable.ic_remove_circle);
-            nonePref.setTitle(R.string.app_list_preference_none);
-            nonePref.setChecked(TextUtils.isEmpty(defaultAppKey));
-            nonePref.setOnClickListener(this);
-            screen.addPreference(nonePref);
-        }
-        for (Map.Entry<String, DefaultAppInfo> app : mCandidates.entrySet()) {
-            RadioButtonPreference pref = new RadioButtonPreference(getPrefContext());
-            configurePreferenceFromAppInfo(
-                    pref, app.getKey(), app.getValue(), defaultAppKey, systemDefaultAppKey);
-            screen.addPreference(pref);
-        }
-        mayCheckOnlyRadioButton();
     }
 
     @Override
     public void onRadioButtonClicked(RadioButtonPreference selected) {
         final String selectedKey = selected.getKey();
-        final String confirmationMessage = getConfirmationMessage(mCandidates.get(selectedKey));
+        final String confirmationMessage = getConfirmationMessage(getCandidate(selectedKey));
         final Activity activity = getActivity();
         if (TextUtils.isEmpty(confirmationMessage)) {
-            onRadioButtonConfirmed(selectedKey);
+            super.onRadioButtonClicked(selected);
         } else if (activity != null) {
             final DialogFragment fragment = ConfirmationDialogFragment.newInstance(
                     this, selectedKey, confirmationMessage);
@@ -138,63 +61,21 @@
         }
     }
 
-    private void onRadioButtonConfirmed(String selectedKey) {
-        final boolean success = setDefaultAppKey(selectedKey);
-        if (success) {
-            updateCheckedState(selectedKey);
-        }
-        onSelectionPerformed(success);
-    }
 
-    @VisibleForTesting
-    public void updateCheckedState(String selectedKey) {
-        final PreferenceScreen screen = getPreferenceScreen();
-        if (screen != null) {
-            final int count = screen.getPreferenceCount();
-            for (int i = 0; i < count; i++) {
-                final Preference pref = screen.getPreference(i);
-                if (pref instanceof RadioButtonPreference) {
-                    final RadioButtonPreference radioPref = (RadioButtonPreference) pref;
-                    final boolean newCheckedState = TextUtils.equals(pref.getKey(), selectedKey);
-                    if (radioPref.isChecked() != newCheckedState) {
-                        radioPref.setChecked(TextUtils.equals(pref.getKey(), selectedKey));
-                    }
-                }
-            }
+    @Override
+    public void bindPreferenceExtra(RadioButtonPreference pref,
+            String key, CandidateInfo info, String defaultKey, String systemDefaultKey) {
+        if (!(info instanceof DefaultAppInfo)) {
+            return;
+        }
+        if (TextUtils.equals(systemDefaultKey, key)) {
+            pref.setSummary(R.string.system_app);
+        } else if (!TextUtils.isEmpty(((DefaultAppInfo) info).summary)) {
+            pref.setSummary(((DefaultAppInfo) info).summary);
         }
     }
 
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
-    void mayCheckOnlyRadioButton() {
-        final PreferenceScreen screen = getPreferenceScreen();
-        // If there is only 1 thing on screen, select it.
-        if (screen != null && screen.getPreferenceCount() == 1) {
-            final Preference onlyPref = screen.getPreference(0);
-            if (onlyPref instanceof RadioButtonPreference) {
-                ((RadioButtonPreference) onlyPref).setChecked(true);
-            }
-        }
-    }
-
-    protected boolean shouldShowItemNone() {
-        return false;
-    }
-
-    protected String getSystemDefaultAppKey() {
-        return null;
-    }
-
-    protected abstract List<? extends DefaultAppInfo> getCandidates();
-
-    protected abstract String getDefaultAppKey();
-
-    protected abstract boolean setDefaultAppKey(String key);
-
-    // Called after the user tries to select an item.
-    protected void onSelectionPerformed(boolean success) {
-    }
-
-    protected String getConfirmationMessage(DefaultAppInfo appInfo) {
+    protected String getConfirmationMessage(CandidateInfo info) {
         return null;
     }
 
@@ -241,23 +122,4 @@
             }
         }
     }
-
-    @VisibleForTesting
-    public RadioButtonPreference configurePreferenceFromAppInfo(RadioButtonPreference pref,
-            String appKey, DefaultAppInfo info, String defaultAppKey, String systemDefaultAppKey) {
-        pref.setTitle(info.loadLabel(mPm.getPackageManager()));
-        pref.setIcon(info.loadIcon(mPm.getPackageManager()));
-        pref.setKey(appKey);
-        if (TextUtils.equals(defaultAppKey, appKey)) {
-            pref.setChecked(true);
-        }
-        if (TextUtils.equals(systemDefaultAppKey, appKey)) {
-            pref.setSummary(R.string.system_app);
-        } else if (!TextUtils.isEmpty(info.summary)) {
-            pref.setSummary(info.summary);
-        }
-        pref.setEnabled(info.enabled);
-        pref.setOnClickListener(this);
-        return pref;
-    }
 }
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java
index 4c65fca..93fc6a6 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java
@@ -51,7 +51,7 @@
         final DefaultAppInfo app = getDefaultAppInfo();
         CharSequence defaultAppLabel = null;
         if (app != null) {
-            defaultAppLabel = app.loadLabel(mPackageManager.getPackageManager());
+            defaultAppLabel = app.loadLabel();
         }
         if (!TextUtils.isEmpty(defaultAppLabel)) {
             preference.setSummary(defaultAppLabel);
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java b/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java
index e3a7a2b..ce9344f 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java
@@ -56,34 +56,34 @@
         final List<ResolveInfo> resolveInfos = mPm.getPackageManager()
                 .queryIntentServices(AUTOFILL_PROBE, PackageManager.GET_META_DATA);
         for (ResolveInfo info : resolveInfos) {
-            candidates.add(new DefaultAppInfo(mUserId, new ComponentName(
+            candidates.add(new DefaultAppInfo(mPm, mUserId, new ComponentName(
                     info.serviceInfo.packageName, info.serviceInfo.name)));
         }
         final List<ResolveInfo> oldResolveInfos = mPm.getPackageManager()
                 .queryIntentServices(OLD_AUTO_FILL_PROBE, PackageManager.GET_META_DATA);
         for (ResolveInfo info : oldResolveInfos) {
-            candidates.add(new DefaultAppInfo(mUserId, new ComponentName(
+            candidates.add(new DefaultAppInfo(mPm, mUserId, new ComponentName(
                     info.serviceInfo.packageName, info.serviceInfo.name)));
         }
         return candidates;
     }
 
     @Override
-    protected String getDefaultAppKey() {
+    protected String getDefaultKey() {
         return Settings.Secure.getString(getContext().getContentResolver(), SETTING);
     }
 
     @Override
-    protected String getConfirmationMessage(DefaultAppInfo appInfo) {
+    protected String getConfirmationMessage(CandidateInfo appInfo) {
         if (appInfo == null) {
             return null;
         }
-        final CharSequence appName = appInfo.loadLabel(mPm.getPackageManager());
+        final CharSequence appName = appInfo.loadLabel();
         return getContext().getString(R.string.autofill_confirmation_message, appName);
     }
 
     @Override
-    protected boolean setDefaultAppKey(String key) {
+    protected boolean setDefaultKey(String key) {
         Settings.Secure.putString(getContext().getContentResolver(), SETTING, key);
         return true;
     }
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceController.java
index c536dbb..161f2df 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceController.java
@@ -54,7 +54,7 @@
         final String flattenComponent = Settings.Secure.getString(mContext.getContentResolver(),
                 DefaultAutofillPicker.SETTING);
         if (!TextUtils.isEmpty(flattenComponent)) {
-            DefaultAppInfo appInfo = new DefaultAppInfo(
+            DefaultAppInfo appInfo = new DefaultAppInfo(mPackageManager,
                     mUserId, ComponentName.unflattenFromString(flattenComponent));
             return appInfo;
         }
diff --git a/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java b/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java
index 70d9415..e965052 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java
@@ -35,12 +35,12 @@
     }
 
     @Override
-    protected String getDefaultAppKey() {
+    protected String getDefaultKey() {
         return mPm.getDefaultBrowserPackageNameAsUser(mUserId);
     }
 
     @Override
-    protected boolean setDefaultAppKey(String packageName) {
+    protected boolean setDefaultKey(String packageName) {
         return mPm.setDefaultBrowserPackageNameAsUser(packageName, mUserId);
     }
 
@@ -59,7 +59,7 @@
                 continue;
             }
             try {
-                candidates.add(new DefaultAppInfo(
+                candidates.add(new DefaultAppInfo(mPm,
                         mPm.getApplicationInfoAsUser(info.activityInfo.packageName, 0, mUserId)));
             } catch (PackageManager.NameNotFoundException e) {
                 // Skip unknown packages.
diff --git a/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java
index 9a5c224..661fb5b 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java
@@ -52,8 +52,7 @@
     public void updateState(Preference preference) {
         super.updateState(preference);
         final DefaultAppInfo defaultApp = getDefaultAppInfo();
-        final CharSequence defaultAppLabel = defaultApp != null
-                ? defaultApp.loadLabel(mPackageManager.getPackageManager()) : null;
+        final CharSequence defaultAppLabel = defaultApp != null ? defaultApp.loadLabel() : null;
         if (TextUtils.isEmpty(defaultAppLabel)) {
             final String onlyAppLabel = getOnlyAppLabel();
             if (!TextUtils.isEmpty(onlyAppLabel)) {
@@ -65,8 +64,9 @@
     @Override
     protected DefaultAppInfo getDefaultAppInfo() {
         try {
-            return new DefaultAppInfo(mPackageManager.getPackageManager().getApplicationInfo(
-                    mPackageManager.getDefaultBrowserPackageNameAsUser(mUserId), 0));
+            return new DefaultAppInfo(mPackageManager,
+                    mPackageManager.getPackageManager().getApplicationInfo(
+                            mPackageManager.getDefaultBrowserPackageNameAsUser(mUserId), 0));
         } catch (PackageManager.NameNotFoundException e) {
             return null;
         }
diff --git a/src/com/android/settings/applications/defaultapps/DefaultEmergencyPicker.java b/src/com/android/settings/applications/defaultapps/DefaultEmergencyPicker.java
index b3cf882..1d707df 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultEmergencyPicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultEmergencyPicker.java
@@ -49,7 +49,7 @@
                 final PackageInfo packageInfo =
                         mPm.getPackageManager().getPackageInfo(info.activityInfo.packageName, 0);
                 final ApplicationInfo appInfo = packageInfo.applicationInfo;
-                candidates.add(new DefaultAppInfo(appInfo));
+                candidates.add(new DefaultAppInfo(mPm, appInfo));
                 // Get earliest installed system app.
                 if (isSystemApp(appInfo) && (bestMatch == null ||
                         bestMatch.firstInstallTime > packageInfo.firstInstallTime)) {
@@ -59,9 +59,9 @@
                 // Skip unknown packages.
             }
             if (bestMatch != null) {
-                final String defaultKey = getDefaultAppKey();
+                final String defaultKey = getDefaultKey();
                 if (TextUtils.isEmpty(defaultKey)) {
-                    setDefaultAppKey(bestMatch.packageName);
+                    setDefaultKey(bestMatch.packageName);
                 }
             }
         }
@@ -69,19 +69,19 @@
     }
 
     @Override
-    protected String getConfirmationMessage(DefaultAppInfo info) {
+    protected String getConfirmationMessage(CandidateInfo info) {
         return Utils.isPackageDirectBootAware(getContext(), info.getKey()) ? null
                 : getContext().getString(R.string.direct_boot_unaware_dialog_message);
     }
 
     @Override
-    protected String getDefaultAppKey() {
+    protected String getDefaultKey() {
         return Settings.Secure.getString(getContext().getContentResolver(),
                 Settings.Secure.EMERGENCY_ASSISTANCE_APPLICATION);
     }
 
     @Override
-    protected boolean setDefaultAppKey(String key) {
+    protected boolean setDefaultKey(String key) {
         final ContentResolver contentResolver = getContext().getContentResolver();
         final String previousValue = Settings.Secure.getString(contentResolver,
                 Settings.Secure.EMERGENCY_ASSISTANCE_APPLICATION);
diff --git a/src/com/android/settings/applications/defaultapps/DefaultHomePicker.java b/src/com/android/settings/applications/defaultapps/DefaultHomePicker.java
index 5e48bf1..038267b 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultHomePicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultHomePicker.java
@@ -68,14 +68,15 @@
             } else {
                 summary = null;
             }
-            final DefaultAppInfo candidate = new DefaultAppInfo(mUserId, activityName, summary);
+            final DefaultAppInfo candidate =
+                    new DefaultAppInfo(mPm, mUserId, activityName, summary);
             candidates.add(candidate);
         }
         return candidates;
     }
 
     @Override
-    protected String getDefaultAppKey() {
+    protected String getDefaultKey() {
         final ArrayList<ResolveInfo> homeActivities = new ArrayList<>();
         final ComponentName currentDefaultHome = mPm.getHomeActivities(homeActivities);
         if (currentDefaultHome != null) {
@@ -85,7 +86,7 @@
     }
 
     @Override
-    protected boolean setDefaultAppKey(String key) {
+    protected boolean setDefaultKey(String key) {
         if (!TextUtils.isEmpty(key)) {
             final ComponentName component = ComponentName.unflattenFromString(key);
             final List<ResolveInfo> homeActivities = new ArrayList<>();
diff --git a/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceController.java
index 7366d18..2e93876 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultHomePreferenceController.java
@@ -60,8 +60,7 @@
     public void updateState(Preference preference) {
         super.updateState(preference);
         final DefaultAppInfo defaultApp = getDefaultAppInfo();
-        final CharSequence defaultAppLabel = defaultApp != null
-                ? defaultApp.loadLabel(mPackageManager.getPackageManager()) : null;
+        final CharSequence defaultAppLabel = defaultApp != null ? defaultApp.loadLabel() : null;
         if (TextUtils.isEmpty(defaultAppLabel)) {
             final String onlyAppLabel = getOnlyAppLabel();
             if (!TextUtils.isEmpty(onlyAppLabel)) {
@@ -75,7 +74,7 @@
         final ArrayList<ResolveInfo> homeActivities = new ArrayList<>();
         final ComponentName currentDefaultHome = mPackageManager.getHomeActivities(homeActivities);
 
-        return new DefaultAppInfo(mUserId, currentDefaultHome);
+        return new DefaultAppInfo(mPackageManager, mUserId, currentDefaultHome);
     }
 
     private String getOnlyAppLabel() {
diff --git a/src/com/android/settings/applications/defaultapps/DefaultNotificationAssistantPicker.java b/src/com/android/settings/applications/defaultapps/DefaultNotificationAssistantPicker.java
index 06c5401..8ffcb68 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultNotificationAssistantPicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultNotificationAssistantPicker.java
@@ -43,12 +43,12 @@
     }
 
     @Override
-    protected String getDefaultAppKey() {
+    protected String getDefaultKey() {
         return Settings.Secure.getString(getContext().getContentResolver(), mConfig.setting);
     }
 
     @Override
-    protected boolean setDefaultAppKey(String value) {
+    protected boolean setDefaultKey(String value) {
         Settings.Secure.putString(getContext().getContentResolver(), mConfig.setting, value);
         return true;
     }
@@ -75,7 +75,7 @@
                 continue;
             }
 
-            candidates.add(new DefaultAppInfo(
+            candidates.add(new DefaultAppInfo(mPm,
                     mUserId, new ComponentName(info.packageName, info.name)));
         }
         return candidates;
diff --git a/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java b/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java
index 0fa9390..fc643c8 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java
@@ -50,7 +50,7 @@
                 DefaultDialerManager.getInstalledDialerApplications(getContext(), mUserId);
         for (String packageName : dialerPackages) {
             try {
-                candidates.add(new DefaultAppInfo(
+                candidates.add(new DefaultAppInfo(mPm,
                         mPm.getApplicationInfoAsUser(packageName, 0, mUserId)));
             } catch (PackageManager.NameNotFoundException e) {
                 // Skip unknown packages.
@@ -60,18 +60,18 @@
     }
 
     @Override
-    protected String getDefaultAppKey() {
+    protected String getDefaultKey() {
         return mDefaultKeyUpdater.getDefaultDialerApplication(getContext(), mUserId);
     }
 
     @Override
-    protected String getSystemDefaultAppKey() {
+    protected String getSystemDefaultKey() {
         return mDefaultKeyUpdater.getSystemDialerPackage();
     }
 
     @Override
-    protected boolean setDefaultAppKey(String key) {
-        if (!TextUtils.isEmpty(key) && !TextUtils.equals(key, getDefaultAppKey())) {
+    protected boolean setDefaultKey(String key) {
+        if (!TextUtils.isEmpty(key) && !TextUtils.equals(key, getDefaultKey())) {
             return mDefaultKeyUpdater.setDefaultDialerApplication(getContext(), key, mUserId);
         }
         return false;
diff --git a/src/com/android/settings/applications/defaultapps/DefaultPhonePreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultPhonePreferenceController.java
index 8a73468..712badb 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultPhonePreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultPhonePreferenceController.java
@@ -57,8 +57,10 @@
     @Override
     protected DefaultAppInfo getDefaultAppInfo() {
         try {
-            return new DefaultAppInfo(mPackageManager.getPackageManager().getApplicationInfo(
-                    DefaultDialerManager.getDefaultDialerApplication(mContext, mUserId), 0));
+            return new DefaultAppInfo(mPackageManager,
+                    mPackageManager.getPackageManager().getApplicationInfo(
+                            DefaultDialerManager.getDefaultDialerApplication(mContext, mUserId),
+                            0));
         } catch (PackageManager.NameNotFoundException e) {
             return null;
         }
diff --git a/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java b/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java
index 31bb6f6..966cd43 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java
@@ -47,7 +47,7 @@
 
         for (SmsApplication.SmsApplicationData smsApplicationData : smsApplications) {
             try {
-                candidates.add(new DefaultAppInfo(
+                candidates.add(new DefaultAppInfo(mPm,
                         mPm.getApplicationInfoAsUser(smsApplicationData.mPackageName, 0, mUserId)));
             } catch (PackageManager.NameNotFoundException e) {
                 // Skip unknown packages.
@@ -58,13 +58,13 @@
     }
 
     @Override
-    protected String getDefaultAppKey() {
+    protected String getDefaultKey() {
         return mDefaultKeyUpdater.getDefaultApplication(getContext());
     }
 
     @Override
-    protected boolean setDefaultAppKey(String key) {
-        if (!TextUtils.isEmpty(key) && !TextUtils.equals(key, getDefaultAppKey())) {
+    protected boolean setDefaultKey(String key) {
+        if (!TextUtils.isEmpty(key) && !TextUtils.equals(key, getDefaultKey())) {
             mDefaultKeyUpdater.setDefaultApplication(getContext(), key);
             return true;
         }
@@ -72,7 +72,7 @@
     }
 
     @Override
-    protected String getConfirmationMessage(DefaultAppInfo info) {
+    protected String getConfirmationMessage(CandidateInfo info) {
         return Utils.isPackageDirectBootAware(getContext(), info.getKey()) ? null
                 : getContext().getString(R.string.direct_boot_unaware_dialog_message);
     }
diff --git a/src/com/android/settings/applications/defaultapps/DefaultSmsPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultSmsPreferenceController.java
index 81a3af0..63075b9 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultSmsPreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultSmsPreferenceController.java
@@ -47,7 +47,7 @@
     protected DefaultAppInfo getDefaultAppInfo() {
         final ComponentName app = SmsApplication.getDefaultSmsApplication(mContext, true);
         if (app != null) {
-            return new DefaultAppInfo(mUserId, app);
+            return new DefaultAppInfo(mPackageManager, mUserId, app);
         }
         return null;
     }
diff --git a/src/com/android/settings/bluetooth/BluetoothSummaryUpdater.java b/src/com/android/settings/bluetooth/BluetoothSummaryUpdater.java
index dc37efc..282f613 100644
--- a/src/com/android/settings/bluetooth/BluetoothSummaryUpdater.java
+++ b/src/com/android/settings/bluetooth/BluetoothSummaryUpdater.java
@@ -98,13 +98,13 @@
         }
         switch (mConnectionState) {
             case BluetoothAdapter.STATE_CONNECTED:
-                return mContext.getString(R.string.bluetooth_connected);
+                return mContext.getString(R.string.bluetooth_connected_summary);
             case BluetoothAdapter.STATE_CONNECTING:
                 return mContext.getString(R.string.bluetooth_connecting);
             case BluetoothAdapter.STATE_DISCONNECTING:
                 return mContext.getString(R.string.bluetooth_disconnecting);
             default:
-                return mContext.getString(R.string.bluetooth_disconnected);
+                return mContext.getString(R.string.disconnected);
         }
     }
 
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index 467b848..59cedf8 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -111,6 +111,7 @@
 import com.android.settings.notification.ZenModeVisualInterruptionSettings;
 import com.android.settings.print.PrintJobSettingsFragment;
 import com.android.settings.print.PrintSettingsFragment;
+import com.android.settings.security.LockscreenDashboardFragment;
 import com.android.settings.sim.SimSettings;
 import com.android.settings.system.SystemDashboardFragment;
 import com.android.settings.tts.TextToSpeechSettings;
@@ -242,6 +243,7 @@
             UserAndAccountDashboardFragment.class.getName(),
             EnterprisePrivacySettings.class.getName(),
             WebViewAppPicker.class.getName(),
+            LockscreenDashboardFragment.class.getName(),
     };
 
     public static final String[] SETTINGS_FOR_RESTRICTED = {
diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
index 076ec05..9ddf7b7 100644
--- a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
+++ b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
@@ -27,6 +27,7 @@
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.UserInfo;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.Environment;
 import android.os.UserHandle;
@@ -759,7 +760,8 @@
         @Override
         public Dialog onCreateDialog(Bundle savedInstanceState) {
             return new AlertDialog.Builder(getActivity())
-                    .setMessage(R.string.storage_detail_dialog_system)
+                    .setMessage(getContext().getString(R.string.storage_detail_dialog_system,
+                            Build.VERSION.RELEASE))
                     .setPositiveButton(android.R.string.ok, null)
                     .create();
         }
diff --git a/src/com/android/settings/deviceinfo/StorageProfileFragment.java b/src/com/android/settings/deviceinfo/StorageProfileFragment.java
index d6071c7..1a24962 100644
--- a/src/com/android/settings/deviceinfo/StorageProfileFragment.java
+++ b/src/com/android/settings/deviceinfo/StorageProfileFragment.java
@@ -73,6 +73,7 @@
 
         mPreferenceController.setVolume(mVolume);
         mUserId = args.getInt(USER_ID_EXTRA, UserHandle.myUserId());
+        // TODO(b/36224168): Use the user id to appropriately badge the preferences.
         mPreferenceController.setUserId(mUserId);
     }
 
@@ -137,6 +138,7 @@
             return null;
         }
 
+        // TODO(b/35927909): Attribute app sizes better than zeroing out for profiles.
         result.gamesSize = 0;
         result.musicAppsSize = 0;
         result.otherAppsSize = 0;
diff --git a/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java b/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java
index eb589ca..b3e89c6 100644
--- a/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java
+++ b/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java
@@ -33,7 +33,6 @@
 import java.util.ArrayList;
 import java.util.List;
 
-
 /**
  * SecondaryUserController controls the preferences on the Storage screen which had to do with
  * secondary users.
@@ -109,6 +108,9 @@
             if (mSize != SIZE_NOT_SET) {
                 mStoragePreference.setStorageSize(mSize, mTotalSizeBytes);
             }
+
+            // TODO(b/36252572): Set the user icon appropriately here.
+
             group.setVisible(true);
             group.addPreference(mStoragePreference);
         }
diff --git a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
index eec9487..e22aa24 100644
--- a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
@@ -35,6 +35,7 @@
 import com.android.settings.applications.ManageApplications;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.core.instrumentation.MetricsFeatureProvider;
+import com.android.settings.deviceinfo.PrivateVolumeSettings.SystemInfoFragment;
 import com.android.settings.deviceinfo.StorageItemPreference;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.deviceinfo.StorageMeasurement;
@@ -52,6 +53,7 @@
     private static final String TAG = "StorageItemPreference";
 
     private static final String IMAGE_MIME_TYPE = "image/*";
+    private static final String SYSTEM_FRAGMENT_TAG = "SystemInfo";
 
     @VisibleForTesting
     static final String PHOTO_KEY = "pref_photos_videos";
@@ -104,8 +106,6 @@
             return false;
         }
 
-        // TODO: Currently, this reflects the existing behavior for these toggles.
-        //       After the intermediate views are built, swap them in.
         Intent intent = null;
         if (preference.getKey() == null) {
             return false;
@@ -133,6 +133,11 @@
                 FeatureFactory.getFactory(mContext).getMetricsFeatureProvider().action(
                         mContext, MetricsEvent.STORAGE_FILES);
                 break;
+            case SYSTEM_KEY:
+                final SystemInfoFragment dialog = new SystemInfoFragment();
+                dialog.setTargetFragment(mFragment, 0);
+                dialog.show(mFragment.getFragmentManager(), SYSTEM_FRAGMENT_TAG);
+                return true;
         }
 
         if (intent != null) {
diff --git a/src/com/android/settings/deviceinfo/storage/UserProfileController.java b/src/com/android/settings/deviceinfo/storage/UserProfileController.java
index ef8b21e..0e19740 100644
--- a/src/com/android/settings/deviceinfo/storage/UserProfileController.java
+++ b/src/com/android/settings/deviceinfo/storage/UserProfileController.java
@@ -66,6 +66,7 @@
         mStoragePreference.setOrder(mPreferenceOrder);
         mStoragePreference.setKey(PREFERENCE_KEY_BASE + mUser.id);
         mStoragePreference.setTitle(mUser.name);
+        // TODO(b/36252572): Set user icon here.
         screen.addPreference(mStoragePreference);
     }
 
diff --git a/src/com/android/settings/display/VrDisplayPreferenceController.java b/src/com/android/settings/display/VrDisplayPreferenceController.java
index 0eb1c88..4fef987 100644
--- a/src/com/android/settings/display/VrDisplayPreferenceController.java
+++ b/src/com/android/settings/display/VrDisplayPreferenceController.java
@@ -17,17 +17,13 @@
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.provider.Settings;
-import android.support.v7.preference.DropDownPreference;
 import android.support.v7.preference.Preference;
-import android.util.Log;
 
 import com.android.settings.R;
 import com.android.settings.core.PreferenceController;
 
-public class VrDisplayPreferenceController extends PreferenceController implements
-        Preference.OnPreferenceChangeListener {
+public class VrDisplayPreferenceController extends PreferenceController {
 
-    private static final String TAG = "VrDisplayPrefContr";
     private static final String KEY_VR_DISPLAY_PREF = "vr_display_pref";
 
     public VrDisplayPreferenceController(Context context) {
@@ -47,31 +43,14 @@
 
     @Override
     public void updateState(Preference preference) {
-        final DropDownPreference pref = (DropDownPreference) preference;
-        pref.setEntries(new CharSequence[]{
-                mContext.getString(R.string.display_vr_pref_low_persistence),
-                mContext.getString(R.string.display_vr_pref_off),
-        });
-        pref.setEntryValues(new CharSequence[]{"0", "1"});
-
         int currentUser = ActivityManager.getCurrentUser();
         int current = Settings.Secure.getIntForUser(mContext.getContentResolver(),
-                Settings.Secure.VR_DISPLAY_MODE,
-                            /*default*/Settings.Secure.VR_DISPLAY_MODE_LOW_PERSISTENCE,
+                Settings.Secure.VR_DISPLAY_MODE, Settings.Secure.VR_DISPLAY_MODE_LOW_PERSISTENCE,
                 currentUser);
-        pref.setValueIndex(current);
-    }
-
-    @Override
-    public boolean onPreferenceChange(Preference preference, Object newValue) {
-        int i = Integer.parseInt((String) newValue);
-        int u = ActivityManager.getCurrentUser();
-        if (!Settings.Secure.putIntForUser(mContext.getContentResolver(),
-                Settings.Secure.VR_DISPLAY_MODE,
-                i, u)) {
-            Log.e(TAG, "Could not change setting for " +
-                    Settings.Secure.VR_DISPLAY_MODE);
+        if (current == 0) {
+            preference.setSummary(R.string.display_vr_pref_low_persistence);
+        } else {
+            preference.setSummary(R.string.display_vr_pref_off);
         }
-        return true;
     }
 }
diff --git a/src/com/android/settings/display/VrDisplayPreferencePicker.java b/src/com/android/settings/display/VrDisplayPreferencePicker.java
new file mode 100644
index 0000000..bccdaa5
--- /dev/null
+++ b/src/com/android/settings/display/VrDisplayPreferencePicker.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.display;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.provider.Settings;
+import android.text.TextUtils;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.R;
+import com.android.settings.widget.RadioButtonPickerFragment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class VrDisplayPreferencePicker extends RadioButtonPickerFragment {
+
+    static final String PREF_KEY_PREFIX = "vr_display_pref_";
+
+    @Override
+    public int getMetricsCategory() {
+        return MetricsProto.MetricsEvent.VR_DISPLAY_PREFERENCE;
+    }
+
+    @Override
+    protected List<VrCandidateInfo> getCandidates() {
+        List<VrCandidateInfo> candidates = new ArrayList<>();
+        final Context context = getContext();
+        candidates.add(new VrCandidateInfo(context, 0, R.string.display_vr_pref_low_persistence));
+        candidates.add(new VrCandidateInfo(context, 1, R.string.display_vr_pref_off));
+        return candidates;
+    }
+
+    @Override
+    protected String getDefaultKey() {
+        int current = Settings.Secure.getIntForUser(getContext().getContentResolver(),
+                Settings.Secure.VR_DISPLAY_MODE, Settings.Secure.VR_DISPLAY_MODE_LOW_PERSISTENCE,
+                mUserId);
+        return PREF_KEY_PREFIX + current;
+    }
+
+    @Override
+    protected boolean setDefaultKey(String key) {
+        if (TextUtils.isEmpty(key)) {
+            return false;
+        }
+        switch (key) {
+            case PREF_KEY_PREFIX + 0:
+                return Settings.Secure.putIntForUser(getContext().getContentResolver(),
+                        Settings.Secure.VR_DISPLAY_MODE, 0, mUserId);
+            case PREF_KEY_PREFIX + 1:
+                return Settings.Secure.putIntForUser(getContext().getContentResolver(),
+                        Settings.Secure.VR_DISPLAY_MODE, 1, mUserId);
+        }
+        return false;
+    }
+
+    static class VrCandidateInfo extends CandidateInfo {
+
+        public final String label;
+        public final int value;
+
+        public VrCandidateInfo(Context context, int value, int resId) {
+            super(true);
+            this.value = value;
+            label = context.getString(resId);
+        }
+
+        @Override
+        public CharSequence loadLabel() {
+            return label;
+        }
+
+        @Override
+        public Drawable loadIcon() {
+            return null;
+        }
+
+        @Override
+        public String getKey() {
+            return PREF_KEY_PREFIX + value;
+        }
+    }
+}
diff --git a/src/com/android/settings/enterprise/AdminGrantedPermissionsPreferenceControllerBase.java b/src/com/android/settings/enterprise/AdminGrantedPermissionsPreferenceControllerBase.java
index c60d7e0..0db9e15 100644
--- a/src/com/android/settings/enterprise/AdminGrantedPermissionsPreferenceControllerBase.java
+++ b/src/com/android/settings/enterprise/AdminGrantedPermissionsPreferenceControllerBase.java
@@ -53,7 +53,8 @@
                     } else {
                         preference.setVisible(true);
                         preference.setSummary(mContext.getResources().getQuantityString(
-                                R.plurals.enterprise_privacy_number_packages_actionable, num, num));
+                                R.plurals.enterprise_privacy_number_packages_lower_bound,
+                                num, num));
                     }
                 });
     }
diff --git a/src/com/android/settings/enterprise/EnterpriseInstalledPackagesPreferenceController.java b/src/com/android/settings/enterprise/EnterpriseInstalledPackagesPreferenceController.java
index 93c1909..e70396d 100644
--- a/src/com/android/settings/enterprise/EnterpriseInstalledPackagesPreferenceController.java
+++ b/src/com/android/settings/enterprise/EnterpriseInstalledPackagesPreferenceController.java
@@ -50,7 +50,8 @@
                     } else {
                         preference.setVisible(true);
                         preference.setSummary(mContext.getResources().getQuantityString(
-                                R.plurals.enterprise_privacy_number_packages, num, num));
+                                R.plurals.enterprise_privacy_number_packages_lower_bound, num,
+                                num));
                     }
                 });
     }
diff --git a/src/com/android/settings/location/LocationSettings.java b/src/com/android/settings/location/LocationSettings.java
index e540b2c..dc321e2 100644
--- a/src/com/android/settings/location/LocationSettings.java
+++ b/src/com/android/settings/location/LocationSettings.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.location;
 
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
 import android.app.Activity;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -49,8 +51,6 @@
 import java.util.Comparator;
 import java.util.List;
 
-import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
-
 /**
  * System location settings (Settings &gt; Location). The screen has three parts:
  * <ul>
diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java
index dd59e86..f88d830 100644
--- a/src/com/android/settings/search/SearchIndexableResources.java
+++ b/src/com/android/settings/search/SearchIndexableResources.java
@@ -70,6 +70,7 @@
 import com.android.settings.notification.ZenModeSettings;
 import com.android.settings.notification.ZenModeVisualInterruptionSettings;
 import com.android.settings.print.PrintSettingsFragment;
+import com.android.settings.security.LockscreenDashboardFragment;
 import com.android.settings.sim.SimSettings;
 import com.android.settings.system.SystemDashboardFragment;
 import com.android.settings.tts.TtsEnginePreferenceFragment;
@@ -170,6 +171,8 @@
         addIndex(PaymentSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_nfc_payment);
         addIndex(
                 TtsEnginePreferenceFragment.class, NO_DATA_RES_ID, R.drawable.ic_settings_language);
+        addIndex(LockscreenDashboardFragment.class, R.xml.security_lockscreen_settings,
+            R.drawable.ic_settings_security);
     }
 
     private SearchIndexableResources() {
diff --git a/src/com/android/settings/security/LockscreenDashboardFragment.java b/src/com/android/settings/security/LockscreenDashboardFragment.java
new file mode 100644
index 0000000..b781fbb
--- /dev/null
+++ b/src/com/android/settings/security/LockscreenDashboardFragment.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.security;
+
+import android.content.Context;
+import android.provider.SearchIndexableResource;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.settings.R;
+import com.android.settings.accounts.AddUserWhenLockedPreferenceController;
+import com.android.settings.core.PreferenceController;
+import com.android.settings.core.lifecycle.Lifecycle;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.notification.LockScreenNotificationPreferenceController;
+import com.android.settings.search.BaseSearchIndexProvider;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Settings screen for lock screen preference
+ */
+public class LockscreenDashboardFragment extends DashboardFragment
+        implements OwnerInfoPreferenceController.OwnerInfoCallback {
+
+    private static final String TAG = "LockscreenDashboardFragment";
+
+    private OwnerInfoPreferenceController mOwnerInfoPreferenceController;
+
+    @Override
+    public int getMetricsCategory() {
+        return MetricsEvent.SETTINGS_LOCK_SCREEN_PREFERENCES;
+    }
+
+    @Override
+    protected String getLogTag() {
+        return TAG;
+    }
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.security_lockscreen_settings;
+    }
+
+    @Override
+    protected List<PreferenceController> getPreferenceControllers(Context context) {
+        final List<PreferenceController> controllers = new ArrayList<>();
+        final Lifecycle lifecycle = getLifecycle();
+        final LockScreenNotificationPreferenceController notificationController =
+            new LockScreenNotificationPreferenceController(context);
+        lifecycle.addObserver(notificationController);
+        controllers.add(notificationController);
+        final AddUserWhenLockedPreferenceController addUserWhenLockedController =
+            new AddUserWhenLockedPreferenceController(context);
+        lifecycle.addObserver(addUserWhenLockedController);
+        controllers.add(addUserWhenLockedController);
+        mOwnerInfoPreferenceController =
+            new OwnerInfoPreferenceController(context, this, lifecycle);
+        controllers.add(mOwnerInfoPreferenceController);
+        return controllers;
+    }
+
+    @Override
+    public void onOwnerInfoUpdated() {
+        if (mOwnerInfoPreferenceController != null) {
+            mOwnerInfoPreferenceController.updateSummary();
+        }
+    }
+
+    public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+        new BaseSearchIndexProvider() {
+            @Override
+            public List<SearchIndexableResource> getXmlResourcesToIndex(
+                Context context, boolean enabled) {
+                final SearchIndexableResource sir = new SearchIndexableResource(context);
+                sir.xmlResId = R.xml.security_lockscreen_settings;
+                return Arrays.asList(sir);
+            }
+
+            @Override
+            public List<PreferenceController> getPreferenceControllers(Context context) {
+                final List<PreferenceController> controllers = new ArrayList<>();
+                controllers.add(new LockScreenNotificationPreferenceController(context));
+                controllers.add(new AddUserWhenLockedPreferenceController(context));
+                controllers.add(new OwnerInfoPreferenceController(
+                    context, null /* fragment */, null /* lifecycle */));
+                return controllers;
+            }
+        };
+}
diff --git a/src/com/android/settings/security/OwnerInfoPreferenceController.java b/src/com/android/settings/security/OwnerInfoPreferenceController.java
new file mode 100644
index 0000000..259ef12
--- /dev/null
+++ b/src/com/android/settings/security/OwnerInfoPreferenceController.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.security;
+
+import android.app.Fragment;
+import android.content.Context;
+import android.os.UserHandle;
+import android.support.annotation.VisibleForTesting;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.Preference.OnPreferenceClickListener;
+import android.support.v7.preference.PreferenceScreen;
+import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.OwnerInfoSettings;
+import com.android.settings.core.PreferenceController;
+import com.android.settings.core.lifecycle.Lifecycle;
+import com.android.settings.core.lifecycle.LifecycleObserver;
+import com.android.settings.core.lifecycle.events.OnResume;
+import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+import com.android.settingslib.RestrictedPreference;
+
+public class OwnerInfoPreferenceController extends PreferenceController
+        implements LifecycleObserver, OnResume {
+
+    private static final String KEY_OWNER_INFO = "owner_info_settings";
+    private static final int MY_USER_ID = UserHandle.myUserId();
+
+    private final LockPatternUtils mLockPatternUtils;
+    private final Fragment mParent;
+    private RestrictedPreference mOwnerInfoPref;
+
+    // Container fragment should implement this in order to show the correct summary
+    public interface OwnerInfoCallback {
+        public void onOwnerInfoUpdated();
+    }
+
+    public OwnerInfoPreferenceController(Context context, Fragment parent, Lifecycle lifecycle ) {
+        super(context);
+        mParent = parent;
+        mLockPatternUtils = new LockPatternUtils(context);
+        if (lifecycle != null) {
+            lifecycle.addObserver(this);
+        }
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        mOwnerInfoPref  = (RestrictedPreference) screen.findPreference(KEY_OWNER_INFO);
+    }
+
+    @Override
+    public void onResume() {
+        updateEnableState();
+        updateSummary();
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return true;
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return KEY_OWNER_INFO;
+    }
+
+    public void updateEnableState() {
+        if (mOwnerInfoPref == null) {
+            return;
+        }
+        if (isDeviceOwnerInfoEnabled()) {
+            EnforcedAdmin admin = getDeviceOwner();
+            mOwnerInfoPref.setDisabledByAdmin(admin);
+        } else {
+            mOwnerInfoPref.setDisabledByAdmin(null);
+            mOwnerInfoPref.setEnabled(!mLockPatternUtils.isLockScreenDisabled(MY_USER_ID));
+            if (mOwnerInfoPref.isEnabled()) {
+                mOwnerInfoPref.setOnPreferenceClickListener(
+                    new OnPreferenceClickListener() {
+                        @Override
+                        public boolean onPreferenceClick(Preference preference) {
+                            OwnerInfoSettings.show(mParent);
+                            return true;
+                        }
+                    });
+            }
+        }
+    }
+
+    public void updateSummary() {
+        if (mOwnerInfoPref != null) {
+            if (isDeviceOwnerInfoEnabled()) {
+                mOwnerInfoPref.setSummary(
+                    getDeviceOwnerInfo());
+            } else {
+                mOwnerInfoPref.setSummary(isOwnerInfoEnabled()
+                    ? getOwnerInfo()
+                    : mContext.getString(
+                        com.android.settings.R.string.owner_info_settings_summary));
+            }
+        }
+    }
+
+    // Wrapper methods to allow testing
+    @VisibleForTesting
+    boolean isDeviceOwnerInfoEnabled() {
+        return mLockPatternUtils.isDeviceOwnerInfoEnabled();
+    }
+
+    @VisibleForTesting
+    String getDeviceOwnerInfo() {
+        return mLockPatternUtils.getDeviceOwnerInfo();
+    }
+
+    @VisibleForTesting
+    boolean isOwnerInfoEnabled() {
+        return mLockPatternUtils.isOwnerInfoEnabled(MY_USER_ID);
+    }
+
+    @VisibleForTesting
+    String getOwnerInfo() {
+        return mLockPatternUtils.getOwnerInfo(MY_USER_ID);
+    }
+
+    @VisibleForTesting
+    EnforcedAdmin getDeviceOwner() {
+        return RestrictedLockUtils.getDeviceOwner(mContext);
+    }
+}
diff --git a/src/com/android/settings/users/UserPreference.java b/src/com/android/settings/users/UserPreference.java
index 7b13597..8b53dd4 100644
--- a/src/com/android/settings/users/UserPreference.java
+++ b/src/com/android/settings/users/UserPreference.java
@@ -20,7 +20,6 @@
 import android.graphics.drawable.Drawable;
 import android.os.UserHandle;
 import android.os.UserManager;
-import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceViewHolder;
 import android.util.AttributeSet;
 import android.view.View;
@@ -87,6 +86,20 @@
     }
 
     @Override
+    protected boolean shouldHideSecondTarget() {
+        if (isDisabledByAdmin()) {
+            // Disabled by admin, show no secondary target.
+            return true;
+        }
+        if (canDeleteUser()) {
+            // Need to show delete user target so don't hide.
+            return false;
+        }
+        // Hide if don't have advanced setting listener.
+        return mSettingsClickListener == null;
+    }
+
+    @Override
     public void onBindViewHolder(PreferenceViewHolder view) {
         super.onBindViewHolder(view);
         final boolean disabledByAdmin = isDisabledByAdmin();
@@ -96,14 +109,11 @@
             userDeleteWidget.setVisibility(disabledByAdmin ? View.GONE : View.VISIBLE);
         }
         if (!disabledByAdmin) {
-            UserManager um = (UserManager) getContext().getSystemService(Context.USER_SERVICE);
             View deleteDividerView = view.findViewById(R.id.divider_delete);
             View manageDividerView = view.findViewById(R.id.divider_manage);
             View deleteView = view.findViewById(R.id.trash_user);
             if (deleteView != null) {
-                if (mDeleteClickListener != null
-                        && !RestrictedLockUtils.hasBaseUserRestriction(getContext(),
-                                UserManager.DISALLOW_REMOVE_USER, UserHandle.myUserId())) {
+                if (canDeleteUser()) {
                     deleteView.setVisibility(View.VISIBLE);
                     deleteDividerView.setVisibility(View.VISIBLE);
                     deleteView.setOnClickListener(mDeleteClickListener);
@@ -129,6 +139,12 @@
         }
     }
 
+    private boolean canDeleteUser() {
+        return mDeleteClickListener != null
+                && !RestrictedLockUtils.hasBaseUserRestriction(getContext(),
+                UserManager.DISALLOW_REMOVE_USER, UserHandle.myUserId());
+    }
+
     private int getSerialNumber() {
         if (mUserId == UserHandle.myUserId()) return Integer.MIN_VALUE;
         if (mSerialNumber < 0) {
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index c3a058a..8026e27 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -61,6 +61,7 @@
 import com.android.settings.SettingsActivity;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
+import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 import com.android.settings.search.SearchIndexableRaw;
@@ -1007,6 +1008,36 @@
         mMePreference.setTitle(label);
     }
 
+    private static class SummaryProvider implements SummaryLoader.SummaryProvider {
+
+        private final Context mContext;
+        private final SummaryLoader mSummaryLoader;
+
+        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
+            mContext = context;
+            mSummaryLoader = summaryLoader;
+        }
+
+        @Override
+        public void setListening(boolean listening) {
+            if (listening) {
+                UserInfo info = mContext.getSystemService(UserManager.class).getUserInfo(
+                    UserHandle.myUserId());
+                mSummaryLoader.setSummary(this, mContext.getString(R.string.users_summary,
+                    info.name));
+            }
+        }
+    }
+
+    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY =
+        new SummaryLoader.SummaryProviderFactory() {
+            @Override
+            public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
+                    SummaryLoader summaryLoader) {
+                return new SummaryProvider(activity, summaryLoader);
+            }
+        };
+
     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
                 @Override
diff --git a/src/com/android/settings/webview/WebViewAppPicker.java b/src/com/android/settings/webview/WebViewAppPicker.java
index f1faf9b..380b964 100644
--- a/src/com/android/settings/webview/WebViewAppPicker.java
+++ b/src/com/android/settings/webview/WebViewAppPicker.java
@@ -19,17 +19,18 @@
 import static android.provider.Settings.ACTION_WEBVIEW_SETTINGS;
 
 import android.app.Activity;
+import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageItemInfo;
 import android.content.pm.PackageInfo;
+import android.content.pm.PackageItemInfo;
 import android.content.pm.PackageManager;
-import android.content.Context;
 import android.support.annotation.VisibleForTesting;
 import android.text.TextUtils;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
+import com.android.settings.applications.PackageManagerWrapper;
 import com.android.settings.applications.defaultapps.DefaultAppInfo;
 import com.android.settings.applications.defaultapps.DefaultAppPickerFragment;
 
@@ -61,7 +62,7 @@
         List<ApplicationInfo> pkgs =
                 getWebViewUpdateServiceWrapper().getValidWebViewApplicationInfos(getContext());
         for (ApplicationInfo ai : pkgs) {
-            packageInfoList.add(createDefaultAppInfo(ai,
+            packageInfoList.add(createDefaultAppInfo(mPm, ai,
                     getDisabledReason(getWebViewUpdateServiceWrapper(),
                             getContext(), ai.packageName)));
         }
@@ -69,12 +70,12 @@
     }
 
     @Override
-    protected String getDefaultAppKey() {
+    protected String getDefaultKey() {
         PackageInfo currentPackage = getWebViewUpdateServiceWrapper().getCurrentWebViewPackage();
         return currentPackage == null ? null : currentPackage.packageName;
     }
 
-    protected boolean setDefaultAppKey(String key) {
+    protected boolean setDefaultKey(String key) {
         boolean success = getWebViewUpdateServiceWrapper().setWebViewProvider(key);
         return success;
     }
@@ -110,25 +111,28 @@
     }
 
     private static class WebViewAppInfo extends DefaultAppInfo {
-        public WebViewAppInfo(PackageItemInfo packageItemInfo, String summary, boolean enabled) {
-          super(packageItemInfo, summary, enabled);
+        public WebViewAppInfo(PackageManagerWrapper pm, PackageItemInfo packageItemInfo,
+                String summary, boolean enabled) {
+            super(pm, packageItemInfo, summary, enabled);
         }
 
         @Override
-        public CharSequence loadLabel(PackageManager pm) {
+        public CharSequence loadLabel() {
             String versionName = "";
             try {
-                versionName = pm.getPackageInfo(packageItemInfo.packageName, 0).versionName;
+                versionName = mPm.getPackageManager().
+                        getPackageInfo(packageItemInfo.packageName, 0).versionName;
             } catch (PackageManager.NameNotFoundException e) {
             }
-            return String.format("%s %s", super.loadLabel(pm), versionName);
+            return String.format("%s %s", super.loadLabel(), versionName);
         }
     }
 
 
     @VisibleForTesting
-    DefaultAppInfo createDefaultAppInfo(PackageItemInfo packageItemInfo, String disabledReason) {
-        return new WebViewAppInfo(packageItemInfo, disabledReason,
+    DefaultAppInfo createDefaultAppInfo(PackageManagerWrapper pm, PackageItemInfo packageItemInfo,
+            String disabledReason) {
+        return new WebViewAppInfo(pm, packageItemInfo, disabledReason,
                 TextUtils.isEmpty(disabledReason) /* enabled */);
     }
 
@@ -139,7 +143,6 @@
     @VisibleForTesting
     String getDisabledReason(WebViewUpdateServiceWrapper webviewUpdateServiceWrapper,
             Context context, String packageName) {
-        StringBuilder disabledReason = new StringBuilder();
         List<UserPackageWrapper> userPackages =
                 webviewUpdateServiceWrapper.getPackageInfosAllUsers(context, packageName);
         for (UserPackageWrapper userPackage : userPackages) {
@@ -150,7 +153,7 @@
             } else if (!userPackage.isEnabledPackage()) {
                 // Package disabled
                 return context.getString(
-                    R.string.webview_disabled_for_user, userPackage.getUserInfo().name);
+                        R.string.webview_disabled_for_user, userPackage.getUserInfo().name);
             }
         }
         return null;
diff --git a/src/com/android/settings/webview/WebViewAppPreferenceController.java b/src/com/android/settings/webview/WebViewAppPreferenceController.java
index 3a181fe..2f3246c 100644
--- a/src/com/android/settings/webview/WebViewAppPreferenceController.java
+++ b/src/com/android/settings/webview/WebViewAppPreferenceController.java
@@ -26,9 +26,9 @@
 
     private static final String WEBVIEW_APP_KEY = "select_webview_provider";
 
-    private Context mContext;
-    private Preference mPreference;
+    private final Context mContext;
     private final WebViewUpdateServiceWrapper mWebViewUpdateServiceWrapper;
+    private Preference mPreference;
 
     public WebViewAppPreferenceController(Context context) {
         this(context, new WebViewUpdateServiceWrapper());
@@ -44,7 +44,8 @@
     @Override
     public DefaultAppInfo getDefaultAppInfo() {
         PackageInfo currentPackage = mWebViewUpdateServiceWrapper.getCurrentWebViewPackage();
-        return new DefaultAppInfo(currentPackage == null ? null : currentPackage.applicationInfo);
+        return new DefaultAppInfo(mPackageManager,
+                currentPackage == null ? null : currentPackage.applicationInfo);
     }
 
     @Override
diff --git a/src/com/android/settings/widget/DonutView.java b/src/com/android/settings/widget/DonutView.java
index ba7939d..0feaa07 100644
--- a/src/com/android/settings/widget/DonutView.java
+++ b/src/com/android/settings/widget/DonutView.java
@@ -22,20 +22,25 @@
 import android.util.AttributeSet;
 import android.view.View;
 
+import com.android.internal.util.Preconditions;
 import com.android.settings.R;
 import com.android.settings.Utils;
 
 /**
  * DonutView represents a donut graph. It visualizes a certain percentage of fullness with a
- * corresponding label with the fullness on the inside (i.e. "50%" inside of the donut.
+ * corresponding label with the fullness on the inside (i.e. "50%" inside of the donut).
  */
 public class DonutView extends View {
     private static final int TOP = -90;
     private float mStrokeWidth;
+    private float mDeviceDensity;
     private int mPercent;
     private Paint mBackgroundCircle;
     private Paint mFilledArc;
     private TextPaint mTextPaint;
+    private TextPaint mBigNumberPaint;
+    private String mPercentString;
+    private String mFullString;
 
     public DonutView(Context context) {
         super(context);
@@ -43,8 +48,8 @@
 
     public DonutView(Context context, AttributeSet attrs) {
         super(context, attrs);
-        float density = getResources().getDisplayMetrics().density;
-        mStrokeWidth = 6f * density;
+        mDeviceDensity = getResources().getDisplayMetrics().density;
+        mStrokeWidth = 6f * mDeviceDensity;
 
         mBackgroundCircle = new Paint();
         mBackgroundCircle.setAntiAlias(true);
@@ -63,28 +68,43 @@
         mTextPaint = new TextPaint();
         mTextPaint.setColor(Utils.getColorAccent(getContext()));
         mTextPaint.setAntiAlias(true);
-        mTextPaint.setTextSize(18f * density);
+        mTextPaint.setTextSize(14f * mDeviceDensity);
         mTextPaint.setTextAlign(Paint.Align.CENTER);
+
+        mBigNumberPaint = new TextPaint();
+        mBigNumberPaint.setColor(Utils.getColorAccent(getContext()));
+        mBigNumberPaint.setAntiAlias(true);
+        mBigNumberPaint.setTextSize(30f * mDeviceDensity);
+        mBigNumberPaint.setTextAlign(Paint.Align.CENTER);
     }
 
     @Override
     protected void onDraw(Canvas canvas) {
         super.onDraw(canvas);
+        drawDonut(canvas);
+        drawInnerText(canvas);
+    }
+
+    private void drawDonut(Canvas canvas) {
         canvas.drawArc(0 + mStrokeWidth, 0 + mStrokeWidth, getWidth() - mStrokeWidth,
                 getHeight() - mStrokeWidth, TOP, 360, false, mBackgroundCircle);
 
         canvas.drawArc(0 + mStrokeWidth, 0 + mStrokeWidth, getWidth() - mStrokeWidth,
                 getHeight() - mStrokeWidth, TOP, (360 * mPercent / 100), false, mFilledArc);
+    }
 
-        int centerX = getWidth() / 2;
-        int centerY = getHeight() / 2;
+    private void drawInnerText(Canvas canvas) {
+        final float centerX = getWidth() / 2;
+        final float centerY = getHeight() / 2;
+        final float totalHeight = getTextHeight(mTextPaint) + getTextHeight(mBigNumberPaint);
+        final float startY = centerY + totalHeight / 2;
 
-        String percentString =
-                String.format(getContext().getString(R.string.storage_percent_used), mPercent);
-        // drawText uses the Y dimension as the floor of the text, so we do this to center.
-        canvas.drawText(percentString, centerX,
-                centerY + getTextHeight(mTextPaint) / 2 - mTextPaint.descent(),
-                mTextPaint);
+        // The first line is the height of the bottom text + its descender above the bottom line.
+        canvas.drawText(mPercentString, centerX,
+                startY - getTextHeight(mTextPaint) - mBigNumberPaint.descent(),
+                mBigNumberPaint);
+        // The second line starts at the bottom + room for the descender.
+        canvas.drawText(mFullString, centerX, startY - mTextPaint.descent(), mTextPaint);
     }
 
     /**
@@ -92,6 +112,8 @@
      */
     public void setPercentage(int percent) {
         mPercent = percent;
+        mPercentString = Utils.formatPercentage(mPercent);
+        mFullString = getContext().getString(R.string.storage_percent_full);
         invalidate();
     }
 
diff --git a/src/com/android/settings/widget/RadioButtonPickerFragment.java b/src/com/android/settings/widget/RadioButtonPickerFragment.java
new file mode 100644
index 0000000..2444539
--- /dev/null
+++ b/src/com/android/settings/widget/RadioButtonPickerFragment.java
@@ -0,0 +1,220 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.widget;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.support.annotation.VisibleForTesting;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.text.TextUtils;
+import android.util.ArrayMap;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.settings.R;
+import com.android.settings.Utils;
+import com.android.settings.core.InstrumentedPreferenceFragment;
+
+import java.util.List;
+import java.util.Map;
+
+public abstract class RadioButtonPickerFragment extends InstrumentedPreferenceFragment implements
+        RadioButtonPreference.OnClickListener {
+
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    static final String EXTRA_FOR_WORK = "for_work";
+
+    private final Map<String, CandidateInfo> mCandidates = new ArrayMap<>();
+
+    protected UserManager mUserManager;
+    protected int mUserId;
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
+        final Bundle arguments = getArguments();
+
+        boolean mForWork = false;
+        if (arguments != null) {
+            mForWork = arguments.getBoolean(EXTRA_FOR_WORK);
+        }
+        final UserHandle managedProfile = Utils.getManagedProfile(mUserManager);
+        mUserId = mForWork && managedProfile != null
+                ? managedProfile.getIdentifier()
+                : UserHandle.myUserId();
+    }
+
+    @Override
+    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+        super.onCreatePreferences(savedInstanceState, rootKey);
+        addPreferencesFromResource(R.xml.placeholder_prefs);
+        updateCandidates();
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        final View view = super.onCreateView(inflater, container, savedInstanceState);
+        setHasOptionsMenu(true);
+        return view;
+    }
+
+    @Override
+    public void onRadioButtonClicked(RadioButtonPreference selected) {
+        final String selectedKey = selected.getKey();
+        onRadioButtonConfirmed(selectedKey);
+    }
+
+    /**
+     * Called after the user tries to select an item.
+     */
+    protected void onSelectionPerformed(boolean success) {
+    }
+
+    /**
+     * Whether the UI should show a "None" item selection.
+     */
+    protected boolean shouldShowItemNone() {
+        return false;
+    }
+
+    protected CandidateInfo getCandidate(String key) {
+        return mCandidates.get(key);
+    }
+
+    protected void onRadioButtonConfirmed(String selectedKey) {
+        final boolean success = setDefaultKey(selectedKey);
+        if (success) {
+            updateCheckedState(selectedKey);
+        }
+        onSelectionPerformed(success);
+    }
+
+    /**
+     * A chance for subclasses to bind additional things to the preference.
+     */
+    @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED)
+    public void bindPreferenceExtra(RadioButtonPreference pref,
+            String key, CandidateInfo info, String defaultKey, String systemDefaultKey) {
+    }
+
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    public void updateCandidates() {
+        mCandidates.clear();
+        final List<? extends CandidateInfo> candidateList = getCandidates();
+        if (candidateList != null) {
+            for (CandidateInfo info : candidateList) {
+                mCandidates.put(info.getKey(), info);
+            }
+        }
+        final String defaultKey = getDefaultKey();
+        final String systemDefaultKey = getSystemDefaultKey();
+        final PreferenceScreen screen = getPreferenceScreen();
+        screen.removeAll();
+        if (shouldShowItemNone()) {
+            final RadioButtonPreference nonePref = new RadioButtonPreference(getPrefContext());
+            nonePref.setIcon(R.drawable.ic_remove_circle);
+            nonePref.setTitle(R.string.app_list_preference_none);
+            nonePref.setChecked(TextUtils.isEmpty(defaultKey));
+            nonePref.setOnClickListener(this);
+            screen.addPreference(nonePref);
+        }
+        for (Map.Entry<String, CandidateInfo> app : mCandidates.entrySet()) {
+            RadioButtonPreference pref = new RadioButtonPreference(getPrefContext());
+            bindPreference(pref, app.getKey(), app.getValue(), defaultKey);
+            bindPreferenceExtra(pref, app.getKey(), app.getValue(), defaultKey, systemDefaultKey);
+            screen.addPreference(pref);
+        }
+        mayCheckOnlyRadioButton();
+    }
+
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    public RadioButtonPreference bindPreference(RadioButtonPreference pref,
+            String key, CandidateInfo info, String defaultKey) {
+        pref.setTitle(info.loadLabel());
+        pref.setIcon(info.loadIcon());
+        pref.setKey(key);
+        if (TextUtils.equals(defaultKey, key)) {
+            pref.setChecked(true);
+        }
+        pref.setEnabled(info.enabled);
+        pref.setOnClickListener(this);
+        return pref;
+    }
+
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    public void updateCheckedState(String selectedKey) {
+        final PreferenceScreen screen = getPreferenceScreen();
+        if (screen != null) {
+            final int count = screen.getPreferenceCount();
+            for (int i = 0; i < count; i++) {
+                final Preference pref = screen.getPreference(i);
+                if (pref instanceof RadioButtonPreference) {
+                    final RadioButtonPreference radioPref = (RadioButtonPreference) pref;
+                    final boolean newCheckedState = TextUtils.equals(pref.getKey(), selectedKey);
+                    if (radioPref.isChecked() != newCheckedState) {
+                        radioPref.setChecked(TextUtils.equals(pref.getKey(), selectedKey));
+                    }
+                }
+            }
+        }
+    }
+
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    public void mayCheckOnlyRadioButton() {
+        final PreferenceScreen screen = getPreferenceScreen();
+        // If there is only 1 thing on screen, select it.
+        if (screen != null && screen.getPreferenceCount() == 1) {
+            final Preference onlyPref = screen.getPreference(0);
+            if (onlyPref instanceof RadioButtonPreference) {
+                ((RadioButtonPreference) onlyPref).setChecked(true);
+            }
+        }
+    }
+
+    protected abstract List<? extends CandidateInfo> getCandidates();
+
+    protected abstract String getDefaultKey();
+
+    protected abstract boolean setDefaultKey(String key);
+
+    protected String getSystemDefaultKey() {
+        return null;
+    }
+
+    public static abstract class CandidateInfo {
+
+        public final boolean enabled;
+
+        public CandidateInfo(boolean enabled) {
+            this.enabled = enabled;
+        }
+
+        public abstract CharSequence loadLabel();
+
+        public abstract Drawable loadIcon();
+
+        public abstract String getKey();
+    }
+
+}
diff --git a/tests/robotests/src/com/android/settings/accounts/UserAndAccountDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/accounts/UserAndAccountDashboardFragmentTest.java
index 39ffcf8..d4a7a9d 100644
--- a/tests/robotests/src/com/android/settings/accounts/UserAndAccountDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/UserAndAccountDashboardFragmentTest.java
@@ -101,7 +101,7 @@
                 .createSummaryProvider(activity, loader);
         provider.setListening(true);
 
-        verify(activity).getString(R.string.user_summary,
+        verify(activity).getString(R.string.users_and_accounts_summary,
                 userInfo.name);
     }
 
diff --git a/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPickerTest.java b/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPickerTest.java
index 544526a..aca11a6 100644
--- a/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPickerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/assist/DefaultAssistPickerTest.java
@@ -61,12 +61,12 @@
         final List<DefaultAssistPicker.Info> assistants = new ArrayList<>();
         assistants.add(new DefaultAssistPicker.Info(TEST_ASSIST));
         ReflectionHelpers.setField(mPicker, "mAvailableAssistants", assistants);
-        mPicker.setDefaultAppKey(TEST_ASSIST.flattenToString());
+        mPicker.setDefaultKey(TEST_ASSIST.flattenToString());
 
         assertThat(Settings.Secure.getString(mContext.getContentResolver(),
                 Settings.Secure.ASSISTANT))
                 .isEqualTo(TEST_ASSIST.flattenToString());
-        assertThat(mPicker.getDefaultAppKey())
+        assertThat(mPicker.getDefaultKey())
                 .isEqualTo(TEST_ASSIST.flattenToString());
     }
 
@@ -74,12 +74,12 @@
     public void setDefaultAppKey_noAvaialbleAssit_shouldClearDefaultAssist() {
         final List<DefaultAssistPicker.Info> assistants = new ArrayList<>();
         ReflectionHelpers.setField(mPicker, "mAvailableAssistants", assistants);
-        mPicker.setDefaultAppKey(TEST_ASSIST.flattenToString());
+        mPicker.setDefaultKey(TEST_ASSIST.flattenToString());
 
         assertThat(Settings.Secure.getString(mContext.getContentResolver(),
                 Settings.Secure.ASSISTANT))
                 .isEmpty();
-        assertThat(mPicker.getDefaultAppKey())
+        assertThat(mPicker.getDefaultKey())
                 .isNull();
     }
 
@@ -88,12 +88,12 @@
         final List<DefaultAssistPicker.Info> assistants = new ArrayList<>();
         assistants.add(new DefaultAssistPicker.Info(TEST_ASSIST));
         ReflectionHelpers.setField(mPicker, "mAvailableAssistants", assistants);
-        mPicker.setDefaultAppKey(null);
+        mPicker.setDefaultKey(null);
 
         assertThat(Settings.Secure.getString(mContext.getContentResolver(),
                 Settings.Secure.ASSISTANT))
                 .isEmpty();
-        assertThat(mPicker.getDefaultAppKey())
+        assertThat(mPicker.getDefaultKey())
                 .isNull();
     }
 }
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppInfoTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppInfoTest.java
index 57668c8..4501a98 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppInfoTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppInfoTest.java
@@ -17,13 +17,17 @@
 package com.android.settings.applications.defaultapps;
 
 
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
 import android.content.ComponentName;
-import android.content.pm.ActivityInfo;
-import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageItemInfo;
 import android.content.pm.PackageManager;
 
 import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
+import com.android.settings.applications.PackageManagerWrapper;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -32,60 +36,44 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
 
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class DefaultAppInfoTest {
 
     @Mock
-    private ActivityInfo mActivityInfo;
-    @Mock
-    private ApplicationInfo mApplicationInfo;
+    private PackageItemInfo mPackageItemInfo;
     @Mock
     private ComponentName mComponentName;
     @Mock
     private PackageManager mPackageManager;
+    @Mock
+    private PackageManagerWrapper mPackageManagerWrapper;
 
     private DefaultAppInfo mInfo;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
+        when(mPackageManagerWrapper.getPackageManager()).thenReturn(mPackageManager);
     }
 
     @Test
     public void initInfoWithActivityInfo_shouldLoadInfo() {
-        mActivityInfo.packageName = "test";
-        mInfo = new DefaultAppInfo(mActivityInfo);
-        mInfo.loadLabel(mPackageManager);
-        mInfo.loadIcon(mPackageManager);
+        mPackageItemInfo.packageName = "test";
+        mInfo = new DefaultAppInfo(mPackageManagerWrapper, mPackageItemInfo);
+        mInfo.loadLabel();
+        mInfo.loadIcon();
 
-        assertThat(mInfo.getKey()).isEqualTo(mActivityInfo.packageName);
-        verify(mActivityInfo).loadLabel(mPackageManager);
-        verify(mActivityInfo).loadIcon(mPackageManager);
-    }
-
-    @Test
-    public void initInfoWithApplicationInfo_shouldLoadInfo() {
-        mApplicationInfo.packageName = "test";
-
-        mInfo = new DefaultAppInfo(mApplicationInfo);
-        mInfo.loadLabel(mPackageManager);
-        mInfo.loadIcon(mPackageManager);
-
-        assertThat(mInfo.getKey()).isEqualTo(mApplicationInfo.packageName);
-        verify(mApplicationInfo).loadLabel(mPackageManager);
-        verify(mApplicationInfo).loadIcon(mPackageManager);
+        assertThat(mInfo.getKey()).isEqualTo(mPackageItemInfo.packageName);
+        verify(mPackageItemInfo).loadLabel(mPackageManager);
+        verify(mPackageItemInfo).loadIcon(mPackageManager);
     }
 
     @Test
     public void initInfoWithComponent_shouldLoadInfo() {
         when(mComponentName.getPackageName()).thenReturn("com.android.settings");
 
-        mInfo = new DefaultAppInfo(0 /* uid */, mComponentName);
+        mInfo = new DefaultAppInfo(mPackageManagerWrapper, 0 /* uid */, mComponentName);
         mInfo.getKey();
 
         verify(mComponentName).flattenToString();
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java
index 6c44bd5..2d9ae9b 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java
@@ -17,11 +17,14 @@
 package com.android.settings.applications.defaultapps;
 
 
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
 import android.app.Activity;
 import android.content.Context;
-import android.os.Bundle;
 import android.os.UserManager;
-import android.support.v4.app.FragmentManager;
 import android.support.v7.preference.PreferenceScreen;
 
 import com.android.settings.SettingsRobolectricTestRunner;
@@ -40,13 +43,6 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class DefaultAppPickerFragmentTest {
@@ -57,8 +53,6 @@
     private PreferenceScreen mScreen;
     @Mock
     private UserManager mUserManager;
-    @Mock
-    private FragmentManager mFragmentManager;
 
     private TestFragment mFragment;
 
@@ -66,9 +60,6 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mFragment = spy(new TestFragment());
-        final Bundle bundle = new Bundle();
-        bundle.putBoolean(DefaultAppPickerFragment.EXTRA_FOR_WORK, false);
-        mFragment.setArguments(bundle);
 
         when(mActivity.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
         doReturn(mActivity).when(mFragment).getContext();
@@ -76,26 +67,7 @@
     }
 
     @Test
-    public void onAttach_userIsInitialized() {
-        mFragment.onAttach((Context) mActivity);
-
-        verify(mActivity).getPackageManager();
-        verify(mActivity).getSystemService(Context.USER_SERVICE);
-    }
-
-    @Test
-    public void clickPreference_noCofirmation_shouldDirectlyConfirm() {
-        final RadioButtonPreference pref =
-                new RadioButtonPreference(RuntimeEnvironment.application);
-        pref.setKey("TEST");
-
-        mFragment.onRadioButtonClicked(pref);
-
-        assertThat(mFragment.setDefaultAppKeyCalled).isTrue();
-    }
-
-    @Test
-    public void clickPreference_hasCofirmation_shouldShowConfirmation() {
+    public void clickPreference_hasConfirmation_shouldShowConfirmation() {
         final RadioButtonPreference pref =
                 new RadioButtonPreference(RuntimeEnvironment.application);
         pref.setKey("TEST");
@@ -106,18 +78,6 @@
         mFragment.onRadioButtonClicked(pref);
     }
 
-    @Test
-    public void displaySingleOption_shouldSelectRadioButton() {
-        final RadioButtonPreference pref =
-                new RadioButtonPreference(RuntimeEnvironment.application);
-        when(mScreen.getPreferenceCount()).thenReturn(1);
-        when(mScreen.getPreference(0)).thenReturn(pref);
-
-        mFragment.mayCheckOnlyRadioButton();
-
-        assertThat(pref.isChecked()).isTrue();
-    }
-
     public static class TestFragment extends DefaultAppPickerFragment {
 
         boolean setDefaultAppKeyCalled;
@@ -133,12 +93,12 @@
         }
 
         @Override
-        protected String getDefaultAppKey() {
+        protected String getDefaultKey() {
             return null;
         }
 
         @Override
-        protected boolean setDefaultAppKey(String key) {
+        protected boolean setDefaultKey(String key) {
             setDefaultAppKeyCalled = true;
             return true;
         }
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceControllerTest.java
index 6dc2e64..fc000c9 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceControllerTest.java
@@ -17,6 +17,10 @@
 package com.android.settings.applications.defaultapps;
 
 
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
 import android.content.Context;
 import android.os.UserManager;
 import android.support.v7.preference.Preference;
@@ -33,10 +37,6 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
 
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class DefaultAppPreferenceControllerTest {
@@ -62,7 +62,7 @@
     public void updateState_hasDefaultApp_shouldUpdateAppName() {
         mController = new TestPreferenceController(mContext);
 
-        when(mController.mAppInfo.loadLabel(mContext.getPackageManager()))
+        when(mController.mAppInfo.loadLabel())
                 .thenReturn(TEST_APP_NAME);
 
         mController.updateState(mPreference);
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPickerTest.java
index 1bd611b..78d0bda 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPickerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPickerTest.java
@@ -16,9 +16,14 @@
 
 package com.android.settings.applications.defaultapps;
 
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
 import android.app.Activity;
 import android.content.Context;
-import android.content.pm.PackageManager;
 import android.os.UserManager;
 
 import com.android.settings.SettingsRobolectricTestRunner;
@@ -36,13 +41,6 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.util.ReflectionHelpers;
 
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
@@ -73,14 +71,14 @@
 
     @Test
     public void setAndGetDefaultAppKey_shouldUpdateDefaultAutoFill() {
-        assertThat(mPicker.setDefaultAppKey(TEST_APP_KEY)).isTrue();
-        assertThat(mPicker.getDefaultAppKey()).isEqualTo(TEST_APP_KEY);
+        assertThat(mPicker.setDefaultKey(TEST_APP_KEY)).isTrue();
+        assertThat(mPicker.getDefaultKey()).isEqualTo(TEST_APP_KEY);
     }
 
     @Test
     public void getConfirmationMessage_shouldNotBeNull() {
         final DefaultAppInfo info = mock(DefaultAppInfo.class);
-        when(info.loadLabel(any(PackageManager.class))).thenReturn("test_app_name");
+        when(info.loadLabel()).thenReturn("test_app_name");
         assertThat(mPicker.getConfirmationMessage(info)).isNotNull();
     }
 
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPickerTest.java
index b0231f8..63d8c6d 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPickerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPickerTest.java
@@ -67,14 +67,14 @@
 
     @Test
     public void setDefaultAppKey_shouldUpdateDefaultBrowser() {
-        mPicker.setDefaultAppKey(TEST_APP_KEY);
+        mPicker.setDefaultKey(TEST_APP_KEY);
         verify(mPackageManager)
                 .setDefaultBrowserPackageNameAsUser(eq(TEST_APP_KEY), anyInt());
     }
 
     @Test
     public void getDefaultAppKey_shouldReturnDefaultBrowser() {
-        mPicker.getDefaultAppKey();
+        mPicker.getDefaultKey();
         verify(mPackageManager)
                 .getDefaultBrowserPackageNameAsUser(anyInt());
     }
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultEmergencyPickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultEmergencyPickerTest.java
index ceccba1..6ee9e86 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultEmergencyPickerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultEmergencyPickerTest.java
@@ -70,8 +70,8 @@
 
     @Test
     public void setDefaultAppKey_shouldUpdateDefault() {
-        assertThat(mPicker.setDefaultAppKey(TEST_APP_KEY)).isTrue();
-        assertThat(mPicker.getDefaultAppKey()).isEqualTo(TEST_APP_KEY);
+        assertThat(mPicker.setDefaultKey(TEST_APP_KEY)).isTrue();
+        assertThat(mPicker.getDefaultKey()).isEqualTo(TEST_APP_KEY);
     }
 
     @Test
@@ -80,6 +80,6 @@
                 Settings.Secure.EMERGENCY_ASSISTANCE_APPLICATION,
                 TEST_APP_KEY);
 
-        assertThat(mPicker.getDefaultAppKey()).isEqualTo(TEST_APP_KEY);
+        assertThat(mPicker.getDefaultKey()).isEqualTo(TEST_APP_KEY);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultHomePickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultHomePickerTest.java
index d63ae6d..38104a9 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultHomePickerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultHomePickerTest.java
@@ -72,7 +72,7 @@
 
     @Test
     public void setDefaultAppKey_shouldUpdateDefault() {
-        assertThat(mPicker.setDefaultAppKey(TEST_APP_KEY)).isTrue();
+        assertThat(mPicker.setDefaultKey(TEST_APP_KEY)).isTrue();
 
         verify(mPackageManager).replacePreferredActivity(any(IntentFilter.class),
                 anyInt(), any(ComponentName[].class), any(ComponentName.class));
@@ -83,7 +83,7 @@
         final ComponentName cn = mock(ComponentName.class);
         when(mPackageManager.getHomeActivities(anyList()))
                 .thenReturn(cn);
-        mPicker.getDefaultAppKey();
+        mPicker.getDefaultKey();
         verify(cn).flattenToString();
     }
 
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultNotificationAssistantPickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultNotificationAssistantPickerTest.java
index 322830c..acf90d5 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultNotificationAssistantPickerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultNotificationAssistantPickerTest.java
@@ -70,9 +70,9 @@
 
     @Test
     public void setDefaultAppKey_shouldUpdateDefault() {
-        mPicker.setDefaultAppKey(TEST_APP_KEY);
+        mPicker.setDefaultKey(TEST_APP_KEY);
 
-        assertThat(mPicker.getDefaultAppKey()).isEqualTo(TEST_APP_KEY);
+        assertThat(mPicker.getDefaultKey()).isEqualTo(TEST_APP_KEY);
     }
 
     @Test
@@ -81,6 +81,6 @@
                 Settings.Secure.ENABLED_NOTIFICATION_ASSISTANT,
                 TEST_APP_KEY);
 
-        assertThat(mPicker.getDefaultAppKey()).isEqualTo(TEST_APP_KEY);
+        assertThat(mPicker.getDefaultKey()).isEqualTo(TEST_APP_KEY);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPhonePickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPhonePickerTest.java
index 0c5d5f1..0318a97 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPhonePickerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultPhonePickerTest.java
@@ -75,14 +75,14 @@
 
     @Test
     public void getSystemDefaultPackage_shouldAskDefaultKeyUpdater() {
-        mPicker.getSystemDefaultAppKey();
+        mPicker.getSystemDefaultKey();
 
         verify(mDefaultKeyUpdater).getSystemDialerPackage();
     }
 
     @Test
     public void setDefaultAppKey_shouldUpdateDefault() {
-        mPicker.setDefaultAppKey(TEST_APP_KEY);
+        mPicker.setDefaultKey(TEST_APP_KEY);
 
         verify(mDefaultKeyUpdater).setDefaultDialerApplication(
                 any(Context.class), eq(TEST_APP_KEY), anyInt());
@@ -90,7 +90,7 @@
 
     @Test
     public void getDefaultAppKey_shouldReturnDefault() {
-        mPicker.getDefaultAppKey();
+        mPicker.getDefaultKey();
         verify(mDefaultKeyUpdater).getDefaultDialerApplication(any(Context.class), anyInt());
     }
 }
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultSmsPickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultSmsPickerTest.java
index 3da6fec..ba19d83 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultSmsPickerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultSmsPickerTest.java
@@ -73,14 +73,14 @@
 
     @Test
     public void setDefaultAppKey_shouldUpdateDefault() {
-        mPicker.setDefaultAppKey(TEST_APP_KEY);
+        mPicker.setDefaultKey(TEST_APP_KEY);
 
         verify(mDefaultKeyUpdater).setDefaultApplication(any(Context.class), eq(TEST_APP_KEY));
     }
 
     @Test
     public void getDefaultAppKey_shouldReturnDefault() {
-        mPicker.getDefaultAppKey();
+        mPicker.getDefaultKey();
 
         verify(mDefaultKeyUpdater).getDefaultApplication(any(Context.class));
     }
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothSummaryUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothSummaryUpdaterTest.java
index a2770a0..cc059ad 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothSummaryUpdaterTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothSummaryUpdaterTest.java
@@ -86,7 +86,8 @@
     public void register_true_shouldSendSummaryChange() {
         mSummaryUpdater.register(true);
 
-        verify(mListener).onSummaryChanged(mContext.getString(R.string.bluetooth_connected));
+        verify(mListener).onSummaryChanged(
+            mContext.getString(R.string.bluetooth_connected_summary));
     }
 
     @Test
@@ -102,7 +103,8 @@
         mSummaryUpdater.register(true);
         mSummaryUpdater.onBluetoothStateChanged(BluetoothAdapter.STATE_ON);
 
-        verify(mListener).onSummaryChanged(mContext.getString(R.string.bluetooth_connected));
+        verify(mListener).onSummaryChanged(
+            mContext.getString(R.string.bluetooth_connected_summary));
     }
 
     @Test
@@ -111,7 +113,8 @@
         mSummaryUpdater.register(true);
         mSummaryUpdater.onBluetoothStateChanged(BluetoothAdapter.STATE_TURNING_ON);
 
-        verify(mListener).onSummaryChanged(mContext.getString(R.string.bluetooth_disconnected));
+        verify(mListener).onSummaryChanged(
+            mContext.getString(R.string.disconnected));
     }
 
     @Test
@@ -128,7 +131,8 @@
         mSummaryUpdater.onConnectionStateChanged(null /* device */,
             BluetoothAdapter.STATE_CONNECTED);
 
-        verify(mListener).onSummaryChanged(mContext.getString(R.string.bluetooth_connected));
+        verify(mListener).onSummaryChanged(
+            mContext.getString(R.string.bluetooth_connected_summary));
     }
 
     @Test
@@ -137,7 +141,8 @@
         mSummaryUpdater.onConnectionStateChanged(null /* device */,
             BluetoothAdapter.STATE_CONNECTED);
 
-        verify(mListener).onSummaryChanged(mContext.getString(R.string.bluetooth_disconnected));
+        verify(mListener).onSummaryChanged(
+            mContext.getString(R.string.disconnected));
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
index 387bc43..18b0c82 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
@@ -20,6 +20,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
@@ -45,6 +46,7 @@
 import com.android.settings.TestConfig;
 import com.android.settings.applications.ManageApplications;
 import com.android.settings.core.instrumentation.MetricsFeatureProvider;
+import com.android.settings.deviceinfo.PrivateVolumeSettings;
 import com.android.settings.deviceinfo.StorageItemPreference;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settingslib.applications.StorageStatsSource;
@@ -187,6 +189,15 @@
     }
 
     @Test
+    public void testClickSystem() {
+        mPreference.setKey("pref_system");
+        assertThat(mController.handlePreferenceTreeClick(mPreference)).isTrue();
+
+        verify(mFragment.getFragmentManager().beginTransaction()).add(
+                any(PrivateVolumeSettings.SystemInfoFragment.class), anyString());
+    }
+
+    @Test
     public void testMeasurementCompletedUpdatesPreferences() {
         StorageItemPreference audio = new StorageItemPreference(mContext);
         StorageItemPreference image = new StorageItemPreference(mContext);
diff --git a/tests/robotests/src/com/android/settings/display/VrDisplayPreferencePickerTest.java b/tests/robotests/src/com/android/settings/display/VrDisplayPreferencePickerTest.java
new file mode 100644
index 0000000..56d4c47
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/display/VrDisplayPreferencePickerTest.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.display;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+
+import android.content.ContentResolver;
+import android.os.UserHandle;
+import android.provider.Settings;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.shadow.ShadowSecureSettings;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.List;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class VrDisplayPreferencePickerTest {
+
+    private VrDisplayPreferencePicker mPicker;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mPicker = spy(new VrDisplayPreferencePicker());
+        doReturn(RuntimeEnvironment.application).when(mPicker).getContext();
+    }
+
+    @Test
+    public void verifyMetricsConstant() {
+        assertThat(mPicker.getMetricsCategory())
+                .isEqualTo(MetricsProto.MetricsEvent.VR_DISPLAY_PREFERENCE);
+    }
+
+    @Test
+    public void getCandidates_shouldReturnTwoCandidates() {
+        List<VrDisplayPreferencePicker.VrCandidateInfo> candidates = mPicker.getCandidates();
+
+        assertThat(candidates.size()).isEqualTo(2);
+        assertThat(candidates.get(0).getKey())
+                .isEqualTo(VrDisplayPreferencePicker.PREF_KEY_PREFIX + 0);
+        assertThat(candidates.get(1).getKey())
+                .isEqualTo(VrDisplayPreferencePicker.PREF_KEY_PREFIX + 1);
+    }
+
+    @Test
+    @Config(shadows = ShadowSecureSettings.class)
+    public void getKey_shouldGetFromSettingsProvider() {
+        final ContentResolver cr = RuntimeEnvironment.application.getContentResolver();
+        Settings.Secure.putIntForUser(cr, Settings.Secure.VR_DISPLAY_MODE, 1,
+                UserHandle.myUserId());
+
+        assertThat(mPicker.getDefaultKey())
+                .isEqualTo(VrDisplayPreferencePicker.PREF_KEY_PREFIX + 1);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/enterprise/AdminGrantedPermissionsPreferenceControllerTestBase.java b/tests/robotests/src/com/android/settings/enterprise/AdminGrantedPermissionsPreferenceControllerTestBase.java
index 69e6237..f001bd1 100644
--- a/tests/robotests/src/com/android/settings/enterprise/AdminGrantedPermissionsPreferenceControllerTestBase.java
+++ b/tests/robotests/src/com/android/settings/enterprise/AdminGrantedPermissionsPreferenceControllerTestBase.java
@@ -93,10 +93,10 @@
 
         setNumberOfPackagesWithAdminGrantedPermissions(20, true /* async */);
         when(mContext.getResources().getQuantityString(
-                R.plurals.enterprise_privacy_number_packages_actionable,20, 20))
-                .thenReturn("20 packages");
+                R.plurals.enterprise_privacy_number_packages_lower_bound, 20, 20))
+                .thenReturn("minimum 20 apps");
         mController.updateState(preference);
-        assertThat(preference.getSummary()).isEqualTo("20 packages");
+        assertThat(preference.getSummary()).isEqualTo("minimum 20 apps");
         assertThat(preference.isVisible()).isTrue();
     }
 
diff --git a/tests/robotests/src/com/android/settings/enterprise/EnterpriseInstalledPackagesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/enterprise/EnterpriseInstalledPackagesPreferenceControllerTest.java
index 98d0fa6..ff884e4 100644
--- a/tests/robotests/src/com/android/settings/enterprise/EnterpriseInstalledPackagesPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/EnterpriseInstalledPackagesPreferenceControllerTest.java
@@ -87,10 +87,11 @@
         assertThat(preference.isVisible()).isFalse();
 
         setNumberOfEnterpriseInstalledPackages(20, true /* async */);
-        when(mContext.getResources().getQuantityString(R.plurals.enterprise_privacy_number_packages,
-                20, 20)).thenReturn("20 packages");
+        when(mContext.getResources().getQuantityString(
+                R.plurals.enterprise_privacy_number_packages_lower_bound, 20, 20))
+                .thenReturn("minimum 20 apps");
         mController.updateState(preference);
-        assertThat(preference.getSummary()).isEqualTo("20 packages");
+        assertThat(preference.getSummary()).isEqualTo("minimum 20 apps");
         assertThat(preference.isVisible()).isTrue();
     }
 
diff --git a/tests/robotests/src/com/android/settings/security/OwnerInfoPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/OwnerInfoPreferenceControllerTest.java
new file mode 100644
index 0000000..d81768a
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/security/OwnerInfoPreferenceControllerTest.java
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.security;
+
+import android.app.FragmentManager;
+import android.app.FragmentTransaction;
+import android.content.Context;
+import android.support.v7.preference.PreferenceScreen;
+import android.support.v14.preference.PreferenceFragment;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.OwnerInfoSettings;
+import com.android.settings.R;
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+import com.android.settingslib.RestrictedPreference;
+
+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 org.robolectric.util.ReflectionHelpers;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Answers.RETURNS_DEEP_STUBS;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class OwnerInfoPreferenceControllerTest {
+
+    @Mock(answer = RETURNS_DEEP_STUBS)
+    private PreferenceFragment mFragment;
+    @Mock
+    private PreferenceScreen mScreen;
+    @Mock
+    private FragmentManager mFragmentManager;
+    @Mock
+    private FragmentTransaction mFragmentTransaction;
+    @Mock
+    private RestrictedPreference mPreference;
+    @Mock
+    private LockPatternUtils mLockPatternUtils;
+
+    private Context mContext;
+    private OwnerInfoPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        ShadowApplication shadowContext = ShadowApplication.getInstance();
+        mContext = spy(shadowContext.getApplicationContext());
+
+        when(mFragment.isAdded()).thenReturn(true);
+        when(mFragment.getPreferenceScreen()).thenReturn(mScreen);
+        when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext);
+        when(mFragment.getFragmentManager()).thenReturn(mFragmentManager);
+        when(mFragmentManager.beginTransaction()).thenReturn(mFragmentTransaction);
+
+        mController = spy(new OwnerInfoPreferenceController(mContext, mFragment, null));
+        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+        ReflectionHelpers.setField(mController, "mLockPatternUtils", mLockPatternUtils);
+    }
+
+    @Test
+    public void isAvailable_shouldReturnTrue() {
+        assertThat(mController.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void onResume_shouldUpdateEnableState() {
+        mController.onResume();
+
+        verify(mController).updateEnableState();
+    }
+
+    @Test
+    public void onResume_shouldUpdateSummary() {
+        mController.onResume();
+
+        verify(mController).updateSummary();
+    }
+
+    @Test
+    public void updateSummary_deviceOwnerInfoEnabled_shouldSetDeviceOwnerInfoSummary() {
+        final String deviceOwnerInfo = "Test Device Owner Info";
+        doReturn(true).when(mController).isDeviceOwnerInfoEnabled();
+        doReturn(deviceOwnerInfo).when(mController).getDeviceOwnerInfo();
+        mController.displayPreference(mScreen);
+
+        mController.updateSummary();
+
+        verify(mPreference).setSummary(deviceOwnerInfo);
+    }
+
+    @Test
+    public void updateSummary_ownerInfoEnabled_shouldSetOwnerInfoSummary() {
+        final String ownerInfo = "Test Owner Info";
+        doReturn(false).when(mController).isDeviceOwnerInfoEnabled();
+        doReturn(true).when(mController).isOwnerInfoEnabled();
+        doReturn(ownerInfo).when(mController).getOwnerInfo();
+        mController.displayPreference(mScreen);
+
+        mController.updateSummary();
+
+        verify(mPreference).setSummary(ownerInfo);
+    }
+
+    @Test
+    public void updateSummary_ownerInfoDisabled_shouldSetDefaultSummary() {
+        doReturn(false).when(mController).isDeviceOwnerInfoEnabled();
+        doReturn(false).when(mController).isOwnerInfoEnabled();
+        mController.displayPreference(mScreen);
+
+        mController.updateSummary();
+
+        verify(mPreference).setSummary(mContext.getString(
+            com.android.settings.R.string.owner_info_settings_summary));
+    }
+
+    @Test
+    public void updateEnableState_deviceOwnerInfoEnabled_shouldSetDisabledByAdmin() {
+        doReturn(true).when(mController).isDeviceOwnerInfoEnabled();
+        doReturn(mock(EnforcedAdmin.class)).when(mController).getDeviceOwner();
+        mController.displayPreference(mScreen);
+
+        mController.updateEnableState();
+
+        verify(mPreference).setDisabledByAdmin(any(EnforcedAdmin.class));
+    }
+
+    @Test
+    public void updateEnableState_lockScreenDisabled_shouldDisablePreference() {
+        doReturn(false).when(mController).isDeviceOwnerInfoEnabled();
+        doReturn(true).when(mLockPatternUtils).isLockScreenDisabled(anyInt());
+        mController.displayPreference(mScreen);
+
+        mController.updateEnableState();
+
+        verify(mPreference).setEnabled(false);
+    }
+
+    @Test
+    public void updateEnableState_lockScreenEnabled_shouldEnablePreference() {
+        doReturn(false).when(mController).isDeviceOwnerInfoEnabled();
+        doReturn(false).when(mLockPatternUtils).isLockScreenDisabled(anyInt());
+        mController.displayPreference(mScreen);
+
+        mController.updateEnableState();
+
+        verify(mPreference).setEnabled(true);
+    }
+
+    @Test
+    public void performClick_shouldLaunchOwnerInfoSettings() {
+        final ShadowApplication application = ShadowApplication.getInstance();
+        final RestrictedPreference preference =
+            new RestrictedPreference(application.getApplicationContext());
+        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(preference);
+        doReturn(false).when(mController).isDeviceOwnerInfoEnabled();
+        doReturn(false).when(mLockPatternUtils).isLockScreenDisabled(anyInt());
+        mController.displayPreference(mScreen);
+        mController.updateEnableState();
+
+        preference.performClick();
+
+        verify(mFragment).getFragmentManager();
+        verify(mFragment.getFragmentManager().beginTransaction())
+            .add(any(OwnerInfoSettings.class), anyString());
+    }
+
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowSecureSettings.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowSecureSettings.java
index 5dd54c0..fd4d0d2 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowSecureSettings.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowSecureSettings.java
@@ -53,6 +53,17 @@
     }
 
     @Implementation
+    public static boolean putIntForUser(ContentResolver cr, String name, int value,
+            int userHandle) {
+        return putInt(cr, name, value);
+    }
+
+    @Implementation
+    public static int getIntForUser(ContentResolver cr, String name, int def, int userHandle) {
+        return getInt(cr, name, def);
+    }
+
+    @Implementation
     public static int getInt(ContentResolver resolver, String name, int defaultValue) {
         Integer value = (Integer) mValueMap.get(name);
         return value == null ? defaultValue : value;
diff --git a/tests/robotests/src/com/android/settings/users/UserPreferenceTest.java b/tests/robotests/src/com/android/settings/users/UserPreferenceTest.java
new file mode 100644
index 0000000..031cd77
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/users/UserPreferenceTest.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.users;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.UserHandle;
+import android.view.View;
+
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import com.android.settingslib.RestrictedPreferenceHelper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class UserPreferenceTest {
+
+    @Mock
+    private RestrictedPreferenceHelper mRestrictedPreferenceHelper;
+    private Context mContext;
+    private UserPreference mUserPreference;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mUserPreference = new UserPreference(mContext, null /* attrs */, UserHandle.USER_CURRENT,
+                null /* settingsListener */, null /* deleteListener */);
+        ReflectionHelpers.setField(mUserPreference, "mHelper", mRestrictedPreferenceHelper);
+    }
+
+    @Test
+    public void testShouldHideSecondTarget_noListener_shouldHide() {
+        assertThat(mUserPreference.shouldHideSecondTarget()).isTrue();
+    }
+
+    @Test
+    public void testShouldHideSecondTarget_disabledByAdmin_shouldHide() {
+        when(mRestrictedPreferenceHelper.isDisabledByAdmin()).thenReturn(true);
+
+        assertThat(mUserPreference.shouldHideSecondTarget()).isTrue();
+    }
+
+    @Test
+    public void testShouldHideSecondTarget_hasSettingListener_shouldNotHide() {
+        ReflectionHelpers.setField(mUserPreference, "mSettingsClickListener",
+                mock(View.OnClickListener.class));
+
+        assertThat(mUserPreference.shouldHideSecondTarget()).isFalse();
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/users/UserSettingsTest.java b/tests/robotests/src/com/android/settings/users/UserSettingsTest.java
new file mode 100644
index 0000000..ed95175
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/users/UserSettingsTest.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.users;
+
+import android.app.Activity;
+import android.content.pm.UserInfo;
+import android.os.UserManager;
+
+import com.android.settings.R;
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import com.android.settings.dashboard.SummaryLoader;
+
+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.Robolectric;
+
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class UserSettingsTest {
+
+    @Mock private UserManager mUserManager;
+    @Mock private SummaryLoader mSummaryLoader;
+    private Activity mActivity;
+    private SummaryLoader.SummaryProvider mSummaryProvider;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mActivity = spy(Robolectric.buildActivity(Activity.class).get());
+        when((Object) mActivity.getSystemService(UserManager.class)).thenReturn(mUserManager);
+
+        mSummaryProvider = UserSettings.SUMMARY_PROVIDER_FACTORY.createSummaryProvider(
+            mActivity, mSummaryLoader);
+    }
+
+    @Test
+    public void setListening_shouldSetSummaryWithUserName() {
+        final String name = "John";
+        final UserInfo userInfo = new UserInfo();
+        userInfo.name = name;
+        when(mUserManager.getUserInfo(anyInt())).thenReturn(userInfo);
+
+        mSummaryProvider.setListening(true);
+
+        verify(mSummaryLoader).setSummary(mSummaryProvider,
+            mActivity.getString(R.string.users_summary, name));
+    }
+
+}
diff --git a/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java b/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java
index 728e357..655f354 100644
--- a/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java
+++ b/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java
@@ -46,8 +46,6 @@
 import com.android.settings.applications.defaultapps.DefaultAppInfo;
 import com.android.settings.widget.RadioButtonPreference;
 
-import java.util.Arrays;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -58,6 +56,8 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.util.ReflectionHelpers;
 
+import java.util.Arrays;
+
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class WebViewAppPickerTest {
@@ -162,13 +162,14 @@
     @Test
     public void testDisabledPackageShownAsDisabled() {
         String disabledReason = "disabled";
-        DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(
+        DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(mPackageManager,
                 createApplicationInfo(DEFAULT_PACKAGE_NAME), disabledReason);
 
         RadioButtonPreference mockPreference = mock(RadioButtonPreference.class);
-        mPicker.configurePreferenceFromAppInfo(mockPreference,
+        mPicker.bindPreference(mockPreference,
+                DEFAULT_PACKAGE_NAME, webviewAppInfo, null);
+        mPicker.bindPreferenceExtra(mockPreference,
                 DEFAULT_PACKAGE_NAME, webviewAppInfo, null, null);
-
         verify(mockPreference, times(1)).setEnabled(eq(false));
         verify(mockPreference, never()).setEnabled(eq(true));
     }
@@ -176,13 +177,14 @@
     @Test
     public void testEnabledPackageShownAsEnabled() {
         String disabledReason = "";
-        DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(
+        DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(mPackageManager,
                 createApplicationInfo(DEFAULT_PACKAGE_NAME), disabledReason);
 
         RadioButtonPreference mockPreference = mock(RadioButtonPreference.class);
-        mPicker.configurePreferenceFromAppInfo(mockPreference,
+        mPicker.bindPreference(mockPreference,
+                DEFAULT_PACKAGE_NAME, webviewAppInfo, null);
+        mPicker.bindPreferenceExtra(mockPreference,
                 DEFAULT_PACKAGE_NAME, webviewAppInfo, null, null);
-
         verify(mockPreference, times(1)).setEnabled(eq(true));
         verify(mockPreference, never()).setEnabled(eq(false));
     }
@@ -190,13 +192,14 @@
     @Test
     public void testDisabledPackageShowsDisabledReasonSummary() {
         String disabledReason = "disabled";
-        DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(
+        DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(mPackageManager,
                 createApplicationInfo(DEFAULT_PACKAGE_NAME), disabledReason);
 
         RadioButtonPreference mockPreference = mock(RadioButtonPreference.class);
-        mPicker.configurePreferenceFromAppInfo(mockPreference,
+        mPicker.bindPreference(mockPreference,
+                DEFAULT_PACKAGE_NAME, webviewAppInfo, null);
+        mPicker.bindPreferenceExtra(mockPreference,
                 DEFAULT_PACKAGE_NAME, webviewAppInfo, null, null);
-
         verify(mockPreference, times(1)).setSummary(eq(disabledReason));
         // Ensure we haven't called setSummary several times.
         verify(mockPreference, times(1)).setSummary(any());
@@ -205,13 +208,14 @@
     @Test
     public void testEnabledPackageShowsEmptySummary() {
         String disabledReason = null;
-        DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(
+        DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(mPackageManager,
                 createApplicationInfo(DEFAULT_PACKAGE_NAME), disabledReason);
 
         RadioButtonPreference mockPreference = mock(RadioButtonPreference.class);
-        mPicker.configurePreferenceFromAppInfo(mockPreference,
+        mPicker.bindPreference(mockPreference,
+                DEFAULT_PACKAGE_NAME, webviewAppInfo, null);
+        mPicker.bindPreferenceExtra(mockPreference,
                 DEFAULT_PACKAGE_NAME, webviewAppInfo, null, null);
-
         verify(mockPreference, never()).setSummary(any());
     }
 
@@ -242,7 +246,7 @@
         WebViewUpdateServiceWrapper wvusWrapper = mock(WebViewUpdateServiceWrapper.class);
         when(wvusWrapper.getPackageInfosAllUsers(
                 any(), eq(DEFAULT_PACKAGE_NAME))).thenReturn(
-                        Arrays.asList(packageForFirstUser, packageForSecondUser));
+                Arrays.asList(packageForFirstUser, packageForSecondUser));
 
         assertThat(mPicker.getDisabledReason(wvusWrapper, mContext, DEFAULT_PACKAGE_NAME)).isNull();
     }
@@ -255,8 +259,8 @@
         when(packageForFirstUser.getUserInfo()).thenReturn(FIRST_USER);
 
         WebViewUpdateServiceWrapper wvusWrapper = mock(WebViewUpdateServiceWrapper.class);
-        when(wvusWrapper.getPackageInfosAllUsers(any(), eq(DEFAULT_PACKAGE_NAME)
-                )).thenReturn(Arrays.asList(packageForFirstUser));
+        when(wvusWrapper.getPackageInfosAllUsers(any(), eq(DEFAULT_PACKAGE_NAME)))
+                .thenReturn(Arrays.asList(packageForFirstUser));
 
         final String EXPECTED_DISABLED_REASON = String.format(
                 "(disabled for user %s)", FIRST_USER.name);
@@ -272,8 +276,8 @@
         when(packageForFirstUser.getUserInfo()).thenReturn(FIRST_USER);
 
         WebViewUpdateServiceWrapper wvusWrapper = mock(WebViewUpdateServiceWrapper.class);
-        when(wvusWrapper.getPackageInfosAllUsers(any(), eq(DEFAULT_PACKAGE_NAME)
-                )).thenReturn(Arrays.asList(packageForFirstUser));
+        when(wvusWrapper.getPackageInfosAllUsers(any(), eq(DEFAULT_PACKAGE_NAME)))
+                .thenReturn(Arrays.asList(packageForFirstUser));
 
         final String EXPECTED_DISABLED_REASON = String.format(
                 "(uninstalled for user %s)", FIRST_USER.name);
@@ -294,13 +298,13 @@
         when(packageForSecondUser.getUserInfo()).thenReturn(SECOND_USER);
 
         WebViewUpdateServiceWrapper wvusWrapper = mock(WebViewUpdateServiceWrapper.class);
-        when(wvusWrapper.getPackageInfosAllUsers(any(), eq(DEFAULT_PACKAGE_NAME)
-                )).thenReturn(Arrays.asList(packageForFirstUser, packageForSecondUser));
+        when(wvusWrapper.getPackageInfosAllUsers(any(), eq(DEFAULT_PACKAGE_NAME)))
+                .thenReturn(Arrays.asList(packageForFirstUser, packageForSecondUser));
 
         final String EXPECTED_DISABLED_REASON = String.format(
                 "(disabled for user %s)", FIRST_USER.name);
         assertThat(mPicker.getDisabledReason(
-                wvusWrapper, mContext,DEFAULT_PACKAGE_NAME)).isEqualTo(EXPECTED_DISABLED_REASON);
+                wvusWrapper, mContext, DEFAULT_PACKAGE_NAME)).isEqualTo(EXPECTED_DISABLED_REASON);
     }
 
     /**
@@ -320,8 +324,8 @@
         when(packageForSecondUser.getUserInfo()).thenReturn(SECOND_USER);
 
         WebViewUpdateServiceWrapper wvusWrapper = mock(WebViewUpdateServiceWrapper.class);
-        when(wvusWrapper.getPackageInfosAllUsers(any(), eq(DEFAULT_PACKAGE_NAME)
-                )).thenReturn(Arrays.asList(packageForFirstUser, packageForSecondUser));
+        when(wvusWrapper.getPackageInfosAllUsers(any(), eq(DEFAULT_PACKAGE_NAME)))
+                .thenReturn(Arrays.asList(packageForFirstUser, packageForSecondUser));
 
         final String EXPECTED_DISABLED_REASON = String.format(
                 "(uninstalled for user %s)", FIRST_USER.name);
@@ -338,7 +342,7 @@
         PackageItemInfo mockPackageItemInfo = mock(PackageItemInfo.class);
         mockPackageItemInfo.packageName = DEFAULT_PACKAGE_NAME;
         when(mockPackageItemInfo.loadLabel(any())).thenReturn("myPackage");
-        DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(
+        DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(mPackageManager,
                 mockPackageItemInfo, "" /* disabledReason */);
 
         PackageInfo packageInfo = new PackageInfo();
@@ -348,9 +352,10 @@
         when(mPackageManager.getPackageManager()).thenReturn(pm);
 
         RadioButtonPreference mockPreference = mock(RadioButtonPreference.class);
-        mPicker.configurePreferenceFromAppInfo(mockPreference,
+        mPicker.bindPreference(mockPreference,
+                DEFAULT_PACKAGE_NAME, webviewAppInfo, null);
+        mPicker.bindPreferenceExtra(mockPreference,
                 DEFAULT_PACKAGE_NAME, webviewAppInfo, null, null);
-
         verify(mockPreference, times(1)).setTitle(eq("myPackage myVersionName"));
         verify(mockPreference, times(1)).setTitle(any());
     }
diff --git a/tests/robotests/src/com/android/settings/widget/RadioButtonPickerFragmentTest.java b/tests/robotests/src/com/android/settings/widget/RadioButtonPickerFragmentTest.java
new file mode 100644
index 0000000..e6d00b3
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/widget/RadioButtonPickerFragmentTest.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.widget;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.UserManager;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import com.android.settings.applications.defaultapps.DefaultAppInfo;
+import com.android.settings.applications.defaultapps.DefaultAppPickerFragment;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class RadioButtonPickerFragmentTest {
+
+
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private Activity mActivity;
+    @Mock
+    private PreferenceScreen mScreen;
+    @Mock
+    private UserManager mUserManager;
+
+    private TestFragment mFragment;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mFragment = spy(new TestFragment());
+
+        when(mActivity.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+        doReturn(mActivity).when(mFragment).getContext();
+        doReturn(mScreen).when(mFragment).getPreferenceScreen();
+    }
+
+    @Test
+    public void onAttach_userIsInitialized() {
+        mFragment.onAttach((Context) mActivity);
+
+        verify(mActivity).getPackageManager();
+        verify(mActivity).getSystemService(Context.USER_SERVICE);
+    }
+
+    @Test
+    public void displaySingleOption_shouldSelectRadioButton() {
+        final RadioButtonPreference pref =
+                new RadioButtonPreference(RuntimeEnvironment.application);
+        when(mScreen.getPreferenceCount()).thenReturn(1);
+        when(mScreen.getPreference(0)).thenReturn(pref);
+
+        mFragment.mayCheckOnlyRadioButton();
+
+        assertThat(pref.isChecked()).isTrue();
+    }
+
+    @Test
+    public void clickPreference_shouldConfirm() {
+        final RadioButtonPreference pref =
+                new RadioButtonPreference(RuntimeEnvironment.application);
+        pref.setKey("TEST");
+
+        mFragment.onRadioButtonClicked(pref);
+
+        assertThat(mFragment.setDefaultKeyCalled).isTrue();
+    }
+
+    public static class TestFragment extends DefaultAppPickerFragment {
+
+        boolean setDefaultKeyCalled;
+
+        @Override
+        public int getMetricsCategory() {
+            return 0;
+        }
+
+        @Override
+        protected List<DefaultAppInfo> getCandidates() {
+            return new ArrayList<>();
+        }
+
+        @Override
+        protected String getDefaultKey() {
+            return null;
+        }
+
+        @Override
+        protected boolean setDefaultKey(String key) {
+            setDefaultKeyCalled = true;
+            return true;
+        }
+
+        @Override
+        public Context getContext() {
+            return RuntimeEnvironment.application;
+        }
+    }
+}
