diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 15b3c66..83bb082 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -63,6 +63,7 @@
 import com.android.settings.core.gateway.SettingsGateway;
 import com.android.settings.dashboard.DashboardFeatureProvider;
 import com.android.settings.dashboard.DashboardSummary;
+import com.android.settings.development.DevelopmentSettingsDashboardFragment;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.wfd.WifiDisplaySettings;
 import com.android.settings.widget.SwitchBar;
@@ -686,10 +687,10 @@
 
         final boolean showDev = DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(this)
                 && !Utils.isMonkeyRunning();
-
+        final boolean isAdminOrDemo = um.isAdminUser() || um.isDemoUser();
         somethingChanged = setTileEnabled(new ComponentName(packageName,
                         Settings.DevelopmentSettingsDashboardActivity.class.getName()),
-                showDev, isAdmin)
+                showDev, isAdminOrDemo)
                 || somethingChanged;
 
         // Enable/disable backup settings depending on whether the user is admin.
@@ -724,10 +725,11 @@
                     final int tileCount = category.getTilesCount();
                     for (int i = 0; i < tileCount; i++) {
                         final ComponentName component = category.getTile(i).intent.getComponent();
-
                         final String name = component.getClassName();
                         final boolean isEnabledForRestricted = ArrayUtils.contains(
-                                SettingsGateway.SETTINGS_FOR_RESTRICTED, name);
+                                SettingsGateway.SETTINGS_FOR_RESTRICTED, name) || (isAdminOrDemo
+                                && Settings.DevelopmentSettingsDashboardActivity.class.getName()
+                                .equals(name));
                         if (packageName.equals(component.getPackageName())
                                 && !isEnabledForRestricted) {
                             somethingChanged = setTileEnabled(component, false, isAdmin)
diff --git a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
index 0f3bfb8..46bc120 100644
--- a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
@@ -18,8 +18,10 @@
 
 import android.app.Activity;
 import android.app.Fragment;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.ResolveInfo;
 import android.os.Build;
 import android.os.UserHandle;
 import android.os.UserManager;
@@ -118,8 +120,8 @@
         if (Utils.isMonkeyRunning()) {
             return false;
         }
-        // Don't enable developer options for secondary users.
-        if (!mUm.isAdminUser()) {
+        // Don't enable developer options for secondary non-demo users.
+        if (!(mUm.isAdminUser() || mUm.isDemoUser())) {
             mMetricsFeatureProvider.action(
                     mContext, MetricsEvent.ACTION_SETTINGS_BUILD_NUMBER_PREF);
             return false;
@@ -133,6 +135,21 @@
         }
 
         if (mUm.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES)) {
+            if (mUm.isDemoUser()) {
+                // Route to demo device owner to lift the debugging restriction.
+                final ComponentName componentName = Utils.getDeviceOwnerComponent(mContext);
+                if (componentName != null) {
+                    final Intent requestDebugFeatures = new Intent()
+                            .setPackage(componentName.getPackageName())
+                            .setAction("com.android.settings.action.REQUEST_DEBUG_FEATURES");
+                    final ResolveInfo resolveInfo = mContext.getPackageManager().resolveActivity(
+                        requestDebugFeatures, 0);
+                    if (resolveInfo != null) {
+                        mContext.startActivity(requestDebugFeatures);
+                        return false;
+                    }
+                }
+            }
             if (mDebuggingFeaturesDisallowedAdmin != null &&
                     !mDebuggingFeaturesDisallowedBySystem) {
                 RestrictedLockUtils.sendShowAdminSupportDetailsIntent(mContext,
diff --git a/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java
index 7c49a06..9272b46 100644
--- a/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java
@@ -118,6 +118,7 @@
         final Context appContext = RuntimeEnvironment.application;
         DevelopmentSettingsEnabler.setDevelopmentSettingsEnabled(appContext, true);
         mShadowUserManager.setIsAdminUser(false);
+        mShadowUserManager.setIsDemoUser(false);
 
         final List<String> nonIndexableKeys =
                 DevelopmentSettingsDashboardFragment.SEARCH_INDEX_DATA_PROVIDER
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java
index 37b85ea..09fa019 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java
@@ -22,7 +22,6 @@
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -57,7 +56,6 @@
 import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowUserManager;
-import org.robolectric.util.ReflectionHelpers;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(shadows = ShadowUtils.class)
@@ -84,24 +82,27 @@
         MockitoAnnotations.initMocks(this);
         mContext = RuntimeEnvironment.application;
         final UserManager userManager =
-            (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+                (UserManager) mContext.getSystemService(Context.USER_SERVICE);
         mShadowUserManager = Shadows.shadowOf(userManager);
         mShadowUserManager.setIsAdminUser(true);
         mFactory = FakeFeatureFactory.setupForTest();
         mLifecycleOwner = () -> mLifecycle;
         mLifecycle = new Lifecycle(mLifecycleOwner);
         mController =
-            new BuildNumberPreferenceController(mContext, mActivity, mFragment, mLifecycle);
+                new BuildNumberPreferenceController(mContext, mActivity, mFragment, mLifecycle);
 
         mPreference = new Preference(mContext);
         mPreference.setKey(mController.getPreferenceKey());
         DevelopmentSettingsEnabler.setDevelopmentSettingsEnabled(mContext, false);
+        Settings.Global.putInt(mContext.getContentResolver(),
+                Settings.Global.DEVICE_PROVISIONED, 1);
     }
 
     @After
     public void tearDown() {
         ShadowUtils.reset();
         mShadowUserManager.setIsAdminUser(false);
+        mShadowUserManager.setIsDemoUser(false);
     }
 
     @Test
@@ -119,20 +120,36 @@
     }
 
     @Test
-    public void handlePrefTreeClick_notAdminUser_doNothing() {
+    public void handlePrefTreeClick_notAdminUser_notDemoUser_doNothing() {
         mShadowUserManager.setIsAdminUser(false);
+        mShadowUserManager.setIsDemoUser(false);
 
         assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
     }
 
     @Test
-    public void handlePrefTreeClick_deviceNotProvisioned_doNothing() {
-        final Context context = RuntimeEnvironment.application;
-        Settings.Global.putInt(context.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 0);
+    public void handlePrefTreeClick_isAdminUser_notDemoUser_handleBuildNumberPref() {
+        mShadowUserManager.setIsAdminUser(true);
+        mShadowUserManager.setIsDemoUser(false);
 
-        mController =
-            new BuildNumberPreferenceController(context, mActivity, mFragment, mLifecycle);
-        ReflectionHelpers.setField(mController, "mContext", context);
+        assertThat(mController.handlePreferenceTreeClick(mPreference)).isTrue();
+    }
+
+    @Test
+    public void handlePrefTreeClick_notAdminUser_isDemoUser_handleBuildNumberPref() {
+        mShadowUserManager.setIsAdminUser(false);
+        mShadowUserManager.setIsDemoUser(true);
+
+        assertThat(mController.handlePreferenceTreeClick(mPreference)).isTrue();
+    }
+
+    @Test
+    public void handlePrefTreeClick_deviceNotProvisioned_doNothing() {
+        mShadowUserManager.setIsAdminUser(true);
+        mShadowUserManager.setIsDemoUser(false);
+
+        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED,
+                0);
 
         assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
         verify(mFactory.metricsFeatureProvider).action(
@@ -142,26 +159,17 @@
 
     @Test
     public void handlePrefTreeClick_isMonkeyRun_doNothing() {
-        final Context context = spy(RuntimeEnvironment.application);
-        Settings.Global.putInt(context.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);
         ShadowUtils.setIsUserAMonkey(true);
-        mController =
-            new BuildNumberPreferenceController(context, mActivity, mFragment, mLifecycle);
-
         assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
     }
 
     @Test
     public void handlePrefTreeClick_userHasRestriction_doNothing() {
-        final Context context = spy(RuntimeEnvironment.application);
-        Settings.Global.putInt(context.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);
+        mShadowUserManager.setIsAdminUser(true);
+        mShadowUserManager.setIsDemoUser(false);
 
         mShadowUserManager.setUserRestriction(Process.myUserHandle(),
-            UserManager.DISALLOW_DEBUGGING_FEATURES, true);
-
-        mController =
-            new BuildNumberPreferenceController(mContext, mActivity, mFragment, mLifecycle);
-        ReflectionHelpers.setField(mController, "mContext", context);
+                UserManager.DISALLOW_DEBUGGING_FEATURES, true);
 
         assertThat(mController.handlePreferenceTreeClick(mPreference)).isFalse();
         verify(mFactory.metricsFeatureProvider).action(
@@ -197,7 +205,7 @@
                 .thenReturn(mock(DatabaseIndexingManager.class));
 
         mController =
-            new BuildNumberPreferenceController(mContext, mActivity, mFragment, mLifecycle);
+                new BuildNumberPreferenceController(mContext, mActivity, mFragment, mLifecycle);
 
         final boolean activityResultHandled = mController.onActivityResult(
                 BuildNumberPreferenceController.REQUEST_CONFIRM_PASSWORD_FOR_DEV_PREF,
