diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index a49d85b..940cb59 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -218,7 +218,7 @@
             android:key="graphics_driver_dashboard"
             android:title="@string/graphics_driver_dashboard_title"
             android:summary="@string/graphics_driver_dashboard_summary"
-            android:fragment="com.android.settings.development.gamedriver.GameDriverDashboard" />
+            android:fragment="com.android.settings.development.graphicsdriver.GraphicsDriverDashboard" />
 
         <Preference
             android:key="platform_compat_dashboard"
diff --git a/res/xml/graphics_driver_settings.xml b/res/xml/graphics_driver_settings.xml
index bc2759f..c72c8fb 100644
--- a/res/xml/graphics_driver_settings.xml
+++ b/res/xml/graphics_driver_settings.xml
@@ -26,20 +26,20 @@
         android:dialogTitle="@string/graphics_driver_all_apps_preference_title"
         android:entries="@array/graphics_driver_all_apps_preference_values"
         android:entryValues="@array/graphics_driver_all_apps_preference_values"
-        settings:controller="com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController">
+        settings:controller="com.android.settings.development.graphicsdriver.GraphicsDriverEnableForAllAppsPreferenceController">
     </ListPreference>
 
     <PreferenceCategory
         android:key="graphics_driver_category"
         android:title="@string/graphics_driver_app_preference_title"
-        settings:controller="com.android.settings.development.gamedriver.GameDriverAppPreferenceController">
+        settings:controller="com.android.settings.development.graphicsdriver.GraphicsDriverAppPreferenceController">
     </PreferenceCategory>
 
     <com.android.settingslib.widget.FooterPreference
         android:key="graphics_driver_footer"
         android:title="@string/graphics_driver_footer_text"
         android:selectable="false"
-        settings:controller="com.android.settings.development.gamedriver.GameDriverFooterPreferenceController">
+        settings:controller="com.android.settings.development.graphicsdriver.GraphicsDriverFooterPreferenceController">
     </com.android.settingslib.widget.FooterPreference>
 
 </PreferenceScreen>
diff --git a/src/com/android/settings/development/gamedriver/GameDriverAppPreferenceController.java b/src/com/android/settings/development/graphicsdriver/GraphicsDriverAppPreferenceController.java
similarity index 88%
rename from src/com/android/settings/development/gamedriver/GameDriverAppPreferenceController.java
rename to src/com/android/settings/development/graphicsdriver/GraphicsDriverAppPreferenceController.java
index d6bdb54..c1376a8 100644
--- a/src/com/android/settings/development/gamedriver/GameDriverAppPreferenceController.java
+++ b/src/com/android/settings/development/graphicsdriver/GraphicsDriverAppPreferenceController.java
@@ -14,10 +14,10 @@
  * limitations under the License.
  */
 
-package com.android.settings.development.gamedriver;
+package com.android.settings.development.graphicsdriver;
 
-import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_DEFAULT;
-import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_OFF;
+import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableForAllAppsPreferenceController.GAME_DRIVER_DEFAULT;
+import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableForAllAppsPreferenceController.GAME_DRIVER_OFF;
 
 import android.content.ContentResolver;
 import android.content.Context;
@@ -53,9 +53,9 @@
 /**
  * Controller of all the per App based list preferences.
  */
-public class GameDriverAppPreferenceController extends BasePreferenceController
+public class GraphicsDriverAppPreferenceController extends BasePreferenceController
         implements Preference.OnPreferenceChangeListener,
-        GameDriverContentObserver.OnGameDriverContentChangedListener, LifecycleObserver,
+        GraphicsDriverContentObserver.OnGraphicsDriverContentChangedListener, LifecycleObserver,
         OnStart, OnStop {
 
     private final Context mContext;
@@ -67,7 +67,7 @@
     private final String mPreferencePrereleaseDriver;
     private final String mPreferenceSystem;
     @VisibleForTesting
-    GameDriverContentObserver mGameDriverContentObserver;
+    GraphicsDriverContentObserver mGraphicsDriverContentObserver;
 
     private final List<AppInfo> mAppInfos;
     private final Set<String> mDevOptInApps;
@@ -76,13 +76,13 @@
 
     private PreferenceGroup mPreferenceGroup;
 
-    public GameDriverAppPreferenceController(Context context, String key) {
+    public GraphicsDriverAppPreferenceController(Context context, String key) {
         super(context, key);
 
         mContext = context;
         mContentResolver = context.getContentResolver();
-        mGameDriverContentObserver =
-                new GameDriverContentObserver(new Handler(Looper.getMainLooper()), this);
+        mGraphicsDriverContentObserver =
+                new GraphicsDriverContentObserver(new Handler(Looper.getMainLooper()), this);
 
         final Resources resources = context.getResources();
         mEntryList = resources.getStringArray(R.array.graphics_driver_app_preference_values);
@@ -130,12 +130,12 @@
 
     @Override
     public void onStart() {
-        mGameDriverContentObserver.register(mContentResolver);
+        mGraphicsDriverContentObserver.register(mContentResolver);
     }
 
     @Override
     public void onStop() {
-        mGameDriverContentObserver.unregister(mContentResolver);
+        mGraphicsDriverContentObserver.unregister(mContentResolver);
     }
 
     @Override
@@ -185,7 +185,7 @@
     }
 
     @Override
-    public void onGameDriverContentChanged() {
+    public void onGraphicsDriverContentChanged() {
         updateState(mPreferenceGroup);
     }
 
@@ -196,8 +196,8 @@
             label = packageManager.getApplicationLabel(applicationInfo).toString();
         }
 
-        final ApplicationInfo info;
-        final String label;
+        public final ApplicationInfo info;
+        public final String label;
     }
 
     // List of non-system packages that are installed for the current user.
@@ -213,7 +213,7 @@
             }
         }
 
-        Collections.sort(appInfos, appInfoComparator);
+        Collections.sort(appInfos, mAppInfoComparator);
 
         return appInfos;
     }
@@ -231,8 +231,8 @@
         return valueSet;
     }
 
-    private final Comparator<AppInfo> appInfoComparator = new Comparator<AppInfo>() {
-        public final int compare(AppInfo a, AppInfo b) {
+    private final Comparator<AppInfo> mAppInfoComparator = new Comparator<AppInfo>() {
+        public int compare(AppInfo a, AppInfo b) {
             return Collator.getInstance().compare(a.label, b.label);
         }
     };
diff --git a/src/com/android/settings/development/gamedriver/GameDriverContentObserver.java b/src/com/android/settings/development/graphicsdriver/GraphicsDriverContentObserver.java
similarity index 66%
rename from src/com/android/settings/development/gamedriver/GameDriverContentObserver.java
rename to src/com/android/settings/development/graphicsdriver/GraphicsDriverContentObserver.java
index e31e046..8317800 100644
--- a/src/com/android/settings/development/gamedriver/GameDriverContentObserver.java
+++ b/src/com/android/settings/development/graphicsdriver/GraphicsDriverContentObserver.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.settings.development.gamedriver;
+package com.android.settings.development.graphicsdriver;
 
 import android.content.ContentResolver;
 import android.database.ContentObserver;
@@ -24,18 +24,19 @@
 import androidx.annotation.VisibleForTesting;
 
 /**
- * Helper class to observe Game Driver settings global change.
+ * Helper class to observe Graphics Driver settings global change.
  */
-public class GameDriverContentObserver extends ContentObserver {
+public class GraphicsDriverContentObserver extends ContentObserver {
 
-    interface OnGameDriverContentChangedListener {
-        void onGameDriverContentChanged();
+    interface OnGraphicsDriverContentChangedListener {
+        void onGraphicsDriverContentChanged();
     }
 
     @VisibleForTesting
-    OnGameDriverContentChangedListener mListener;
+    OnGraphicsDriverContentChangedListener mListener;
 
-    public GameDriverContentObserver(Handler handler, OnGameDriverContentChangedListener listener) {
+    public GraphicsDriverContentObserver(Handler handler,
+            OnGraphicsDriverContentChangedListener listener) {
         super(handler);
         mListener = listener;
     }
@@ -43,14 +44,20 @@
     @Override
     public void onChange(boolean selfChange) {
         super.onChange(selfChange);
-        mListener.onGameDriverContentChanged();
+        mListener.onGraphicsDriverContentChanged();
     }
 
+    /**
+     * Register GraphicsDriverContentObserver to ContentResolver.
+     */
     public void register(ContentResolver contentResolver) {
         contentResolver.registerContentObserver(
                 Settings.Global.getUriFor(Settings.Global.GAME_DRIVER_ALL_APPS), false, this);
     }
 
+    /**
+     * Unregister GraphicsDriverContentObserver.
+     */
     public void unregister(ContentResolver contentResolver) {
         contentResolver.unregisterContentObserver(this);
     }
diff --git a/src/com/android/settings/development/gamedriver/GameDriverDashboard.java b/src/com/android/settings/development/graphicsdriver/GraphicsDriverDashboard.java
similarity index 87%
rename from src/com/android/settings/development/gamedriver/GameDriverDashboard.java
rename to src/com/android/settings/development/graphicsdriver/GraphicsDriverDashboard.java
index 4ef0a87..2801689 100644
--- a/src/com/android/settings/development/gamedriver/GameDriverDashboard.java
+++ b/src/com/android/settings/development/graphicsdriver/GraphicsDriverDashboard.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.settings.development.gamedriver;
+package com.android.settings.development.graphicsdriver;
 
 import android.app.settings.SettingsEnums;
 import android.content.Context;
@@ -33,9 +33,9 @@
  * Dashboard for Game Driver preferences.
  */
 @SearchIndexable
-public class GameDriverDashboard extends DashboardFragment {
+public class GraphicsDriverDashboard extends DashboardFragment {
 
-    private static final String TAG = "GameDriverDashboard";
+    private static final String TAG = "GraphicsDriverDashboard";
 
     @Override
     public int getMetricsCategory() {
@@ -63,8 +63,8 @@
 
         final SettingsActivity activity = (SettingsActivity) getActivity();
         final SwitchBar switchBar = activity.getSwitchBar();
-        final GameDriverGlobalSwitchBarController switchBarController =
-                new GameDriverGlobalSwitchBarController(
+        final GraphicsDriverGlobalSwitchBarController switchBarController =
+                new GraphicsDriverGlobalSwitchBarController(
                         activity, new SwitchBarController(switchBar));
         getSettingsLifecycle().addObserver(switchBarController);
         switchBar.show();
diff --git a/src/com/android/settings/development/gamedriver/GameDriverEnableForAllAppsPreferenceController.java b/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableForAllAppsPreferenceController.java
similarity index 86%
rename from src/com/android/settings/development/gamedriver/GameDriverEnableForAllAppsPreferenceController.java
rename to src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableForAllAppsPreferenceController.java
index 9c816c5..4baa993 100644
--- a/src/com/android/settings/development/gamedriver/GameDriverEnableForAllAppsPreferenceController.java
+++ b/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableForAllAppsPreferenceController.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.settings.development.gamedriver;
+package com.android.settings.development.graphicsdriver;
 
 import android.content.ContentResolver;
 import android.content.Context;
@@ -38,10 +38,10 @@
 /**
  * Controller of global switch to enable Game Driver for all Apps.
  */
-public class GameDriverEnableForAllAppsPreferenceController extends BasePreferenceController
+public class GraphicsDriverEnableForAllAppsPreferenceController extends BasePreferenceController
         implements Preference.OnPreferenceChangeListener,
-                   GameDriverContentObserver.OnGameDriverContentChangedListener, LifecycleObserver,
-                   OnStart, OnStop {
+                   GraphicsDriverContentObserver.OnGraphicsDriverContentChangedListener,
+                   LifecycleObserver, OnStart, OnStop {
 
     public static final int GAME_DRIVER_DEFAULT = 0;
     public static final int GAME_DRIVER_ALL_APPS = 1;
@@ -54,11 +54,11 @@
     private final String mPreferenceGameDriver;
     private final String mPreferencePrereleaseDriver;
     @VisibleForTesting
-    GameDriverContentObserver mGameDriverContentObserver;
+    GraphicsDriverContentObserver mGraphicsDriverContentObserver;
 
     private ListPreference mPreference;
 
-    public GameDriverEnableForAllAppsPreferenceController(Context context, String key) {
+    public GraphicsDriverEnableForAllAppsPreferenceController(Context context, String key) {
         super(context, key);
         mContext = context;
         mContentResolver = context.getContentResolver();
@@ -69,8 +69,8 @@
                 resources.getString(R.string.graphics_driver_app_preference_game_driver);
         mPreferencePrereleaseDriver =
                 resources.getString(R.string.graphics_driver_app_preference_prerelease_driver);
-        mGameDriverContentObserver =
-                new GameDriverContentObserver(new Handler(Looper.getMainLooper()), this);
+        mGraphicsDriverContentObserver =
+                new GraphicsDriverContentObserver(new Handler(Looper.getMainLooper()), this);
     }
 
     @Override
@@ -92,12 +92,12 @@
 
     @Override
     public void onStart() {
-        mGameDriverContentObserver.register(mContentResolver);
+        mGraphicsDriverContentObserver.register(mContentResolver);
     }
 
     @Override
     public void onStop() {
-        mGameDriverContentObserver.unregister(mContentResolver);
+        mGraphicsDriverContentObserver.unregister(mContentResolver);
     }
 
     @Override
@@ -144,7 +144,7 @@
     }
 
     @Override
-    public void onGameDriverContentChanged() {
+    public void onGraphicsDriverContentChanged() {
         updateState(mPreference);
     }
 }
diff --git a/src/com/android/settings/development/gamedriver/GameDriverFooterPreferenceController.java b/src/com/android/settings/development/graphicsdriver/GraphicsDriverFooterPreferenceController.java
similarity index 65%
rename from src/com/android/settings/development/gamedriver/GameDriverFooterPreferenceController.java
rename to src/com/android/settings/development/graphicsdriver/GraphicsDriverFooterPreferenceController.java
index 1ad476b..e368aab 100644
--- a/src/com/android/settings/development/gamedriver/GameDriverFooterPreferenceController.java
+++ b/src/com/android/settings/development/graphicsdriver/GraphicsDriverFooterPreferenceController.java
@@ -14,10 +14,10 @@
  * limitations under the License.
  */
 
-package com.android.settings.development.gamedriver;
+package com.android.settings.development.graphicsdriver;
 
-import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_DEFAULT;
-import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_OFF;
+import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableForAllAppsPreferenceController.GAME_DRIVER_DEFAULT;
+import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableForAllAppsPreferenceController.GAME_DRIVER_OFF;
 
 import android.content.ContentResolver;
 import android.content.Context;
@@ -35,23 +35,23 @@
 import com.android.settingslib.widget.FooterPreference;
 
 /**
- * Controller of footer preference for Game Driver.
+ * Controller of footer preference for Graphics Driver Preferences dashboard.
  */
-public class GameDriverFooterPreferenceController extends BasePreferenceController
-        implements GameDriverContentObserver.OnGameDriverContentChangedListener, LifecycleObserver,
-        OnStart, OnStop {
+public class GraphicsDriverFooterPreferenceController extends BasePreferenceController
+        implements GraphicsDriverContentObserver.OnGraphicsDriverContentChangedListener,
+        LifecycleObserver, OnStart, OnStop {
 
     private final ContentResolver mContentResolver;
     @VisibleForTesting
-    GameDriverContentObserver mGameDriverContentObserver;
+    GraphicsDriverContentObserver mGraphicsDriverContentObserver;
 
     private FooterPreference mPreference;
 
-    public GameDriverFooterPreferenceController(Context context, String key) {
+    public GraphicsDriverFooterPreferenceController(Context context, String key) {
         super(context, key);
         mContentResolver = context.getContentResolver();
-        mGameDriverContentObserver =
-                new GameDriverContentObserver(new Handler(Looper.getMainLooper()), this);
+        mGraphicsDriverContentObserver =
+                new GraphicsDriverContentObserver(new Handler(Looper.getMainLooper()), this);
     }
 
     @Override
@@ -71,16 +71,16 @@
 
     @Override
     public void onStart() {
-        mGameDriverContentObserver.register(mContentResolver);
+        mGraphicsDriverContentObserver.register(mContentResolver);
     }
 
     @Override
     public void onStop() {
-        mGameDriverContentObserver.unregister(mContentResolver);
+        mGraphicsDriverContentObserver.unregister(mContentResolver);
     }
 
     @Override
-    public void onGameDriverContentChanged() {
+    public void onGraphicsDriverContentChanged() {
         updateState(mPreference);
     }
 }
diff --git a/src/com/android/settings/development/gamedriver/GameDriverGlobalSwitchBarController.java b/src/com/android/settings/development/graphicsdriver/GraphicsDriverGlobalSwitchBarController.java
similarity index 64%
rename from src/com/android/settings/development/gamedriver/GameDriverGlobalSwitchBarController.java
rename to src/com/android/settings/development/graphicsdriver/GraphicsDriverGlobalSwitchBarController.java
index 15f71e0..86c56b7 100644
--- a/src/com/android/settings/development/gamedriver/GameDriverGlobalSwitchBarController.java
+++ b/src/com/android/settings/development/graphicsdriver/GraphicsDriverGlobalSwitchBarController.java
@@ -14,12 +14,12 @@
  * limitations under the License.
  */
 
-package com.android.settings.development.gamedriver;
+package com.android.settings.development.graphicsdriver;
 
-import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_ALL_APPS;
-import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_DEFAULT;
-import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_OFF;
-import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_PRERELEASE_ALL_APPS;
+import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableForAllAppsPreferenceController.GAME_DRIVER_ALL_APPS;
+import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableForAllAppsPreferenceController.GAME_DRIVER_DEFAULT;
+import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableForAllAppsPreferenceController.GAME_DRIVER_OFF;
+import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableForAllAppsPreferenceController.GAME_DRIVER_PRERELEASE_ALL_APPS;
 
 import android.content.ContentResolver;
 import android.content.Context;
@@ -38,24 +38,24 @@
 /**
  * Controller of global switch bar used to fully turn off Game Driver.
  */
-public class GameDriverGlobalSwitchBarController
+public class GraphicsDriverGlobalSwitchBarController
         implements SwitchWidgetController.OnSwitchChangeListener,
-                   GameDriverContentObserver.OnGameDriverContentChangedListener, LifecycleObserver,
-                   OnStart, OnStop {
+                   GraphicsDriverContentObserver.OnGraphicsDriverContentChangedListener,
+                   LifecycleObserver, OnStart, OnStop {
 
     private final Context mContext;
     private final ContentResolver mContentResolver;
     @VisibleForTesting
     SwitchWidgetController mSwitchWidgetController;
     @VisibleForTesting
-    GameDriverContentObserver mGameDriverContentObserver;
+    GraphicsDriverContentObserver mGraphicsDriverContentObserver;
 
-    GameDriverGlobalSwitchBarController(
+    GraphicsDriverGlobalSwitchBarController(
             Context context, SwitchWidgetController switchWidgetController) {
         mContext = context;
         mContentResolver = context.getContentResolver();
-        mGameDriverContentObserver =
-                new GameDriverContentObserver(new Handler(Looper.getMainLooper()), this);
+        mGraphicsDriverContentObserver =
+                new GraphicsDriverContentObserver(new Handler(Looper.getMainLooper()), this);
         mSwitchWidgetController = switchWidgetController;
         mSwitchWidgetController.setEnabled(
                 DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(context));
@@ -69,27 +69,28 @@
     @Override
     public void onStart() {
         mSwitchWidgetController.startListening();
-        mGameDriverContentObserver.register(mContentResolver);
+        mGraphicsDriverContentObserver.register(mContentResolver);
     }
 
     @Override
     public void onStop() {
         mSwitchWidgetController.stopListening();
-        mGameDriverContentObserver.unregister(mContentResolver);
+        mGraphicsDriverContentObserver.unregister(mContentResolver);
     }
 
     @Override
     public boolean onSwitchToggled(boolean isChecked) {
-        final int gameDriver = Settings.Global.getInt(
+        final int graphicsDriverGlobalOption = Settings.Global.getInt(
                 mContentResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_DEFAULT);
 
         if (isChecked
-                && (gameDriver == GAME_DRIVER_DEFAULT || gameDriver == GAME_DRIVER_ALL_APPS
-                        || gameDriver == GAME_DRIVER_PRERELEASE_ALL_APPS)) {
+                && (graphicsDriverGlobalOption == GAME_DRIVER_DEFAULT
+                        || graphicsDriverGlobalOption == GAME_DRIVER_ALL_APPS
+                        || graphicsDriverGlobalOption == GAME_DRIVER_PRERELEASE_ALL_APPS)) {
             return true;
         }
 
-        if (!isChecked && gameDriver == GAME_DRIVER_OFF) {
+        if (!isChecked && graphicsDriverGlobalOption == GAME_DRIVER_OFF) {
             return true;
         }
 
@@ -100,7 +101,7 @@
     }
 
     @Override
-    public void onGameDriverContentChanged() {
+    public void onGraphicsDriverContentChanged() {
         mSwitchWidgetController.setChecked(
                 Settings.Global.getInt(
                         mContentResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_DEFAULT)
diff --git a/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverAppPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverAppPreferenceControllerTest.java
similarity index 92%
rename from tests/robotests/src/com/android/settings/development/gamedriver/GameDriverAppPreferenceControllerTest.java
rename to tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverAppPreferenceControllerTest.java
index de4be1d..522dc8a 100644
--- a/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverAppPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverAppPreferenceControllerTest.java
@@ -14,12 +14,12 @@
  * limitations under the License.
  */
 
-package com.android.settings.development.gamedriver;
+package com.android.settings.development.graphicsdriver;
 
 import static com.android.settings.core.BasePreferenceController.AVAILABLE;
 import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;
-import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_DEFAULT;
-import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_OFF;
+import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableForAllAppsPreferenceController.GAME_DRIVER_DEFAULT;
+import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableForAllAppsPreferenceController.GAME_DRIVER_OFF;
 import static com.android.settings.testutils.ApplicationTestUtils.buildInfo;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -53,7 +53,7 @@
 import java.util.Arrays;
 
 @RunWith(RobolectricTestRunner.class)
-public class GameDriverAppPreferenceControllerTest {
+public class GraphicsDriverAppPreferenceControllerTest {
 
     private static final int DEFAULT = 0;
     private static final int GAME_DRIVER = 1;
@@ -71,13 +71,13 @@
     @Mock
     private PreferenceScreen mScreen;
     @Mock
-    private GameDriverContentObserver mGameDriverContentObserver;
+    private GraphicsDriverContentObserver mGraphicsDriverContentObserver;
 
     private Context mContext;
     private PreferenceGroup mGroup;
     private PreferenceManager mPreferenceManager;
     private ContentResolver mResolver;
-    private GameDriverAppPreferenceController mController;
+    private GraphicsDriverAppPreferenceController mController;
     private CharSequence[] mValueList;
     private String mDialogTitle;
     private String mPreferencePrereleaseDriver;
@@ -137,19 +137,19 @@
     @Test
     public void onStart_shouldRegister() {
         loadDefaultConfig();
-        mController.mGameDriverContentObserver = mGameDriverContentObserver;
+        mController.mGraphicsDriverContentObserver = mGraphicsDriverContentObserver;
         mController.onStart();
 
-        verify(mGameDriverContentObserver).register(mResolver);
+        verify(mGraphicsDriverContentObserver).register(mResolver);
     }
 
     @Test
     public void onStop_shouldUnregister() {
         loadDefaultConfig();
-        mController.mGameDriverContentObserver = mGameDriverContentObserver;
+        mController.mGraphicsDriverContentObserver = mGraphicsDriverContentObserver;
         mController.onStop();
 
-        verify(mGameDriverContentObserver).unregister(mResolver);
+        verify(mGraphicsDriverContentObserver).unregister(mResolver);
     }
 
     @Test
@@ -295,7 +295,9 @@
         when(mContext.getPackageManager()).thenReturn(mPackageManager);
     }
 
-    private void loadDefaultConfig() { loadConfig("", "", ""); }
+    private void loadDefaultConfig() {
+        loadConfig("", "", "");
+    }
 
     private void loadConfig(String optIn, String prereleaseOptIn, String optOut) {
         Settings.Global.putString(mResolver, Settings.Global.GAME_DRIVER_OPT_IN_APPS, optIn);
@@ -303,7 +305,7 @@
                 mResolver, Settings.Global.GAME_DRIVER_PRERELEASE_OPT_IN_APPS, prereleaseOptIn);
         Settings.Global.putString(mResolver, Settings.Global.GAME_DRIVER_OPT_OUT_APPS, optOut);
 
-        mController = new GameDriverAppPreferenceController(mContext, "testKey");
+        mController = new GraphicsDriverAppPreferenceController(mContext, "testKey");
         mGroup = spy(new PreferenceCategory(mContext));
         final PreferenceManager preferenceManager = new PreferenceManager(mContext);
         when(mGroup.getContext()).thenReturn(mContext);
diff --git a/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverContentObserverTest.java b/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverContentObserverTest.java
similarity index 65%
rename from tests/robotests/src/com/android/settings/development/gamedriver/GameDriverContentObserverTest.java
rename to tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverContentObserverTest.java
index caaf896..b6bf4a7 100644
--- a/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverContentObserverTest.java
+++ b/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverContentObserverTest.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.settings.development.gamedriver;
+package com.android.settings.development.graphicsdriver;
 
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
@@ -28,45 +28,44 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
 
 @RunWith(RobolectricTestRunner.class)
-public class GameDriverContentObserverTest {
+public class GraphicsDriverContentObserverTest {
 
     @Mock
     private ContentResolver mResolver;
     @Mock
-    private GameDriverContentObserver.OnGameDriverContentChangedListener mListener;
+    private GraphicsDriverContentObserver.OnGraphicsDriverContentChangedListener mListener;
 
-    private GameDriverContentObserver mGameDriverContentObserver;
+    private GraphicsDriverContentObserver mGraphicsDriverContentObserver;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
-        mGameDriverContentObserver = spy(new GameDriverContentObserver(null, null));
+        mGraphicsDriverContentObserver = spy(new GraphicsDriverContentObserver(null, null));
     }
 
     @Test
     public void onChange_shouldCallListener() {
-        mGameDriverContentObserver.mListener = mListener;
-        mGameDriverContentObserver.onChange(true);
+        mGraphicsDriverContentObserver.mListener = mListener;
+        mGraphicsDriverContentObserver.onChange(true);
 
-        verify(mListener).onGameDriverContentChanged();
+        verify(mListener).onGraphicsDriverContentChanged();
     }
 
     @Test
     public void register_shouldRegisterContentObserver() {
-        mGameDriverContentObserver.register(mResolver);
+        mGraphicsDriverContentObserver.register(mResolver);
 
         verify(mResolver).registerContentObserver(
                 Settings.Global.getUriFor(Settings.Global.GAME_DRIVER_ALL_APPS), false,
-                mGameDriverContentObserver);
+                mGraphicsDriverContentObserver);
     }
 
     @Test
     public void unregister_shouldUnregisterContentObserver() {
-        mGameDriverContentObserver.unregister(mResolver);
+        mGraphicsDriverContentObserver.unregister(mResolver);
 
-        verify(mResolver).unregisterContentObserver(mGameDriverContentObserver);
+        verify(mResolver).unregisterContentObserver(mGraphicsDriverContentObserver);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverDashboardTest.java b/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverDashboardTest.java
similarity index 79%
rename from tests/robotests/src/com/android/settings/development/gamedriver/GameDriverDashboardTest.java
rename to tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverDashboardTest.java
index eb5c3b3..838f47b 100644
--- a/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverDashboardTest.java
+++ b/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverDashboardTest.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.settings.development.gamedriver;
+package com.android.settings.development.graphicsdriver;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -28,13 +28,13 @@
 import org.robolectric.RobolectricTestRunner;
 
 @RunWith(RobolectricTestRunner.class)
-public class GameDriverDashboardTest {
+public class GraphicsDriverDashboardTest {
 
-    private GameDriverDashboard mDashboard;
+    private GraphicsDriverDashboard mDashboard;
 
     @Before
     public void setUp() {
-        mDashboard = new GameDriverDashboard();
+        mDashboard = new GraphicsDriverDashboard();
     }
 
     @Test
@@ -43,13 +43,13 @@
     }
 
     @Test
-    public void getMetricesCategory_shouldReturnGameDriverDashboard() {
+    public void getMetricesCategory_shouldReturnGraphicsDriverDashboard() {
         assertThat(mDashboard.getMetricsCategory())
                 .isEqualTo(SettingsEnums.SETTINGS_GAME_DRIVER_DASHBOARD);
     }
 
     @Test
-    public void getPreferenceScreen_shouldReturnGameDriverSettings() {
+    public void getPreferenceScreen_shouldReturnGraphicsDriverSettings() {
         assertThat(mDashboard.getPreferenceScreenResId()).isEqualTo(R.xml.graphics_driver_settings);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverEnableForAllAppsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableForAllAppsPreferenceControllerTest.java
similarity index 85%
rename from tests/robotests/src/com/android/settings/development/gamedriver/GameDriverEnableForAllAppsPreferenceControllerTest.java
rename to tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableForAllAppsPreferenceControllerTest.java
index 8495f60..366a18d 100644
--- a/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverEnableForAllAppsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableForAllAppsPreferenceControllerTest.java
@@ -14,14 +14,14 @@
  * limitations under the License.
  */
 
-package com.android.settings.development.gamedriver;
+package com.android.settings.development.graphicsdriver;
 
 import static com.android.settings.core.BasePreferenceController.AVAILABLE;
 import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;
-import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_ALL_APPS;
-import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_DEFAULT;
-import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_OFF;
-import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_PRERELEASE_ALL_APPS;
+import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableForAllAppsPreferenceController.GAME_DRIVER_ALL_APPS;
+import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableForAllAppsPreferenceController.GAME_DRIVER_DEFAULT;
+import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableForAllAppsPreferenceController.GAME_DRIVER_OFF;
+import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableForAllAppsPreferenceController.GAME_DRIVER_PRERELEASE_ALL_APPS;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -48,18 +48,18 @@
 import org.robolectric.RuntimeEnvironment;
 
 @RunWith(RobolectricTestRunner.class)
-public class GameDriverEnableForAllAppsPreferenceControllerTest {
+public class GraphicsDriverEnableForAllAppsPreferenceControllerTest {
 
     @Mock
     private PreferenceScreen mScreen;
     @Mock
     private ListPreference mPreference;
     @Mock
-    private GameDriverContentObserver mGameDriverContentObserver;
+    private GraphicsDriverContentObserver mGraphicsDriverContentObserver;
 
     private Context mContext;
     private ContentResolver mResolver;
-    private GameDriverEnableForAllAppsPreferenceController mController;
+    private GraphicsDriverEnableForAllAppsPreferenceController mController;
     private String mPreferenceDefault;
     private String mPreferenceGameDriver;
     private String mPreferencePrereleaseDriver;
@@ -81,7 +81,7 @@
         Settings.Global.putInt(
                 mResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_DEFAULT);
 
-        mController = new GameDriverEnableForAllAppsPreferenceController(mContext, "testKey");
+        mController = new GraphicsDriverEnableForAllAppsPreferenceController(mContext, "testKey");
         when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
         mController.displayPreference(mScreen);
     }
@@ -120,18 +120,18 @@
 
     @Test
     public void onStart_shouldRegister() {
-        mController.mGameDriverContentObserver = mGameDriverContentObserver;
+        mController.mGraphicsDriverContentObserver = mGraphicsDriverContentObserver;
         mController.onStart();
 
-        verify(mGameDriverContentObserver).register(mResolver);
+        verify(mGraphicsDriverContentObserver).register(mResolver);
     }
 
     @Test
     public void onStop_shouldUnregister() {
-        mController.mGameDriverContentObserver = mGameDriverContentObserver;
+        mController.mGraphicsDriverContentObserver = mGraphicsDriverContentObserver;
         mController.onStop();
 
-        verify(mGameDriverContentObserver).unregister(mResolver);
+        verify(mGraphicsDriverContentObserver).unregister(mResolver);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverFooterPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverFooterPreferenceControllerTest.java
similarity index 74%
rename from tests/robotests/src/com/android/settings/development/gamedriver/GameDriverFooterPreferenceControllerTest.java
rename to tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverFooterPreferenceControllerTest.java
index 17b7b36..1dac131 100644
--- a/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverFooterPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverFooterPreferenceControllerTest.java
@@ -14,13 +14,13 @@
  * limitations under the License.
  */
 
-package com.android.settings.development.gamedriver;
+package com.android.settings.development.graphicsdriver;
 
 import static com.android.settings.core.BasePreferenceController.AVAILABLE_UNSEARCHABLE;
 import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;
-import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_ALL_APPS;
-import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_DEFAULT;
-import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_OFF;
+import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableForAllAppsPreferenceController.GAME_DRIVER_ALL_APPS;
+import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableForAllAppsPreferenceController.GAME_DRIVER_DEFAULT;
+import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableForAllAppsPreferenceController.GAME_DRIVER_OFF;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -45,25 +45,25 @@
 import org.robolectric.RuntimeEnvironment;
 
 @RunWith(RobolectricTestRunner.class)
-public class GameDriverFooterPreferenceControllerTest {
+public class GraphicsDriverFooterPreferenceControllerTest {
 
     @Mock
     private PreferenceScreen mScreen;
     @Mock
     private FooterPreference mPreference;
     @Mock
-    private GameDriverContentObserver mGameDriverContentObserver;
+    private GraphicsDriverContentObserver mGraphicsDriverContentObserver;
 
     private Context mContext;
     private ContentResolver mResolver;
-    private GameDriverFooterPreferenceController mController;
+    private GraphicsDriverFooterPreferenceController mController;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mContext = RuntimeEnvironment.application;
         mResolver = mContext.getContentResolver();
-        mController = spy(new GameDriverFooterPreferenceController(mContext, "key"));
+        mController = spy(new GraphicsDriverFooterPreferenceController(mContext, "key"));
         when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
     }
 
@@ -92,17 +92,17 @@
 
     @Test
     public void onStart_shouldRegister() {
-        mController.mGameDriverContentObserver = mGameDriverContentObserver;
+        mController.mGraphicsDriverContentObserver = mGraphicsDriverContentObserver;
         mController.onStart();
 
-        verify(mGameDriverContentObserver).register(mResolver);
+        verify(mGraphicsDriverContentObserver).register(mResolver);
     }
 
     @Test
     public void onStop_shouldUnregister() {
-        mController.mGameDriverContentObserver = mGameDriverContentObserver;
+        mController.mGraphicsDriverContentObserver = mGraphicsDriverContentObserver;
         mController.onStop();
 
-        verify(mGameDriverContentObserver).unregister(mResolver);
+        verify(mGraphicsDriverContentObserver).unregister(mResolver);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverGlobalSwitchBarControllerTest.java b/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverGlobalSwitchBarControllerTest.java
similarity index 76%
rename from tests/robotests/src/com/android/settings/development/gamedriver/GameDriverGlobalSwitchBarControllerTest.java
rename to tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverGlobalSwitchBarControllerTest.java
index f546c36..7d4ee45 100644
--- a/tests/robotests/src/com/android/settings/development/gamedriver/GameDriverGlobalSwitchBarControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverGlobalSwitchBarControllerTest.java
@@ -14,10 +14,11 @@
  * limitations under the License.
  */
 
-package com.android.settings.development.gamedriver;
+package com.android.settings.development.graphicsdriver;
 
-import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_DEFAULT;
-import static com.android.settings.development.gamedriver.GameDriverEnableForAllAppsPreferenceController.GAME_DRIVER_OFF;
+import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableForAllAppsPreferenceController.GAME_DRIVER_DEFAULT;
+import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableForAllAppsPreferenceController.GAME_DRIVER_OFF;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.Mockito.verify;
@@ -39,18 +40,18 @@
 import org.robolectric.RuntimeEnvironment;
 
 @RunWith(RobolectricTestRunner.class)
-public class GameDriverGlobalSwitchBarControllerTest {
+public class GraphicsDriverGlobalSwitchBarControllerTest {
 
     @Mock
     private SwitchBar mSwitchBar;
     @Mock
     private SwitchWidgetController mSwitchWidgetController;
     @Mock
-    private GameDriverContentObserver mGameDriverContentObserver;
+    private GraphicsDriverContentObserver mGraphicsDriverContentObserver;
 
     private Context mContext;
     private ContentResolver mResolver;
-    private GameDriverGlobalSwitchBarController mController;
+    private GraphicsDriverGlobalSwitchBarController mController;
 
     @Before
     public void setUp() {
@@ -63,7 +64,7 @@
     public void constructor_gameDriverOn_shouldCheckSwitchBar() {
         Settings.Global.putInt(
                 mResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_DEFAULT);
-        mController = new GameDriverGlobalSwitchBarController(
+        mController = new GraphicsDriverGlobalSwitchBarController(
                 mContext, new SwitchBarController(mSwitchBar));
 
         verify(mSwitchBar).setChecked(true);
@@ -72,7 +73,7 @@
     @Test
     public void constructor_gameDriverOff_shouldUncheckSwitchBar() {
         Settings.Global.putInt(mResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_OFF);
-        mController = new GameDriverGlobalSwitchBarController(
+        mController = new GraphicsDriverGlobalSwitchBarController(
                 mContext, new SwitchBarController(mSwitchBar));
 
         verify(mSwitchBar).setChecked(false);
@@ -81,7 +82,7 @@
     @Test
     public void constructor_developmentSettingsEnabled_shouldEnableSwitchBar() {
         Settings.Global.putInt(mResolver, Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
-        mController = new GameDriverGlobalSwitchBarController(
+        mController = new GraphicsDriverGlobalSwitchBarController(
                 mContext, new SwitchBarController(mSwitchBar));
 
         verify(mSwitchBar).setEnabled(true);
@@ -90,7 +91,7 @@
     @Test
     public void constructor_developmentSettingsDisabled_shouldDisableSwitchBar() {
         Settings.Global.putInt(mResolver, Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0);
-        mController = new GameDriverGlobalSwitchBarController(
+        mController = new GraphicsDriverGlobalSwitchBarController(
                 mContext, new SwitchBarController(mSwitchBar));
 
         verify(mSwitchBar).setEnabled(false);
@@ -98,32 +99,32 @@
 
     @Test
     public void onStart_shouldStartListeningAndRegister() {
-        mController = new GameDriverGlobalSwitchBarController(
+        mController = new GraphicsDriverGlobalSwitchBarController(
                 mContext, new SwitchBarController(mSwitchBar));
         mController.mSwitchWidgetController = mSwitchWidgetController;
-        mController.mGameDriverContentObserver = mGameDriverContentObserver;
+        mController.mGraphicsDriverContentObserver = mGraphicsDriverContentObserver;
         mController.onStart();
 
         verify(mSwitchWidgetController).startListening();
-        verify(mGameDriverContentObserver).register(mResolver);
+        verify(mGraphicsDriverContentObserver).register(mResolver);
     }
 
     @Test
     public void onStop_shouldStopListeningAndUnregister() {
-        mController = new GameDriverGlobalSwitchBarController(
+        mController = new GraphicsDriverGlobalSwitchBarController(
                 mContext, new SwitchBarController(mSwitchBar));
         mController.mSwitchWidgetController = mSwitchWidgetController;
-        mController.mGameDriverContentObserver = mGameDriverContentObserver;
+        mController.mGraphicsDriverContentObserver = mGraphicsDriverContentObserver;
         mController.onStop();
 
         verify(mSwitchWidgetController).stopListening();
-        verify(mGameDriverContentObserver).unregister(mResolver);
+        verify(mGraphicsDriverContentObserver).unregister(mResolver);
     }
 
     @Test
     public void onSwitchToggled_checked_shouldTurnOnGameDriver() {
         Settings.Global.putInt(mResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_OFF);
-        mController = new GameDriverGlobalSwitchBarController(
+        mController = new GraphicsDriverGlobalSwitchBarController(
                 mContext, new SwitchBarController(mSwitchBar));
         mController.onSwitchToggled(true);
 
@@ -136,7 +137,7 @@
     public void onSwitchToggled_unchecked_shouldTurnOffGameDriver() {
         Settings.Global.putInt(
                 mResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_DEFAULT);
-        mController = new GameDriverGlobalSwitchBarController(
+        mController = new GraphicsDriverGlobalSwitchBarController(
                 mContext, new SwitchBarController(mSwitchBar));
         mController.onSwitchToggled(false);
 
