diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 2ba7919..e3fa070 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -97,6 +97,7 @@
     <!-- For Search -->
     <declare-styleable name="Preference">
         <attr name="keywords" format="string" />
+        <attr name="controller" format="string" />
     </declare-styleable>
 
     <!-- For DotsPageIndicator -->
diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml
index f9f5d2b..333fd2a 100644
--- a/res/xml/display_settings.xml
+++ b/res/xml/display_settings.xml
@@ -25,8 +25,9 @@
     <Preference
         android:key="brightness"
         android:title="@string/brightness"
-        settings:keywords="@string/keywords_display_brightness_level">
-        <intent android:action="com.android.intent.action.SHOW_BRIGHTNESS_DIALOG" />
+        settings:keywords="@string/keywords_display_brightness_level"
+        settings:controller="com.android.settings.display.AutoBrightnessPreferenceController">
+    <intent android:action="com.android.intent.action.SHOW_BRIGHTNESS_DIALOG" />
     </Preference>
 
     <com.android.settings.display.NightDisplayPreference
diff --git a/res/xml/system_dashboard_fragment.xml b/res/xml/system_dashboard_fragment.xml
index 8b9d0ca..1dfa6fb 100644
--- a/res/xml/system_dashboard_fragment.xml
+++ b/res/xml/system_dashboard_fragment.xml
@@ -26,7 +26,8 @@
         android:title="@string/gesture_preference_title"
         android:icon="@drawable/ic_settings_gestures"
         android:order="-250"
-        android:fragment="com.android.settings.gestures.GestureSettings" />
+        android:fragment="com.android.settings.gestures.GestureSettings"
+        settings:controller="com.android.settings.gestures.GesturesSettingPreferenceController"/>
 
     <!-- Backup -->
     <Preference
@@ -34,7 +35,8 @@
         android:title="@string/privacy_settings_title"
         android:summary="@string/summary_placeholder"
         android:icon="@drawable/ic_settings_backup"
-        android:order="-60">
+        android:order="-60"
+        settings:controller="com.android.settings.backup.BackupSettingsActivityPreferenceController">
         <intent android:action="android.settings.BACKUP_AND_RESET_SETTINGS" />
     </Preference>
 
@@ -44,14 +46,16 @@
         android:title="@string/system_update_settings_list_item_title"
         android:summary="@string/summary_placeholder"
         android:icon="@drawable/ic_system_update"
-        android:order="-30">
+        android:order="-30"
+        settings:controller="com.android.settings.deviceinfo.SystemUpdatePreferenceController">
         <intent android:action="android.settings.SYSTEM_UPDATE_SETTINGS" />
     </Preference>
 
     <Preference
         android:key="additional_system_update_settings"
         android:title="@string/additional_system_update_settings_list_item_title"
-        android:order="-31">
+        android:order="-31"
+        settings:controller="com.android.settings.deviceinfo.AdditionalSystemUpdatePreferenceController">
         <intent android:action="android.intent.action.MAIN"
                 android:targetPackage="@string/additional_system_update"
                 android:targetClass="@string/additional_system_update_menu" />
diff --git a/src/com/android/settings/backup/BackupSettingsActivityPreferenceController.java b/src/com/android/settings/backup/BackupSettingsActivityPreferenceController.java
index afc13b4..7a7530c 100644
--- a/src/com/android/settings/backup/BackupSettingsActivityPreferenceController.java
+++ b/src/com/android/settings/backup/BackupSettingsActivityPreferenceController.java
@@ -22,31 +22,29 @@
 import android.support.v7.preference.Preference;
 
 import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settingslib.core.AbstractPreferenceController;
 
-public class BackupSettingsActivityPreferenceController extends
-        AbstractPreferenceController implements PreferenceControllerMixin {
+public class BackupSettingsActivityPreferenceController extends BasePreferenceController {
+    private static final String TAG = "BackupSettingActivityPC";
+
     private static final String KEY_BACKUP_SETTINGS = "backup_settings";
-    private static final String TAG = "BackupSettingActivityPC" ;
 
     private final UserManager mUm;
     private final BackupManager mBackupManager;
 
     public BackupSettingsActivityPreferenceController(Context context) {
-        super(context);
+        super(context, KEY_BACKUP_SETTINGS);
         mUm = (UserManager) context.getSystemService(Context.USER_SERVICE);
         mBackupManager = new BackupManager(context);
     }
 
     @Override
-    public boolean isAvailable() {
-        return mUm.isAdminUser();
-    }
-
-    @Override
-    public String getPreferenceKey() {
-        return KEY_BACKUP_SETTINGS;
+    public int getAvailabilityStatus() {
+        return mUm.isAdminUser()
+                ? AVAILABLE
+                : DISABLED_UNSUPPORTED;
     }
 
     @Override
@@ -57,4 +55,4 @@
                 ? R.string.accessibility_feature_state_on
                 : R.string.accessibility_feature_state_off);
     }
-}
+}
\ No newline at end of file
diff --git a/src/com/android/settings/deviceinfo/AdditionalSystemUpdatePreferenceController.java b/src/com/android/settings/deviceinfo/AdditionalSystemUpdatePreferenceController.java
index 06bdb3f..f91ed4e 100644
--- a/src/com/android/settings/deviceinfo/AdditionalSystemUpdatePreferenceController.java
+++ b/src/com/android/settings/deviceinfo/AdditionalSystemUpdatePreferenceController.java
@@ -17,26 +17,23 @@
 
 import android.content.Context;
 
+import com.android.settings.core.BasePreferenceController;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settingslib.core.AbstractPreferenceController;
 
-public class AdditionalSystemUpdatePreferenceController extends
-        AbstractPreferenceController implements PreferenceControllerMixin {
+public class AdditionalSystemUpdatePreferenceController extends BasePreferenceController {
 
     private static final String KEY_UPDATE_SETTING = "additional_system_update_settings";
 
     public AdditionalSystemUpdatePreferenceController(Context context) {
-        super(context);
+        super(context, KEY_UPDATE_SETTING);
     }
 
     @Override
-    public boolean isAvailable() {
+    public int getAvailabilityStatus() {
         return mContext.getResources().getBoolean(
-                com.android.settings.R.bool.config_additional_system_update_setting_enable);
+                com.android.settings.R.bool.config_additional_system_update_setting_enable)
+                ? AVAILABLE
+                : DISABLED_UNSUPPORTED;
     }
-
-    @Override
-    public String getPreferenceKey() {
-        return KEY_UPDATE_SETTING;
-    }
-}
+}
\ No newline at end of file
diff --git a/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java b/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java
index d8a64a8..92c33d8 100644
--- a/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java
+++ b/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java
@@ -30,11 +30,9 @@
 
 import com.android.settings.R;
 import com.android.settings.Utils;
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settings.core.BasePreferenceController;
 
-public class SystemUpdatePreferenceController extends AbstractPreferenceController implements
-        PreferenceControllerMixin {
+public class SystemUpdatePreferenceController extends BasePreferenceController {
 
     private static final String TAG = "SysUpdatePrefContr";
 
@@ -42,19 +40,16 @@
 
     private final UserManager mUm;
 
-    public SystemUpdatePreferenceController(Context context, UserManager um) {
-        super(context);
-        mUm = um;
+    public SystemUpdatePreferenceController(Context context) {
+        super(context, KEY_SYSTEM_UPDATE_SETTINGS);
+        mUm = UserManager.get(context);
     }
 
     @Override
-    public boolean isAvailable() {
-        return mUm.isAdminUser();
-    }
-
-    @Override
-    public String getPreferenceKey() {
-        return KEY_SYSTEM_UPDATE_SETTINGS;
+    public int getAvailabilityStatus() {
+        return mUm.isAdminUser()
+                ? AVAILABLE
+                : DISABLED_UNSUPPORTED;
     }
 
     @Override
@@ -62,14 +57,14 @@
         super.displayPreference(screen);
         if (isAvailable()) {
             Utils.updatePreferenceToSpecificActivityOrRemove(mContext, screen,
-                    KEY_SYSTEM_UPDATE_SETTINGS,
+                    getPreferenceKey(),
                     Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY);
         }
     }
 
     @Override
     public boolean handlePreferenceTreeClick(Preference preference) {
-        if (KEY_SYSTEM_UPDATE_SETTINGS.equals(preference.getKey())) {
+        if (TextUtils.equals(getPreferenceKey(), preference.getKey())) {
             CarrierConfigManager configManager =
                     (CarrierConfigManager) mContext.getSystemService(CARRIER_CONFIG_SERVICE);
             PersistableBundle b = configManager.getConfig();
@@ -108,4 +103,4 @@
             mContext.getApplicationContext().sendBroadcast(intent);
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/com/android/settings/gestures/GesturesSettingPreferenceController.java b/src/com/android/settings/gestures/GesturesSettingPreferenceController.java
index d1b47b2..819b128 100644
--- a/src/com/android/settings/gestures/GesturesSettingPreferenceController.java
+++ b/src/com/android/settings/gestures/GesturesSettingPreferenceController.java
@@ -23,27 +23,26 @@
 
 import com.android.internal.hardware.AmbientDisplayConfiguration;
 import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.core.AbstractPreferenceController;
 
 import java.util.List;
 
-public class GesturesSettingPreferenceController extends AbstractPreferenceController
-        implements PreferenceControllerMixin {
-
-    private static final String KEY_GESTURES_SETTINGS = "gesture_settings";
-
+public class GesturesSettingPreferenceController extends BasePreferenceController {
     private final AssistGestureFeatureProvider mFeatureProvider;
     private List<AbstractPreferenceController> mGestureControllers;
 
+    private static final String KEY_GESTURES_SETTINGS = "gesture_settings";
+
     public GesturesSettingPreferenceController(Context context) {
-        super(context);
+        super(context, KEY_GESTURES_SETTINGS);
         mFeatureProvider = FeatureFactory.getFactory(context).getAssistGestureFeatureProvider();
     }
 
     @Override
-    public boolean isAvailable() {
+    public int getAvailabilityStatus() {
         if (mGestureControllers == null) {
             mGestureControllers = GestureSettings.buildPreferenceControllers(mContext,
                     null /* lifecycle */, new AmbientDisplayConfiguration(mContext));
@@ -52,12 +51,9 @@
         for (AbstractPreferenceController controller : mGestureControllers) {
             isAvailable = isAvailable || controller.isAvailable();
         }
-        return isAvailable;
-    }
-
-    @Override
-    public String getPreferenceKey() {
-        return KEY_GESTURES_SETTINGS;
+        return isAvailable
+                ? AVAILABLE
+                : DISABLED_UNSUPPORTED;
     }
 
     @Override
@@ -83,5 +79,4 @@
         }
         preference.setSummary(summary);
     }
-
-}
+}
\ No newline at end of file
diff --git a/src/com/android/settings/search/XmlParserUtils.java b/src/com/android/settings/search/XmlParserUtils.java
index b4ffc53..27c5cd3 100644
--- a/src/com/android/settings/search/XmlParserUtils.java
+++ b/src/com/android/settings/search/XmlParserUtils.java
@@ -71,6 +71,10 @@
         return getData(context, attrs, R.styleable.Preference, R.styleable.Preference_keywords);
     }
 
+    public static String getController(Context context, AttributeSet attrs) {
+        return getData(context, attrs, R.styleable.Preference, R.styleable.Preference_controller);
+    }
+
     public static int getDataIcon(Context context, AttributeSet attrs) {
         final TypedArray ta = context.obtainStyledAttributes(attrs,
                 com.android.internal.R.styleable.Preference);
diff --git a/src/com/android/settings/system/SystemDashboardFragment.java b/src/com/android/settings/system/SystemDashboardFragment.java
index b344d8b..323a2d4 100644
--- a/src/com/android/settings/system/SystemDashboardFragment.java
+++ b/src/com/android/settings/system/SystemDashboardFragment.java
@@ -82,7 +82,7 @@
 
     private static List<AbstractPreferenceController> buildPreferenceControllers(Context context) {
         final List<AbstractPreferenceController> controllers = new ArrayList<>();
-        controllers.add(new SystemUpdatePreferenceController(context, UserManager.get(context)));
+        controllers.add(new SystemUpdatePreferenceController(context));
         controllers.add(new AdditionalSystemUpdatePreferenceController(context));
         controllers.add(new BackupSettingsActivityPreferenceController(context));
         controllers.add(new GesturesSettingPreferenceController(context));
@@ -124,10 +124,10 @@
                 @Override
                 public List<String> getNonIndexableKeys(Context context) {
                     List<String> keys = super.getNonIndexableKeys(context);
-                    keys.add((new BackupSettingsActivityPreferenceController(context)
-                            .getPreferenceKey()));
+                    keys.add((new BackupSettingsActivityPreferenceController(
+                            context).getPreferenceKey()));
                     keys.add(KEY_RESET);
                     return keys;
                 }
             };
-}
+}
\ No newline at end of file
diff --git a/tests/robotests/res/xml-mcc999/about_legal.xml b/tests/robotests/res/xml-mcc999/about_legal.xml
index 53a2b89..3e008cb 100644
--- a/tests/robotests/res/xml-mcc999/about_legal.xml
+++ b/tests/robotests/res/xml-mcc999/about_legal.xml
@@ -30,5 +30,6 @@
 
     <Preference
             android:key="pref_key_1"
-            android:title="bears_bears_bears"/>
+            android:title="bears_bears_bears"
+            settings:controller="mind_flayer"/>
 </PreferenceScreen>
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/core/XmlControllerAttributeTest.java b/tests/robotests/src/com/android/settings/core/XmlControllerAttributeTest.java
new file mode 100644
index 0000000..ed4e815
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/core/XmlControllerAttributeTest.java
@@ -0,0 +1,275 @@
+package com.android.settings.core;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import android.content.Context;
+import android.content.res.XmlResourceParser;
+import android.provider.SearchIndexableResource;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.util.Xml;
+
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.search.DatabaseIndexingUtils;
+import com.android.settings.search.Indexable;
+import com.android.settings.search.SearchIndexableResources;
+import com.android.settings.search.XmlParserUtils;
+import com.android.settings.security.SecuritySettings;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.xmlpull.v1.XmlPullParser;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class XmlControllerAttributeTest {
+
+    // List of classes that are too hard to mock in order to retrieve xml information.
+    private final List<Class> illegalClasses = new ArrayList<>(
+            Arrays.asList(
+                    SecuritySettings.class
+            ));
+
+    // List of XML that could be retrieved from the illegalClasses list.
+    private final List<Integer> whitelistXml = new ArrayList<>(
+            Arrays.asList(
+                    R.xml.security_settings_misc,
+                    R.xml.security_settings_lockscreen_profile,
+                    R.xml.security_settings_lockscreen,
+                    R.xml.security_settings_chooser,
+                    R.xml.security_settings_pattern_profile,
+                    R.xml.security_settings_pin_profile,
+                    R.xml.security_settings_password_profile,
+                    R.xml.security_settings_pattern,
+                    R.xml.security_settings_pin,
+                    R.xml.security_settings_password,
+                    R.xml.security_settings,
+                    R.xml.security_settings_status
+            ));
+
+    private static final String NO_VALID_CONSTRUCTOR_ERROR =
+            "Controllers added in XML need a constructor following either:"
+                    + "\n\tClassName(Context)\n\tClassName(Context, String)"
+                    + "\nThese controllers are missing a valid constructor:\n";
+
+    private static final String NOT_BASE_PREF_CONTROLLER_ERROR =
+            "Controllers added in XML need to extend com.android.settings.core"
+                    + ".BasePreferenceController\nThese controllers do not:\n";
+
+    private static final String BAD_CLASSNAME_ERROR =
+            "The following controllers set in the XML did not have valid class names:\n";
+
+    private static final String BAD_CONSTRUCTOR_ERROR =
+            "The constructor provided by the following classes were insufficient to instantiate "
+                    + "the object. It could be due to being an interface, abstract, or an "
+                    + "IllegalAccessException. Please fix the following classes:\n";
+
+    Context mContext;
+
+    private Set<Class> mProviderClassesCopy;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        mProviderClassesCopy = new HashSet<>(SearchIndexableResources.providerValues());
+    }
+
+    @After
+    public void cleanUp() {
+        SearchIndexableResources.providerValues().clear();
+        SearchIndexableResources.providerValues().addAll(mProviderClassesCopy);
+    }
+
+    @Test
+    public void testAllIndexableXML_onlyValidBasePreferenceControllersAdded() {
+        Set<Integer> xmlSet = getIndexableXml();
+        xmlSet.addAll(whitelistXml);
+
+        List<String> xmlControllers = new ArrayList<>();
+        Set<String> invalidConstructors = new HashSet<>();
+        Set<String> invalidClassHierarchy = new HashSet<>();
+        Set<String> badClassNameControllers = new HashSet<>();
+        Set<String> badConstructorControllers = new HashSet<>();
+
+        for (int resId : xmlSet) {
+            xmlControllers.addAll(getXmlControllers(resId));
+        }
+
+        for (String controllerClassName : xmlControllers) {
+            Class<?> clazz = getClassFromClassName(controllerClassName);
+
+            if (clazz == null) {
+                badClassNameControllers.add(controllerClassName);
+                continue;
+            }
+
+            Constructor<?> constructor = getConstructorFromClass(clazz);
+
+            if (constructor == null) {
+                invalidConstructors.add(controllerClassName);
+                continue;
+            }
+
+            Object controller = getObjectFromConstructor(constructor);
+            if (controller == null) {
+                badConstructorControllers.add(controllerClassName);
+                continue;
+            }
+
+            if (!(controller instanceof BasePreferenceController)) {
+                invalidClassHierarchy.add(controllerClassName);
+            }
+        }
+
+        final String invalidConstructorError = buildErrorMessage(NO_VALID_CONSTRUCTOR_ERROR,
+                invalidConstructors);
+        final String invalidClassHierarchyError = buildErrorMessage(NOT_BASE_PREF_CONTROLLER_ERROR,
+                invalidClassHierarchy);
+        final String badClassNameError = buildErrorMessage(BAD_CLASSNAME_ERROR,
+                badClassNameControllers);
+        final String badConstructorError = buildErrorMessage(BAD_CONSTRUCTOR_ERROR,
+                badConstructorControllers);
+
+        assertWithMessage(invalidConstructorError).that(invalidConstructors).isEmpty();
+        assertWithMessage(invalidClassHierarchyError).that(invalidClassHierarchy).isEmpty();
+        assertWithMessage(badClassNameError).that(badClassNameControllers).isEmpty();
+        assertWithMessage(badConstructorError).that(badConstructorControllers).isEmpty();
+    }
+
+    private Set<Integer> getIndexableXml() {
+        Set<Integer> xmlResSet = new HashSet();
+
+        Collection<Class> indexableClasses = SearchIndexableResources.providerValues();
+        indexableClasses.removeAll(illegalClasses);
+
+        for (Class clazz : indexableClasses) {
+
+            Indexable.SearchIndexProvider provider = DatabaseIndexingUtils.getSearchIndexProvider(
+                    clazz);
+
+            if (provider == null) {
+                continue;
+            }
+
+            List<SearchIndexableResource> resources = provider.getXmlResourcesToIndex(mContext,
+                    true);
+
+            if (resources == null) {
+                continue;
+            }
+
+            for (SearchIndexableResource resource : resources) {
+                // Add '0's anyway. It won't break the test.
+                xmlResSet.add(resource.xmlResId);
+            }
+        }
+        return xmlResSet;
+    }
+
+    private List<String> getXmlControllers(int xmlResId) {
+        List<String> xmlControllers = new ArrayList<>();
+
+        XmlResourceParser parser;
+        try {
+            parser = mContext.getResources().getXml(xmlResId);
+
+            int type;
+            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+                    && type != XmlPullParser.START_TAG) {
+                // Parse next until start tag is found
+            }
+
+            final int outerDepth = parser.getDepth();
+            final AttributeSet attrs = Xml.asAttributeSet(parser);
+            String controllerClassName;
+            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
+                    && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
+                if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
+                    continue;
+                }
+
+                controllerClassName = XmlParserUtils.getController(mContext, attrs);
+                // If controller is not indexed, then it is not compatible with
+                if (!TextUtils.isEmpty(controllerClassName)) {
+                    xmlControllers.add(controllerClassName);
+                }
+            }
+        } catch (Exception e) {
+            // Assume an issue with robolectric resources
+        }
+        return xmlControllers;
+    }
+
+    private String buildErrorMessage(String errorSummary, Set<String> errorClasses) {
+        final StringBuilder error = new StringBuilder(errorSummary);
+        for (String c : errorClasses) {
+            error.append(c).append("\n");
+        }
+        return error.toString();
+    }
+
+    private Class<?> getClassFromClassName(String className) {
+        Class<?> clazz = null;
+        try {
+            clazz = Class.forName(className);
+        } catch (ClassNotFoundException e) {
+        }
+        return clazz;
+    }
+
+    private Constructor<?> getConstructorFromClass(Class<?> clazz) {
+        Constructor<?> constructor = null;
+        try {
+            constructor = clazz.getConstructor(Context.class);
+        } catch (NoSuchMethodException e) {
+        }
+
+        if (constructor != null) {
+            return constructor;
+        }
+
+        try {
+            constructor = clazz.getConstructor(Context.class, String.class);
+        } catch (NoSuchMethodException e) {
+        }
+
+        return constructor;
+    }
+
+    private Object getObjectFromConstructor(Constructor<?> constructor) {
+        Object controller = null;
+
+        try {
+            controller = constructor.newInstance(mContext);
+        } catch (InstantiationException | IllegalAccessException | InvocationTargetException |
+                IllegalArgumentException e) {
+        }
+
+        if (controller != null) {
+            return controller;
+        }
+
+        try {
+            controller = constructor.newInstance(mContext, "key");
+        } catch (InstantiationException | IllegalAccessException | InvocationTargetException |
+                IllegalArgumentException e) {
+        }
+
+        return controller;
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/SystemUpdatePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/SystemUpdatePreferenceControllerTest.java
index 05670e2..1fd5430 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/SystemUpdatePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/SystemUpdatePreferenceControllerTest.java
@@ -57,7 +57,9 @@
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        mController = new SystemUpdatePreferenceController(mContext, mUserManager);
+
+        when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+        mController = new SystemUpdatePreferenceController(mContext);
         mPreference = new Preference(RuntimeEnvironment.application);
         mPreference.setKey(mController.getPreferenceKey());
         when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
@@ -82,7 +84,7 @@
 
         mController.updateNonIndexableKeys(keys);
 
-        assertThat(keys.size()).isEqualTo(1);
+        assertThat(keys).hasSize(1);
     }
 
     @Test
@@ -94,8 +96,8 @@
 
     @Test
     public void updateState_shouldSetToAndroidVersion() {
-        mController = new SystemUpdatePreferenceController(
-                RuntimeEnvironment.application, mUserManager);
+        mController = new SystemUpdatePreferenceController(RuntimeEnvironment.application);
+
         mController.updateState(mPreference);
 
         assertThat(mPreference.getSummary())
diff --git a/tests/robotests/src/com/android/settings/search/XmlParserUtilTest.java b/tests/robotests/src/com/android/settings/search/XmlParserUtilTest.java
index 6050b32..2bec503 100644
--- a/tests/robotests/src/com/android/settings/search/XmlParserUtilTest.java
+++ b/tests/robotests/src/com/android/settings/search/XmlParserUtilTest.java
@@ -129,6 +129,16 @@
     }
 
     @Test
+    @Config(qualifiers = "mcc999")
+    public void testControllerAttribute_returnsValidData() {
+        XmlResourceParser parser = getChildByType(R.xml.about_legal, "Preference");
+        final AttributeSet attrs = Xml.asAttributeSet(parser);
+
+        String controller = XmlParserUtils.getController(mContext, attrs);
+        assertThat(controller).isEqualTo("mind_flayer");
+    }
+
+    @Test
     public void testDataSummaryInvalid_ReturnsNull() {
         XmlResourceParser parser = getParentPrimedParser(R.xml.display_settings);
         final AttributeSet attrs = Xml.asAttributeSet(parser);
