diff --git a/src/com/android/camera/one/OneCameraCaptureSetting.java b/src/com/android/camera/one/OneCameraCaptureSetting.java
index 76f2042..bff9d64 100644
--- a/src/com/android/camera/one/OneCameraCaptureSetting.java
+++ b/src/com/android/camera/one/OneCameraCaptureSetting.java
@@ -45,8 +45,13 @@
             final HardwareSpec hardwareSpec,
             String cameraSettingScope,
             boolean isHdrPlusEnabled) {
-        Observable<OneCamera.PhotoCaptureParameters.Flash> flashSetting = new FlashSetting(
-                SettingObserver.ofString(settingsManager, cameraSettingScope, Keys.KEY_FLASH_MODE));
+        Observable<OneCamera.PhotoCaptureParameters.Flash> flashSetting;
+        if (hardwareSpec.isFlashSupported()) {
+            flashSetting = new FlashSetting(SettingObserver.ofString(
+                        settingsManager, cameraSettingScope, Keys.KEY_FLASH_MODE));
+        } else {
+            flashSetting = new FlashSetting(Observables.of("off"));
+        }
         Observable<Integer> exposureSetting = SettingObserver.ofInteger(
                 settingsManager, cameraSettingScope, Keys.KEY_EXPOSURE);
         Observable<Boolean> hdrSceneSetting;
diff --git a/src/com/android/camera/one/config/OneCameraFeatureConfigCreator.java b/src/com/android/camera/one/config/OneCameraFeatureConfigCreator.java
index 0cedb18..3e0fb9d 100644
--- a/src/com/android/camera/one/config/OneCameraFeatureConfigCreator.java
+++ b/src/com/android/camera/one/config/OneCameraFeatureConfigCreator.java
@@ -105,9 +105,15 @@
                     }
                 }
 
-                // On FULL devices starting with L-MR1 we can run ZSL.
-                if (supportedLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL) {
-                    return CaptureSupportLevel.ZSL;
+                // On FULL devices starting with L-MR1 we can run ZSL if private reprocessing
+                // or YUV reprocessing is supported.
+                if (supportedLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL ||
+                        supportedLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_3) {
+                    if (supportsReprocessing(characteristics)) {
+                        return CaptureSupportLevel.ZSL;
+                    } else {
+                        return CaptureSupportLevel.LIMITED_YUV;
+                    }
                 }
 
                 // On LIMITED devices starting with L-MR1 we run a simple YUV
@@ -124,6 +130,24 @@
         };
     }
 
+    private static boolean supportsReprocessing(CameraCharacteristics characteristics) {
+        int maxNumInputStreams = characteristics.get(
+                CameraCharacteristics.REQUEST_MAX_NUM_INPUT_STREAMS);
+        if (maxNumInputStreams == 0) {
+            return false;
+        }
+
+        int[] capabilities = characteristics.get(
+                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
+        for (int cap : capabilities) {
+            if (cap == CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING ||
+                    cap == CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     /**
      * @return If an override exits, this returns the capture support hardware
      *         level that should be used on this device.
diff --git a/src/com/android/camera/one/v2/photo/PictureTakerFactory.java b/src/com/android/camera/one/v2/photo/PictureTakerFactory.java
index cf585f3..68ca5a7 100644
--- a/src/com/android/camera/one/v2/photo/PictureTakerFactory.java
+++ b/src/com/android/camera/one/v2/photo/PictureTakerFactory.java
@@ -48,14 +48,14 @@
         // performs the AF & AE precapture sequence.
         ImageCaptureCommand flashOnCommand = new ConvergedImageCaptureCommand(
                 sharedImageReader, frameServer, rootRequestBuilder,
-                CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG, CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG,
+                CameraDevice.TEMPLATE_STILL_CAPTURE, CameraDevice.TEMPLATE_STILL_CAPTURE,
                 Arrays.asList(rootRequestBuilder), true /* ae */, true /* af */);
 
         // When flash is OFF, wait for AF convergence, but not AE convergence
         // (which can be very slow).
         ImageCaptureCommand flashOffCommand = new ConvergedImageCaptureCommand(
                 sharedImageReader, frameServer, rootRequestBuilder,
-                CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG, CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG,
+                CameraDevice.TEMPLATE_STILL_CAPTURE, CameraDevice.TEMPLATE_STILL_CAPTURE,
                 Arrays.asList(rootRequestBuilder), false /* ae */, true /* af */);
 
         // When flash is AUTO, wait for AF & AE.
@@ -63,7 +63,7 @@
         // not necessary, then this could skip waiting for AE convergence.
         ImageCaptureCommand flashAutoCommand = new ConvergedImageCaptureCommand(
                 sharedImageReader, frameServer, rootRequestBuilder,
-                CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG, CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG,
+                CameraDevice.TEMPLATE_STILL_CAPTURE, CameraDevice.TEMPLATE_STILL_CAPTURE,
                 Arrays.asList(rootRequestBuilder), true /* ae */, true /* af */);
 
         ImageCaptureCommand flashBasedCommand = new FlashBasedPhotoCommand(logFactory, flashMode,
