diff --git a/ring-android/app/src/main/java/cx/ring/services/CameraServiceCamera2.java b/ring-android/app/src/main/java/cx/ring/services/CameraServiceCamera2.java
index a080060109ce2f8d8df2bcc3f58de39e5d3c2108..3247323bf8a95f40a3913cbcd79a6190c2f9dec9 100644
--- a/ring-android/app/src/main/java/cx/ring/services/CameraServiceCamera2.java
+++ b/ring-android/app/src/main/java/cx/ring/services/CameraServiceCamera2.java
@@ -66,6 +66,8 @@ import cx.ring.views.AutoFitTextureView;
 class CameraServiceCamera2 extends CameraService {
     private static final String TAG = CameraServiceCamera2.class.getName();
     private static final boolean USE_HARDWARE_ENCODER = false;
+    private static final int FPS_MAX = 30;
+    private static final int FPS_TARGET = 30;
 
     private final HandlerThread t = new HandlerThread("videoHandler");
 
@@ -219,9 +221,7 @@ class CameraServiceCamera2 extends CameraService {
 
     }
 
-    private static Size chooseOptimalSize(Size[] choices, int textureViewWidth,
-                                          int textureViewHeight, int maxWidth, int maxHeight, Size aspectRatio) {
-
+    private static Size chooseOptimalSize(Size[] choices, int textureViewWidth, int textureViewHeight, int maxWidth, int maxHeight, Size aspectRatio) {
         // Collect the supported resolutions that are at least as big as the preview Surface
         List<Size> bigEnough = new ArrayList<>();
         // Collect the supported resolutions that are smaller than the preview Surface
@@ -252,6 +252,25 @@ class CameraServiceCamera2 extends CameraService {
         }
     }
 
+    private static Range<Integer> chooseOptimalFpsRange(Range<Integer>[] ranges) {
+        Range<Integer> range = null;
+        if (ranges != null) {
+            for (Range<Integer> r : ranges) {
+                if (r.getUpper() > FPS_MAX)
+                    continue;
+                if (range != null) {
+                    int d = Math.abs(r.getUpper() - FPS_TARGET) - Math.abs(range.getUpper() - FPS_TARGET);
+                    if (d > 0)
+                        continue;
+                    if (d == 0 && r.getLower() > range.getLower())
+                        continue;
+                }
+                range = r;
+            }
+        }
+        return range == null ? new Range<>(0, FPS_TARGET) : range;
+    }
+
     @Override
     public void openCamera(Context context, VideoParams videoParams, Object surface, CameraListener listener) {
         CameraDevice camera = previewCamera;
@@ -266,27 +285,22 @@ class CameraServiceCamera2 extends CameraService {
         Handler handler = new Handler(t.getLooper());
         try {
             CameraCharacteristics cc = manager.getCameraCharacteristics(videoParams.id);
+
+            final Range<Integer> fpsRange = chooseOptimalFpsRange(cc.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES));
+            Log.w(TAG, "fpsRange: " + fpsRange);
+
             StreamConfigurationMap streamConfigs = cc.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
-            cc.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
             Size[] sizes = streamConfigs.getOutputSizes(SurfaceHolder.class);
             for (Size s : sizes)
                 Log.w(TAG, "supportedSize: " + s);
             AutoFitTextureView view = (AutoFitTextureView) surface;
             boolean flip = videoParams.rotation % 180 != 0;
 
-            Size previewSize = chooseOptimalSize(sizes,
+            final Size previewSize = chooseOptimalSize(sizes,
                     flip ? view.getHeight() : view.getWidth(), flip ? view.getWidth() : view.getHeight(),
                     videoParams.width, videoParams.height,
                     new Size(videoParams.width, videoParams.height));
 
-            //videoParams.
-            Log.e(TAG, "openCamera " + videoParams.width + "x" + videoParams.height + " flip:" + flip);
-            Log.e(TAG, "openCamera " + videoParams.rotWidth + "x" + videoParams.rotHeight);
-            Log.e(TAG, "openCamera view " + view.getWidth() + "x" + view.getHeight());
-            Log.e(TAG, "openCamera previewSize " + previewSize.getWidth() + "x" + previewSize.getHeight());
-
-            //view.setAspectRatio(flip ? videoParams.height : videoParams.width, flip ? videoParams.width : videoParams.height);
-            //view.setAspectRatio(videoParams.height, videoParams.width);
             int orientation = context.getResources().getConfiguration().orientation;
             if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
                 view.setAspectRatio(
@@ -297,10 +311,7 @@ class CameraServiceCamera2 extends CameraService {
             }
 
             SurfaceTexture texture = view.getSurfaceTexture();
-            //texture.setDefaultBufferSize(flip ? previewSize.getHeight() : previewSize.getWidth(), flip ? previewSize.getWidth() : previewSize.getHeight());
-
             Surface s = new Surface(texture);
-            //s.setFixedSize(flip ? videoParams.height : videoParams.width, flip ? videoParams.width : videoParams.height);
 
             Pair<MediaCodec, Surface> codec = USE_HARDWARE_ENCODER ? openCameraWithEncoder(videoParams, MediaFormat.MIMETYPE_VIDEO_VP8) : null;
 
@@ -336,7 +347,7 @@ class CameraServiceCamera2 extends CameraService {
                         }
                         builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO);
                         builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
-                        builder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, new Range<>(0, 24));
+                        builder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fpsRange);
                         builder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_AUTO);
                         final CaptureRequest request = builder.build();
 
@@ -456,12 +467,12 @@ class CameraServiceCamera2 extends CameraService {
 
     @Override
     String[] getCameraIds() {
-            try {
-                return manager.getCameraIdList();
-            } catch (Exception e) {
-                Log.w(TAG, "getCameraIds: can't enumerate devices", e);
-                return new String[0];
-            }
+        try {
+            return manager.getCameraIdList();
+        } catch (Exception e) {
+            Log.w(TAG, "getCameraIds: can't enumerate devices", e);
+            return new String[0];
+        }
     }
 
     @Override