diff --git a/res/values/strings.xml b/res/values/strings.xml
index 6d22b5d..ab7f180 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -744,6 +744,10 @@
     <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 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">Access settings in lock screen</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>
@@ -1593,11 +1597,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 +1611,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 +1647,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 +1836,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] -->
@@ -2704,7 +2717,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 +3057,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] -->
@@ -4239,10 +4252,13 @@
     <!-- Title in main settings screen for printing settings [CHAR LIMIT=15] -->
     <string name="print_settings">Printing</string>
 
-    <!-- Print frameworks summary in settings screen [CHAR LIMIT=50] -->
-    <plurals name="print_settings_title">
-        <item quantity="one">1 print job</item>
-        <item quantity="other">%d print jobs</item>
+    <!-- Print setting summary in settings screen [CHAR LIMIT=50] -->
+    <string name="print_settings_summary_no_service">No print service</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>
     </plurals>
 
     <!-- Title for print service settings screen [CHAR LIMIT=25] -->
@@ -6285,28 +6301,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>
@@ -8223,16 +8245,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] -->
@@ -8245,6 +8257,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] -->
@@ -8253,6 +8270,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] -->
@@ -8267,15 +8289,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>
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/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/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/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/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/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/print/PrintSettingsFragment.java b/src/com/android/settings/print/PrintSettingsFragment.java
index 07d6931..fad577c 100644
--- a/src/com/android/settings/print/PrintSettingsFragment.java
+++ b/src/com/android/settings/print/PrintSettingsFragment.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.print;
 
-import android.app.Activity;
 import android.app.LoaderManager.LoaderCallbacks;
 import android.content.ActivityNotFoundException;
 import android.content.AsyncTaskLoader;
@@ -37,9 +36,9 @@
 import android.printservice.PrintServiceInfo;
 import android.provider.SearchIndexableResource;
 import android.provider.Settings;
+import android.support.annotation.VisibleForTesting;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceCategory;
-import android.support.v7.preference.PreferenceScreen;
 import android.text.TextUtils;
 import android.text.format.DateUtils;
 import android.util.Log;
@@ -191,12 +190,14 @@
 
             mPrintServicesCategory.removeAll();
             PackageManager pm = getActivity().getPackageManager();
+            final Context context = getPrefContext();
+            if (context == null) {
+                Log.w(TAG, "No preference context, skip adding print services");
+                return;
+            }
 
-            final int numServices = services.size();
-            for (int i = 0; i < numServices; i++) {
-                PrintServiceInfo service = services.get(i);
-                PreferenceScreen preference = getPreferenceManager().createPreferenceScreen(
-                        getActivity());
+            for (PrintServiceInfo service : services) {
+                Preference preference = new Preference(context);
 
                 String title = service.getResolveInfo().loadLabel(pm).toString();
                 preference.setTitle(title);
@@ -310,13 +311,14 @@
                 }
 
                 mActivePrintJobsCategory.removeAll();
+                final Context context = getPrefContext();
+                if (context == null) {
+                    Log.w(TAG, "No preference context, skip adding print jobs");
+                    return;
+                }
 
-                final int printJobCount = printJobs.size();
-                for (int i = 0; i < printJobCount; i++) {
-                    PrintJobInfo printJob = printJobs.get(i);
-
-                    PreferenceScreen preference = getPreferenceManager()
-                            .createPreferenceScreen(getActivity());
+                for (PrintJobInfo printJob : printJobs) {
+                    Preference preference = new Preference(context);
 
                     preference.setPersistent(false);
                     preference.setFragment(PrintJobSettingsFragment.class.getName());
@@ -503,51 +505,56 @@
     /**
      * Provider for the print settings summary
      */
-    private static class PrintSummaryProvider
-            implements SummaryLoader.SummaryProvider, PrintJobStateChangeListener {
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    static class PrintSummaryProvider implements SummaryLoader.SummaryProvider {
         private final Context mContext;
-        private final PrintManager mPrintManager;
+        private final PrintManagerWrapper mPrintManager;
         private final SummaryLoader mSummaryLoader;
 
         /**
          * Create a new {@link PrintSummaryProvider}.
          *
-         * @param context The context this provider is for
+         * @param context       The context this provider is for
          * @param summaryLoader The summary load using this provider
          */
-        public PrintSummaryProvider(Context context, SummaryLoader summaryLoader) {
+        PrintSummaryProvider(Context context, SummaryLoader summaryLoader,
+                PrintManagerWrapper printManager) {
             mContext = context;
             mSummaryLoader = summaryLoader;
-            mPrintManager = ((PrintManager) context.getSystemService(Context.PRINT_SERVICE))
-                    .getGlobalPrintManagerForUser(context.getUserId());
+            mPrintManager = printManager;
         }
 
         @Override
         public void setListening(boolean isListening) {
             if (mPrintManager != null) {
                 if (isListening) {
-                    mPrintManager.addPrintJobStateChangeListener(this);
-                    onPrintJobStateChanged(null);
-                } else {
-                    mPrintManager.removePrintJobStateChangeListener(this);
+                    List<PrintServiceInfo> services =
+                            mPrintManager.getPrintServices(PrintManager.ALL_SERVICES);
+                    if (services == null || services.isEmpty()) {
+                        mSummaryLoader.setSummary(this,
+                                mContext.getString(R.string.print_settings_summary_no_service));
+                    } else {
+                        final int count = services.size();
+                        mSummaryLoader.setSummary(this,
+                                mContext.getResources().getQuantityString(
+                                        R.plurals.print_settings_summary, count, count));
+                    }
                 }
             }
         }
 
-        @Override
-        public void onPrintJobStateChanged(PrintJobId printJobId) {
-            List<PrintJob> printJobs = mPrintManager.getPrintJobs();
+        static class PrintManagerWrapper {
 
-            int numActivePrintJobs = 0;
-            final int numPrintJobs = printJobs.size();
-            for (int i = 0; i < numPrintJobs; i++) {
-                if (shouldShowToUser(printJobs.get(i).getInfo())) {
-                    numActivePrintJobs++;
-                }
+            private final PrintManager mPrintManager;
+
+            PrintManagerWrapper(Context context) {
+                mPrintManager = ((PrintManager) context.getSystemService(Context.PRINT_SERVICE))
+                        .getGlobalPrintManagerForUser(context.getUserId());
             }
 
-            mSummaryLoader.setSummary(this, mContext.getResources().getQuantityString(
-                    R.plurals.print_settings_title, numActivePrintJobs, numActivePrintJobs));
+            public List<PrintServiceInfo> getPrintServices(int selectionFlags) {
+                return mPrintManager.getPrintServices(selectionFlags);
+            }
         }
     }
 
@@ -555,14 +562,9 @@
      * A factory for {@link PrintSummaryProvider providers} the settings app can use to read the
      * print summary.
      */
-    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
-            = new SummaryLoader.SummaryProviderFactory() {
-        @Override
-        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
-                SummaryLoader summaryLoader) {
-            return new PrintSummaryProvider(activity, summaryLoader);
-        }
-    };
+    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY =
+            (activity, summaryLoader) -> new PrintSummaryProvider(activity, summaryLoader,
+                    new PrintSummaryProvider.PrintManagerWrapper(activity));
 
     public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
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/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/RadioButtonPickerFragment.java b/src/com/android/settings/widget/RadioButtonPickerFragment.java
new file mode 100644
index 0000000..52e8c53
--- /dev/null
+++ b/src/com/android/settings/widget/RadioButtonPickerFragment.java
@@ -0,0 +1,221 @@
+/*
+ * 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/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..2c88179 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,15 @@
 package com.android.settings.applications.defaultapps;
 
 
+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.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 +44,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 +54,6 @@
     private PreferenceScreen mScreen;
     @Mock
     private UserManager mUserManager;
-    @Mock
-    private FragmentManager mFragmentManager;
 
     private TestFragment mFragment;
 
@@ -66,9 +61,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 +68,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 +79,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 +94,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/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/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/print/PrintSettingsFragmentTest.java b/tests/robotests/src/com/android/settings/print/PrintSettingsFragmentTest.java
new file mode 100644
index 0000000..265472e
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/print/PrintSettingsFragmentTest.java
@@ -0,0 +1,84 @@
+/*
+ * 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.print;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.Activity;
+import android.content.res.Resources;
+import android.print.PrintManager;
+import android.printservice.PrintServiceInfo;
+
+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 java.util.List;
+
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class PrintSettingsFragmentTest {
+
+    @Mock
+    private PrintSettingsFragment.PrintSummaryProvider.PrintManagerWrapper mPrintManager;
+    @Mock
+    private Activity mActivity;
+    @Mock
+    private Resources mRes;
+    @Mock
+    private SummaryLoader mSummaryLoader;
+    private SummaryLoader.SummaryProvider mSummaryProvider;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        when(mActivity.getResources()).thenReturn(mRes);
+        mSummaryProvider = new PrintSettingsFragment.PrintSummaryProvider(mActivity, mSummaryLoader,
+                mPrintManager);
+    }
+
+    @Test
+    public void testSummary_shouldSetSummaryToNumberOfPrintServices() {
+        final List<PrintServiceInfo> printServices = mock(List.class);
+        when(printServices.isEmpty()).thenReturn(false);
+        when(printServices.size()).thenReturn(2);
+        // 2 services
+        when(mPrintManager.getPrintServices(PrintManager.ALL_SERVICES)).thenReturn(printServices);
+
+        mSummaryProvider.setListening(true);
+
+        verify(mRes).getQuantityString(R.plurals.print_settings_summary, 2, 2);
+
+        // No service
+        when(mPrintManager.getPrintServices(PrintManager.ALL_SERVICES)).thenReturn(null);
+
+        mSummaryProvider.setListening(true);
+
+        verify(mActivity).getString(R.string.print_settings_summary_no_service);
+    }
+}
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/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;
+        }
+    }
+}
