diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index a166528..a4e5de1 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -279,7 +279,7 @@
         // bluetooth audio ldac codec: playback quality
         controllers.add(new ShowTapsPreferenceController(context));
         controllers.add(new PointerLocationPreferenceController(context));
-        // show surface updates
+        controllers.add(new ShowSurfaceUpdatesPreferenceController(context));
         // show layout bounds
         // force rtl layout direction
         // window animation scale
diff --git a/src/com/android/settings/development/ShowSurfaceUpdatesPreferenceController.java b/src/com/android/settings/development/ShowSurfaceUpdatesPreferenceController.java
new file mode 100644
index 0000000..5656aa0
--- /dev/null
+++ b/src/com/android/settings/development/ShowSurfaceUpdatesPreferenceController.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2017 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.development;
+
+import android.content.Context;
+import android.os.IBinder;
+import android.os.Parcel;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.support.annotation.VisibleForTesting;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+public class ShowSurfaceUpdatesPreferenceController extends DeveloperOptionsPreferenceController
+        implements Preference.OnPreferenceChangeListener {
+
+    private static final String SHOW_SCREEN_UPDATES_KEY = "show_screen_updates";
+
+    private static final int SETTING_VALUE_ON = 1;
+    private static final int SETTING_VALUE_OFF = 0;
+
+    @VisibleForTesting
+    static final String SURFACE_FLINGER_SERVICE_KEY = "SurfaceFlinger";
+    @VisibleForTesting
+    static final int SURFACE_FLINGER_READ_CODE = 1010;
+
+    private static final int SURFACE_FLINGER_WRITE_SURFACE_UPDATES_CODE = 1002;
+    private static final String SURFACE_COMPOSER_INTERFACE_KEY = "android.ui.ISurfaceComposer";
+
+    private final IBinder mSurfaceFlinger;
+    private SwitchPreference mPreference;
+
+    public ShowSurfaceUpdatesPreferenceController(Context context) {
+        super(context);
+        mSurfaceFlinger = ServiceManager.getService(SURFACE_FLINGER_SERVICE_KEY);
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return true;
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return SHOW_SCREEN_UPDATES_KEY;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+
+        mPreference = (SwitchPreference) screen.findPreference(getPreferenceKey());
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        final boolean isEnabled = (Boolean) newValue;
+        writeShowUpdatesSetting(isEnabled);
+        return true;
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        updateShowUpdatesSetting();
+    }
+
+    @Override
+    protected void onDeveloperOptionsSwitchEnabled() {
+        mPreference.setEnabled(true);
+    }
+
+    @Override
+    protected void onDeveloperOptionsSwitchDisabled() {
+        writeShowUpdatesSetting(false);
+        mPreference.setChecked(false);
+        mPreference.setEnabled(false);
+    }
+
+    @VisibleForTesting
+    void updateShowUpdatesSetting() {
+        // magic communication with surface flinger.
+        try {
+            if (mSurfaceFlinger != null) {
+                final Parcel data = Parcel.obtain();
+                final Parcel reply = Parcel.obtain();
+                data.writeInterfaceToken(SURFACE_COMPOSER_INTERFACE_KEY);
+                mSurfaceFlinger.transact(SURFACE_FLINGER_READ_CODE, data, reply, 0 /* flags */);
+                @SuppressWarnings("unused") final int showCpu = reply.readInt();
+                @SuppressWarnings("unused") final int enableGL = reply.readInt();
+                final int showUpdates = reply.readInt();
+                mPreference.setChecked(showUpdates != SETTING_VALUE_OFF);
+                reply.recycle();
+                data.recycle();
+            }
+        } catch (RemoteException ex) {
+            // intentional no-op
+        }
+    }
+
+    @VisibleForTesting
+    void writeShowUpdatesSetting(boolean isEnabled) {
+        try {
+            if (mSurfaceFlinger != null) {
+                final Parcel data = Parcel.obtain();
+                data.writeInterfaceToken(SURFACE_COMPOSER_INTERFACE_KEY);
+                final int showUpdates = isEnabled ? SETTING_VALUE_ON : SETTING_VALUE_OFF;
+                data.writeInt(showUpdates);
+                mSurfaceFlinger.transact(SURFACE_FLINGER_WRITE_SURFACE_UPDATES_CODE, data,
+                        null /* reply */, 0 /* flags */);
+                data.recycle();
+            }
+        } catch (RemoteException ex) {
+            // intentional no-op
+        }
+        updateShowUpdatesSetting();
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/development/ShowSurfaceUpdatesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/ShowSurfaceUpdatesPreferenceControllerTest.java
new file mode 100644
index 0000000..c3a3a82
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/development/ShowSurfaceUpdatesPreferenceControllerTest.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2017 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.development;
+
+import static com.android.settings.development.ShowSurfaceUpdatesPreferenceController
+        .SURFACE_FLINGER_READ_CODE;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.IBinder;
+import android.os.Parcel;
+import android.os.RemoteException;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.util.ReflectionHelpers;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class ShowSurfaceUpdatesPreferenceControllerTest {
+
+    @Mock
+    private Context mContext;
+    @Mock
+    private PreferenceScreen mScreen;
+    @Mock
+    private SwitchPreference mPreference;
+    @Mock
+    private IBinder mSurfaceFlinger;
+
+    private ShowSurfaceUpdatesPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mController = spy(new ShowSurfaceUpdatesPreferenceController(mContext));
+        ReflectionHelpers.setField(mController, "mSurfaceFlinger", mSurfaceFlinger);
+        doNothing().when(mController).writeShowUpdatesSetting(anyBoolean());
+        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+        mController.displayPreference(mScreen);
+    }
+
+    @Test
+    public void onPreferenceChange_settingToggledOn_shouldWriteTrueToShowUpdatesSetting() {
+        mController.onPreferenceChange(mPreference, true /* new value */);
+
+        verify(mController).writeShowUpdatesSetting(true);
+    }
+
+    @Test
+    public void onPreferenceChange_settingToggledOff_shouldWriteFalseToShowUpdatesSetting() {
+        mController.onPreferenceChange(mPreference, false /* new value */);
+
+        verify(mController).writeShowUpdatesSetting(false);
+    }
+
+    @Test
+    @Config(shadows = {ShadowParcel.class})
+    public void updateState_settingEnabled_shouldCheckPreference() throws RemoteException {
+        ShadowParcel.sReadIntResult = 1;
+        doReturn(true).when(mSurfaceFlinger).transact(eq(SURFACE_FLINGER_READ_CODE), any(), any(),
+                eq(0 /* flags */));
+        mController.updateState(mPreference);
+
+        verify(mPreference).setChecked(true);
+    }
+
+    @Test
+    @Config(shadows = {ShadowParcel.class})
+    public void updateState_settingDisabled_shouldUnCheckPreference() throws RemoteException {
+        ShadowParcel.sReadIntResult = 0;
+        doReturn(true).when(mSurfaceFlinger).transact(eq(SURFACE_FLINGER_READ_CODE), any(), any(),
+                eq(0 /* flags */));
+        mController.updateState(mPreference);
+
+        verify(mPreference).setChecked(false);
+    }
+
+    @Test
+    public void onDeveloperOptionsSwitchDisabled_shouldDisablePreference() {
+        mController.onDeveloperOptionsSwitchDisabled();
+
+        verify(mController).writeShowUpdatesSetting(false);
+        verify(mPreference).setChecked(false);
+        verify(mPreference).setEnabled(false);
+    }
+
+    @Test
+    public void onDeveloperOptionsSwitchEnabled_shouldEnablePreference() {
+        mController.onDeveloperOptionsSwitchEnabled();
+
+        verify(mPreference).setEnabled(true);
+    }
+
+
+    @Implements(Parcel.class)
+    public static class ShadowParcel {
+
+        static int sReadIntResult;
+
+        @Implementation
+        public int readInt() {
+            return sReadIntResult;
+        }
+    }
+}
