diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index e12afd1..57d3543 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2916,11 +2916,21 @@
 
         <!-- Quick Settings tiles for Developer Options -->
         <service
-                android:name=".qstile.ShowLayout"
+                android:name=".qstile.DevelopmentTiles$ShowLayout"
                 android:label="@string/debug_layout"
                 android:icon="@drawable/tile_icon_show_layout"
                 android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"
-                android:enabled="true">
+                android:enabled="false">
+            <intent-filter>
+                <action android:name="android.service.quicksettings.action.QS_TILE" />
+            </intent-filter>
+        </service>
+        <service
+                android:name=".qstile.DevelopmentTiles$GPUProfiling"
+                android:label="@string/track_frame_time"
+                android:icon="@drawable/tile_icon_graphics"
+                android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"
+                android:enabled="false">
             <intent-filter>
                 <action android:name="android.service.quicksettings.action.QS_TILE" />
             </intent-filter>
diff --git a/res/drawable/tile_icon_graphics.xml b/res/drawable/tile_icon_graphics.xml
new file mode 100644
index 0000000..84a0a5a
--- /dev/null
+++ b/res/drawable/tile_icon_graphics.xml
@@ -0,0 +1,52 @@
+<!--
+Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M23,1v22H1V1H23 M24,0H0v24h24V0L24,0z"/>
+    <path
+        android:strokeColor="#FFFFFFFF"
+        android:strokeWidth="0.667"
+        android:pathData="M5,19L1,23"/>
+    <path
+        android:strokeColor="#FFFFFFFF"
+        android:strokeWidth="0.667"
+        android:pathData="M1,1L5,5"/>
+    <path
+        android:strokeColor="#FFFFFFFF"
+        android:strokeWidth="0.667"
+        android:pathData="M19,5L23,1"/>
+    <path
+        android:strokeColor="#FFFFFFFF"
+        android:strokeWidth="0.667"
+        android:pathData="M19,19L23,23"/>
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M14,3.8l-4,0l-0.2,-0.8l4.4,0z"/>
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M18.8,5.2v13.5H5.2V5.2H18.8 M19.5,4.5h-15v15h15V4.5L19.5,4.5z"/>
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M6.5,9.5h5v11h-5z"/>
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M12.5,16.5h5v5h-5z"/>
+</vector>
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 616fe39..45a1294 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -104,6 +104,7 @@
 import com.android.settings.notification.ZenModeVisualInterruptionSettings;
 import com.android.settings.print.PrintJobSettingsFragment;
 import com.android.settings.print.PrintSettingsFragment;
+import com.android.settings.qstile.DevelopmentTiles;
 import com.android.settings.search.DynamicIndexableContentMonitor;
 import com.android.settings.search.Index;
 import com.android.settings.sim.SimSettings;
@@ -1067,12 +1068,14 @@
                 pm.hasSystemFeature(PackageManager.FEATURE_PRINTING), isAdmin, pm);
 
         final boolean showDev = mDevelopmentPreferences.getBoolean(
-                DevelopmentSettings.PREF_SHOW,
-                android.os.Build.TYPE.equals("eng"));
+                    DevelopmentSettings.PREF_SHOW, android.os.Build.TYPE.equals("eng"))
+                && !um.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES);
         setTileEnabled(new ComponentName(packageName,
                         Settings.DevelopmentSettingsActivity.class.getName()),
-                showDev && !um.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES),
-                isAdmin, pm);
+                showDev, isAdmin, pm);
+
+        // Reveal development-only quick settings tiles
+        DevelopmentTiles.setTilesEnabled(this, showDev);
 
         if (UserHandle.MU_ENABLED && !isAdmin) {
             // When on restricted users, disable all extra categories (but only the settings ones).
diff --git a/src/com/android/settings/qstile/DevelopmentTiles.java b/src/com/android/settings/qstile/DevelopmentTiles.java
new file mode 100644
index 0000000..0d8e7db
--- /dev/null
+++ b/src/com/android/settings/qstile/DevelopmentTiles.java
@@ -0,0 +1,95 @@
+/*
+ * 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.qstile;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.SystemProperties;
+import android.service.quicksettings.Tile;
+import android.service.quicksettings.TileService;
+import android.view.ThreadedRenderer;
+import android.view.View;
+import com.android.settings.DevelopmentSettings;
+
+public class DevelopmentTiles {
+    // List of components that need to be enabled when developer tools are turned on
+    static final Class[] TILE_CLASSES = new Class[] {
+            ShowLayout.class,
+            GPUProfiling.class,
+    };
+    public static void setTilesEnabled(Context context, boolean enable) {
+        final PackageManager pm = context.getPackageManager();
+        for (Class cls : TILE_CLASSES) {
+            pm.setComponentEnabledSetting(new ComponentName(context, cls),
+                    enable ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
+                           : PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
+                    PackageManager.DONT_KILL_APP);
+        }
+    }
+
+    /**
+     * Tile to control the "Show layout bounds" developer setting
+     */
+    public static class ShowLayout extends TileService {
+        @Override
+        public void onStartListening() {
+            super.onStartListening();
+            refresh();
+        }
+
+        public void refresh() {
+            final boolean enabled = SystemProperties.getBoolean(View.DEBUG_LAYOUT_PROPERTY, false);
+            getQsTile().setState(enabled ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE);
+            getQsTile().updateTile();
+        }
+
+        @Override
+        public void onClick() {
+            SystemProperties.set(View.DEBUG_LAYOUT_PROPERTY,
+                    getQsTile().getState() == Tile.STATE_INACTIVE ? "true" : "false");
+            new DevelopmentSettings.SystemPropPoker().execute(); // Settings app magic
+            refresh();
+        }
+    }
+
+    /**
+     * Tile to control the "GPU profiling" developer setting
+     */
+    public static class GPUProfiling extends TileService {
+        @Override
+        public void onStartListening() {
+            super.onStartListening();
+            refresh();
+        }
+
+        public void refresh() {
+            final String value = SystemProperties.get(ThreadedRenderer.PROFILE_PROPERTY);
+            getQsTile().setState(value.equals("visual_bars")
+                    ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE);
+            getQsTile().updateTile();
+        }
+
+        @Override
+        public void onClick() {
+            SystemProperties.set(ThreadedRenderer.PROFILE_PROPERTY,
+                    getQsTile().getState() == Tile.STATE_INACTIVE ? "visual_bars" : "");
+            new DevelopmentSettings.SystemPropPoker().execute(); // Settings app magic
+            refresh();
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/qstile/ShowLayout.java b/src/com/android/settings/qstile/ShowLayout.java
deleted file mode 100644
index 654cb67..0000000
--- a/src/com/android/settings/qstile/ShowLayout.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * 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.qstile;
-
-import android.os.SystemProperties;
-import android.service.quicksettings.Tile;
-import android.service.quicksettings.TileService;
-import android.view.View;
-import com.android.settings.DevelopmentSettings;
-
-public class ShowLayout extends TileService {
-    @Override
-    public void onStartListening() {
-        super.onStartListening();
-        refresh();
-    }
-
-    public void refresh() {
-        getQsTile().setState(
-            SystemProperties.getBoolean(View.DEBUG_LAYOUT_PROPERTY, false)
-                ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE);
-        getQsTile().updateTile();
-    }
-
-    @Override
-    public void onClick() {
-        SystemProperties.set(View.DEBUG_LAYOUT_PROPERTY,
-                getQsTile().getState() == Tile.STATE_INACTIVE ? "true" : "false");
-        new DevelopmentSettings.SystemPropPoker().execute(); // Settings app magic
-        refresh();
-    }
-}
