diff --git a/res/values/strings.xml b/res/values/strings.xml
index f4c49cc..0beb22d 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] -->
@@ -6288,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>
@@ -8231,16 +8250,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] -->
@@ -8253,6 +8262,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] -->
@@ -8261,6 +8275,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] -->
@@ -8275,15 +8294,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>
@@ -8330,8 +8344,9 @@
     <string name="storage_size_large_alternate"><xliff:g id="number" example="128">^1</xliff:g><small> <xliff:g id="unit" example="KB">^2</xliff:g></small></string>
     <!-- Summary of a single storage volume total space. [CHAR LIMIT=48]-->
     <string name="storage_volume_total">Used of <xliff:g id="total" example="32GB">%1$s</xliff:g></string>
-    <!-- The percent of storage used by a storage volume. Exposed inside of a donut graph. [CHAR LIMIT=4]-->
-    <string name="storage_percent_used"><xliff:g id="percent" example="50%">%1$s</xliff:g>%%</string>
+    <!-- Follows the percent of storage used by a storage volume. Exposed inside of a donut graph. [CHAR LIMIT=7]-->
+    <string name="storage_percent_full">full</string>
+
 
     <!-- Title of games app storage screen [CHAR LIMIT=30] -->
     <string name="game_storage_settings">Games</string>
diff --git a/res/xml/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/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/DonutView.java b/src/com/android/settings/widget/DonutView.java
index ba7939d..0feaa07 100644
--- a/src/com/android/settings/widget/DonutView.java
+++ b/src/com/android/settings/widget/DonutView.java
@@ -22,20 +22,25 @@
 import android.util.AttributeSet;
 import android.view.View;
 
+import com.android.internal.util.Preconditions;
 import com.android.settings.R;
 import com.android.settings.Utils;
 
 /**
  * DonutView represents a donut graph. It visualizes a certain percentage of fullness with a
- * corresponding label with the fullness on the inside (i.e. "50%" inside of the donut.
+ * corresponding label with the fullness on the inside (i.e. "50%" inside of the donut).
  */
 public class DonutView extends View {
     private static final int TOP = -90;
     private float mStrokeWidth;
+    private float mDeviceDensity;
     private int mPercent;
     private Paint mBackgroundCircle;
     private Paint mFilledArc;
     private TextPaint mTextPaint;
+    private TextPaint mBigNumberPaint;
+    private String mPercentString;
+    private String mFullString;
 
     public DonutView(Context context) {
         super(context);
@@ -43,8 +48,8 @@
 
     public DonutView(Context context, AttributeSet attrs) {
         super(context, attrs);
-        float density = getResources().getDisplayMetrics().density;
-        mStrokeWidth = 6f * density;
+        mDeviceDensity = getResources().getDisplayMetrics().density;
+        mStrokeWidth = 6f * mDeviceDensity;
 
         mBackgroundCircle = new Paint();
         mBackgroundCircle.setAntiAlias(true);
@@ -63,28 +68,43 @@
         mTextPaint = new TextPaint();
         mTextPaint.setColor(Utils.getColorAccent(getContext()));
         mTextPaint.setAntiAlias(true);
-        mTextPaint.setTextSize(18f * density);
+        mTextPaint.setTextSize(14f * mDeviceDensity);
         mTextPaint.setTextAlign(Paint.Align.CENTER);
+
+        mBigNumberPaint = new TextPaint();
+        mBigNumberPaint.setColor(Utils.getColorAccent(getContext()));
+        mBigNumberPaint.setAntiAlias(true);
+        mBigNumberPaint.setTextSize(30f * mDeviceDensity);
+        mBigNumberPaint.setTextAlign(Paint.Align.CENTER);
     }
 
     @Override
     protected void onDraw(Canvas canvas) {
         super.onDraw(canvas);
+        drawDonut(canvas);
+        drawInnerText(canvas);
+    }
+
+    private void drawDonut(Canvas canvas) {
         canvas.drawArc(0 + mStrokeWidth, 0 + mStrokeWidth, getWidth() - mStrokeWidth,
                 getHeight() - mStrokeWidth, TOP, 360, false, mBackgroundCircle);
 
         canvas.drawArc(0 + mStrokeWidth, 0 + mStrokeWidth, getWidth() - mStrokeWidth,
                 getHeight() - mStrokeWidth, TOP, (360 * mPercent / 100), false, mFilledArc);
+    }
 
-        int centerX = getWidth() / 2;
-        int centerY = getHeight() / 2;
+    private void drawInnerText(Canvas canvas) {
+        final float centerX = getWidth() / 2;
+        final float centerY = getHeight() / 2;
+        final float totalHeight = getTextHeight(mTextPaint) + getTextHeight(mBigNumberPaint);
+        final float startY = centerY + totalHeight / 2;
 
-        String percentString =
-                String.format(getContext().getString(R.string.storage_percent_used), mPercent);
-        // drawText uses the Y dimension as the floor of the text, so we do this to center.
-        canvas.drawText(percentString, centerX,
-                centerY + getTextHeight(mTextPaint) / 2 - mTextPaint.descent(),
-                mTextPaint);
+        // The first line is the height of the bottom text + its descender above the bottom line.
+        canvas.drawText(mPercentString, centerX,
+                startY - getTextHeight(mTextPaint) - mBigNumberPaint.descent(),
+                mBigNumberPaint);
+        // The second line starts at the bottom + room for the descender.
+        canvas.drawText(mFullString, centerX, startY - mTextPaint.descent(), mTextPaint);
     }
 
     /**
@@ -92,6 +112,8 @@
      */
     public void setPercentage(int percent) {
         mPercent = percent;
+        mPercentString = Utils.formatPercentage(mPercent);
+        mFullString = getContext().getString(R.string.storage_percent_full);
         invalidate();
     }
 
diff --git a/src/com/android/settings/widget/RadioButtonPickerFragment.java b/src/com/android/settings/widget/RadioButtonPickerFragment.java
new file mode 100644
index 0000000..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/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;
+        }
+    }
+}
