diff --git a/res/values/config.xml b/res/values/config.xml
index 92c11f6..f964d5e 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -44,6 +44,9 @@
     <!-- Whether to show Camera HAL HDR+ switch in Developer Options -->
     <bool name="config_show_camera_hal_hdrplus">false</bool>
 
+    <!-- Whether to show Camera laser sensor switch in Developer Options -->
+    <bool name="config_show_camera_laser_sensor">false</bool>
+
     <!-- Fully-qualified class name for the implementation of the FeatureFactory to be instantiated. -->
     <string name="config_featureFactory" translatable="false">com.android.settings.overlay.FeatureFactoryImpl</string>
 
diff --git a/res/values/strings.xml b/res/values/strings.xml
index b53dbde..c778b68 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -8236,6 +8236,9 @@
     <!-- Toast message letting the user know how to enable Camera HAL HDR+ -->
     <string name="camera_hal_hdrplus_toast">To apply Camera HAL HDR+ change, reboot device</string>
 
+    <!-- Title for Camera laser sensor switch [CHAR LIMIT=NONE] -->
+    <string name="camera_laser_sensor_switch">Camera Laser Sensor</string>
+
     <!-- Name of the setting to disable the automatic update -->
     <string name="ota_disable_automatic_update">Automatic system updates</string>
 
diff --git a/res/xml/development_prefs.xml b/res/xml/development_prefs.xml
index 1846a8c..147c5bc 100644
--- a/res/xml/development_prefs.xml
+++ b/res/xml/development_prefs.xml
@@ -164,6 +164,10 @@
             android:summary="@string/telephony_monitor_switch_summary"/>
 
         <SwitchPreference
+            android:key="camera_laser_sensor_switch"
+            android:title="@string/camera_laser_sensor_switch" />
+
+        <SwitchPreference
             android:key="camera_hal_hdrplus_switch"
             android:title="@string/camera_hal_hdrplus_switch" />
 
diff --git a/src/com/android/settings/development/CameraLaserSensorPreferenceController.java b/src/com/android/settings/development/CameraLaserSensorPreferenceController.java
new file mode 100644
index 0000000..26bfc80
--- /dev/null
+++ b/src/com/android/settings/development/CameraLaserSensorPreferenceController.java
@@ -0,0 +1,104 @@
+/*
+ * 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.SystemProperties;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.widget.Toast;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settings.R;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.core.AbstractPreferenceController;
+
+public class CameraLaserSensorPreferenceController extends AbstractPreferenceController
+        implements PreferenceControllerMixin {
+
+    private static final String KEY_CAMERA_LASER_SENSOR_SWITCH = "camera_laser_sensor_switch";
+    @VisibleForTesting
+    static final String BUILD_TYPE = "ro.build.type";
+    @VisibleForTesting
+    static final String PROPERTY_CAMERA_LASER_SENSOR = "persist.camera.stats.disablehaf";
+    @VisibleForTesting
+    static final int ENABLED = 0;
+    @VisibleForTesting
+    static final int DISABLED = 2;
+
+    private SwitchPreference mPreference;
+
+    public CameraLaserSensorPreferenceController(Context context) {
+        super(context);
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        mPreference = (SwitchPreference) screen.findPreference(KEY_CAMERA_LASER_SENSOR_SWITCH);
+        updatePreference();
+    }
+
+    @Override
+    public String getPreferenceKey() {
+        return KEY_CAMERA_LASER_SENSOR_SWITCH;
+    }
+
+    @Override
+    public boolean isAvailable() {
+        String buildType = SystemProperties.get(BUILD_TYPE);
+        return mContext.getResources().getBoolean(R.bool.config_show_camera_laser_sensor) &&
+               (buildType.equals("userdebug") || buildType.equals("eng"));
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        updatePreference();
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        if (KEY_CAMERA_LASER_SENSOR_SWITCH.equals(preference.getKey())) {
+            final SwitchPreference switchPreference = (SwitchPreference)preference;
+            String value = Integer.toString(switchPreference.isChecked() ? ENABLED : DISABLED);
+            SystemProperties.set(PROPERTY_CAMERA_LASER_SENSOR, value);
+            return true;
+        }
+        return false;
+    }
+
+    public void enablePreference(boolean enabled) {
+        if (isAvailable()) {
+            mPreference.setEnabled(enabled);
+        }
+    }
+
+    public boolean updatePreference() {
+        if (!isAvailable()) {
+            return false;
+        }
+        final boolean enabled = isLaserSensorEnabled();
+        mPreference.setChecked(enabled);
+        return enabled;
+    }
+
+    private boolean isLaserSensorEnabled() {
+        String prop = SystemProperties.get(PROPERTY_CAMERA_LASER_SENSOR, Integer.toString(ENABLED));
+        return prop.equals(Integer.toString(ENABLED));
+    }
+}
diff --git a/src/com/android/settings/development/DevelopmentSettings.java b/src/com/android/settings/development/DevelopmentSettings.java
index 137b697..ae271ff 100644
--- a/src/com/android/settings/development/DevelopmentSettings.java
+++ b/src/com/android/settings/development/DevelopmentSettings.java
@@ -365,6 +365,7 @@
     private BugReportInPowerPreferenceController mBugReportInPowerController;
     private TelephonyMonitorPreferenceController mTelephonyMonitorController;
     private CameraHalHdrplusPreferenceController mCameraHalHdrplusController;
+    private CameraLaserSensorPreferenceController mCameraLaserSensorController;
 
     private BroadcastReceiver mEnableAdbReceiver;
 
@@ -406,6 +407,7 @@
         mWebViewAppPrefController = new WebViewAppPreferenceController(getActivity());
         mVerifyAppsOverUsbController = new VerifyAppsOverUsbPreferenceController(getActivity());
         mCameraHalHdrplusController = new CameraHalHdrplusPreferenceController(getActivity());
+        mCameraLaserSensorController = new CameraLaserSensorPreferenceController(getActivity());
 
         setIfOnlyAvailableForAdmins(true);
         if (isUiRestricted() || !Utils.isDeviceProvisioned(getActivity())) {
@@ -441,6 +443,8 @@
         mCameraHalHdrplusController.displayPreference(getPreferenceScreen());
         mEnableAdbController.displayPreference(getPreferenceScreen());
 
+        mCameraLaserSensorController.displayPreference(getPreferenceScreen());
+
         mKeepScreenOn = (RestrictedSwitchPreference) findAndInitSwitchPref(KEEP_SCREEN_ON);
         mBtHciSnoopLog = findAndInitSwitchPref(BT_HCI_SNOOP_LOG);
         mEnableOemUnlock = (RestrictedSwitchPreference) findAndInitSwitchPref(ENABLE_OEM_UNLOCK);
@@ -660,6 +664,7 @@
         mTelephonyMonitorController.enablePreference(enabled);
         mWebViewAppPrefController.enablePreference(enabled);
         mCameraHalHdrplusController.enablePreference(enabled);
+        mCameraLaserSensorController.enablePreference(enabled);
         updateAllOptions();
     }
 
@@ -794,6 +799,7 @@
         mHaveDebugSettings |= mBugReportInPowerController.updatePreference();
         mHaveDebugSettings |= mTelephonyMonitorController.updatePreference();
         mHaveDebugSettings |= mCameraHalHdrplusController.updatePreference();
+        mHaveDebugSettings |= mCameraLaserSensorController.updatePreference();
         updateSwitchPreference(mKeepScreenOn, Settings.Global.getInt(cr,
                 Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 0) != 0);
         updateSwitchPreference(mBtHciSnoopLog, SystemProperties.getBoolean(
@@ -2471,6 +2477,10 @@
             return true;
         }
 
+        if (mCameraLaserSensorController.handlePreferenceTreeClick(preference)) {
+            return true;
+        }
+
         if (preference == mClearAdbKeys) {
             if (mAdbKeysDialog != null) dismissDialogs();
             mAdbKeysDialog = new AlertDialog.Builder(getActivity())
diff --git a/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerTest.java
new file mode 100644
index 0000000..7aab99d
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/development/CameraLaserSensorPreferenceControllerTest.java
@@ -0,0 +1,175 @@
+/*
+ * 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.SystemProperties;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+import org.robolectric.RuntimeEnvironment;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
+        shadows = {SettingsShadowSystemProperties.class})
+public class CameraLaserSensorPreferenceControllerTest {
+
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private Context mContext;
+    @Mock
+    private PreferenceScreen mScreen;
+    @Mock
+    private SwitchPreference mPreference;
+
+    static final String USERDEBUG_BUILD = "userdebug";
+    static final String ENG_BUILD = "eng";
+    static final String USER_BUILD = "user";
+
+    private CameraLaserSensorPreferenceController mController;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mController = new CameraLaserSensorPreferenceController(mContext);
+        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+        when(mPreference.getKey()).thenReturn(mController.getPreferenceKey());
+    }
+
+    @After
+    public void tearDown() {
+        SettingsShadowSystemProperties.clear();
+    }
+
+    @Test
+    public void isAvailable_withConfigNoShow_shouldReturnFalse() {
+        when(mContext.getResources().getBoolean(R.bool.config_show_camera_laser_sensor))
+                .thenReturn(false);
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+    @Test
+    public void isAvailable_withUserdebugBuild_shouldReturnTrue() {
+        when(mContext.getResources().getBoolean(R.bool.config_show_camera_laser_sensor))
+                .thenReturn(true);
+
+        SettingsShadowSystemProperties.set(
+                CameraLaserSensorPreferenceController.BUILD_TYPE, USERDEBUG_BUILD);
+
+        assertThat(mController.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void isAvailable_withEngBuild_shouldReturnTrue() {
+        when(mContext.getResources().getBoolean(R.bool.config_show_camera_laser_sensor))
+                .thenReturn(true);
+
+        SettingsShadowSystemProperties.set(
+                CameraLaserSensorPreferenceController.BUILD_TYPE, ENG_BUILD);
+
+        assertThat(mController.isAvailable()).isTrue();
+    }
+
+    @Test
+    public void isAvailable_withUserBuild_shouldReturnFalse() {
+        when(mContext.getResources().getBoolean(R.bool.config_show_camera_laser_sensor))
+                .thenReturn(true);
+
+        SettingsShadowSystemProperties.set(
+                CameraLaserSensorPreferenceController.BUILD_TYPE, USER_BUILD);
+
+        assertThat(mController.isAvailable()).isFalse();
+    }
+
+    @Test
+    public void displayPreference_cameraLaserSensorEnabled_shouldCheckedPreference() {
+        when(mContext.getResources().getBoolean(R.bool.config_show_camera_laser_sensor))
+                .thenReturn(true);
+
+        SettingsShadowSystemProperties.set(
+                CameraLaserSensorPreferenceController.PROPERTY_CAMERA_LASER_SENSOR,
+                Integer.toString(CameraLaserSensorPreferenceController.ENABLED));
+        SettingsShadowSystemProperties.set(
+                CameraLaserSensorPreferenceController.BUILD_TYPE, USERDEBUG_BUILD);
+
+        mController.displayPreference(mScreen);
+
+        verify(mPreference).setChecked(true);
+    }
+
+    @Test
+    public void displayPreference_cameraLaserSensorEnabled_shouldUncheckedPreference() {
+        when(mContext.getResources().getBoolean(R.bool.config_show_camera_laser_sensor))
+                .thenReturn(true);
+
+        SettingsShadowSystemProperties.set(
+                CameraLaserSensorPreferenceController.PROPERTY_CAMERA_LASER_SENSOR,
+                Integer.toString(CameraLaserSensorPreferenceController.DISABLED));
+        SettingsShadowSystemProperties.set(
+                CameraLaserSensorPreferenceController.BUILD_TYPE, USERDEBUG_BUILD);
+
+        mController.displayPreference(mScreen);
+
+        verify(mPreference).setChecked(false);
+    }
+
+    @Test
+    public void handlePreferenceTreeClick_preferenceChecked_shouldEnableCameraLaserSensor() {
+        when(mContext.getResources().getBoolean(R.bool.config_show_camera_laser_sensor))
+                .thenReturn(true);
+
+        when(mPreference.isChecked()).thenReturn(true);
+
+        mController.handlePreferenceTreeClick(mPreference);
+
+        assertThat(Integer.toString(CameraLaserSensorPreferenceController.ENABLED).equals(
+            SystemProperties.get(
+                        CameraLaserSensorPreferenceController.PROPERTY_CAMERA_LASER_SENSOR,
+                        Integer.toString(CameraLaserSensorPreferenceController.ENABLED)))).isTrue();
+    }
+
+    @Test
+    public void handlePreferenceTreeClick_preferenceUnchecked_shouldDisableCameraLaserSensor() {
+        when(mContext.getResources().getBoolean(R.bool.config_show_camera_laser_sensor))
+                .thenReturn(true);
+
+        when(mPreference.isChecked()).thenReturn(false);
+
+        mController.handlePreferenceTreeClick(mPreference);
+
+        assertThat(Integer.toString(CameraLaserSensorPreferenceController.DISABLED).equals(
+                SystemProperties.get(
+                        CameraLaserSensorPreferenceController.PROPERTY_CAMERA_LASER_SENSOR,
+                        Integer.toString(CameraLaserSensorPreferenceController.ENABLED)))).isTrue();
+    }
+}
