diff --git a/apps/CameraITS/tests/scene0/test_burst_capture.py b/apps/CameraITS/tests/scene0/test_burst_capture.py
new file mode 100644
index 0000000..e6ee100
--- /dev/null
+++ b/apps/CameraITS/tests/scene0/test_burst_capture.py
@@ -0,0 +1,40 @@
+# Copyright 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.
+
+import its.image
+import its.device
+import its.objects
+import os.path
+
+def main():
+    """Test capture a burst of full size images is fast enough to not timeout.
+       This test verify that entire capture pipeline can keep up the speed
+       of fullsize capture + CPU read for at least some time.
+    """
+    NAME = os.path.basename(__file__).split(".")[0]
+    NUM_TEST_FRAMES = 20
+
+    with its.device.ItsSession() as cam:
+        props = cam.get_camera_properties()
+        req = its.objects.auto_capture_request()
+        caps = cam.do_capture([req]*NUM_TEST_FRAMES)
+
+        cap = caps[0]
+        img = its.image.convert_capture_to_rgb_image(cap, props=props)
+        img_name = "%s.jpg" % (NAME)
+        its.image.write_image(img, img_name)
+
+if __name__ == '__main__':
+    main()
+
diff --git a/apps/CameraITS/tests/scene2/test_faces.py b/apps/CameraITS/tests/scene2/test_faces.py
index ba4f317..f42552d 100644
--- a/apps/CameraITS/tests/scene2/test_faces.py
+++ b/apps/CameraITS/tests/scene2/test_faces.py
@@ -25,6 +25,7 @@
     FD_MODE_OFF = 0
     FD_MODE_SIMPLE = 1
     FD_MODE_FULL = 2
+    W, H = 640, 480
 
     with its.device.ItsSession() as cam:
         props = cam.get_camera_properties()
@@ -42,14 +43,12 @@
             assert(FD_MODE_OFF <= fd_mode <= FD_MODE_FULL)
             req = its.objects.auto_capture_request()
             req['android.statistics.faceDetectMode'] = fd_mode
-            caps = cam.do_capture([req]*NUM_TEST_FRAMES)
+            fmt = {"format":"yuv", "width":W, "height":H}
+            caps = cam.do_capture([req]*NUM_TEST_FRAMES, fmt)
             for i,cap in enumerate(caps):
                 md = cap['metadata']
                 assert(md['android.statistics.faceDetectMode'] == fd_mode)
                 faces = md['android.statistics.faces']
-                img = its.image.convert_capture_to_rgb_image(cap, props=props)
-                img_name = "%s_fd_mode_%s.jpg" % (NAME, fd_mode)
-                its.image.write_image(img, img_name)
 
                 # 0 faces should be returned for OFF mode
                 if fd_mode == FD_MODE_OFF:
@@ -58,6 +57,9 @@
                 # Face detection could take several frames to warm up,
                 # but it should detect at least one face in last frame
                 if i == NUM_TEST_FRAMES - 1:
+                    img = its.image.convert_capture_to_rgb_image(cap, props=props)
+                    img_name = "%s_fd_mode_%s.jpg" % (NAME, fd_mode)
+                    its.image.write_image(img, img_name)
                     if len(faces) == 0:
                         print "Error: no face detected in mode", fd_mode
                         assert(0)
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsUtils.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsUtils.java
index b0eaf35..363c9e1 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsUtils.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsUtils.java
@@ -187,13 +187,16 @@
             ByteBuffer buffer = planes[0].getBuffer();
             if (quota != null) {
                 try {
+                    Logt.i(TAG, "Start waiting for quota Semaphore");
                     quota.acquire(buffer.capacity());
+                    Logt.i(TAG, "Acquired quota Semaphore. Start reading image");
                 } catch (java.lang.InterruptedException e) {
                     Logt.e(TAG, "getDataFromImage error acquiring memory quota. Interrupted", e);
                 }
             }
             data = new byte[buffer.capacity()];
             buffer.get(data);
+            Logt.i(TAG, "Done reading jpeg image, format %d");
             return data;
         } else if (format == ImageFormat.YUV_420_888 || format == ImageFormat.RAW_SENSOR
                 || format == ImageFormat.RAW10 || format == ImageFormat.RAW12) {
@@ -201,7 +204,9 @@
             int dataSize = width * height * ImageFormat.getBitsPerPixel(format) / 8;
             if (quota != null) {
                 try {
+                    Logt.i(TAG, "Start waiting for quota Semaphore");
                     quota.acquire(dataSize);
+                    Logt.i(TAG, "Acquired quota Semaphore. Start reading image");
                 } catch (java.lang.InterruptedException e) {
                     Logt.e(TAG, "getDataFromImage error acquiring memory quota. Interrupted", e);
                 }
@@ -220,8 +225,9 @@
                 int pixelStride = planes[i].getPixelStride();
                 int bytesPerPixel = ImageFormat.getBitsPerPixel(format) / 8;
                 Logt.i(TAG, String.format(
-                        "Reading image: fmt %d, plane %d, w %d, h %d, rowStride %d, pixStride %d",
-                        format, i, width, height, rowStride, pixelStride));
+                        "Reading image: fmt %d, plane %d, w %d, h %d," +
+                        "rowStride %d, pixStride %d, bytesPerPixel %d",
+                        format, i, width, height, rowStride, pixelStride, bytesPerPixel));
                 // For multi-planar yuv images, assuming yuv420 with 2x2 chroma subsampling.
                 int w = (i == 0) ? width : width / 2;
                 int h = (i == 0) ? height : height / 2;
