diff --git a/src/com/android/settings/DeviceInfoSettings.java b/src/com/android/settings/DeviceInfoSettings.java
index a9b170c..3305b98 100644
--- a/src/com/android/settings/DeviceInfoSettings.java
+++ b/src/com/android/settings/DeviceInfoSettings.java
@@ -35,10 +35,9 @@
 import android.widget.Toast;
 
 import com.android.internal.logging.MetricsProto.MetricsEvent;
-import com.android.settings.dashboard.DashboardFeatureProvider;
 import com.android.settings.dashboard.SummaryLoader;
+import com.android.settings.deviceinfo.AdditionalSystemUpdatePreferenceController;
 import com.android.settings.deviceinfo.SystemUpdatePreferenceController;
-import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Index;
 import com.android.settings.search.Indexable;
@@ -77,7 +76,7 @@
     int mDevHitCountdown;
     Toast mDevHitToast;
     private SystemUpdatePreferenceController mSystemUpdatePreferenceController;
-    private DashboardFeatureProvider mDashboardFeatureProvider;
+    private AdditionalSystemUpdatePreferenceController mAdditionalSystemUpdatePreferenceController;
 
     private UserManager mUm;
 
@@ -102,8 +101,8 @@
         final Activity activity = getActivity();
         mUm = UserManager.get(activity);
         mSystemUpdatePreferenceController = new SystemUpdatePreferenceController(activity, mUm);
-        mDashboardFeatureProvider = FeatureFactory.getFactory(activity)
-                .getDashboardFeatureProvider(activity);
+        mAdditionalSystemUpdatePreferenceController =
+                new AdditionalSystemUpdatePreferenceController(activity);
 
         addPreferencesFromResource(R.xml.device_info_settings);
 
@@ -159,6 +158,7 @@
          * info.
          */
         mSystemUpdatePreferenceController.displayPreference(getPreferenceScreen());
+        mAdditionalSystemUpdatePreferenceController.displayPreference(getPreferenceScreen());
 
         // Remove manual entry if none present.
         removePreferenceIfBoolFalse(KEY_MANUAL, R.bool.config_show_manual);
@@ -398,6 +398,8 @@
                 }
                 new SystemUpdatePreferenceController(context, UserManager.get(context))
                         .updateNonIndexableKeys(keys);
+                new AdditionalSystemUpdatePreferenceController(context)
+                        .updateNonIndexableKeys(keys);
                 return keys;
             }
 
diff --git a/src/com/android/settings/DisplaySettings.java b/src/com/android/settings/DisplaySettings.java
index 0e680bc..2e8b926 100644
--- a/src/com/android/settings/DisplaySettings.java
+++ b/src/com/android/settings/DisplaySettings.java
@@ -17,435 +17,76 @@
 package com.android.settings;
 
 import android.app.Activity;
-import android.app.ActivityManager;
-import android.app.UiModeManager;
-import android.app.admin.DevicePolicyManager;
-import android.content.ContentResolver;
 import android.content.Context;
-import android.content.pm.PackageManager;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.hardware.Sensor;
-import android.hardware.SensorManager;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.SystemProperties;
-import android.os.UserHandle;
-import android.os.UserManager;
 import android.provider.SearchIndexableResource;
 import android.provider.Settings;
-import android.support.v14.preference.SwitchPreference;
-import android.support.v7.preference.DropDownPreference;
-import android.support.v7.preference.ListPreference;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.Preference.OnPreferenceChangeListener;
-import android.text.TextUtils;
-import android.util.Log;
 
-import com.android.internal.app.NightDisplayController;
 import com.android.internal.logging.MetricsProto.MetricsEvent;
-import com.android.internal.view.RotationPolicy;
-import com.android.settings.accessibility.ToggleFontSizePreferenceFragment;
+import com.android.settings.core.PreferenceController;
+import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.dashboard.SummaryLoader;
+import com.android.settings.display.AutoBrightnessPreferenceController;
+import com.android.settings.display.AutoRotatePreferenceController;
+import com.android.settings.display.CameraGesturePreferenceController;
+import com.android.settings.display.DozePreferenceController;
+import com.android.settings.display.FontSizePreferenceController;
+import com.android.settings.display.LiftToWakePreferenceController;
+import com.android.settings.display.NightDisplayPreferenceController;
+import com.android.settings.display.NightModePreferenceController;
+import com.android.settings.display.ScreenSaverPreferenceController;
+import com.android.settings.display.TapToWakePreferenceController;
+import com.android.settings.display.TimeoutPreferenceController;
+import com.android.settings.display.VrDisplayPreferenceController;
+import com.android.settings.display.WallpaperPreferenceController;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
-import com.android.settingslib.RestrictedLockUtils;
-import com.android.settingslib.RestrictedPreference;
+import com.android.settingslib.drawer.CategoryKey;
 
 import java.util.ArrayList;
 import java.util.List;
 
-import static android.provider.Settings.Secure.CAMERA_GESTURE_DISABLED;
-import static android.provider.Settings.Secure.DOUBLE_TAP_TO_WAKE;
-import static android.provider.Settings.Secure.DOZE_ENABLED;
-import static android.provider.Settings.Secure.WAKE_GESTURE_ENABLED;
-import static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE;
-import static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
-import static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL;
 import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
-import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 
-public class DisplaySettings extends SettingsPreferenceFragment implements
-        Preference.OnPreferenceChangeListener, Indexable {
+public class DisplaySettings extends DashboardFragment {
     private static final String TAG = "DisplaySettings";
 
-    /** If there is no setting in the provider, use this. */
-    private static final int FALLBACK_SCREEN_TIMEOUT_VALUE = 30000;
-
-    private static final String KEY_SCREEN_TIMEOUT = "screen_timeout";
-    private static final String KEY_FONT_SIZE = "font_size";
-    private static final String KEY_SCREEN_SAVER = "screensaver";
-    private static final String KEY_LIFT_TO_WAKE = "lift_to_wake";
-    private static final String KEY_DOZE = "doze";
-    private static final String KEY_TAP_TO_WAKE = "tap_to_wake";
-    private static final String KEY_AUTO_BRIGHTNESS = "auto_brightness";
-    private static final String KEY_AUTO_ROTATE = "auto_rotate";
-    private static final String KEY_NIGHT_DISPLAY = "night_display";
-    private static final String KEY_NIGHT_MODE = "night_mode";
-    private static final String KEY_CAMERA_GESTURE = "camera_gesture";
-    private static final String KEY_WALLPAPER = "wallpaper";
-    private static final String KEY_VR_DISPLAY_PREF = "vr_display_pref";
-
-    private Preference mFontSizePref;
-
-    private TimeoutListPreference mScreenTimeoutPreference;
-    private ListPreference mNightModePreference;
-    private Preference mScreenSaverPreference;
-    private SwitchPreference mLiftToWakePreference;
-    private SwitchPreference mDozePreference;
-    private SwitchPreference mTapToWakePreference;
-    private SwitchPreference mAutoBrightnessPreference;
-    private SwitchPreference mCameraGesturePreference;
-
     @Override
     public int getMetricsCategory() {
         return MetricsEvent.DISPLAY;
     }
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        final Activity activity = getActivity();
-        final ContentResolver resolver = activity.getContentResolver();
-
-        addPreferencesFromResource(R.xml.display_settings);
-
-        mScreenSaverPreference = findPreference(KEY_SCREEN_SAVER);
-        if (mScreenSaverPreference != null
-                && getResources().getBoolean(
-                        com.android.internal.R.bool.config_dreamsSupported) == false) {
-            getPreferenceScreen().removePreference(mScreenSaverPreference);
-        }
-
-        mScreenTimeoutPreference = (TimeoutListPreference) findPreference(KEY_SCREEN_TIMEOUT);
-
-        mFontSizePref = findPreference(KEY_FONT_SIZE);
-
-        if (isAutomaticBrightnessAvailable(getResources())) {
-            mAutoBrightnessPreference = (SwitchPreference) findPreference(KEY_AUTO_BRIGHTNESS);
-            mAutoBrightnessPreference.setOnPreferenceChangeListener(this);
-        } else {
-            removePreference(KEY_AUTO_BRIGHTNESS);
-        }
-
-        if (!NightDisplayController.isAvailable(activity)) {
-            removePreference(KEY_NIGHT_DISPLAY);
-        }
-
-        if (isLiftToWakeAvailable(activity)) {
-            mLiftToWakePreference = (SwitchPreference) findPreference(KEY_LIFT_TO_WAKE);
-            mLiftToWakePreference.setOnPreferenceChangeListener(this);
-        } else {
-            removePreference(KEY_LIFT_TO_WAKE);
-        }
-
-        if (isDozeAvailable(activity)) {
-            mDozePreference = (SwitchPreference) findPreference(KEY_DOZE);
-            mDozePreference.setOnPreferenceChangeListener(this);
-        } else {
-            removePreference(KEY_DOZE);
-        }
-
-        if (isTapToWakeAvailable(getResources())) {
-            mTapToWakePreference = (SwitchPreference) findPreference(KEY_TAP_TO_WAKE);
-            mTapToWakePreference.setOnPreferenceChangeListener(this);
-        } else {
-            removePreference(KEY_TAP_TO_WAKE);
-        }
-
-        if (isCameraGestureAvailable(getResources())) {
-            mCameraGesturePreference = (SwitchPreference) findPreference(KEY_CAMERA_GESTURE);
-            mCameraGesturePreference.setOnPreferenceChangeListener(this);
-        } else {
-            removePreference(KEY_CAMERA_GESTURE);
-        }
-
-        if (RotationPolicy.isRotationLockToggleVisible(activity)) {
-            DropDownPreference rotatePreference =
-                    (DropDownPreference) findPreference(KEY_AUTO_ROTATE);
-            int rotateLockedResourceId;
-            // The following block sets the string used when rotation is locked.
-            // If the device locks specifically to portrait or landscape (rather than current
-            // rotation), then we use a different string to include this information.
-            if (allowAllRotations(activity)) {
-                rotateLockedResourceId = R.string.display_auto_rotate_stay_in_current;
-            } else {
-                if (RotationPolicy.getRotationLockOrientation(activity)
-                        == Configuration.ORIENTATION_PORTRAIT) {
-                    rotateLockedResourceId =
-                            R.string.display_auto_rotate_stay_in_portrait;
-                } else {
-                    rotateLockedResourceId =
-                            R.string.display_auto_rotate_stay_in_landscape;
-                }
-            }
-            rotatePreference.setEntries(new CharSequence[] {
-                    activity.getString(R.string.display_auto_rotate_rotate),
-                    activity.getString(rotateLockedResourceId),
-            });
-            rotatePreference.setEntryValues(new CharSequence[] { "0", "1" });
-            rotatePreference.setValueIndex(RotationPolicy.isRotationLocked(activity) ?
-                    1 : 0);
-            rotatePreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
-                @Override
-                public boolean onPreferenceChange(Preference preference, Object newValue) {
-                    final boolean locked = Integer.parseInt((String) newValue) != 0;
-                    mMetricsFeatureProvider.action(getActivity(), MetricsEvent.ACTION_ROTATION_LOCK,
-                            locked);
-                    RotationPolicy.setRotationLock(activity, locked);
-                    return true;
-                }
-            });
-        } else {
-            removePreference(KEY_AUTO_ROTATE);
-        }
-
-        if (isVrDisplayModeAvailable(activity)) {
-            DropDownPreference vrDisplayPref =
-                    (DropDownPreference) findPreference(KEY_VR_DISPLAY_PREF);
-            vrDisplayPref.setEntries(new CharSequence[] {
-                    activity.getString(R.string.display_vr_pref_low_persistence),
-                    activity.getString(R.string.display_vr_pref_off),
-            });
-            vrDisplayPref.setEntryValues(new CharSequence[] { "0", "1" });
-
-            final Context c = activity;
-            int currentUser = ActivityManager.getCurrentUser();
-            int current = Settings.Secure.getIntForUser(c.getContentResolver(),
-                            Settings.Secure.VR_DISPLAY_MODE,
-                            /*default*/Settings.Secure.VR_DISPLAY_MODE_LOW_PERSISTENCE,
-                            currentUser);
-            vrDisplayPref.setValueIndex(current);
-            vrDisplayPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
-                @Override
-                public boolean onPreferenceChange(Preference preference, Object newValue) {
-                    int i = Integer.parseInt((String) newValue);
-                    int u = ActivityManager.getCurrentUser();
-                    if (!Settings.Secure.putIntForUser(c.getContentResolver(),
-                            Settings.Secure.VR_DISPLAY_MODE,
-                            i, u)) {
-                        Log.e(TAG, "Could not change setting for " +
-                                Settings.Secure.VR_DISPLAY_MODE);
-                    }
-                    return true;
-                }
-            });
-        } else {
-            removePreference(KEY_VR_DISPLAY_PREF);
-        }
-
-        mNightModePreference = (ListPreference) findPreference(KEY_NIGHT_MODE);
-        if (mNightModePreference != null) {
-            final UiModeManager uiManager = (UiModeManager) getSystemService(
-                    Context.UI_MODE_SERVICE);
-            final int currentNightMode = uiManager.getNightMode();
-            mNightModePreference.setValue(String.valueOf(currentNightMode));
-            mNightModePreference.setOnPreferenceChangeListener(this);
-        }
-    }
-
-    private static boolean allowAllRotations(Context context) {
-        return Resources.getSystem().getBoolean(
-                com.android.internal.R.bool.config_allowAllRotations);
-    }
-
-    private static boolean isLiftToWakeAvailable(Context context) {
-        SensorManager sensors = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
-        return sensors != null && sensors.getDefaultSensor(Sensor.TYPE_WAKE_GESTURE) != null;
-    }
-
-    private static boolean isDozeAvailable(Context context) {
-        String name = Build.IS_DEBUGGABLE ? SystemProperties.get("debug.doze.component") : null;
-        if (TextUtils.isEmpty(name)) {
-            name = context.getResources().getString(
-                    com.android.internal.R.string.config_dozeComponent);
-        }
-        return !TextUtils.isEmpty(name);
-    }
-
-    private static boolean isTapToWakeAvailable(Resources res) {
-        return res.getBoolean(com.android.internal.R.bool.config_supportDoubleTapWake);
-    }
-
-    private static boolean isAutomaticBrightnessAvailable(Resources res) {
-        return res.getBoolean(com.android.internal.R.bool.config_automatic_brightness_available);
-    }
-
-    private static boolean isCameraGestureAvailable(Resources res) {
-        boolean configSet = res.getInteger(
-                com.android.internal.R.integer.config_cameraLaunchGestureSensorType) != -1;
-        return configSet &&
-                !SystemProperties.getBoolean("gesture.disable_camera_launch", false);
-    }
-
-    private static boolean isVrDisplayModeAvailable(Context context) {
-        PackageManager pm = context.getPackageManager();
-        return pm.hasSystemFeature(PackageManager.FEATURE_VR_MODE_HIGH_PERFORMANCE);
-    }
-
-    private void updateTimeoutPreferenceDescription(long currentTimeout) {
-        TimeoutListPreference preference = mScreenTimeoutPreference;
-        final CharSequence[] entries = preference.getEntries();
-        final CharSequence[] values = preference.getEntryValues();
-        String summary;
-        if (preference.isDisabledByAdmin()) {
-            summary = getString(R.string.disabled_by_policy_title);
-        } else {
-            CharSequence timeoutDescription = getTimeoutDescription(
-                    currentTimeout, entries, values);
-            summary = timeoutDescription == null ? ""
-                    : getString(R.string.screen_timeout_summary, timeoutDescription);
-        }
-        preference.setSummary(summary);
-    }
-
-    private static CharSequence getTimeoutDescription(
-        long currentTimeout, CharSequence[] entries, CharSequence[] values) {
-        if (currentTimeout < 0 || entries == null || values == null
-                || values.length != entries.length) {
-            return null;
-        }
-
-        for (int i = 0; i < values.length; i++) {
-            long timeout = Long.parseLong(values[i].toString());
-            if (currentTimeout == timeout) {
-                return entries[i];
-            }
-        }
-        return null;
+    protected String getLogTag() {
+        return TAG;
     }
 
     @Override
-    public void onResume() {
-        super.onResume();
-        updateState();
-
-        final long currentTimeout = Settings.System.getLong(getActivity().getContentResolver(),
-                SCREEN_OFF_TIMEOUT, FALLBACK_SCREEN_TIMEOUT_VALUE);
-        mScreenTimeoutPreference.setValue(String.valueOf(currentTimeout));
-        mScreenTimeoutPreference.setOnPreferenceChangeListener(this);
-        final DevicePolicyManager dpm = (DevicePolicyManager) getActivity().getSystemService(
-                Context.DEVICE_POLICY_SERVICE);
-        if (dpm != null) {
-            final EnforcedAdmin admin = RestrictedLockUtils.checkIfMaximumTimeToLockIsSet(
-                    getActivity());
-            final long maxTimeout = dpm
-                    .getMaximumTimeToLockForUserAndProfiles(UserHandle.myUserId());
-            mScreenTimeoutPreference.removeUnusableTimeouts(maxTimeout, admin);
-        }
-        updateTimeoutPreferenceDescription(currentTimeout);
-
-        disablePreferenceIfManaged(KEY_WALLPAPER, UserManager.DISALLOW_SET_WALLPAPER);
-    }
-
-    private void updateState() {
-        updateFontSizeSummary();
-        updateScreenSaverSummary();
-
-        // Update auto brightness if it is available.
-        if (mAutoBrightnessPreference != null) {
-            int brightnessMode = Settings.System.getInt(getContentResolver(),
-                    SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_MANUAL);
-            mAutoBrightnessPreference.setChecked(brightnessMode != SCREEN_BRIGHTNESS_MODE_MANUAL);
-        }
-
-        // Update lift-to-wake if it is available.
-        if (mLiftToWakePreference != null) {
-            int value = Settings.Secure.getInt(getContentResolver(), WAKE_GESTURE_ENABLED, 0);
-            mLiftToWakePreference.setChecked(value != 0);
-        }
-
-        // Update tap to wake if it is available.
-        if (mTapToWakePreference != null) {
-            int value = Settings.Secure.getInt(getContentResolver(), DOUBLE_TAP_TO_WAKE, 0);
-            mTapToWakePreference.setChecked(value != 0);
-        }
-
-        // Update doze if it is available.
-        if (mDozePreference != null) {
-            int value = Settings.Secure.getInt(getContentResolver(), DOZE_ENABLED, 1);
-            mDozePreference.setChecked(value != 0);
-        }
-
-        // Update camera gesture #1 if it is available.
-        if (mCameraGesturePreference != null) {
-            int value = Settings.Secure.getInt(getContentResolver(), CAMERA_GESTURE_DISABLED, 0);
-            mCameraGesturePreference.setChecked(value == 0);
-        }
-    }
-
-    private void updateScreenSaverSummary() {
-        if (mScreenSaverPreference != null) {
-            mScreenSaverPreference.setSummary(
-                    DreamSettings.getSummaryTextWithDreamName(getActivity()));
-        }
-    }
-
-    private void updateFontSizeSummary() {
-        final Context context = mFontSizePref.getContext();
-        final float currentScale = Settings.System.getFloat(context.getContentResolver(),
-                Settings.System.FONT_SCALE, 1.0f);
-        final Resources res = context.getResources();
-        final String[] entries = res.getStringArray(R.array.entries_font_size);
-        final String[] strEntryValues = res.getStringArray(R.array.entryvalues_font_size);
-        final int index = ToggleFontSizePreferenceFragment.fontSizeValueToIndex(currentScale,
-                strEntryValues);
-        mFontSizePref.setSummary(entries[index]);
+    protected String getCategoryKey() {
+        return CategoryKey.CATEGORY_DISPLAY;
     }
 
     @Override
-    public boolean onPreferenceChange(Preference preference, Object objValue) {
-        final String key = preference.getKey();
-        if (KEY_SCREEN_TIMEOUT.equals(key)) {
-            try {
-                int value = Integer.parseInt((String) objValue);
-                Settings.System.putInt(getContentResolver(), SCREEN_OFF_TIMEOUT, value);
-                updateTimeoutPreferenceDescription(value);
-            } catch (NumberFormatException e) {
-                Log.e(TAG, "could not persist screen timeout setting", e);
-            }
-        }
-        if (preference == mAutoBrightnessPreference) {
-            boolean auto = (Boolean) objValue;
-            Settings.System.putInt(getContentResolver(), SCREEN_BRIGHTNESS_MODE,
-                    auto ? SCREEN_BRIGHTNESS_MODE_AUTOMATIC : SCREEN_BRIGHTNESS_MODE_MANUAL);
-        }
-        if (preference == mLiftToWakePreference) {
-            boolean value = (Boolean) objValue;
-            Settings.Secure.putInt(getContentResolver(), WAKE_GESTURE_ENABLED, value ? 1 : 0);
-        }
-        if (preference == mDozePreference) {
-            boolean value = (Boolean) objValue;
-            Settings.Secure.putInt(getContentResolver(), DOZE_ENABLED, value ? 1 : 0);
-        }
-        if (preference == mTapToWakePreference) {
-            boolean value = (Boolean) objValue;
-            Settings.Secure.putInt(getContentResolver(), DOUBLE_TAP_TO_WAKE, value ? 1 : 0);
-        }
-        if (preference == mCameraGesturePreference) {
-            boolean value = (Boolean) objValue;
-            Settings.Secure.putInt(getContentResolver(), CAMERA_GESTURE_DISABLED,
-                    value ? 0 : 1 /* Backwards because setting is for disabling */);
-        }
-        if (preference == mNightModePreference) {
-            try {
-                final int value = Integer.parseInt((String) objValue);
-                final UiModeManager uiManager = (UiModeManager) getSystemService(
-                        Context.UI_MODE_SERVICE);
-                uiManager.setNightMode(value);
-            } catch (NumberFormatException e) {
-                Log.e(TAG, "could not persist night mode setting", e);
-            }
-        }
-        return true;
+    protected int getPreferenceScreenResId() {
+        return R.xml.display_settings;
     }
 
     @Override
-    public boolean onPreferenceTreeClick(Preference preference) {
-        if (preference == mDozePreference) {
-            mMetricsFeatureProvider.action(getActivity(), MetricsEvent.ACTION_AMBIENT_DISPLAY);
-        }
-        return super.onPreferenceTreeClick(preference);
+    protected List<PreferenceController> getPreferenceControllers(Context context) {
+        final List<PreferenceController> controllers = new ArrayList<>();
+        controllers.add(new AutoBrightnessPreferenceController(context));
+        controllers.add(new AutoRotatePreferenceController(context));
+        controllers.add(new CameraGesturePreferenceController(context));
+        controllers.add(new DozePreferenceController(context));
+        controllers.add(new FontSizePreferenceController(context));
+        controllers.add(new LiftToWakePreferenceController(context));
+        controllers.add(new NightDisplayPreferenceController(context));
+        controllers.add(new NightModePreferenceController(context));
+        controllers.add(new ScreenSaverPreferenceController(context));
+        controllers.add(new TapToWakePreferenceController(context));
+        controllers.add(new TimeoutPreferenceController(context));
+        controllers.add(new VrDisplayPreferenceController(context));
+        controllers.add(new WallpaperPreferenceController(context));
+        return controllers;
     }
 
     @Override
@@ -453,19 +94,6 @@
         return R.string.help_uri_display;
     }
 
-    private void disablePreferenceIfManaged(String key, String restriction) {
-        final RestrictedPreference pref = (RestrictedPreference) findPreference(key);
-        if (pref != null) {
-            pref.setDisabledByAdmin(null);
-            if (RestrictedLockUtils.hasBaseUserRestriction(getActivity(), restriction,
-                    UserHandle.myUserId())) {
-                pref.setEnabled(false);
-            } else {
-                pref.checkRestrictionAndSetDisabled(restriction);
-            }
-        }
-    }
-
     private static class SummaryProvider implements SummaryLoader.SummaryProvider {
         private final Context mContext;
         private final SummaryLoader mLoader;
@@ -484,13 +112,13 @@
 
         private void updateSummary() {
             final long currentTimeout = Settings.System.getLong(mContext.getContentResolver(),
-                    SCREEN_OFF_TIMEOUT, FALLBACK_SCREEN_TIMEOUT_VALUE);
+                    SCREEN_OFF_TIMEOUT, TimeoutPreferenceController.FALLBACK_SCREEN_TIMEOUT_VALUE);
             final CharSequence[] entries =
                     mContext.getResources().getTextArray(R.array.screen_timeout_entries);
             final CharSequence[] values =
                     mContext.getResources().getTextArray(R.array.screen_timeout_values);
-            final CharSequence timeoutDescription = getTimeoutDescription(
-                    currentTimeout, entries, values);
+            final CharSequence timeoutDescription = TimeoutPreferenceController
+                    .getTimeoutDescription(currentTimeout, entries, values);
             final String summary = timeoutDescription == null ? ""
                     : mContext.getString(R.string.display_summary, timeoutDescription);
             mLoader.setSummary(this, summary);
@@ -501,7 +129,7 @@
             = new SummaryLoader.SummaryProviderFactory() {
         @Override
         public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
-                                                                   SummaryLoader summaryLoader) {
+                SummaryLoader summaryLoader) {
             return new SummaryProvider(activity, summaryLoader);
         }
     };
@@ -511,8 +139,7 @@
                 @Override
                 public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
                         boolean enabled) {
-                    ArrayList<SearchIndexableResource> result =
-                            new ArrayList<SearchIndexableResource>();
+                    ArrayList<SearchIndexableResource> result = new ArrayList<>();
 
                     SearchIndexableResource sir = new SearchIndexableResource(context);
                     sir.xmlResId = R.xml.display_settings;
@@ -523,35 +150,22 @@
 
                 @Override
                 public List<String> getNonIndexableKeys(Context context) {
-                    ArrayList<String> result = new ArrayList<String>();
-                    if (!context.getResources().getBoolean(
-                            com.android.internal.R.bool.config_dreamsSupported)) {
-                        result.add(KEY_SCREEN_SAVER);
-                    }
-                    if (!isAutomaticBrightnessAvailable(context.getResources())) {
-                        result.add(KEY_AUTO_BRIGHTNESS);
-                    }
-                    if (!NightDisplayController.isAvailable(context)) {
-                        result.add(KEY_NIGHT_DISPLAY);
-                    }
-                    if (!isLiftToWakeAvailable(context)) {
-                        result.add(KEY_LIFT_TO_WAKE);
-                    }
-                    if (!isDozeAvailable(context)) {
-                        result.add(KEY_DOZE);
-                    }
-                    if (!RotationPolicy.isRotationLockToggleVisible(context)) {
-                        result.add(KEY_AUTO_ROTATE);
-                    }
-                    if (!isTapToWakeAvailable(context.getResources())) {
-                        result.add(KEY_TAP_TO_WAKE);
-                    }
-                    if (!isCameraGestureAvailable(context.getResources())) {
-                        result.add(KEY_CAMERA_GESTURE);
-                    }
-                    if (!isVrDisplayModeAvailable(context)) {
-                        result.add(KEY_VR_DISPLAY_PREF);
-                    }
+                    ArrayList<String> result = new ArrayList<>();
+
+                    new AutoBrightnessPreferenceController(context).updateNonIndexableKeys(result);
+                    new AutoRotatePreferenceController(context).updateNonIndexableKeys(result);
+                    new CameraGesturePreferenceController(context).updateNonIndexableKeys(result);
+                    new DozePreferenceController(context).updateNonIndexableKeys(result);
+                    new FontSizePreferenceController(context).updateNonIndexableKeys(result);
+                    new LiftToWakePreferenceController(context).updateNonIndexableKeys(result);
+                    new NightDisplayPreferenceController(context).updateNonIndexableKeys(result);
+                    new NightModePreferenceController(context).updateNonIndexableKeys(result);
+                    new ScreenSaverPreferenceController(context).updateNonIndexableKeys(result);
+                    new TapToWakePreferenceController(context).updateNonIndexableKeys(result);
+                    new TimeoutPreferenceController(context).updateNonIndexableKeys(result);
+                    new VrDisplayPreferenceController(context).updateNonIndexableKeys(result);
+                    new WallpaperPreferenceController(context).updateNonIndexableKeys(result);
+
                     return result;
                 }
             };
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 62ad337..477c326 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -164,6 +164,7 @@
     public static class SystemSettings extends SettingsActivity { /* empty */ }
 
     // Top level categories for new IA
+    public static class DisplayDashboardActivity extends SettingsActivity {}
     public static class StorageDashboardActivity extends SettingsActivity {}
     public static class SystemDashboardActivity extends SettingsActivity {}
     public static class SupportDashboardActivity extends SettingsActivity {}
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 9f86860..f9974b6 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -271,6 +271,7 @@
             // New IA
             // Home page
             "com.android.settings.Settings.BatteryDashboardAlias",
+            "com.android.settings.Settings.DisplayDashboardAlias",
             Settings.SystemDashboardActivity.class.getName(),
             Settings.SupportDashboardActivity.class.getName(),
             // Home page > System
diff --git a/src/com/android/settings/core/PreferenceController.java b/src/com/android/settings/core/PreferenceController.java
index eb912b2..6eac2bd 100644
--- a/src/com/android/settings/core/PreferenceController.java
+++ b/src/com/android/settings/core/PreferenceController.java
@@ -35,7 +35,34 @@
     /**
      * Displays preference in this controller.
      */
-    public abstract void displayPreference(PreferenceScreen screen);
+    public void displayPreference(PreferenceScreen screen) {
+        if (isAvailable()) {
+            if (this instanceof Preference.OnPreferenceChangeListener) {
+                final Preference preference = screen.findPreference(getPreferenceKey());
+                preference.setOnPreferenceChangeListener(
+                        (Preference.OnPreferenceChangeListener) this);
+            }
+        } else {
+            removePreference(screen, getPreferenceKey());
+        }
+    }
+
+    /**
+     * Updates the current status of preference (summary, switch state, etc)
+     */
+    public void updateState(PreferenceScreen screen) {
+    }
+
+    /**
+     * Updates non-indexable keys for search provider.
+     *
+     * Called by SearchIndexProvider#getNonIndexableKeys
+     */
+    public void updateNonIndexableKeys(List<String> keys) {
+        if (!isAvailable()) {
+            keys.add(getPreferenceKey());
+        }
+    }
 
     /**
      * Handles preference tree click
@@ -46,13 +73,6 @@
     public abstract boolean handlePreferenceTreeClick(Preference preference);
 
     /**
-     * Updates non-indexable keys for search provider.
-     *
-     * Called by SearchIndexProvider#getNonIndexableKeys
-     */
-    public abstract void updateNonIndexableKeys(List<String> keys);
-
-    /**
      * Removes preference from screen.
      */
     protected final void removePreference(PreferenceScreen screen, String key) {
@@ -62,4 +82,14 @@
         }
     }
 
+    /**
+     * Returns true if preference is available (should be displayed)
+     */
+    protected abstract boolean isAvailable();
+
+    /**
+     * Returns the key for this preference.
+     */
+    protected abstract String getPreferenceKey();
+
 }
diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java
index 0aee0b5..0758e4a 100644
--- a/src/com/android/settings/dashboard/DashboardFragment.java
+++ b/src/com/android/settings/dashboard/DashboardFragment.java
@@ -55,6 +55,14 @@
         super.onAttach(context);
         mDashboardFeatureProvider =
                 FeatureFactory.getFactory(context).getDashboardFeatureProvider(context);
+
+        final List<PreferenceController> controllers = getPreferenceControllers(context);
+        if (controllers == null) {
+            return;
+        }
+        for (PreferenceController controller : controllers) {
+            addPreferenceController(controller);
+        }
     }
 
     @Override
@@ -81,7 +89,10 @@
         if (category == null) {
             return;
         }
-        mSummaryLoader.setListening(true);
+        if (mSummaryLoader != null) {
+            // SummaryLoader can be null when there is no dynamic tiles.
+            mSummaryLoader.setListening(true);
+        }
         final Activity activity = getActivity();
         if (activity instanceof SettingsDrawerActivity) {
             mListeningToCategoryChange = true;
@@ -103,6 +114,12 @@
     }
 
     @Override
+    public void onResume() {
+        super.onResume();
+        updatePreferenceStates();
+    }
+
+    @Override
     public boolean onPreferenceTreeClick(Preference preference) {
         Collection<PreferenceController> controllers = mPreferenceControllers.values();
         // Give all controllers a chance to handle click.
@@ -117,7 +134,10 @@
     @Override
     public void onStop() {
         super.onStop();
-        mSummaryLoader.setListening(false);
+        if (mSummaryLoader != null) {
+            // SummaryLoader can be null when there is no dynamic tiles.
+            mSummaryLoader.setListening(false);
+        }
         if (mListeningToCategoryChange) {
             final Activity activity = getActivity();
             if (activity instanceof SettingsDrawerActivity) {
@@ -142,11 +162,35 @@
     protected abstract String getCategoryKey();
 
     /**
+     * Get the tag string for logging.
+     */
+    protected abstract String getLogTag();
+
+    /**
+     * Get the res id for static preference xml for this fragment.
+     */
+    protected abstract int getPreferenceScreenResId();
+
+    /**
+     * Get a list of {@link PreferenceController} for this fragment.
+     */
+    protected abstract List<PreferenceController> getPreferenceControllers(Context context);
+
+    /**
      * Displays resource based tiles.
      */
-    protected abstract void displayResourceTiles();
-
-    protected abstract String getLogTag();
+    private void displayResourceTiles() {
+        final int resId = getPreferenceScreenResId();
+        if (resId <= 0) {
+            return;
+        }
+        addPreferencesFromResource(resId);
+        final PreferenceScreen screen = getPreferenceScreen();
+        Collection<PreferenceController> controllers = mPreferenceControllers.values();
+        for (PreferenceController controller : controllers) {
+            controller.displayPreference(screen);
+        }
+    }
 
     /**
      * Displays dashboard tiles as preference.
@@ -196,6 +240,17 @@
     }
 
     /**
+     * Update state of each preference managed by PreferenceController.
+     */
+    private void updatePreferenceStates() {
+        Collection<PreferenceController> controllers = mPreferenceControllers.values();
+        final PreferenceScreen screen = getPreferenceScreen();
+        for (PreferenceController controller : controllers) {
+            controller.updateState(screen);
+        }
+    }
+
+    /**
      * Refresh preference items using system category dashboard items.
      */
     private void refreshAllPreferences(final String TAG) {
@@ -206,6 +261,7 @@
         }
         // Add resource based tiles.
         displayResourceTiles();
+
         // Add dashboard tiles.
         displayDashboardTiles(TAG, getPreferenceScreen());
     }
diff --git a/src/com/android/settings/dashboard/SummaryLoader.java b/src/com/android/settings/dashboard/SummaryLoader.java
index ff69a0b..4e4dd40 100644
--- a/src/com/android/settings/dashboard/SummaryLoader.java
+++ b/src/com/android/settings/dashboard/SummaryLoader.java
@@ -86,7 +86,13 @@
         mWorker = new Worker(mWorkerThread.getLooper());
         mActivity = activity;
 
-        List<Tile> tiles = mDashboardFeatureProvider.getTilesForCategory(categoryKey).tiles;
+        final DashboardCategory category =
+                mDashboardFeatureProvider.getTilesForCategory(categoryKey);
+        if (category == null || category.tiles == null) {
+            return;
+        }
+
+        List<Tile> tiles = category.tiles;
         for (Tile tile : tiles) {
             mWorker.obtainMessage(Worker.MSG_GET_PROVIDER, tile).sendToTarget();
         }
@@ -258,6 +264,9 @@
     }
 
     private Tile getTileFromCategory(DashboardCategory category, ComponentName component) {
+        if (category == null || category.tiles == null) {
+            return null;
+        }
         final int tileCount = category.tiles.size();
         for (int j = 0; j < tileCount; j++) {
             final Tile tile = category.tiles.get(j);
diff --git a/src/com/android/settings/deviceinfo/AdditionalSystemUpdatePreferenceController.java b/src/com/android/settings/deviceinfo/AdditionalSystemUpdatePreferenceController.java
new file mode 100644
index 0000000..6dd6aba
--- /dev/null
+++ b/src/com/android/settings/deviceinfo/AdditionalSystemUpdatePreferenceController.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.deviceinfo;
+
+import android.content.Context;
+import android.support.v7.preference.Preference;
+
+import com.android.settings.core.PreferenceController;
+
+public class AdditionalSystemUpdatePreferenceController extends PreferenceController {
+
+    private static final String KEY_UPDATE_SETTING = "additional_system_update_settings";
+
+    public AdditionalSystemUpdatePreferenceController(Context context) {
+        super(context);
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        return false;
+    }
+
+    @Override
+    protected boolean isAvailable() {
+        return mContext.getResources().getBoolean(
+                com.android.settings.R.bool.config_additional_system_update_setting_enable);
+    }
+
+    @Override
+    protected String getPreferenceKey() {
+        return KEY_UPDATE_SETTING;
+    }
+}
diff --git a/src/com/android/settings/deviceinfo/ManageStoragePreferenceController.java b/src/com/android/settings/deviceinfo/ManageStoragePreferenceController.java
index aae4be0..add4781 100644
--- a/src/com/android/settings/deviceinfo/ManageStoragePreferenceController.java
+++ b/src/com/android/settings/deviceinfo/ManageStoragePreferenceController.java
@@ -33,17 +33,8 @@
     }
 
     @Override
-    public void displayPreference(PreferenceScreen screen) {
-        if (!isAvailable()) {
-            removePreference(screen, KEY_MANAGE_STORAGE);
-        }
-    }
-
-    @Override
-    public void updateNonIndexableKeys(List<String> keys) {
-        if (!isAvailable()) {
-            keys.add(KEY_MANAGE_STORAGE);
-        }
+    protected String getPreferenceKey() {
+        return KEY_MANAGE_STORAGE;
     }
 
     @Override
@@ -51,10 +42,8 @@
         return false;
     }
 
-    /**
-     * Whether a preference should be available on screen.
-     */
-    private boolean isAvailable() {
+    @Override
+    protected boolean isAvailable() {
         return mContext.getResources().getBoolean(R.bool.config_storage_manager_settings_enabled);
     }
 }
diff --git a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
index 7e8d925..aa4d834 100644
--- a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
+++ b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
@@ -20,6 +20,7 @@
 import android.provider.SearchIndexableResource;
 
 import com.android.settings.R;
+import com.android.settings.core.PreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -45,22 +46,20 @@
     }
 
     @Override
-    public void onAttach(Context context) {
-        super.onAttach(context);
-        addPreferenceController(new ManageStoragePreferenceController(context));
-    }
-
-    @Override
     protected String getCategoryKey() {
         return CategoryKey.CATEGORY_STORAGE;
     }
 
     @Override
-    protected void displayResourceTiles() {
-        addPreferencesFromResource(R.xml.storage_dashboard_fragment);
+    protected int getPreferenceScreenResId() {
+        return R.xml.storage_dashboard_fragment;
+    }
 
-        getPreferenceController(ManageStoragePreferenceController.class)
-                .displayPreference(getPreferenceScreen());
+    @Override
+    protected List<PreferenceController> getPreferenceControllers(Context context) {
+        final List<PreferenceController> controllers = new ArrayList<>();
+        controllers.add(new ManageStoragePreferenceController(context));
+        return controllers;
     }
 
     /**
diff --git a/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java b/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java
index 5c2ebcb..449847a 100644
--- a/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java
+++ b/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java
@@ -25,7 +25,6 @@
 import android.text.TextUtils;
 import android.util.Log;
 
-import com.android.settings.R;
 import com.android.settings.Utils;
 import com.android.settings.core.PreferenceController;
 
@@ -37,8 +36,7 @@
 
     private static final String TAG = "SysUpdatePrefContr";
 
-    static final String KEY_SYSTEM_UPDATE_SETTINGS = "system_update_settings";
-    static final String KEY_UPDATE_SETTING = "additional_system_update_settings";
+    private static final String KEY_SYSTEM_UPDATE_SETTINGS = "system_update_settings";
 
     private final UserManager mUm;
 
@@ -48,29 +46,32 @@
     }
 
     @Override
+    protected boolean isAvailable() {
+        return mUm.isAdminUser();
+    }
+
+    @Override
+    protected String getPreferenceKey() {
+        return KEY_SYSTEM_UPDATE_SETTINGS;
+    }
+
+    @Override
     public void displayPreference(PreferenceScreen screen) {
-        if (isAvailable(mContext, KEY_SYSTEM_UPDATE_SETTINGS)) {
+        if (isAvailable()) {
             Utils.updatePreferenceToSpecificActivityOrRemove(mContext, screen,
                     KEY_SYSTEM_UPDATE_SETTINGS,
                     Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY);
         } else {
             removePreference(screen, KEY_SYSTEM_UPDATE_SETTINGS);
         }
-
-        if (!isAvailable(mContext, KEY_UPDATE_SETTING)) {
-            removePreference(screen, KEY_UPDATE_SETTING);
-        }
     }
 
     @Override
     public void updateNonIndexableKeys(List<String> keys) {
         // TODO: system update needs to be fixed for non-owner user b/22760654
-        if (!isAvailable(mContext, KEY_SYSTEM_UPDATE_SETTINGS)) {
+        if (!isAvailable()) {
             keys.add(KEY_SYSTEM_UPDATE_SETTINGS);
         }
-        if (!isAvailable(mContext, KEY_UPDATE_SETTING)) {
-            keys.add(KEY_UPDATE_SETTING);
-        }
     }
 
     @Override
@@ -88,21 +89,6 @@
     }
 
     /**
-     * Whether a preference should be available on screen.
-     */
-    private boolean isAvailable(Context context, String key) {
-        switch (key) {
-            case KEY_SYSTEM_UPDATE_SETTINGS:
-                return mUm.isAdminUser();
-            case KEY_UPDATE_SETTING:
-                return context.getResources().getBoolean(
-                        R.bool.config_additional_system_update_setting_enable);
-            default:
-                return false;
-        }
-    }
-
-    /**
      * Trigger client initiated action (send intent) on system update
      */
     private void ciActionOnSysUpdate(PersistableBundle b) {
diff --git a/src/com/android/settings/display/AutoBrightnessPreferenceController.java b/src/com/android/settings/display/AutoBrightnessPreferenceController.java
new file mode 100644
index 0000000..934ccf2
--- /dev/null
+++ b/src/com/android/settings/display/AutoBrightnessPreferenceController.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+package com.android.settings.display;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.core.PreferenceController;
+
+import static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE;
+import static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
+import static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL;
+
+
+public class AutoBrightnessPreferenceController extends PreferenceController implements
+        Preference.OnPreferenceChangeListener {
+
+    private static final String KEY_AUTO_BRIGHTNESS = "auto_brightness";
+
+    public AutoBrightnessPreferenceController(Context context) {
+        super(context);
+    }
+
+    @Override
+    protected boolean isAvailable() {
+        return mContext.getResources().getBoolean(
+                com.android.internal.R.bool.config_automatic_brightness_available);
+    }
+
+    @Override
+    protected String getPreferenceKey() {
+        return KEY_AUTO_BRIGHTNESS;
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        return false;
+    }
+
+    @Override
+    public void updateState(PreferenceScreen screen) {
+        final SwitchPreference preference =
+                (SwitchPreference) screen.findPreference(KEY_AUTO_BRIGHTNESS);
+        if (preference == null) {
+            return;
+        }
+        int brightnessMode = Settings.System.getInt(mContext.getContentResolver(),
+                SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_MANUAL);
+        preference.setChecked(brightnessMode != SCREEN_BRIGHTNESS_MODE_MANUAL);
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        boolean auto = (Boolean) newValue;
+        Settings.System.putInt(mContext.getContentResolver(), SCREEN_BRIGHTNESS_MODE,
+                auto ? SCREEN_BRIGHTNESS_MODE_AUTOMATIC : SCREEN_BRIGHTNESS_MODE_MANUAL);
+        return true;
+    }
+}
diff --git a/src/com/android/settings/display/AutoRotatePreferenceController.java b/src/com/android/settings/display/AutoRotatePreferenceController.java
new file mode 100644
index 0000000..f28e1d6
--- /dev/null
+++ b/src/com/android/settings/display/AutoRotatePreferenceController.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+package com.android.settings.display;
+
+import android.content.Context;
+import android.content.res.Configuration;
+import android.support.v7.preference.DropDownPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.internal.logging.MetricsProto;
+import com.android.internal.view.RotationPolicy;
+import com.android.settings.R;
+import com.android.settings.core.PreferenceController;
+import com.android.settings.core.instrumentation.MetricsFeatureProvider;
+import com.android.settings.overlay.FeatureFactory;
+
+public class AutoRotatePreferenceController extends PreferenceController implements
+        Preference.OnPreferenceChangeListener {
+
+    private static final String KEY_AUTO_ROTATE = "auto_rotate";
+    private final MetricsFeatureProvider mMetricsFeatureProvider;
+
+    public AutoRotatePreferenceController(Context context) {
+        super(context);
+        mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
+    }
+
+    @Override
+    protected String getPreferenceKey() {
+        return KEY_AUTO_ROTATE;
+    }
+
+    @Override
+    public void updateState(PreferenceScreen screen) {
+        final DropDownPreference rotatePreference =
+                (DropDownPreference) screen.findPreference(KEY_AUTO_ROTATE);
+        final int rotateLockedResourceId;
+        // The following block sets the string used when rotation is locked.
+        // If the device locks specifically to portrait or landscape (rather than current
+        // rotation), then we use a different string to include this information.
+        if (allowAllRotations()) {
+            rotateLockedResourceId = R.string.display_auto_rotate_stay_in_current;
+        } else {
+            if (RotationPolicy.getRotationLockOrientation(mContext)
+                    == Configuration.ORIENTATION_PORTRAIT) {
+                rotateLockedResourceId = R.string.display_auto_rotate_stay_in_portrait;
+            } else {
+                rotateLockedResourceId = R.string.display_auto_rotate_stay_in_landscape;
+            }
+        }
+        rotatePreference.setEntries(new CharSequence[]{
+                mContext.getString(R.string.display_auto_rotate_rotate),
+                mContext.getString(rotateLockedResourceId),
+        });
+        rotatePreference.setEntryValues(new CharSequence[]{"0", "1"});
+        rotatePreference.setValueIndex(RotationPolicy.isRotationLocked(mContext) ?
+                1 : 0);
+    }
+
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        return false;
+    }
+
+    @Override
+    protected boolean isAvailable() {
+        return RotationPolicy.isRotationLockToggleVisible(mContext);
+    }
+
+    private boolean allowAllRotations() {
+        return mContext.getResources().getBoolean(
+                com.android.internal.R.bool.config_allowAllRotations);
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        final boolean locked = Integer.parseInt((String) newValue) != 0;
+        mMetricsFeatureProvider.action(mContext, MetricsProto.MetricsEvent.ACTION_ROTATION_LOCK,
+                locked);
+        RotationPolicy.setRotationLock(mContext, locked);
+        return true;
+    }
+}
diff --git a/src/com/android/settings/display/CameraGesturePreferenceController.java b/src/com/android/settings/display/CameraGesturePreferenceController.java
new file mode 100644
index 0000000..98486c5
--- /dev/null
+++ b/src/com/android/settings/display/CameraGesturePreferenceController.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+package com.android.settings.display;
+
+import android.content.Context;
+import android.os.SystemProperties;
+import android.provider.Settings;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.core.PreferenceController;
+
+import static android.provider.Settings.Secure.CAMERA_GESTURE_DISABLED;
+
+public class CameraGesturePreferenceController extends PreferenceController implements
+        Preference.OnPreferenceChangeListener {
+
+    private static final String KEY_CAMERA_GESTURE = "camera_gesture";
+
+    public CameraGesturePreferenceController(Context context) {
+        super(context);
+    }
+
+    @Override
+    protected String getPreferenceKey() {
+        return KEY_CAMERA_GESTURE;
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        return false;
+    }
+
+    @Override
+    public void updateState(PreferenceScreen screen) {
+        final SwitchPreference preference =
+                (SwitchPreference) screen.findPreference(KEY_CAMERA_GESTURE);
+        if (preference != null) {
+            int value = Settings.Secure.getInt(mContext.getContentResolver(),
+                    CAMERA_GESTURE_DISABLED, 0);
+            preference.setChecked(value == 0);
+        }
+    }
+
+    @Override
+    protected boolean isAvailable() {
+        boolean configSet = mContext.getResources().getInteger(
+                com.android.internal.R.integer.config_cameraLaunchGestureSensorType) != -1;
+        return configSet
+                && !SystemProperties.getBoolean("gesture.disable_camera_launch", false);
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        boolean value = (Boolean) newValue;
+        Settings.Secure.putInt(mContext.getContentResolver(), CAMERA_GESTURE_DISABLED,
+                value ? 0 : 1 /* Backwards because setting is for disabling */);
+        return true;
+    }
+}
diff --git a/src/com/android/settings/display/DozePreferenceController.java b/src/com/android/settings/display/DozePreferenceController.java
new file mode 100644
index 0000000..9fcc807
--- /dev/null
+++ b/src/com/android/settings/display/DozePreferenceController.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+package com.android.settings.display;
+
+import android.content.Context;
+import android.os.Build;
+import android.os.SystemProperties;
+import android.provider.Settings;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.text.TextUtils;
+
+import com.android.settings.core.PreferenceController;
+import com.android.settings.core.instrumentation.MetricsFeatureProvider;
+import com.android.settings.overlay.FeatureFactory;
+
+import static android.provider.Settings.Secure.DOZE_ENABLED;
+import static com.android.internal.logging.MetricsProto.MetricsEvent.ACTION_AMBIENT_DISPLAY;
+
+public class DozePreferenceController extends PreferenceController implements
+        Preference.OnPreferenceChangeListener {
+
+    private static final String KEY_DOZE = "doze";
+
+    private final MetricsFeatureProvider mMetricsFeatureProvider;
+
+    public DozePreferenceController(Context context) {
+        super(context);
+        mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
+    }
+
+    @Override
+    protected String getPreferenceKey() {
+        return KEY_DOZE;
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        if (KEY_DOZE.equals(preference.getKey())) {
+            mMetricsFeatureProvider.action(mContext, ACTION_AMBIENT_DISPLAY);
+        }
+        return false;
+    }
+
+    @Override
+    public void updateState(PreferenceScreen screen) {
+        final SwitchPreference preference = (SwitchPreference) screen.findPreference(KEY_DOZE);
+        // Update doze if it is available.
+        if (preference != null) {
+            int value = Settings.Secure.getInt(mContext.getContentResolver(), DOZE_ENABLED, 1);
+            preference.setChecked(value != 0);
+        }
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        boolean value = (Boolean) newValue;
+        Settings.Secure.putInt(mContext.getContentResolver(), DOZE_ENABLED, value ? 1 : 0);
+        return true;
+    }
+
+    @Override
+    protected boolean isAvailable() {
+        String name = Build.IS_DEBUGGABLE ? SystemProperties.get("debug.doze.component") : null;
+        if (TextUtils.isEmpty(name)) {
+            name = mContext.getResources().getString(
+                    com.android.internal.R.string.config_dozeComponent);
+        }
+        return !TextUtils.isEmpty(name);
+    }
+}
diff --git a/src/com/android/settings/display/FontSizePreferenceController.java b/src/com/android/settings/display/FontSizePreferenceController.java
new file mode 100644
index 0000000..9981fcd
--- /dev/null
+++ b/src/com/android/settings/display/FontSizePreferenceController.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+package com.android.settings.display;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.provider.Settings;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.accessibility.ToggleFontSizePreferenceFragment;
+import com.android.settings.core.PreferenceController;
+
+public class FontSizePreferenceController extends PreferenceController {
+
+    private static final String KEY_FONT_SIZE = "font_size";
+
+    public FontSizePreferenceController(Context context) {
+        super(context);
+    }
+
+    @Override
+    protected boolean isAvailable() {
+        return true;
+    }
+
+    @Override
+    protected String getPreferenceKey() {
+        return KEY_FONT_SIZE;
+    }
+
+    @Override
+    public void updateState(PreferenceScreen screen) {
+        final Preference preference = screen.findPreference(KEY_FONT_SIZE);
+        if (preference == null) {
+            return;
+        }
+        final float currentScale = Settings.System.getFloat(mContext.getContentResolver(),
+                Settings.System.FONT_SCALE, 1.0f);
+        final Resources res = mContext.getResources();
+        final String[] entries = res.getStringArray(R.array.entries_font_size);
+        final String[] strEntryValues = res.getStringArray(R.array.entryvalues_font_size);
+        final int index = ToggleFontSizePreferenceFragment.fontSizeValueToIndex(currentScale,
+                strEntryValues);
+        preference.setSummary(entries[index]);
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        return false;
+    }
+}
diff --git a/src/com/android/settings/display/LiftToWakePreferenceController.java b/src/com/android/settings/display/LiftToWakePreferenceController.java
new file mode 100644
index 0000000..0b573cf
--- /dev/null
+++ b/src/com/android/settings/display/LiftToWakePreferenceController.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+package com.android.settings.display;
+
+import android.content.Context;
+import android.hardware.Sensor;
+import android.hardware.SensorManager;
+import android.provider.Settings;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.core.PreferenceController;
+
+import static android.provider.Settings.Secure.WAKE_GESTURE_ENABLED;
+
+public class LiftToWakePreferenceController extends PreferenceController implements
+        Preference.OnPreferenceChangeListener {
+
+    private static final String KEY_LIFT_TO_WAKE = "lift_to_wake";
+
+    public LiftToWakePreferenceController(Context context) {
+        super(context);
+    }
+
+    @Override
+    protected boolean isAvailable() {
+        SensorManager sensors = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
+        return sensors != null && sensors.getDefaultSensor(Sensor.TYPE_WAKE_GESTURE) != null;
+    }
+
+    @Override
+    protected String getPreferenceKey() {
+        return KEY_LIFT_TO_WAKE;
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        return false;
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        boolean value = (Boolean) newValue;
+        Settings.Secure.putInt(mContext.getContentResolver(), WAKE_GESTURE_ENABLED, value ? 1 : 0);
+        return true;
+    }
+
+    @Override
+    public void updateState(PreferenceScreen screen) {
+        final SwitchPreference pref = (SwitchPreference) screen.findPreference(KEY_LIFT_TO_WAKE);
+        // Update lift-to-wake if it is available.
+        if (pref != null) {
+            int value =
+                    Settings.Secure.getInt(mContext.getContentResolver(), WAKE_GESTURE_ENABLED, 0);
+            pref.setChecked(value != 0);
+        }
+    }
+}
diff --git a/src/com/android/settings/display/NightDisplayPreferenceController.java b/src/com/android/settings/display/NightDisplayPreferenceController.java
new file mode 100644
index 0000000..d7191d2
--- /dev/null
+++ b/src/com/android/settings/display/NightDisplayPreferenceController.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+package com.android.settings.display;
+
+import android.content.Context;
+import android.support.v7.preference.Preference;
+
+import com.android.internal.app.NightDisplayController;
+import com.android.settings.core.PreferenceController;
+
+public class NightDisplayPreferenceController extends PreferenceController {
+
+    private static final String KEY_NIGHT_DISPLAY = "night_display";
+
+    public NightDisplayPreferenceController(Context context) {
+        super(context);
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        return false;
+    }
+
+    @Override
+    protected boolean isAvailable() {
+        return NightDisplayController.isAvailable(mContext);
+    }
+
+    @Override
+    protected String getPreferenceKey() {
+        return KEY_NIGHT_DISPLAY;
+    }
+}
diff --git a/src/com/android/settings/display/NightModePreferenceController.java b/src/com/android/settings/display/NightModePreferenceController.java
new file mode 100644
index 0000000..7b3c584
--- /dev/null
+++ b/src/com/android/settings/display/NightModePreferenceController.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+package com.android.settings.display;
+
+import android.app.UiModeManager;
+import android.content.Context;
+import android.support.v7.preference.ListPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.util.Log;
+
+import com.android.settings.core.PreferenceController;
+
+import static android.content.Context.UI_MODE_SERVICE;
+
+public class NightModePreferenceController extends PreferenceController
+        implements Preference.OnPreferenceChangeListener {
+
+    private static final String TAG = "NightModePrefContr";
+    private static final String KEY_NIGHT_MODE = "night_mode";
+
+    public NightModePreferenceController(Context context) {
+        super(context);
+    }
+
+    @Override
+    protected boolean isAvailable() {
+        return false;
+    }
+
+    @Override
+    protected String getPreferenceKey() {
+        return KEY_NIGHT_MODE;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        if (!isAvailable()) {
+            removePreference(screen, KEY_NIGHT_MODE);
+            return;
+        }
+        ListPreference mNightModePreference = (ListPreference) screen.findPreference(
+                KEY_NIGHT_MODE);
+        if (mNightModePreference != null) {
+            final UiModeManager uiManager =
+                    (UiModeManager) mContext.getSystemService(UI_MODE_SERVICE);
+            final int currentNightMode = uiManager.getNightMode();
+            mNightModePreference.setValue(String.valueOf(currentNightMode));
+            mNightModePreference.setOnPreferenceChangeListener(this);
+        }
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        return false;
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        try {
+            final int value = Integer.parseInt((String) newValue);
+            final UiModeManager uiManager =
+                    (UiModeManager) mContext.getSystemService(UI_MODE_SERVICE);
+            uiManager.setNightMode(value);
+        } catch (NumberFormatException e) {
+            Log.e(TAG, "could not persist night mode setting", e);
+            return false;
+        }
+        return true;
+    }
+}
diff --git a/src/com/android/settings/display/ScreenSaverPreferenceController.java b/src/com/android/settings/display/ScreenSaverPreferenceController.java
new file mode 100644
index 0000000..6376fcf
--- /dev/null
+++ b/src/com/android/settings/display/ScreenSaverPreferenceController.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+package com.android.settings.display;
+
+import android.content.Context;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.DreamSettings;
+import com.android.settings.core.PreferenceController;
+
+public class ScreenSaverPreferenceController extends PreferenceController {
+
+    private static final String KEY_SCREEN_SAVER = "screensaver";
+
+    public ScreenSaverPreferenceController(Context context) {
+        super(context);
+    }
+
+    @Override
+    protected boolean isAvailable() {
+        return mContext.getResources().getBoolean(
+                com.android.internal.R.bool.config_dreamsSupported);
+    }
+
+    @Override
+    protected String getPreferenceKey() {
+        return KEY_SCREEN_SAVER;
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        return false;
+    }
+
+    @Override
+    public void updateState(PreferenceScreen screen) {
+        final Preference preference = screen.findPreference(KEY_SCREEN_SAVER);
+        if (preference != null) {
+            preference.setSummary(
+                    DreamSettings.getSummaryTextWithDreamName(mContext));
+        }
+    }
+}
diff --git a/src/com/android/settings/display/TapToWakePreferenceController.java b/src/com/android/settings/display/TapToWakePreferenceController.java
new file mode 100644
index 0000000..6d1681f
--- /dev/null
+++ b/src/com/android/settings/display/TapToWakePreferenceController.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+package com.android.settings.display;
+
+import android.content.Context;
+import android.provider.Settings;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.core.PreferenceController;
+
+public class TapToWakePreferenceController extends PreferenceController implements
+        Preference.OnPreferenceChangeListener {
+
+    private static final String KEY_TAP_TO_WAKE = "tap_to_wake";
+
+    public TapToWakePreferenceController(Context context) {
+        super(context);
+    }
+
+    @Override
+    protected String getPreferenceKey() {
+        return KEY_TAP_TO_WAKE;
+    }
+
+    @Override
+    protected boolean isAvailable() {
+        return mContext.getResources().getBoolean(
+                com.android.internal.R.bool.config_supportDoubleTapWake);
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        return false;
+    }
+
+    @Override
+    public void updateState(PreferenceScreen screen) {
+        final SwitchPreference preference =
+                (SwitchPreference) screen.findPreference(KEY_TAP_TO_WAKE);
+        if (preference != null) {
+            int value = Settings.Secure.getInt(
+                    mContext.getContentResolver(), Settings.Secure.DOUBLE_TAP_TO_WAKE, 0);
+            preference.setChecked(value != 0);
+        }
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        boolean value = (Boolean) newValue;
+        Settings.Secure.putInt(
+                mContext.getContentResolver(), Settings.Secure.DOUBLE_TAP_TO_WAKE, value ? 1 : 0);
+        return true;
+    }
+}
diff --git a/src/com/android/settings/display/TimeoutPreferenceController.java b/src/com/android/settings/display/TimeoutPreferenceController.java
new file mode 100644
index 0000000..1295a47
--- /dev/null
+++ b/src/com/android/settings/display/TimeoutPreferenceController.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+package com.android.settings.display;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.util.Log;
+
+import com.android.settings.R;
+import com.android.settings.TimeoutListPreference;
+import com.android.settings.core.PreferenceController;
+import com.android.settingslib.RestrictedLockUtils;
+
+import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
+
+public class TimeoutPreferenceController extends PreferenceController implements
+        Preference.OnPreferenceChangeListener {
+
+    private static final String TAG = "TimeoutPrefContr";
+
+    /** If there is no setting in the provider, use this. */
+    public static final int FALLBACK_SCREEN_TIMEOUT_VALUE = 30000;
+
+    private static final String KEY_SCREEN_TIMEOUT = "screen_timeout";
+
+    public TimeoutPreferenceController(Context context) {
+        super(context);
+    }
+
+    @Override
+    protected boolean isAvailable() {
+        return true;
+    }
+
+    @Override
+    protected String getPreferenceKey() {
+        return KEY_SCREEN_TIMEOUT;
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        return false;
+    }
+
+    @Override
+    public void updateState(PreferenceScreen screen) {
+        final TimeoutListPreference preference =
+                (TimeoutListPreference) screen.findPreference(KEY_SCREEN_TIMEOUT);
+        if (preference == null) {
+            return;
+        }
+        final long currentTimeout = Settings.System.getLong(mContext.getContentResolver(),
+                SCREEN_OFF_TIMEOUT, FALLBACK_SCREEN_TIMEOUT_VALUE);
+        preference.setValue(String.valueOf(currentTimeout));
+        final DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService(
+                Context.DEVICE_POLICY_SERVICE);
+        if (dpm != null) {
+            final RestrictedLockUtils.EnforcedAdmin admin =
+                    RestrictedLockUtils.checkIfMaximumTimeToLockIsSet(mContext);
+            final long maxTimeout =
+                    dpm.getMaximumTimeToLockForUserAndProfiles(UserHandle.myUserId());
+            preference.removeUnusableTimeouts(maxTimeout, admin);
+        }
+        updateTimeoutPreferenceDescription(preference, currentTimeout);
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        try {
+            int value = Integer.parseInt((String) newValue);
+            Settings.System.putInt(mContext.getContentResolver(), SCREEN_OFF_TIMEOUT, value);
+            updateTimeoutPreferenceDescription((TimeoutListPreference) preference, value);
+        } catch (NumberFormatException e) {
+            Log.e(TAG, "could not persist screen timeout setting", e);
+        }
+        return true;
+    }
+
+    public static CharSequence getTimeoutDescription(
+            long currentTimeout, CharSequence[] entries, CharSequence[] values) {
+        if (currentTimeout < 0 || entries == null || values == null
+                || values.length != entries.length) {
+            return null;
+        }
+
+        for (int i = 0; i < values.length; i++) {
+            long timeout = Long.parseLong(values[i].toString());
+            if (currentTimeout == timeout) {
+                return entries[i];
+            }
+        }
+        return null;
+    }
+
+    private void updateTimeoutPreferenceDescription(TimeoutListPreference preference,
+            long currentTimeout) {
+        final CharSequence[] entries = preference.getEntries();
+        final CharSequence[] values = preference.getEntryValues();
+        final String summary;
+        if (preference.isDisabledByAdmin()) {
+            summary = mContext.getString(com.android.settings.R.string.disabled_by_policy_title);
+        } else {
+            final CharSequence timeoutDescription = getTimeoutDescription(
+                    currentTimeout, entries, values);
+            summary = timeoutDescription == null
+                    ? ""
+                    : mContext.getString(R.string.screen_timeout_summary, timeoutDescription);
+        }
+        preference.setSummary(summary);
+    }
+
+}
diff --git a/src/com/android/settings/display/VrDisplayPreferenceController.java b/src/com/android/settings/display/VrDisplayPreferenceController.java
new file mode 100644
index 0000000..c340759
--- /dev/null
+++ b/src/com/android/settings/display/VrDisplayPreferenceController.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+package com.android.settings.display;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.provider.Settings;
+import android.support.v7.preference.DropDownPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.util.Log;
+
+import com.android.settings.R;
+import com.android.settings.core.PreferenceController;
+
+public class VrDisplayPreferenceController extends PreferenceController implements
+        Preference.OnPreferenceChangeListener {
+
+    private static final String TAG = "VrDisplayPrefContr";
+    private static final String KEY_VR_DISPLAY_PREF = "vr_display_pref";
+
+    public VrDisplayPreferenceController(Context context) {
+        super(context);
+    }
+
+    @Override
+    protected boolean isAvailable() {
+        final PackageManager pm = mContext.getPackageManager();
+        return pm.hasSystemFeature(PackageManager.FEATURE_VR_MODE_HIGH_PERFORMANCE);
+    }
+
+    @Override
+    protected String getPreferenceKey() {
+        return KEY_VR_DISPLAY_PREF;
+    }
+
+    @Override
+    public void updateState(PreferenceScreen screen) {
+        final DropDownPreference pref =
+                (DropDownPreference) screen.findPreference(KEY_VR_DISPLAY_PREF);
+        if (pref == null) {
+            Log.d(TAG, "Could not find VR display preference.");
+            return;
+        }
+        pref.setEntries(new CharSequence[]{
+                mContext.getString(R.string.display_vr_pref_low_persistence),
+                mContext.getString(R.string.display_vr_pref_off),
+        });
+        pref.setEntryValues(new CharSequence[]{"0", "1"});
+
+        int currentUser = ActivityManager.getCurrentUser();
+        int current = Settings.Secure.getIntForUser(mContext.getContentResolver(),
+                Settings.Secure.VR_DISPLAY_MODE,
+                            /*default*/Settings.Secure.VR_DISPLAY_MODE_LOW_PERSISTENCE,
+                currentUser);
+        pref.setValueIndex(current);
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        int i = Integer.parseInt((String) newValue);
+        int u = ActivityManager.getCurrentUser();
+        if (!Settings.Secure.putIntForUser(mContext.getContentResolver(),
+                Settings.Secure.VR_DISPLAY_MODE,
+                i, u)) {
+            Log.e(TAG, "Could not change setting for " +
+                    Settings.Secure.VR_DISPLAY_MODE);
+        }
+        return true;
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        return false;
+    }
+}
diff --git a/src/com/android/settings/display/WallpaperPreferenceController.java b/src/com/android/settings/display/WallpaperPreferenceController.java
new file mode 100644
index 0000000..32e9abc
--- /dev/null
+++ b/src/com/android/settings/display/WallpaperPreferenceController.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+package com.android.settings.display;
+
+import android.content.Context;
+import android.os.UserHandle;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.core.PreferenceController;
+import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.RestrictedPreference;
+
+import static android.os.UserManager.DISALLOW_SET_WALLPAPER;
+
+public class WallpaperPreferenceController extends PreferenceController {
+
+    private static final String KEY_WALLPAPER = "wallpaper";
+
+    public WallpaperPreferenceController(Context context) {
+        super(context);
+    }
+
+    @Override
+    protected boolean isAvailable() {
+        return true;
+    }
+
+    @Override
+    protected String getPreferenceKey() {
+        return KEY_WALLPAPER;
+    }
+
+    @Override
+    public void updateState(PreferenceScreen screen) {
+        disablePreferenceIfManaged(screen);
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        return false;
+    }
+
+    private void disablePreferenceIfManaged(PreferenceScreen screen) {
+        final RestrictedPreference pref =
+                (RestrictedPreference) screen.findPreference(KEY_WALLPAPER);
+        final String restriction = DISALLOW_SET_WALLPAPER;
+        if (pref != null) {
+            pref.setDisabledByAdmin(null);
+            if (RestrictedLockUtils.hasBaseUserRestriction(mContext,
+                    restriction, UserHandle.myUserId())) {
+                pref.setEnabled(false);
+            } else {
+                pref.checkRestrictionAndSetDisabled(restriction);
+            }
+        }
+    }
+}
diff --git a/src/com/android/settings/system/SystemDashboardFragment.java b/src/com/android/settings/system/SystemDashboardFragment.java
index e5c5119..6f1e6f6 100644
--- a/src/com/android/settings/system/SystemDashboardFragment.java
+++ b/src/com/android/settings/system/SystemDashboardFragment.java
@@ -20,7 +20,9 @@
 import android.provider.SearchIndexableResource;
 
 import com.android.settings.R;
+import com.android.settings.core.PreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.deviceinfo.AdditionalSystemUpdatePreferenceController;
 import com.android.settings.deviceinfo.SystemUpdatePreferenceController;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -47,18 +49,8 @@
     }
 
     @Override
-    public void onAttach(Context context) {
-        super.onAttach(context);
-        addPreferenceController(
-                new SystemUpdatePreferenceController(context, UserManager.get(context)));
-    }
-
-    @Override
-    protected void displayResourceTiles() {
-        addPreferencesFromResource(R.xml.system_dashboard_fragment);
-
-        getPreferenceController(SystemUpdatePreferenceController.class)
-                .displayPreference(getPreferenceScreen());
+    protected int getPreferenceScreenResId() {
+        return R.xml.system_dashboard_fragment;
     }
 
     @Override
@@ -66,6 +58,14 @@
         return CategoryKey.CATEGORY_SYSTEM;
     }
 
+    @Override
+    protected List<PreferenceController> getPreferenceControllers(Context context) {
+        final List<PreferenceController> controllers = new ArrayList<>();
+        controllers.add(new SystemUpdatePreferenceController(context, UserManager.get(context)));
+        controllers.add(new AdditionalSystemUpdatePreferenceController(context));
+        return controllers;
+    }
+
     /**
      * For Search.
      */
@@ -89,10 +89,11 @@
                             .isEnabled()) {
                         return null;
                     }
-                    final SystemUpdatePreferenceController systemUpdatePreferenceController =
-                            new SystemUpdatePreferenceController(context, UserManager.get(context));
                     final List<String> keys = new ArrayList<>();
-                    systemUpdatePreferenceController.updateNonIndexableKeys(keys);
+                    new SystemUpdatePreferenceController(context, UserManager.get(context))
+                            .updateNonIndexableKeys(keys);
+                    new AdditionalSystemUpdatePreferenceController(context)
+                            .updateNonIndexableKeys(keys);
                     return keys;
                 }
             };
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index 88ae259..ca455b8 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -40,11 +40,11 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.provider.Settings;
+import android.provider.Settings.Global;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.Preference.OnPreferenceClickListener;
 import android.support.v7.preference.PreferenceGroup;
 import android.support.v7.preference.PreferenceScreen;
-import android.provider.Settings.Global;
 import android.util.Log;
 import android.util.SparseArray;
 import android.view.Menu;
