Merge "Clean up setTestResultAndFinish" into lmp-dev
diff --git a/apps/CtsVerifier/Android.mk b/apps/CtsVerifier/Android.mk
index c69d16a..bcfaf44 100644
--- a/apps/CtsVerifier/Android.mk
+++ b/apps/CtsVerifier/Android.mk
@@ -23,7 +23,7 @@
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-Iaidl-files-under, src)
 
-LOCAL_STATIC_JAVA_LIBRARIES := cts-sensors-tests
+LOCAL_STATIC_JAVA_LIBRARIES := cts-sensors-tests ctstestrunner
 
 LOCAL_PACKAGE_NAME := CtsVerifier
 
@@ -36,6 +36,8 @@
 
 LOCAL_DEX_PREOPT := false
 
+LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
+
 include $(BUILD_PACKAGE)
 
 # Builds and launches CTS Verifier on a device.
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index b17946a..5f6dd0d 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -61,6 +61,8 @@
         <meta-data android:name="com.google.android.backup.api_key"
                 android:value="AEdPqrEAAAAIbK6ldcOzoeRtQ1u1dFVJ1A7KetRhit-a1Xa82Q" />
 
+        <uses-library android:name="android.test.runner"/>
+
         <activity android:name=".TestListActivity" android:label="@string/app_name">
             <!--
                 TestListActivity will have the USB accessory Test in its test list, but it
@@ -748,6 +750,34 @@
                        android:value="android.hardware.sensor.gyroscope" />
         </activity-->
 
+        <activity android:name=".sensors.SingleSensorTestsActivity"
+                  android:label="@string/snsr_single_sensor_tests"
+                  android:screenOrientation="nosensor">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.cts.intent.category.MANUAL_TEST"/>
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_sensors"/>
+        </activity>
+
+        <activity android:name=".sensors.SensorIntegrationTestsActivity"
+                  android:label="@string/snsr_sensor_integration_tests">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.cts.intent.category.MANUAL_TEST"/>
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_sensors"/>
+        </activity>
+
+        <activity android:name=".sensors.SensorTestActivity"
+                  android:label="@string/snsr_sensor_test">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.cts.intent.category.MANUAL_TEST"/>
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_sensors"/>
+        </activity>
+
         <activity android:name=".location.LocationModeOffTestActivity"
                 android:label="@string/location_mode_off_test">
             <intent-filter>
diff --git a/apps/CtsVerifier/assets/scripts/execute_power_tests.py b/apps/CtsVerifier/assets/scripts/execute_power_tests.py
index 92b79ca..68e13db 100755
--- a/apps/CtsVerifier/assets/scripts/execute_power_tests.py
+++ b/apps/CtsVerifier/assets/scripts/execute_power_tests.py
@@ -228,6 +228,7 @@
                 print("This current high: %.2f mAmps. Device is probably not in suspend mode.  Waiting..."%\
                       (1000.0*(sum(measurements)/len(measurements))))
             if tries >= TIMEOUT_SCREEN_OFF:
+                # TODO: dump the state of sensor service to identify if there are features using sensors
                 self.reportErrorIf(tries>=TIMEOUT_SCREEN_OFF, msg="Unable to determine application processor suspend mode status.")
                 break
         if DELAY_SCREEN_OFF:
@@ -369,6 +370,7 @@
             self.setUSBEnabled(True)
             max_power = max(measurements) - avg
             if current_diff <= max_power_allowed:
+                # TODO: fail the test of background > current
                 message = ("Draw is within limits. Current:%f Background:%f   Measured: %f Stddev: %f  Peak: %f")%\
                              ( current_diff*1000.0, backgnd*1000.0, avg*1000.0, stddev*1000.0, max_power*1000.0)
             else:
diff --git a/apps/CtsVerifier/proguard.flags b/apps/CtsVerifier/proguard.flags
index 2dfa185..7605f3d 100644
--- a/apps/CtsVerifier/proguard.flags
+++ b/apps/CtsVerifier/proguard.flags
@@ -7,7 +7,7 @@
 }
 
 # ensure we keep public sensor test methods, these are needed at runtime
--keepclassmembers class * extends com.android.cts.verifier.sensors.BaseSensorTestActivity {
+-keepclassmembers class * extends com.android.cts.verifier.sensors.base.BaseSensorTestActivity {
     public <methods>;
 }
 
diff --git a/apps/CtsVerifier/res/layout/snsr_error.xml b/apps/CtsVerifier/res/layout/snsr_error.xml
index 4b3869a..d78a8fb 100644
--- a/apps/CtsVerifier/res/layout/snsr_error.xml
+++ b/apps/CtsVerifier/res/layout/snsr_error.xml
@@ -14,7 +14,7 @@
      limitations under the License.
 -->
 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="wrap_content"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:paddingBottom="@dimen/snsr_boxed_padding_bottom"
         android:paddingTop="@dimen/snsr_boxed_padding_top"
diff --git a/apps/CtsVerifier/res/layout/snsr_information.xml b/apps/CtsVerifier/res/layout/snsr_information.xml
index 4b4a4cb..e3d9542 100644
--- a/apps/CtsVerifier/res/layout/snsr_information.xml
+++ b/apps/CtsVerifier/res/layout/snsr_information.xml
@@ -14,7 +14,7 @@
      limitations under the License.
 -->
 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="wrap_content"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:paddingBottom="@dimen/snsr_boxed_padding_bottom"
         android:paddingTop="@dimen/snsr_boxed_padding_top"
diff --git a/apps/CtsVerifier/res/layout/snsr_instruction.xml b/apps/CtsVerifier/res/layout/snsr_instruction.xml
index 9a48cf6..66c7386 100644
--- a/apps/CtsVerifier/res/layout/snsr_instruction.xml
+++ b/apps/CtsVerifier/res/layout/snsr_instruction.xml
@@ -14,7 +14,7 @@
      limitations under the License.
 -->
 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="wrap_content"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:paddingBottom="@dimen/snsr_log_padding_bottom"
         android:paddingTop="@dimen/snsr_log_padding_top"
diff --git a/apps/CtsVerifier/res/layout/snsr_success.xml b/apps/CtsVerifier/res/layout/snsr_success.xml
index 7aaad57..9d600dc 100644
--- a/apps/CtsVerifier/res/layout/snsr_success.xml
+++ b/apps/CtsVerifier/res/layout/snsr_success.xml
@@ -14,7 +14,7 @@
      limitations under the License.
 -->
 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="wrap_content"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:paddingBottom="@dimen/snsr_boxed_padding_bottom"
         android:paddingTop="@dimen/snsr_boxed_padding_top"
diff --git a/apps/CtsVerifier/res/layout/snsr_test_title.xml b/apps/CtsVerifier/res/layout/snsr_test_title.xml
index 69e9fad..2a458e7 100644
--- a/apps/CtsVerifier/res/layout/snsr_test_title.xml
+++ b/apps/CtsVerifier/res/layout/snsr_test_title.xml
@@ -14,7 +14,7 @@
      limitations under the License.
 -->
 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="wrap_content"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:paddingBottom="@dimen/snsr_boxed_padding_bottom"
         android:paddingTop="@dimen/snsr_boxed_padding_top"
diff --git a/apps/CtsVerifier/res/layout/snsr_warning.xml b/apps/CtsVerifier/res/layout/snsr_warning.xml
index 6f102bb..5d63fc1 100644
--- a/apps/CtsVerifier/res/layout/snsr_warning.xml
+++ b/apps/CtsVerifier/res/layout/snsr_warning.xml
@@ -14,7 +14,7 @@
      limitations under the License.
 -->
 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="wrap_content"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:paddingBottom="@dimen/snsr_boxed_padding_bottom"
         android:paddingTop="@dimen/snsr_boxed_padding_top"
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index 6b8e582..4882946 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -441,6 +441,8 @@
     <string name="snsr_device_steady">Keep the device steady.</string>
     <string name="snsr_keep_device_rotating_clockwise">Once the test begins, you will have to keep rotating the device clockwise.</string>
     <string name="snsr_wait_for_user">Press \'Next\' to continue.</string>
+    <string name="snsr_wait_to_begin">Press \'Next\' to begin.</string>
+    <string name="snsr_wait_to_complete">Press \'Next\' to complete.</string>
     <string name="snsr_on_complete_return">After completing the task, go back to this test.</string>
     <string name="snsr_movement_expected">Movement was expected during the test. Found=%1$b.</string>
     <string name="snsr_sensor_feature_deactivation">Additionally, turn off any other features installed in the device, that register for sensors. Once you are done, you can continue the test.</string>
@@ -549,6 +551,11 @@
     <string name="snsr_significant_motion_registration">Expected to be able to register for TriggerSensor. Found=%b.</string>
     <string name="snsr_significant_motion_cancelation">Expected to be able to cancel TriggerSensor. Found=%b.</string>
 
+    <!-- Strings for Sensor CTS tests inside CtsVerifier -->
+    <string name="snsr_single_sensor_tests">CTS Single Sensor Tests</string>
+    <string name="snsr_sensor_integration_tests">CTS Sensor Integration Tests</string>
+    <string name="snsr_sensor_test">CTS Sensor Test</string>
+
     <!-- Strings for Sample Test Activities -->
     <string name="share_button_text">Share</string>
     <string name="sample_framework_test">Sample Framework Test</string>
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/AccelerometerMeasurementTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/AccelerometerMeasurementTestActivity.java
index f40bc75..265f086 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/AccelerometerMeasurementTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/AccelerometerMeasurementTestActivity.java
@@ -17,6 +17,7 @@
 package com.android.cts.verifier.sensors;
 
 import com.android.cts.verifier.R;
+import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
 
 import android.hardware.Sensor;
 import android.hardware.SensorManager;
@@ -28,7 +29,7 @@
 /**
  * Semi-automated test that focuses on characteristics associated with Accelerometer measurements.
  */
-public class AccelerometerMeasurementTestActivity extends BaseSensorTestActivity {
+public class AccelerometerMeasurementTestActivity extends SensorCtsVerifierTestActivity {
     public AccelerometerMeasurementTestActivity() {
         super(AccelerometerMeasurementTestActivity.class);
     }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BaseSensorTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BaseSensorTestActivity.java
deleted file mode 100644
index 03b87d5..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BaseSensorTestActivity.java
+++ /dev/null
@@ -1,488 +0,0 @@
-/*
-
- * Copyright (C) 2014 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.cts.verifier.sensors;
-
-import com.android.cts.verifier.R;
-import com.android.cts.verifier.TestResult;
-import com.android.cts.verifier.sensors.helpers.SensorFeaturesDeactivator;
-
-import junit.framework.Assert;
-
-import android.app.Activity;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Color;
-import android.hardware.cts.helpers.SensorNotSupportedException;
-import android.media.MediaPlayer;
-import android.os.Bundle;
-import android.os.Vibrator;
-import android.provider.Settings;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.View;
-import android.widget.LinearLayout;
-import android.widget.ScrollView;
-import android.widget.TextView;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.security.InvalidParameterException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Semaphore;
-
-/**
- * Base class to author Sensor test cases. It provides access to the following flow:
- *      Activity set up
- *          for test unit : all test units
- *              execute test unit
- *      Activity clean up
- *
- * Each test unit can wait for operators to notify at some intervals, but the test needs to be
- * autonomous to verify the data collected.
- */
-public abstract class BaseSensorTestActivity
-        extends Activity
-        implements View.OnClickListener, Runnable {
-    protected final String LOG_TAG = "TestRunner";
-
-    protected final Class mTestClass;
-    private final int mLayoutId;
-
-    private final DeactivatorActivityHandler mDeactivatorActivityHandler;
-    protected final SensorFeaturesDeactivator mSensorFeaturesDeactivator;
-    private final Semaphore mSemaphore = new Semaphore(0);
-
-    private ScrollView mLogScrollView;
-    private LinearLayout mLogLayout;
-    private View mNextView;
-    private Thread mWorkerThread;
-
-    private volatile int mTestPassedCounter;
-    private volatile int mTestSkippedCounter;
-    private volatile int mTestFailedCounter;
-
-    protected BaseSensorTestActivity(Class testClass) {
-        this(testClass, R.layout.snsr_semi_auto_test);
-    }
-
-    protected BaseSensorTestActivity(Class testClass, int layoutId) {
-        mTestClass = testClass;
-        mLayoutId = layoutId;
-        mDeactivatorActivityHandler = new DeactivatorActivityHandler();
-        mSensorFeaturesDeactivator = new SensorFeaturesDeactivator(mDeactivatorActivityHandler);
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(mLayoutId);
-
-        mLogScrollView = (ScrollView) findViewById(R.id.log_scroll_view);
-        mLogLayout = (LinearLayout) findViewById(R.id.log_layout);
-        mNextView = findViewById(R.id.next_button);
-        mNextView.setOnClickListener(this);
-
-        updateButton(false /*enabled*/);
-        mWorkerThread = new Thread(this);
-        mWorkerThread.start();
-    }
-
-    @Override
-    public void onClick(View target) {
-        mSemaphore.release();
-    }
-
-    @Override
-    public void run() {
-        try {
-            activitySetUp();
-        } catch (Throwable e) {
-            SensorTestResult testSkipped = SensorTestResult.SKIPPED;
-            String testSummary = e.getMessage();
-            setTestResult(getTestClassName(), testSkipped, testSummary);
-            logTestDetails(testSkipped, testSummary);
-            return;
-        }
-
-        // TODO: it might be necessary to implement fall through so passed tests do not need to
-        //       be re-executed
-        StringBuilder overallTestResults = new StringBuilder();
-        for (Method testMethod : findTestMethods()) {
-            SensorTestDetails testDetails = executeTest(testMethod);
-            setTestResult(testDetails.name, testDetails.result, testDetails.summary);
-            logTestDetails(testDetails.result, testDetails.summary);
-            overallTestResults.append(testDetails.toString() + "\n");
-        }
-        appendText(R.string.snsr_test_complete);
-
-        // log to screen and save the overall test summary (activity level)
-        SensorTestDetails testDetails = getOverallTestDetails();
-        logTestDetails(testDetails.result, testDetails.summary);
-        overallTestResults.append(testDetails.summary);
-        setTestResult(testDetails.name, testDetails.result, overallTestResults.toString());
-
-        try {
-            activityCleanUp();
-        } catch (Throwable e) {
-            appendText(e.getMessage(), Color.RED);
-            Log.e(LOG_TAG, "An error occurred on Activity CleanUp.", e);
-        }
-
-        waitForUser();
-        finish();
-    }
-
-    @Override
-    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-        mDeactivatorActivityHandler.onActivityResult();
-    }
-
-    private static class SensorTestDetails {
-        public SensorTestResult result;
-        public String name;
-        public String summary;
-
-        @Override
-        public String toString() {
-            return String.format("%s|%s|%s", name, result.name(), summary);
-        }
-    }
-
-    // TODO: this should be protected currently it is used by power tests, but the result should
-    // only be available in this class
-    public enum SensorTestResult {
-        SKIPPED,
-        PASS,
-        FAIL
-    }
-
-    /**
-     * For use only by {@link BaseSensorSemiAutomatedTestActivity} and other base classes.
-     */
-    protected void setTestResult(String testId, SensorTestResult testResult, String testDetails) {
-        switch(testResult) {
-            case SKIPPED:
-                TestResult.setPassedResult(this, testId, testDetails);
-                break;
-            case PASS:
-                TestResult.setPassedResult(this, testId, testDetails);
-                break;
-            case FAIL:
-                TestResult.setFailedResult(this, testId, testDetails);
-                break;
-            default:
-                throw new InvalidParameterException("Unrecognized testResult.");
-        }
-    }
-
-    private void logTestDetails(SensorTestResult testResult, String testSummary) {
-        int textViewResId;
-        int testResultResId;
-        int logPriority;
-        switch(testResult) {
-            case SKIPPED:
-                textViewResId = R.layout.snsr_warning;
-                testResultResId = R.string.snsr_test_skipped;
-                logPriority = Log.INFO;
-                break;
-            case PASS:
-                textViewResId = R.layout.snsr_success;
-                testResultResId = R.string.snsr_test_pass;
-                logPriority = Log.DEBUG;
-                break;
-            case FAIL:
-                textViewResId = R.layout.snsr_error;
-                testResultResId = R.string.snsr_test_fail;
-                logPriority = Log.ERROR;
-                break;
-            default:
-                throw new InvalidParameterException("Unrecognized testResult.");
-        }
-        if (TextUtils.isEmpty(testSummary)) {
-            testSummary = getString(testResultResId);
-        }
-        Log.println(logPriority, LOG_TAG, testSummary);
-
-        TextAppender textAppender = new TextAppender(textViewResId);
-        textAppender.setText(testSummary);
-        textAppender.append();
-    }
-
-    /**
-     * A general set up routine. It executes only once before the first test case.
-     *
-     * @throws Throwable An exception that denotes the failure of set up. No tests will be executed.
-     */
-    protected void activitySetUp() throws Throwable {}
-
-    /**
-     * A general clean up routine. It executes upon successful execution of {@link #activitySetUp()}
-     * and after all the test cases.
-     *
-     * @throws Throwable An exception that will be logged and ignored, for ease of implementation
-     *                   by subclasses.
-     */
-    protected void activityCleanUp() throws Throwable {}
-
-    @Deprecated
-    protected void appendText(int resId, int textColor) {
-        appendText(resId);
-    }
-
-    @Deprecated
-    protected void appendText(String text, int textColor) {
-        appendText(text);
-    }
-
-    @Deprecated
-    protected void appendText(int resId) {
-        TextAppender textAppender = new TextAppender(R.layout.snsr_instruction);
-        textAppender.setText(resId);
-        textAppender.append();
-    }
-
-    @Deprecated
-    protected void appendText(String text) {
-        TextAppender textAppender = new TextAppender(R.layout.snsr_instruction);
-        textAppender.setText(text);
-        textAppender.append();
-    }
-
-    @Deprecated
-    protected void clearText() {
-        this.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mLogLayout.removeAllViews();
-            }
-        });
-    }
-
-    protected void updateButton(boolean enabled) {
-        this.runOnUiThread(new ButtonEnabler(this.mNextView, enabled));
-    }
-
-    protected void waitForUser() {
-        appendText(R.string.snsr_wait_for_user);
-        updateButton(true);
-        try {
-            mSemaphore.acquire();
-        } catch(InterruptedException e) {}
-        updateButton(false);
-    }
-
-    protected void playSound() {
-        MediaPlayer player = MediaPlayer.create(this, Settings.System.DEFAULT_NOTIFICATION_URI);
-        player.start();
-        try {
-            Thread.sleep(500);
-        } catch(InterruptedException e) {
-        } finally {
-            player.stop();
-        }
-    }
-
-    protected void vibrate(int timeInMs) {
-        Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
-        vibrator.vibrate(timeInMs);
-    }
-
-    protected void vibrate(long[] pattern) {
-        Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
-        vibrator.vibrate(pattern, -1);
-    }
-
-    // TODO: move to sensor assertions
-    protected String assertTimestampSynchronization(
-            long eventTimestamp,
-            long receivedTimestamp,
-            long deltaThreshold,
-            String sensorName) {
-        long timestampDelta = Math.abs(eventTimestamp - receivedTimestamp);
-        String timestampMessage = getString(
-                R.string.snsr_event_time,
-                receivedTimestamp,
-                eventTimestamp,
-                timestampDelta,
-                deltaThreshold,
-                sensorName);
-        Assert.assertTrue(timestampMessage, timestampDelta < deltaThreshold);
-        return timestampMessage;
-    }
-
-    private List<Method> findTestMethods() {
-        ArrayList<Method> testMethods = new ArrayList<Method>();
-        for (Method method : mTestClass.getDeclaredMethods()) {
-            if (Modifier.isPublic(method.getModifiers())
-                    && method.getParameterTypes().length == 0
-                    && method.getName().startsWith("test")
-                    && method.getReturnType().equals(String.class)) {
-                testMethods.add(method);
-            }
-        }
-        return testMethods;
-    }
-
-    private SensorTestDetails executeTest(Method testMethod) {
-        SensorTestDetails testDetails = new SensorTestDetails();
-        String testMethodName = testMethod.getName();
-        testDetails.name = String.format("%s#%s", getTestClassName(), testMethodName);
-
-        try {
-            TextAppender textAppender = new TextAppender(R.layout.snsr_test_title);
-            textAppender.setText(testMethodName);
-            textAppender.append();
-
-            testDetails.summary = (String) testMethod.invoke(this);
-            testDetails.result = SensorTestResult.PASS;
-            ++mTestPassedCounter;
-        } catch (InvocationTargetException e) {
-            // get the inner exception, because we use reflection APIs to execute the test
-            Throwable cause = e.getCause();
-            testDetails.summary = cause.getMessage();
-            if (cause instanceof SensorNotSupportedException) {
-                testDetails.result = SensorTestResult.SKIPPED;
-                ++mTestSkippedCounter;
-            } else {
-                testDetails.result = SensorTestResult.FAIL;
-                ++mTestFailedCounter;
-            }
-        } catch (Throwable e) {
-            testDetails.summary = e.getMessage();
-            testDetails.result = SensorTestResult.FAIL;
-            ++mTestFailedCounter;
-        }
-
-        return testDetails;
-    }
-
-    private SensorTestDetails getOverallTestDetails() {
-        SensorTestDetails testDetails = new SensorTestDetails();
-        testDetails.name = getTestClassName();
-
-        testDetails.result = SensorTestResult.PASS;
-        if (mTestFailedCounter > 0) {
-            testDetails.result = SensorTestResult.FAIL;
-        } else if (mTestSkippedCounter > 0 || mTestPassedCounter == 0) {
-            testDetails.result = SensorTestResult.SKIPPED;
-        }
-
-        testDetails.summary = getString(
-                R.string.snsr_test_summary,
-                mTestPassedCounter,
-                mTestSkippedCounter,
-                mTestFailedCounter);
-
-        return testDetails;
-    }
-
-    private String getTestClassName() {
-        if (mTestClass == null) {
-            return "<unknown>";
-        }
-        return mTestClass.getName();
-    }
-
-    private class TextAppender {
-        private final TextView mTextView;
-
-        public TextAppender(int textViewResId) {
-            mTextView = (TextView) getLayoutInflater().inflate(textViewResId, null /* viewGroup */);
-        }
-
-        public void setText(String text) {
-            mTextView.setText(text);
-        }
-
-        public void setText(int textResId) {
-            mTextView.setText(textResId);
-        }
-
-        public void append() {
-            runOnUiThread(new Runnable() {
-                @Override
-                public void run() {
-                    mLogLayout.addView(mTextView);
-                    mLogScrollView.post(new Runnable() {
-                        @Override
-                        public void run() {
-                            mLogScrollView.fullScroll(View.FOCUS_DOWN);
-                        }
-                    });
-                }
-            });
-        }
-    }
-
-    private class ButtonEnabler implements Runnable {
-        private final View mButtonView;
-        private final boolean mButtonEnabled;
-
-        public ButtonEnabler(View buttonView, boolean buttonEnabled) {
-            mButtonView = buttonView;
-            mButtonEnabled = buttonEnabled;
-        }
-
-        @Override
-        public void run() {
-            mButtonView.setEnabled(mButtonEnabled);
-        }
-    }
-
-    private class DeactivatorActivityHandler implements SensorFeaturesDeactivator.ActivityHandler {
-        private static final int SENSOR_FEATURES_DEACTIVATOR_RESULT = 0;
-
-        private CountDownLatch mCountDownLatch;
-
-        @Override
-        public ContentResolver getContentResolver() {
-            return BaseSensorTestActivity.this.getContentResolver();
-        }
-
-        @Override
-        public void logInstructions(int instructionsResId, Object ... params) {
-            appendText(BaseSensorTestActivity.this.getString(instructionsResId, params));
-        }
-
-        @Override
-        public void waitForUser() {
-            BaseSensorTestActivity.this.waitForUser();
-        }
-
-        @Override
-        public void launchAndWaitForSubactivity(String action) throws InterruptedException {
-            mCountDownLatch = new CountDownLatch(1);
-            Intent intent = new Intent(action);
-            startActivityForResult(intent, SENSOR_FEATURES_DEACTIVATOR_RESULT);
-            mCountDownLatch.await();
-        }
-
-        public void onActivityResult() {
-            mCountDownLatch.countDown();
-        }
-
-        @Override
-        public String getString(int resId, Object ... params) {
-            return BaseSensorTestActivity.this.getString(resId, params);
-        }
-    }
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BatchingTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BatchingTestActivity.java
index 89a20d2..009e644 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BatchingTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BatchingTestActivity.java
@@ -17,6 +17,7 @@
 package com.android.cts.verifier.sensors;
 
 import com.android.cts.verifier.R;
+import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
 
 import junit.framework.Assert;
 
@@ -43,7 +44,9 @@
  * If a sensor supports the batching mode, FifoReservedEventCount for that sensor should be greater
  * than one.
  */
-public class BatchingTestActivity extends BaseSensorTestActivity implements SensorEventListener2 {
+public class BatchingTestActivity
+        extends SensorCtsVerifierTestActivity
+        implements SensorEventListener2 {
     public BatchingTestActivity() {
         super(BatchingTestActivity.class);
     }
@@ -75,14 +78,14 @@
         PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
         mWakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "BatchingTests");
 
-        mSensorFeaturesDeactivator.requestDeactivationOfFeatures();
+        deactivateSensorFeatures();
         mWakeLock.acquire();
     }
 
     @Override
     protected void activityCleanUp() throws InterruptedException {
         mWakeLock.release();
-        mSensorFeaturesDeactivator.requestToRestoreFeatures();
+        restoreSensorFeatures();
     }
 
     // TODO: refactor to discover all available sensors of each type and dinamically generate test
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/GyroscopeMeasurementTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/GyroscopeMeasurementTestActivity.java
index 0c6b931..c4927e9 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/GyroscopeMeasurementTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/GyroscopeMeasurementTestActivity.java
@@ -17,6 +17,7 @@
 package com.android.cts.verifier.sensors;
 
 import com.android.cts.verifier.R;
+import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
 
 import android.hardware.Sensor;
 import android.hardware.SensorManager;
@@ -26,7 +27,7 @@
 /**
  * Semi-automated test that focuses on characteristics associated with Accelerometer measurements.
  */
-public class GyroscopeMeasurementTestActivity extends BaseSensorTestActivity {
+public class GyroscopeMeasurementTestActivity extends SensorCtsVerifierTestActivity {
     public GyroscopeMeasurementTestActivity() {
         super(GyroscopeMeasurementTestActivity.class);
     }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MagneticFieldMeasurementTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MagneticFieldMeasurementTestActivity.java
index 0177a85..0e83a3e 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MagneticFieldMeasurementTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MagneticFieldMeasurementTestActivity.java
@@ -17,6 +17,7 @@
 package com.android.cts.verifier.sensors;
 
 import com.android.cts.verifier.R;
+import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
 
 import android.graphics.Color;
 import android.hardware.Sensor;
@@ -35,7 +36,7 @@
  * Also, it is recommended to execute these tests outdoors, or at least far from magnetic
  * disturbances.
  */
-public class MagneticFieldMeasurementTestActivity extends BaseSensorTestActivity {
+public class MagneticFieldMeasurementTestActivity extends SensorCtsVerifierTestActivity {
     public MagneticFieldMeasurementTestActivity() {
         super(MagneticFieldMeasurementTestActivity.class);
     }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RotationVectorTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RotationVectorTestActivity.java
index 9ffce01..6526ed1 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RotationVectorTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RotationVectorTestActivity.java
@@ -17,6 +17,7 @@
 package com.android.cts.verifier.sensors;
 
 import com.android.cts.verifier.R;
+import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
 
 import junit.framework.Assert;
 
@@ -42,7 +43,7 @@
  * - GAME_ROTATION_VECTOR.
  */
 public class RotationVectorTestActivity
-        extends BaseSensorTestActivity
+        extends SensorCtsVerifierTestActivity
         implements SensorEventListener {
     public RotationVectorTestActivity() {
         super(RotationVectorTestActivity.class, R.layout.snsr_rotvec);
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorIntegrationTestsActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorIntegrationTestsActivity.java
new file mode 100644
index 0000000..bda7f2b
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorIntegrationTestsActivity.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2014 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.cts.verifier.sensors;
+
+import com.android.cts.verifier.sensors.base.SensorCtsTestActivity;
+
+import android.hardware.cts.SensorIntegrationTests;
+
+/**
+ * Activity to execute CTS sensor integration tests.
+ * It is a wrapper for {@link SensorIntegrationTests} running with AndroidJUnitRunner.
+ */
+public class SensorIntegrationTestsActivity extends SensorCtsTestActivity {
+    public SensorIntegrationTestsActivity() {
+        super(SensorIntegrationTests.class);
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorPowerTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorPowerTestActivity.java
index f992107..85ab6c5 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorPowerTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorPowerTestActivity.java
@@ -16,14 +16,17 @@
 
 package com.android.cts.verifier.sensors;
 
+import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
 import com.android.cts.verifier.sensors.helpers.PowerTestHostLink;
+import com.android.cts.verifier.sensors.reporting.SensorTestDetails;
 
 import junit.framework.Assert;
 
 import java.util.concurrent.TimeUnit;
 
-public class SensorPowerTestActivity extends BaseSensorTestActivity implements
-        PowerTestHostLink.HostToDeviceInterface {
+public class SensorPowerTestActivity
+        extends SensorCtsVerifierTestActivity
+        implements PowerTestHostLink.HostToDeviceInterface {
     public class TestExecutionException extends Exception {
         public TestExecutionException(final String message) {
             super(message);
@@ -43,9 +46,8 @@
     }
 
     /* channel for host to raise an exception on the device if needed */
-    public void raiseError(final String testname,
-            final String message) throws Exception {
-        setTestResult(testname, SensorTestResult.SKIPPED, message);
+    public void raiseError(String testName, String message) throws Exception {
+        getTestLogger().logTestFail(testName, message);
         throw new TestExecutionException(message);
     }
 
@@ -53,14 +55,14 @@
         appendText(text);
     }
 
-    public void logTestResult(String testId, SensorTestResult testResult, String testDetails) {
-        setTestResult(testId, testResult, testDetails);
+    public void logTestResult(SensorTestDetails testDetails) {
+        getTestLogger().logTestDetails(testDetails);
     }
 
     @Override
     protected void activitySetUp() throws InterruptedException {
-        mSensorFeaturesDeactivator.requestToSetScreenOffTimeout(15, TimeUnit.SECONDS);
-        mSensorFeaturesDeactivator.requestDeactivationOfFeatures();
+        setScreenOffTimeout(15, TimeUnit.SECONDS);
+        deactivateSensorFeatures();
     }
 
     @Override
@@ -69,12 +71,11 @@
             mHostLink.close();
         }
 
-        mSensorFeaturesDeactivator.requestToRestoreFeatures();
-        mSensorFeaturesDeactivator.requestToResetScreenOffTimeout();
+        restoreSensorFeatures();
+        resetScreenOffTimeout();
     }
 
     public String testSensorsPower() throws Throwable {
-        String testDetails = "";
         if (mHostLink == null) {
             // prepare Activity screen to show instructions to the operator
             clearText();
@@ -94,17 +95,22 @@
                 // until it issues an "EXIT" command to break out
                 // of the run loop. The host will run all associated tests
                 // sequentially here:
-                final PowerTestHostLink.PowerTestResult testResult = mHostLink.run();
-                testDetails = testResult.testDetails;
-                Assert.assertEquals(testDetails, 0, testResult.failedCount);
+                PowerTestHostLink.PowerTestResult testResult = mHostLink.run();
+
+                SensorTestDetails testDetails = new SensorTestDetails(
+                        getApplicationContext(),
+                        "SensorPowerTest",
+                        testResult.passedCount,
+                        testResult.skippedCount,
+                        testResult.failedCount);
+                Assert.assertEquals(testDetails.getSummary(), 0, testResult.failedCount);
+                return testDetails.getSummary();
             } finally {
                 mHostLink.close();
                 mHostLink = null;
             }
-
         } else {
             throw new IllegalStateException("Attempt to run test twice");
         }
-        return testDetails;
     }
 }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorSynchronizationTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorSynchronizationTestActivity.java
index fe66dc9..eeb4bf0 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorSynchronizationTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorSynchronizationTestActivity.java
@@ -1,10 +1,10 @@
 
 package com.android.cts.verifier.sensors;
 
-import java.util.ArrayList;
-import java.util.List;
+import com.android.cts.verifier.sensors.base.BaseSensorSemiAutomatedTestActivity;
 
 import junit.framework.Assert;
+
 import android.annotation.TargetApi;
 import android.content.Context;
 import android.graphics.Color;
@@ -16,13 +16,17 @@
 import android.os.Build;
 import android.os.SystemClock;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Test cross-sensor timestamp alignment by detecting major change in each
  * sensor and comparing timestamps of that change.
  */
 @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
-public class SensorSynchronizationTestActivity extends
-        BaseSensorSemiAutomatedTestActivity implements SensorEventListener {
+public class SensorSynchronizationTestActivity
+        extends BaseSensorSemiAutomatedTestActivity
+        implements SensorEventListener {
 
     private final double NANOS_PER_MILLI = 1e6;
     private final int DATA_COLLECTION_TIME_IN_MS = 5000;
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorTestActivity.java
new file mode 100644
index 0000000..fd3d380
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorTestActivity.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2014 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.cts.verifier.sensors;
+
+import com.android.cts.verifier.sensors.base.SensorCtsTestActivity;
+
+import android.hardware.cts.SensorTest;
+
+/**
+ * Activity to execute CTS sensor tests.
+ * It is a wrapper for {@link SensorTest} running with AndroidJUnitRunner.
+ */
+public class SensorTestActivity extends SensorCtsTestActivity {
+    public SensorTestActivity() {
+        super(SensorTest.class);
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorValueAccuracyActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorValueAccuracyActivity.java
index 601060f..d8075f0 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorValueAccuracyActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorValueAccuracyActivity.java
@@ -17,6 +17,7 @@
 package com.android.cts.verifier.sensors;
 
 import com.android.cts.verifier.R;
+import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
 
 import junit.framework.Assert;
 
@@ -41,7 +42,7 @@
  * data rates. Also sensor events will be verified while other sensors are also active.
  */
 public class SensorValueAccuracyActivity
-        extends BaseSensorTestActivity
+        extends SensorCtsVerifierTestActivity
         implements SensorEventListener {
     public SensorValueAccuracyActivity() {
         super(SensorValueAccuracyActivity.class);
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SignificantMotionTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SignificantMotionTestActivity.java
index cd0cfcb..73608f1 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SignificantMotionTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SignificantMotionTestActivity.java
@@ -17,6 +17,7 @@
 package com.android.cts.verifier.sensors;
 
 import com.android.cts.verifier.R;
+import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
 
 import junit.framework.Assert;
 
@@ -35,7 +36,7 @@
  * Test cases for Significant Motion sensor.
  * They use walking motion to change the location and trigger Significant Motion.
  */
-public class SignificantMotionTestActivity extends BaseSensorTestActivity {
+public class SignificantMotionTestActivity extends SensorCtsVerifierTestActivity {
     public SignificantMotionTestActivity() {
         super(SignificantMotionTestActivity.class);
     }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SingleSensorTestsActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SingleSensorTestsActivity.java
new file mode 100644
index 0000000..23b5707
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SingleSensorTestsActivity.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2014 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.cts.verifier.sensors;
+
+import com.android.cts.verifier.sensors.base.SensorCtsTestActivity;
+
+import android.hardware.cts.SingleSensorTests;
+
+/**
+ * Activity to execute CTS single sensor tests.
+ * It is a wrapper for {@link SingleSensorTests} running with AndroidJUnitRunner.
+ */
+public class SingleSensorTestsActivity extends SensorCtsTestActivity {
+    public SingleSensorTestsActivity() {
+        super(SingleSensorTests.class);
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/StepCounterTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/StepCounterTestActivity.java
index cc75a11..78430e3 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/StepCounterTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/StepCounterTestActivity.java
@@ -17,6 +17,7 @@
 package com.android.cts.verifier.sensors;
 
 import com.android.cts.verifier.R;
+import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
 
 import junit.framework.Assert;
 
@@ -35,7 +36,9 @@
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
-public class StepCounterTestActivity extends BaseSensorTestActivity implements SensorEventListener {
+public class StepCounterTestActivity
+        extends SensorCtsVerifierTestActivity
+        implements SensorEventListener {
     public StepCounterTestActivity() {
         super(StepCounterTestActivity.class);
     }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BaseSensorSemiAutomatedTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorSemiAutomatedTestActivity.java
similarity index 62%
rename from apps/CtsVerifier/src/com/android/cts/verifier/sensors/BaseSensorSemiAutomatedTestActivity.java
rename to apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorSemiAutomatedTestActivity.java
index 8685d43..7f32a07 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BaseSensorSemiAutomatedTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorSemiAutomatedTestActivity.java
@@ -14,17 +14,14 @@
  * limitations under the License.
  */
 
-package com.android.cts.verifier.sensors;
+package com.android.cts.verifier.sensors.base;
 
-import com.android.cts.verifier.R;
+import com.android.cts.verifier.sensors.reporting.SensorTestDetails;
 
-import android.graphics.Color;
 import android.hardware.cts.helpers.SensorNotSupportedException;
 
 /**
- * Base class to author Sensor semi-automated test cases.
- * These tests can only wait for operators to notify at some intervals, but the test needs to be
- * autonomous to verify the data collected.
+ * Base class to author a single Sensor semi-automated test case.
  *
  * @deprecated use {@link BaseSensorTestActivity} instead.
  */
@@ -35,23 +32,20 @@
     }
 
     @Override
-    public void run() {
-        String message = "";
-        SensorTestResult testResult = SensorTestResult.PASS;
+    public SensorTestDetails executeTests() {
+        String summary = "";
+        SensorTestDetails.ResultCode resultCode = SensorTestDetails.ResultCode.PASS;
         try {
             onRun();
         } catch(SensorNotSupportedException e) {
             // the sensor is not supported/available in the device, log a warning and skip the test
-            testResult = SensorTestResult.SKIPPED;
-            message = e.getMessage();
+            resultCode = SensorTestDetails.ResultCode.SKIPPED;
+            summary = e.getMessage();
         } catch(Throwable e) {
-            testResult = SensorTestResult.FAIL;
-            message = e.getMessage();
+            resultCode = SensorTestDetails.ResultCode.FAIL;
+            summary = e.getMessage();
         }
-        setTestResult(getTestId(), testResult, message);
-        appendText(R.string.snsr_test_complete);
-        waitForUser();
-        finish();
+        return new SensorTestDetails(getTestClassName(), resultCode, summary);
     }
 
     /**
@@ -62,13 +56,6 @@
      *
      * throws Throwable
      */
+    @Deprecated
     protected abstract void onRun() throws Throwable;
-
-    protected void logSuccess() {
-        appendText(R.string.snsr_test_pass, Color.GREEN);
-    }
-
-    private String getTestId() {
-        return this.getClass().getName();
-    }
 }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorTestActivity.java
new file mode 100644
index 0000000..2938dff
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorTestActivity.java
@@ -0,0 +1,558 @@
+/*
+
+ * Copyright (C) 2014 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.cts.verifier.sensors.base;
+
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.TestResult;
+import com.android.cts.verifier.sensors.helpers.SensorFeaturesDeactivator;
+import com.android.cts.verifier.sensors.reporting.SensorTestDetails;
+
+import junit.framework.Assert;
+
+import android.app.Activity;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.media.MediaPlayer;
+import android.os.Bundle;
+import android.os.Vibrator;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.ScrollView;
+import android.widget.TextView;
+
+import java.security.InvalidParameterException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * A base Activity that is used to build different methods to execute tests inside CtsVerifier.
+ * i.e. CTS tests, and semi-automated CtsVerifier tests.
+ *
+ * This class provides access to the following flow:
+ *      Activity set up
+ *          Execute tests (implemented by sub-classes)
+ *      Activity clean up
+ *
+ * Currently the following class structure is available:
+ * - BaseSensorTestActivity                 : provides the platform to execute Sensor tests inside
+ *      |                                     CtsVerifier, and logging support
+ *      |
+ *      -- SensorCtsTestActivity            : an activity that can be inherited from to wrap a CTS
+ *      |                                     sensor test, and execute it inside CtsVerifier
+ *      |                                     these tests do not require any operator interaction
+ *      |
+ *      -- SensorCtsVerifierTestActivity    : an activity that can be inherited to write sensor
+ *                                            tests that require operator interaction
+ */
+public abstract class BaseSensorTestActivity
+        extends Activity
+        implements View.OnClickListener, Runnable {
+    @Deprecated
+    protected static final String LOG_TAG = "SensorTest";
+
+    protected final Class mTestClass;
+
+    private final int mLayoutId;
+    private final DeactivatorActivityHandler mDeactivatorActivityHandler;
+    private final SensorFeaturesDeactivator mSensorFeaturesDeactivator;
+
+    private final Semaphore mSemaphore = new Semaphore(0);
+    private final SensorTestLogger mTestLogger = new SensorTestLogger();
+
+    private ScrollView mLogScrollView;
+    private LinearLayout mLogLayout;
+    private View mNextView;
+
+    /**
+     * Constructor to be used by subclasses.
+     *
+     * @param testClass The class that contains the tests. It is dependant on test executor
+     *                  implemented by subclasses.
+     */
+    protected BaseSensorTestActivity(Class testClass) {
+        this(testClass, R.layout.snsr_semi_auto_test);
+    }
+
+    /**
+     * Constructor to be used by subclasses. It allows to provide a custom layout for the test UI.
+     *
+     * @param testClass The class that contains the tests. It is dependant on test executor
+     *                  implemented by subclasses.
+     * @param layoutId The Id of the layout to use for the test UI. The layout must contain all the
+     *                 elements in the base layout {@code R.layout.snsr_semi_auto_test}.
+     */
+    protected BaseSensorTestActivity(Class testClass, int layoutId) {
+        mTestClass = testClass;
+        mLayoutId = layoutId;
+        mDeactivatorActivityHandler = new DeactivatorActivityHandler();
+        mSensorFeaturesDeactivator = new SensorFeaturesDeactivator(mDeactivatorActivityHandler);
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(mLayoutId);
+
+        mLogScrollView = (ScrollView) findViewById(R.id.log_scroll_view);
+        mLogLayout = (LinearLayout) findViewById(R.id.log_layout);
+        mNextView = findViewById(R.id.next_button);
+        mNextView.setOnClickListener(this);
+
+        updateButton(false /*enabled*/);
+        new Thread(this).start();
+    }
+
+    @Override
+    public void onClick(View target) {
+        mSemaphore.release();
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        mDeactivatorActivityHandler.onActivityResult();
+    }
+
+    /**
+     * The main execution {@link Thread}.
+     *
+     * This function executes in a background thread, allowing the test run freely behind the
+     * scenes. It provides the following execution hooks:
+     *  - Activity SetUp/CleanUp (not available in JUnit)
+     *  - executeTests: to implement several execution engines
+     */
+    @Override
+    public void run() {
+        SensorTestDetails testDetails = null;
+        try {
+            activitySetUp();
+        } catch (Throwable e) {
+            testDetails = new SensorTestDetails(
+                    getTestClassName(),
+                    SensorTestDetails.ResultCode.SKIPPED,
+                    "[ActivitySetUp] " + e.getMessage());
+        }
+
+        // TODO: implement execution filters:
+        //      - execute all tests and report results officially
+        //      - execute single tests or failed tests only
+        if (testDetails == null) {
+            testDetails = executeTests();
+        }
+
+        try {
+            activityCleanUp();
+        } catch (Throwable e) {
+            testDetails = new SensorTestDetails(
+                    getTestClassName(),
+                    SensorTestDetails.ResultCode.FAIL,
+                    "[ActivityCleanUp] " + e.getMessage());
+        }
+        mTestLogger.logInstructions(R.string.snsr_test_complete);
+
+        // log to screen and save the overall test summary (activity level)
+        setTestResult(testDetails);
+        waitForUser(R.string.snsr_wait_to_complete);
+        finish();
+    }
+
+    /**
+     * A general set up routine. It executes only once before the first test case.
+     *
+     * @throws Throwable An exception that denotes the failure of set up. No tests will be executed.
+     */
+    protected void activitySetUp() throws Throwable {}
+
+    /**
+     * A general clean up routine. It executes upon successful execution of {@link #activitySetUp()}
+     * and after all the test cases.
+     *
+     * @throws Throwable An exception that will be logged and ignored, for ease of implementation
+     *                   by subclasses.
+     */
+    protected void activityCleanUp() throws Throwable {}
+
+    /**
+     * Performs the work of executing the tests.
+     * Sub-classes implementing different execution methods implement this method.
+     *
+     * @return A {@link SensorTestDetails} object containing information about the executed tests.
+     */
+    protected abstract SensorTestDetails executeTests();
+
+    /**
+     * Guides the operator throughout the process of deactivating features that are known to use
+     * Sensor data.
+     *
+     * @throws InterruptedException
+     */
+    protected void deactivateSensorFeatures() throws InterruptedException {
+        mSensorFeaturesDeactivator.requestDeactivationOfFeatures();
+    }
+
+    /**
+     * Guides the operator throughout the process of restoring the state of features that are known
+     * to use Sensor data, to their original state.
+     *
+     * @throws InterruptedException
+     */
+    protected void restoreSensorFeatures() throws InterruptedException {
+        mSensorFeaturesDeactivator.requestToRestoreFeatures();
+    }
+
+    /**
+     * Guides the operator throughout the process of setting the Screen Off timeout to a required
+     * value.
+     *
+     * @param timeout The expected timeout.
+     * @param timeUnit The unit of the provided timeout.
+     *
+     * @throws InterruptedException
+     */
+    protected void setScreenOffTimeout(long timeout, TimeUnit timeUnit)
+            throws InterruptedException {
+        mSensorFeaturesDeactivator.requestToSetScreenOffTimeout(timeout, timeUnit);
+    }
+
+    /**
+     * Guides the operator throughout the process of restoring the state of the Screen Off timeout
+     * to its original state.
+     *
+     * @throws InterruptedException
+     */
+    protected void resetScreenOffTimeout() throws InterruptedException {
+        mSensorFeaturesDeactivator.requestToResetScreenOffTimeout();
+    }
+
+    protected SensorTestLogger getTestLogger() {
+        return mTestLogger;
+    }
+
+    @Deprecated
+    protected void appendText(int resId, int textColor) {
+        mTestLogger.logInstructions(resId);
+    }
+
+    @Deprecated
+    protected void appendText(String text, int textColor) {
+        appendText(text);
+    }
+
+    @Deprecated
+    protected void appendText(int resId) {
+        mTestLogger.logInstructions(resId);
+    }
+
+    @Deprecated
+    protected void appendText(String text) {
+        TextAppender textAppender = new TextAppender(R.layout.snsr_instruction);
+        textAppender.setText(text);
+        textAppender.append();
+    }
+
+    @Deprecated
+    protected void clearText() {
+        this.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mLogLayout.removeAllViews();
+            }
+        });
+    }
+
+    /**
+     * Waits for the operator to acknowledge a requested action.
+     *
+     * @param waitMessageResId The action requested to the operator.
+     */
+    protected void waitForUser(int waitMessageResId) {
+        mTestLogger.logInstructions(waitMessageResId);
+        updateButton(true);
+        try {
+            mSemaphore.acquire();
+        } catch (InterruptedException e)  {
+            Log.e(LOG_TAG, "Error on waitForUser", e);
+        }
+        updateButton(false);
+    }
+
+    /**
+     * Waits for the operator to acknowledge to begin execution.
+     */
+    protected void waitForUserToBegin() {
+        waitForUser(R.string.snsr_wait_to_begin);
+    }
+
+    @Deprecated
+    protected void waitForUser() {
+        waitForUser(R.string.snsr_wait_for_user);
+    }
+
+    protected void playSound() {
+        MediaPlayer player = MediaPlayer.create(this, Settings.System.DEFAULT_NOTIFICATION_URI);
+        if (player == null) {
+            Log.e(LOG_TAG, "MediaPlayer unavailable.");
+            return;
+        }
+
+        player.start();
+        try {
+            Thread.sleep(500);
+        } catch(InterruptedException e) {
+            Log.d(LOG_TAG, "Error on playSound", e);
+        } finally {
+            player.stop();
+        }
+    }
+
+    protected void vibrate(int timeInMs) {
+        Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
+        vibrator.vibrate(timeInMs);
+    }
+
+    protected void vibrate(long[] pattern) {
+        Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
+        vibrator.vibrate(pattern, -1);
+    }
+
+    // TODO: move to sensor assertions
+    protected String assertTimestampSynchronization(
+            long eventTimestamp,
+            long receivedTimestamp,
+            long deltaThreshold,
+            String sensorName) {
+        long timestampDelta = Math.abs(eventTimestamp - receivedTimestamp);
+        String timestampMessage = getString(
+                R.string.snsr_event_time,
+                receivedTimestamp,
+                eventTimestamp,
+                timestampDelta,
+                deltaThreshold,
+                sensorName);
+        Assert.assertTrue(timestampMessage, timestampDelta < deltaThreshold);
+        return timestampMessage;
+    }
+
+    protected String getTestClassName() {
+        if (mTestClass == null) {
+            return "<unknown>";
+        }
+        return mTestClass.getName();
+    }
+
+    private void setTestResult(SensorTestDetails testDetails) {
+        mTestLogger.logTestDetails(testDetails);
+
+        String summary = mTestLogger.getOverallSummary();
+        String name = testDetails.getName();
+        switch(testDetails.getResultCode()) {
+            case SKIPPED:
+                TestResult.setPassedResult(this, name, summary);
+                break;
+            case PASS:
+                TestResult.setPassedResult(this, name, summary);
+                break;
+            case FAIL:
+                TestResult.setFailedResult(this, name, summary);
+                break;
+        }
+    }
+
+    private void updateButton(boolean enabled) {
+        runOnUiThread(new ButtonEnabler(this.mNextView, enabled));
+    }
+
+    // a logger available until sensor reporting is in place
+    protected class SensorTestLogger {
+        private static final String SUMMARY_SEPARATOR = " | ";
+
+        private final StringBuilder mOverallSummaryBuilder = new StringBuilder();
+
+        public void logTestStart(String testName) {
+            // TODO: log the sensor information and expected execution time of each test
+            TextAppender textAppender = new TextAppender(R.layout.snsr_test_title);
+            textAppender.setText(testName);
+            textAppender.append();
+        }
+
+        // TODO: add methods to log failures in activity setup/cleanup
+
+        public void logInstructions(int instructionsResId, Object ... params) {
+            TextAppender textAppender = new TextAppender(R.layout.snsr_instruction);
+            textAppender.setText(getString(instructionsResId, params));
+            textAppender.append();
+        }
+
+        public void logTestDetails(SensorTestDetails testDetails) {
+            String name = testDetails.getName();
+            String summary = testDetails.getSummary();
+            switch (testDetails.getResultCode()) {
+                case SKIPPED:
+                    logTestSkip(name, summary);
+                    break;
+                case PASS:
+                    logTestPass(name, summary);
+                    break;
+                case FAIL:
+                    logTestFail(name, summary);
+                    break;
+                default:
+                    throw new InvalidParameterException(
+                            "Invalid SensorTestDetails.ResultCode: " + testDetails.getResultCode());
+            }
+        }
+
+        public void logTestPass(String testName, String testSummary) {
+            testSummary = getValidTestSummary(testSummary, R.string.snsr_test_pass);
+            logTestEnd(R.layout.snsr_success, testSummary);
+            Log.d(LOG_TAG, testSummary);
+            saveResult(testName, SensorTestDetails.ResultCode.PASS, testSummary);
+        }
+
+        public void logTestFail(String testName, String testSummary) {
+            testSummary = getValidTestSummary(testSummary, R.string.snsr_test_fail);
+            logTestEnd(R.layout.snsr_error, testSummary);
+            Log.e(LOG_TAG, testSummary);
+            saveResult(testName, SensorTestDetails.ResultCode.FAIL, testSummary);
+        }
+
+        public void logTestSkip(String testName, String testSummary) {
+            testSummary = getValidTestSummary(testSummary, R.string.snsr_test_skipped);
+            logTestEnd(R.layout.snsr_warning, testSummary);
+            Log.i(LOG_TAG, testSummary);
+            saveResult(testName, SensorTestDetails.ResultCode.SKIPPED, testSummary);
+        }
+
+        public String getOverallSummary() {
+            return mOverallSummaryBuilder.toString();
+        }
+
+        private void logTestEnd(int textViewResId, String testSummary) {
+            TextAppender textAppender = new TextAppender(textViewResId);
+            textAppender.setText(testSummary);
+            textAppender.append();
+        }
+
+        private String getValidTestSummary(String testSummary, int defaultSummaryResId) {
+            if (TextUtils.isEmpty(testSummary)) {
+                return getString(defaultSummaryResId);
+            }
+            return testSummary;
+        }
+
+        private void saveResult(
+                String testName,
+                SensorTestDetails.ResultCode resultCode,
+                String summary) {
+            mOverallSummaryBuilder.append(testName);
+            mOverallSummaryBuilder.append(SUMMARY_SEPARATOR);
+            mOverallSummaryBuilder.append(resultCode.name());
+            mOverallSummaryBuilder.append(SUMMARY_SEPARATOR);
+            mOverallSummaryBuilder.append(summary);
+            mOverallSummaryBuilder.append("\n");
+        }
+    }
+
+    private class TextAppender {
+        private final TextView mTextView;
+
+        public TextAppender(int textViewResId) {
+            mTextView = (TextView) getLayoutInflater().inflate(textViewResId, null /* viewGroup */);
+        }
+
+        public void setText(String text) {
+            mTextView.setText(text);
+        }
+
+        public void setText(int textResId) {
+            mTextView.setText(textResId);
+        }
+
+        public void append() {
+            runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    mLogLayout.addView(mTextView);
+                    mLogScrollView.post(new Runnable() {
+                        @Override
+                        public void run() {
+                            mLogScrollView.fullScroll(View.FOCUS_DOWN);
+                        }
+                    });
+                }
+            });
+        }
+    }
+
+    private class ButtonEnabler implements Runnable {
+        private final View mButtonView;
+        private final boolean mButtonEnabled;
+
+        public ButtonEnabler(View buttonView, boolean buttonEnabled) {
+            mButtonView = buttonView;
+            mButtonEnabled = buttonEnabled;
+        }
+
+        @Override
+        public void run() {
+            mButtonView.setEnabled(mButtonEnabled);
+        }
+    }
+
+    private class DeactivatorActivityHandler implements SensorFeaturesDeactivator.ActivityHandler {
+        private static final int SENSOR_FEATURES_DEACTIVATOR_RESULT = 0;
+
+        private CountDownLatch mCountDownLatch;
+
+        @Override
+        public ContentResolver getContentResolver() {
+            return BaseSensorTestActivity.this.getContentResolver();
+        }
+
+        @Override
+        public void logInstructions(int instructionsResId, Object ... params) {
+            mTestLogger.logInstructions(instructionsResId, params);
+        }
+
+        @Override
+        public void waitForUser() {
+            BaseSensorTestActivity.this.waitForUser(R.string.snsr_wait_for_user);
+        }
+
+        @Override
+        public void launchAndWaitForSubactivity(String action) throws InterruptedException {
+            mCountDownLatch = new CountDownLatch(1);
+            Intent intent = new Intent(action);
+            startActivityForResult(intent, SENSOR_FEATURES_DEACTIVATOR_RESULT);
+            mCountDownLatch.await();
+        }
+
+        public void onActivityResult() {
+            mCountDownLatch.countDown();
+        }
+
+        @Override
+        public String getString(int resId, Object ... params) {
+            return BaseSensorTestActivity.this.getString(resId, params);
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestActivity.java
new file mode 100644
index 0000000..1479248
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestActivity.java
@@ -0,0 +1,166 @@
+/*
+
+ * Copyright (C) 2014 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.cts.verifier.sensors.base;
+
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.sensors.reporting.SensorTestDetails;
+
+import junit.framework.TestResult;
+import junit.framework.TestSuite;
+
+import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.runner.Computer;
+import org.junit.runner.Description;
+import org.junit.runner.JUnitCore;
+import org.junit.runner.Request;
+import org.junit.runner.Result;
+import org.junit.runner.Runner;
+import org.junit.runner.notification.Failure;
+import org.junit.runner.notification.RunListener;
+import org.junit.runners.model.InitializationError;
+import org.junit.runners.model.RunnerBuilder;
+
+import android.hardware.cts.SensorTestCase;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * An Activity that allows Sensor CTS tests to be executed inside CtsVerifier.
+ *
+ * Sub-classes pass the test class as part of construction.
+ * One JUnit test class is executed per Activity, the test class can still be executed outside
+ * CtsVerifier.
+ */
+public abstract class SensorCtsTestActivity extends BaseSensorTestActivity {
+
+    /**
+     * Constructor for a CTS test executor. It will execute a standalone CTS test class.
+     *
+     * @param testClass The test class to execute, it must be a subclass of {@link SensorTestCase}.
+     */
+    protected SensorCtsTestActivity(Class<? extends SensorTestCase> testClass) {
+        super(testClass);
+    }
+
+    @Override
+    protected void activitySetUp() {
+        getTestLogger().logInstructions(R.string.snsr_no_interaction);
+        waitForUserToBegin();
+
+        // TODO: deactivate Sensor features?
+    }
+
+    /**
+     * For reference on the implementation of this test executor see:
+     *      android.support.test.runner.AndroidJUnitRunner
+     */
+    @Override
+    protected SensorTestDetails executeTests() {
+        JUnitCore testRunner = new JUnitCore();
+        testRunner.addListener(new SensorRunListener());
+
+        Computer computer = new Computer();
+        RunnerBuilder runnerBuilder = new SensorRunnerBuilder();
+
+        Runner runner;
+        try {
+            runner = computer.getSuite(runnerBuilder, new Class[]{ mTestClass });
+        } catch (InitializationError e) {
+            return new SensorTestDetails(
+                    getTestClassName(),
+                    SensorTestDetails.ResultCode.FAIL,
+                    "[JUnit Initialization]" + e.getMessage());
+        }
+
+        Request request = Request.runner(runner);
+        Result result = testRunner.run(request);
+        return new SensorTestDetails(getApplicationContext(), getClass().getName(), result);
+    }
+
+    /**
+     * A {@link RunnerBuilder} that is used to inject during execution a {@link SensorTestSuite}.
+     */
+    private class SensorRunnerBuilder extends RunnerBuilder {
+        @Override
+        public Runner runnerForClass(Class<?> testClass) throws Throwable {
+            TestSuite testSuite = new SensorTestSuite(testClass);
+            return new JUnit38ClassRunner(testSuite);
+        }
+    }
+
+    /**
+     * A {@link TestSuite} that is used to inject during execution a {@link SensorCtsTestResult}.
+     */
+    private class SensorTestSuite extends TestSuite {
+        public SensorTestSuite(Class<?> testClass) {
+            super(testClass);
+        }
+
+        @Override
+        public void run(TestResult testResult) {
+            super.run(new SensorCtsTestResult(getApplicationContext(), testResult));
+        }
+    }
+
+    /**
+     * Dummy {@link RunListener}.
+     * It is only used to handle logging into the UI.
+     */
+    private class SensorRunListener extends RunListener {
+        private volatile boolean mCurrentTestReported;
+
+        public void testRunStarted(Description description) throws Exception {
+            // nothing to log
+        }
+
+        public void testRunFinished(Result result) throws Exception {
+            // nothing to log
+            vibrate((int)TimeUnit.SECONDS.toMillis(2));
+            playSound();
+        }
+
+        public void testStarted(Description description) throws Exception {
+            mCurrentTestReported = false;
+            getTestLogger().logTestStart(description.getMethodName());
+        }
+
+        public void testFinished(Description description) throws Exception {
+            if (!mCurrentTestReported) {
+                getTestLogger().logTestPass(description.getMethodName(), null /* testSummary */);
+            }
+            playSound();
+        }
+
+        public void testFailure(Failure failure) throws Exception {
+            mCurrentTestReported = true;
+            getTestLogger()
+                    .logTestFail(failure.getDescription().getMethodName(), failure.toString());
+        }
+
+        public void testAssumptionFailure(Failure failure) {
+            mCurrentTestReported = true;
+            getTestLogger()
+                    .logTestFail(failure.getDescription().getMethodName(), failure.toString());
+        }
+
+        public void testIgnored(Description description) throws Exception {
+            mCurrentTestReported = true;
+            getTestLogger().logTestSkip(description.getMethodName(), description.toString());
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestResult.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestResult.java
new file mode 100644
index 0000000..d07b4c4
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestResult.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2014 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.cts.verifier.sensors.base;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.Protectable;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestFailure;
+import junit.framework.TestListener;
+import junit.framework.TestResult;
+
+import android.content.Context;
+import android.hardware.cts.SensorTestCase;
+
+import java.util.Enumeration;
+
+/**
+ * A wrapper class for a {@link TestResult}.
+ *
+ * It provides a way to inject augmented data and helper objects during the execution of tests.
+ * i.e. inject a Context object for use by tests.
+ */
+class SensorCtsTestResult extends TestResult {
+    private final Context mContext;
+    private final TestResult mWrappedTestResult;
+
+    public SensorCtsTestResult(Context context, TestResult testResult) {
+        mContext = context;
+        mWrappedTestResult = testResult;
+    }
+
+    @Override
+    public void addError(Test test, Throwable throwable) {
+        mWrappedTestResult.addError(test, throwable);
+    }
+
+    @Override
+    public void addFailure(Test test, AssertionFailedError assertionFailedError) {
+        mWrappedTestResult.addFailure(test, assertionFailedError);
+    }
+
+    @Override
+    public void addListener(TestListener testListener) {
+        mWrappedTestResult.addListener(testListener);
+    }
+
+    @Override
+    public void removeListener(TestListener testListener) {
+        mWrappedTestResult.removeListener(testListener);
+    }
+
+    @Override
+    public void endTest(Test test) {
+        mWrappedTestResult.endTest(test);
+    }
+
+    @Override
+    public int errorCount() {
+        return mWrappedTestResult.errorCount();
+    }
+
+    @Override
+    public Enumeration<TestFailure> errors() {
+        return mWrappedTestResult.errors();
+    }
+
+    @Override
+    public int failureCount() {
+        return mWrappedTestResult.failureCount();
+    }
+
+    @Override
+    public Enumeration<TestFailure> failures() {
+        return mWrappedTestResult.failures();
+    }
+
+    @Override
+    public int runCount() {
+        return mWrappedTestResult.runCount();
+    }
+
+    @Override
+    public void runProtected(Test test, Protectable protectable) {
+        mWrappedTestResult.runProtected(test, protectable);
+    }
+
+    @Override
+    public boolean shouldStop() {
+        return mWrappedTestResult.shouldStop();
+    }
+
+    @Override
+    public void startTest(Test test) {
+        mWrappedTestResult.startTest(test);
+    }
+
+    @Override
+    public void stop() {
+        mWrappedTestResult.stop();
+    }
+
+    @Override
+    public boolean wasSuccessful() {
+        return mWrappedTestResult.wasSuccessful();
+    }
+
+    @Override
+    protected void run(TestCase testCase) {
+        if (testCase instanceof SensorTestCase) {
+            SensorTestCase sensorTestCase = (SensorTestCase) testCase;
+            sensorTestCase.setContext(mContext);
+            // TODO: set delayed assertion provider
+        } else {
+            throw new IllegalStateException("TestCase must be an instance of SensorTestCase.");
+        }
+        super.run(testCase);
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsVerifierTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsVerifierTestActivity.java
new file mode 100644
index 0000000..5987036
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsVerifierTestActivity.java
@@ -0,0 +1,132 @@
+/*
+
+ * Copyright (C) 2014 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.cts.verifier.sensors.base;
+
+import com.android.cts.verifier.sensors.reporting.SensorTestDetails;
+
+import android.hardware.cts.helpers.SensorNotSupportedException;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * An Activity that provides a test execution engine for Sensor CtsVerifier tests. The tests are
+ * able to interact with an operator.
+ *
+ * Sub-classes reuse its own class definition to 'load' tests at runtime through reflection.
+ */
+public abstract class SensorCtsVerifierTestActivity extends BaseSensorTestActivity {
+    private volatile int mTestPassedCounter;
+    private volatile int mTestSkippedCounter;
+    private volatile int mTestFailedCounter;
+
+    /**
+     * Constructor for a CtsVerifier test executor. It executes tests defined in the same class.
+     *
+     * @param testClass The test class to execute, this is the same subclass implementing the
+     *                  executor. It must be a subclass of {@link SensorCtsVerifierTestActivity}
+     */
+    protected SensorCtsVerifierTestActivity(
+            Class<? extends SensorCtsVerifierTestActivity> testClass) {
+        super(testClass);
+    }
+
+    /**
+     * Constructor for a CtsVerifier test executor. It executes tests defined in the same class.
+     *
+     * @param testClass The test class to execute, this is the same subclass implementing the
+     *                  executor. It must be a subclass of {@link SensorCtsVerifierTestActivity}
+     * @param layoutId The Id of the layout to use for the test UI. The layout must contain all the
+     *                 elements in the base layout {@code R.layout.snsr_semi_auto_test}.
+     */
+    protected SensorCtsVerifierTestActivity(
+            Class<? extends SensorCtsVerifierTestActivity> testClass,
+            int layoutId) {
+        super(testClass, layoutId);
+    }
+
+    /**
+     * Executes Semi-automated Sensor tests.
+     * Execution is driven by this class, and allows discovery of tests using reflection.
+     */
+    @Override
+    protected SensorTestDetails executeTests() {
+        // TODO: use reporting to log individual test results
+        StringBuilder overallTestResults = new StringBuilder();
+        for (Method testMethod : findTestMethods()) {
+            SensorTestDetails testDetails = executeTest(testMethod);
+            getTestLogger().logTestDetails(testDetails);
+            overallTestResults.append(testDetails.toString());
+            overallTestResults.append("\n");
+        }
+
+        return new SensorTestDetails(
+                getApplicationContext(),
+                getTestClassName(),
+                mTestPassedCounter,
+                mTestSkippedCounter,
+                mTestFailedCounter);
+    }
+
+    private List<Method> findTestMethods() {
+        ArrayList<Method> testMethods = new ArrayList<Method>();
+        for (Method method : mTestClass.getDeclaredMethods()) {
+            if (Modifier.isPublic(method.getModifiers())
+                    && method.getParameterTypes().length == 0
+                    && method.getName().startsWith("test")
+                    && method.getReturnType().equals(String.class)) {
+                testMethods.add(method);
+            }
+        }
+        return testMethods;
+    }
+
+    private SensorTestDetails executeTest(Method testMethod) {
+        String testMethodName = testMethod.getName();
+        String testName = String.format("%s#%s", getTestClassName(), testMethodName);
+        String testSummary;
+        SensorTestDetails.ResultCode testResultCode;
+
+        try {
+            getTestLogger().logTestStart(testMethod.getName());
+            testSummary = (String) testMethod.invoke(this);
+            testResultCode = SensorTestDetails.ResultCode.PASS;
+            ++mTestPassedCounter;
+        } catch (InvocationTargetException e) {
+            // get the inner exception, because we use reflection APIs to execute the test
+            Throwable cause = e.getCause();
+            testSummary = cause.getMessage();
+            if (cause instanceof SensorNotSupportedException) {
+                testResultCode = SensorTestDetails.ResultCode.SKIPPED;
+                ++mTestSkippedCounter;
+            } else {
+                testResultCode = SensorTestDetails.ResultCode.FAIL;
+                ++mTestFailedCounter;
+            }
+        } catch (Throwable e) {
+            testSummary = e.getMessage();
+            testResultCode = SensorTestDetails.ResultCode.FAIL;
+            ++mTestFailedCounter;
+        }
+
+        return new SensorTestDetails(testName, testResultCode, testSummary);
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/PowerTestHostLink.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/PowerTestHostLink.java
index 828baaa..645bdb2 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/PowerTestHostLink.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/PowerTestHostLink.java
@@ -16,7 +16,7 @@
 
 package com.android.cts.verifier.sensors.helpers;
 
-import com.android.cts.verifier.sensors.BaseSensorTestActivity.SensorTestResult;
+import com.android.cts.verifier.sensors.reporting.SensorTestDetails;
 
 import android.content.Context;
 import android.hardware.Sensor;
@@ -35,7 +35,7 @@
 import java.util.List;
 import java.util.StringTokenizer;
 
-/*
+/**
  * This class handles communication with the host to respond to commands.
  * The command/response link is through a TCP socket on the host side, forwarded via adb to a local
  * socket on the device.  The system uses a standard "accept-read_command-send_response-close" to
@@ -46,12 +46,12 @@
  */
 public class PowerTestHostLink {
 
-    /*
+    /**
      * Host-to-device bridge will use a Listener instance to drive the test via the CtsVerifier
      * running on the device.
      */
     public interface HostToDeviceInterface {
-        void logTestResult(String testName, SensorTestResult result, String message);
+        void logTestResult(SensorTestDetails testDetails);
         void raiseError(String testName, String message) throws Exception;
         void waitForUserAcknowledgement(String message);
         void logText(String text);
@@ -62,7 +62,6 @@
         public int passedCount = 0;
         public int skippedCount = 0;
         public int failedCount = 0;
-        public String testDetails = "";
     };
 
 
@@ -87,7 +86,6 @@
     private final Context mContext;
     private final HostToDeviceInterface mHostToDeviceExecutor;
     private PowerTestResult mTestResult;
-    private StringBuilder mStringBuilder;
 
     public PowerTestHostLink(Context context, final HostToDeviceInterface listener) {
         Log.d(TAG, " +++ Begin of localSocketServer() +++ ");
@@ -127,7 +125,6 @@
      */
     public PowerTestResult run() throws Exception {
         mTestResult = new PowerTestResult();
-        mStringBuilder = new StringBuilder();
         // define buffer to receive data from host
         final int BUFFER_SIZE = 4096;
         byte[] buffer = new byte[BUFFER_SIZE];
@@ -213,11 +210,8 @@
             }
         }
         mHostToDeviceExecutor.logText("Device disconnected.");
-        if (mStringBuilder != null){
-            mTestResult.testDetails = mStringBuilder.toString();
-        }
         Log.d(TAG, "Returning " + mTestResult.passedCount + "passed " + mTestResult.skippedCount + "skipped " +
-        mTestResult.failedCount + "failed :" + mTestResult.testDetails);
+        mTestResult.failedCount + "failed.");
         return mTestResult;
     }
 
@@ -292,7 +286,7 @@
         String response;
         StringTokenizer tokenizer = new StringTokenizer(request, " ");
         String testName = "";
-        SensorTestResult result = SensorTestResult.FAIL;
+        SensorTestDetails.ResultCode resultCode = SensorTestDetails.ResultCode.FAIL;
         String message = "";
 
         try {
@@ -303,17 +297,17 @@
             final String resultToken = tokenizer.nextToken();
 
             if (resultToken.equals("PASS")) {
-                result = SensorTestResult.PASS;
+                resultCode = SensorTestDetails.ResultCode.PASS;
                 ++mTestResult.passedCount;
                 message = "PASSED: ";
                 response = RESPONSE_OK;
             } else if (resultToken.equals("FAIL")) {
-                result = SensorTestResult.FAIL;
+                resultCode = SensorTestDetails.ResultCode.FAIL;
                 ++mTestResult.failedCount;
                 message = "FAILED: ";
                 response = RESPONSE_OK;
             } else if (resultToken.equals("SKIPPED")) {
-                result = SensorTestResult.SKIPPED;
+                resultCode = SensorTestDetails.ResultCode.SKIPPED;
                 ++mTestResult.skippedCount;
                 message = "SKIPPED: ";
                 response = RESPONSE_OK;
@@ -329,8 +323,8 @@
             response = RESPONSE_ERR;
         }
         String fullMessage = testName + " " + message;
-        mStringBuilder.append(fullMessage + "\n");
-        mHostToDeviceExecutor.logTestResult(testName, result, fullMessage );
+        mHostToDeviceExecutor.logTestResult(
+                new SensorTestDetails(testName, resultCode, fullMessage));
         return response;
     }
 
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/reporting/SensorTestDetails.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/reporting/SensorTestDetails.java
new file mode 100644
index 0000000..9a9b1cb
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/reporting/SensorTestDetails.java
@@ -0,0 +1,88 @@
+/*
+
+ * Copyright (C) 2014 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.cts.verifier.sensors.reporting;
+
+import com.android.cts.verifier.R;
+
+import org.junit.runner.Result;
+
+import android.content.Context;
+
+/**
+ * A class that holds the result of a Sensor test execution.
+ */
+public class SensorTestDetails {
+    private final String mName;
+    private final ResultCode mResultCode;
+    private final String mSummary;
+
+    public enum ResultCode {
+        SKIPPED,
+        PASS,
+        FAIL
+    }
+
+    public SensorTestDetails(String name, ResultCode resultCode, String summary) {
+        mName = name;
+        mResultCode = resultCode;
+        mSummary = summary;
+    }
+
+    public SensorTestDetails(
+            Context context,
+            String name,
+            int passCount,
+            int skipCount,
+            int failCount) {
+        ResultCode resultCode = ResultCode.PASS;
+        if (failCount > 0) {
+            resultCode = ResultCode.FAIL;
+        } else if (skipCount > 0) {
+            resultCode = ResultCode.SKIPPED;
+        }
+
+        mName = name;
+        mResultCode = resultCode;
+        mSummary = context.getString(R.string.snsr_test_summary, passCount, skipCount, failCount);
+    }
+
+    public SensorTestDetails(Context context, String name, Result result) {
+        this(context,
+                name,
+                result.getRunCount(),
+                result.getIgnoreCount(),
+                result.getFailureCount());
+    }
+
+    public String getName() {
+        return mName;
+    }
+
+    public ResultCode getResultCode() {
+        return mResultCode;
+    }
+
+    public String getSummary() {
+        return mSummary;
+    }
+
+    @Override
+    public String toString() {
+        return String.format("%s|%s|%s", mName, mResultCode.name(), mSummary);
+    }
+}
diff --git a/hostsidetests/theme/assets/21/hdpi.zip b/hostsidetests/theme/assets/21/hdpi.zip
index 2035d17..9cc179c 100644
--- a/hostsidetests/theme/assets/21/hdpi.zip
+++ b/hostsidetests/theme/assets/21/hdpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/21/tvdpi.zip b/hostsidetests/theme/assets/21/tvdpi.zip
index eb6fd8c..fbe1781 100644
--- a/hostsidetests/theme/assets/21/tvdpi.zip
+++ b/hostsidetests/theme/assets/21/tvdpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/21/xhdpi.zip b/hostsidetests/theme/assets/21/xhdpi.zip
index c4b4d0e..de6e2e1 100644
--- a/hostsidetests/theme/assets/21/xhdpi.zip
+++ b/hostsidetests/theme/assets/21/xhdpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/21/xxhdpi.zip b/hostsidetests/theme/assets/21/xxhdpi.zip
index 62983df..9f0d778 100644
--- a/hostsidetests/theme/assets/21/xxhdpi.zip
+++ b/hostsidetests/theme/assets/21/xxhdpi.zip
Binary files differ
diff --git a/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java b/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java
index 0bfecdc..50a2047 100644
--- a/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java
+++ b/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java
@@ -47,7 +47,7 @@
  */
 public class TaskSwitchingTest extends DeviceTestCase implements IBuildReceiver {
     private static final String TAG = "TaskSwitchingTest";
-    private final static String CTS_RUNNER = "android.test.InstrumentationCtsTestRunner";
+    private final static String RUNNER = "android.support.test.runner.AndroidJUnitRunner";
     private CtsBuildHelper mBuild;
     private ITestDevice mDevice;
     private String mCtsReport = null;
@@ -92,7 +92,7 @@
     public void testTaskswitching() throws Exception {
         HostReportLog report =
                 new HostReportLog(mDevice.getSerialNumber(), ReportLog.getClassMethodNames());
-        RemoteAndroidTestRunner testRunner = new RemoteAndroidTestRunner(PACKAGES[0], CTS_RUNNER,
+        RemoteAndroidTestRunner testRunner = new RemoteAndroidTestRunner(PACKAGES[0], RUNNER,
                 mDevice.getIDevice());
         LocalListener listener = new LocalListener();
         mDevice.runInstrumentationTests(testRunner, listener);
diff --git a/tests/Android.mk b/tests/Android.mk
index 3f5b753..f66946a 100644
--- a/tests/Android.mk
+++ b/tests/Android.mk
@@ -21,7 +21,6 @@
               $(call all-renderscript-files-under, src)\
               src/android/app/cts/ISecondary.aidl\
               src/android/os/cts/IEmptyService.aidl\
-              src/android/security/cts/activity/ISecureRandomService.aidl
 
 LOCAL_JAVA_LIBRARIES := android.test.runner
 
diff --git a/tests/jni/Android.mk b/tests/jni/Android.mk
index 139118d..d9bc51b 100644
--- a/tests/jni/Android.mk
+++ b/tests/jni/Android.mk
@@ -26,7 +26,6 @@
 		android_os_cts_TaggedPointer.cpp \
 		android_os_cts_OSFeatures.cpp \
 		android_os_cts_FileUtils.cpp \
-		android_net_cts_NetlinkSocket.cpp
 
 LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
 
diff --git a/tests/jni/CtsJniOnLoad.cpp b/tests/jni/CtsJniOnLoad.cpp
index e0bb813..06be7c7 100644
--- a/tests/jni/CtsJniOnLoad.cpp
+++ b/tests/jni/CtsJniOnLoad.cpp
@@ -16,7 +16,6 @@
 
 #include <jni.h>
 #include <stdio.h>
-#include "android_net_cts_NetlinkSocket.h"
 
 extern int register_android_os_cts_CpuFeatures(JNIEnv*);
 
@@ -49,9 +48,5 @@
       return JNI_ERR;
     }
 
-    if (register_android_net_cts_NetlinkSocket(env)) {
-        return JNI_ERR;
-    }
-
     return JNI_VERSION_1_4;
 }
diff --git a/tests/jni/android_os_cts_FileUtils.cpp b/tests/jni/android_os_cts_FileUtils.cpp
index d78d26c..2b7e282 100644
--- a/tests/jni/android_os_cts_FileUtils.cpp
+++ b/tests/jni/android_os_cts_FileUtils.cpp
@@ -22,6 +22,7 @@
 #include <sys/errno.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <assert.h>
 
 static jclass gFileStatusClass;
 static jfieldID gFileStatusDevFieldID;
@@ -122,8 +123,10 @@
 int register_android_os_cts_FileUtils(JNIEnv* env)
 {
     jclass clazz = env->FindClass("android/os/cts/FileUtils");
+    assert(clazz != null);
 
     gFileStatusClass = env->FindClass("android/os/cts/FileUtils$FileStatus");
+    assert(gFileStatusClass != null);
     gFileStatusDevFieldID = env->GetFieldID(gFileStatusClass, "dev", "I");
     gFileStatusInoFieldID = env->GetFieldID(gFileStatusClass, "ino", "I");
     gFileStatusModeFieldID = env->GetFieldID(gFileStatusClass, "mode", "I");
diff --git a/tests/tests/accessibilityservice/AndroidManifest.xml b/tests/tests/accessibilityservice/AndroidManifest.xml
index 4039193..0d452ae 100644
--- a/tests/tests/accessibilityservice/AndroidManifest.xml
+++ b/tests/tests/accessibilityservice/AndroidManifest.xml
@@ -19,10 +19,12 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.android.cts.accessibilityservice">
 
-  <uses-sdk android:minSdkVersion="18"
-          android:targetSdkVersion="18" />
+   <uses-sdk android:minSdkVersion="18"
+           android:targetSdkVersion="18" />
 
-  <application android:theme="@android:style/Theme.Holo.NoActionBar" >
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+
+    <application android:theme="@android:style/Theme.Holo.NoActionBar" >
 
       <uses-library android:name="android.test.runner"/>
 
diff --git a/tests/tests/hardware/Android.mk b/tests/tests/hardware/Android.mk
index 7a1b271..e77ac7b 100644
--- a/tests/tests/hardware/Android.mk
+++ b/tests/tests/hardware/Android.mk
@@ -23,7 +23,15 @@
 
 LOCAL_SDK_VERSION := current
 
+# TODO: sensors need to be refactored out into their own namespace: android.hardware.sensors.cts
 LOCAL_SRC_FILES := $(call all-java-files-under, src/android/hardware/cts/helpers)
+LOCAL_SRC_FILES += \
+    src/android/hardware/cts/SensorTestCase.java \
+    src/android/hardware/cts/SingleSensorTests.java \
+    src/android/hardware/cts/SensorIntegrationTests.java \
+    src/android/hardware/cts/SensorTest.java \
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil
 
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/AllocationTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/AllocationTest.java
index fb23a5f..92a5e58 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/AllocationTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/AllocationTest.java
@@ -20,7 +20,7 @@
 import static android.hardware.camera2.cts.helpers.Preconditions.*;
 import static android.hardware.camera2.cts.helpers.AssertHelpers.*;
 import static android.hardware.camera2.cts.CameraTestUtils.*;
-import static com.android.ex.camera2.blocking.BlockingStateListener.*;
+import static com.android.ex.camera2.blocking.BlockingStateCallback.*;
 
 import android.content.Context;
 import android.graphics.ImageFormat;
@@ -56,8 +56,8 @@
 import android.view.Surface;
 
 import com.android.ex.camera2.blocking.BlockingCameraManager.BlockingOpenException;
-import com.android.ex.camera2.blocking.BlockingStateListener;
-import com.android.ex.camera2.blocking.BlockingSessionListener;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -78,8 +78,8 @@
     private CameraManager mCameraManager;
     private CameraDevice mCamera;
     private CameraCaptureSession mSession;
-    private BlockingStateListener mCameraListener;
-    private BlockingSessionListener mSessionListener;
+    private BlockingStateCallback mCameraListener;
+    private BlockingSessionCallback mSessionListener;
 
     private String[] mCameraIds;
 
@@ -107,7 +107,7 @@
         mHandlerThread = new HandlerThread("AllocationTest");
         mHandlerThread.start();
         mHandler = new Handler(mHandlerThread.getLooper());
-        mCameraListener = new BlockingStateListener();
+        mCameraListener = new BlockingStateCallback();
 
         mCameraIterable = new CameraIterable();
         mSizeIterable = new SizeIterable();
@@ -360,7 +360,7 @@
         assertNotNull("Failed to get Surface", cameraTarget);
         outputSurfaces.add(cameraTarget);
 
-        mSessionListener = new BlockingSessionListener();
+        mSessionListener = new BlockingSessionCallback();
         mCamera.createCaptureSession(outputSurfaces, mSessionListener, mHandler);
         mSession = mSessionListener.waitAndGetSession(SESSION_CONFIGURE_TIMEOUT_MS);
         CaptureRequest.Builder captureBuilder =
@@ -384,7 +384,7 @@
         checkNotNull("request", request);
         checkNotNull("graph", graph);
 
-        mSession.capture(request, new CameraCaptureSession.CaptureListener() {
+        mSession.capture(request, new CameraCaptureSession.CaptureCallback() {
             @Override
             public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request,
                     TotalCaptureResult result) {
@@ -402,7 +402,7 @@
         if (VERBOSE) Log.v(TAG, "Stopping capture and waiting for idle");
         // Stop repeat, wait for captures to complete, and disconnect from surfaces
         mSession.close();
-        mSessionListener.getStateWaiter().waitForState(BlockingSessionListener.SESSION_CLOSED,
+        mSessionListener.getStateWaiter().waitForState(BlockingSessionCallback.SESSION_CLOSED,
                 SESSION_CLOSE_TIMEOUT_MS);
         mSession = null;
         mSessionListener = null;
@@ -824,7 +824,7 @@
 
             // TODO: start capture, i.e. configureOutputs
 
-            SimpleCaptureListener listener = new SimpleCaptureListener();
+            SimpleCaptureCallback listener = new SimpleCaptureCallback();
 
             if (!repeating) {
                 for (int i = 0; i < count; ++i) {
@@ -835,7 +835,7 @@
             }
 
             // Assume that the device is already IDLE.
-            mSessionListener.getStateWaiter().waitForState(BlockingSessionListener.SESSION_ACTIVE,
+            mSessionListener.getStateWaiter().waitForState(BlockingSessionCallback.SESSION_ACTIVE,
                     CAMERA_ACTIVE_TIMEOUT_MS);
 
             for (int i = 0; i < count; ++i) {
@@ -851,7 +851,7 @@
             if (repeating) {
                 mSession.stopRepeating();
                 mSessionListener.getStateWaiter().waitForState(
-                    BlockingSessionListener.SESSION_READY, CAMERA_IDLE_TIMEOUT_MS);
+                    BlockingSessionCallback.SESSION_READY, CAMERA_IDLE_TIMEOUT_MS);
             }
 
             // TODO: Make a Configure decorator or some such for configureOutputs
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
index 7ddae65..7f3c652 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
@@ -17,8 +17,8 @@
 package android.hardware.camera2.cts;
 
 import static android.hardware.camera2.cts.CameraTestUtils.*;
-import static com.android.ex.camera2.blocking.BlockingStateListener.*;
-import static com.android.ex.camera2.blocking.BlockingSessionListener.*;
+import static com.android.ex.camera2.blocking.BlockingStateCallback.*;
+import static com.android.ex.camera2.blocking.BlockingSessionCallback.*;
 import static org.mockito.Mockito.*;
 import static android.hardware.camera2.CaptureRequest.*;
 
@@ -40,8 +40,8 @@
 import android.util.Range;
 import android.view.Surface;
 
-import com.android.ex.camera2.blocking.BlockingSessionListener;
-import com.android.ex.camera2.blocking.BlockingStateListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
 import com.android.ex.camera2.utils.StateWaiter;
 
 import org.mockito.ArgumentMatcher;
@@ -65,9 +65,9 @@
 
     private CameraCaptureSession mSession;
 
-    private BlockingStateListener mCameraMockListener;
+    private BlockingStateCallback mCameraMockListener;
     private int mLatestDeviceState = STATE_UNINITIALIZED;
-    private BlockingSessionListener mSessionMockListener;
+    private BlockingSessionCallback mSessionMockListener;
     private StateWaiter mSessionWaiter;
     private int mLatestSessionState = -1; // uninitialized
 
@@ -95,7 +95,7 @@
          * Use spy object here since we want to use the SimpleDeviceListener callback
          * implementation (spy doesn't stub the functions unless we ask it to do so).
          */
-        mCameraMockListener = spy(new BlockingStateListener());
+        mCameraMockListener = spy(new BlockingStateCallback());
     }
 
     @Override
@@ -405,7 +405,7 @@
         // A cascade of Device->Session->Capture listeners, each of which invokes at least one
         // method on the camera device or session.
 
-        class ChainedCaptureListener extends CameraCaptureSession.CaptureListener {
+        class ChainedCaptureCallback extends CameraCaptureSession.CaptureCallback {
             public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request,
                     TotalCaptureResult result) {
                 try {
@@ -444,8 +444,8 @@
             }
         }
 
-        class ChainedSessionListener extends CameraCaptureSession.StateListener {
-            private final ChainedCaptureListener mCaptureListener = new ChainedCaptureListener();
+        class ChainedSessionListener extends CameraCaptureSession.StateCallback {
+            private final ChainedCaptureCallback mCaptureCallback = new ChainedCaptureCallback();
 
             public void onConfigured(CameraCaptureSession session) {
                 try {
@@ -456,7 +456,7 @@
                     session.getDevice();
                     session.abortCaptures();
                     // The important call for the next level of chaining
-                    session.capture(request.build(), mCaptureListener, mHandler);
+                    session.capture(request.build(), mCaptureCallback, mHandler);
                     // Some more calls
                     session.setRepeatingRequest(request.build(),
                             /*listener*/ null, /*handler*/ null);
@@ -479,7 +479,7 @@
             }
         }
 
-        class ChainedCameraListener extends CameraDevice.StateListener {
+        class ChainedCameraListener extends CameraDevice.StateCallback {
             private final ChainedSessionListener mSessionListener = new ChainedSessionListener();
 
             public CameraDevice cameraDevice;
@@ -760,19 +760,19 @@
         CaptureRequest.Builder requestBuilder = mCamera.createCaptureRequest(template);
         assertNotNull("Failed to create capture request", requestBuilder);
         requestBuilder.addTarget(mReaderSurface);
-        CameraCaptureSession.CaptureListener mockCaptureListener =
-                mock(CameraCaptureSession.CaptureListener.class);
+        CameraCaptureSession.CaptureCallback mockCaptureCallback =
+                mock(CameraCaptureSession.CaptureCallback.class);
 
         if (VERBOSE) {
             Log.v(TAG, String.format("Capturing shot for device %s, template %d",
                     id, template));
         }
 
-        startCapture(requestBuilder.build(), repeating, mockCaptureListener, mHandler);
+        startCapture(requestBuilder.build(), repeating, mockCaptureCallback, mHandler);
         waitForSessionState(SESSION_ACTIVE, SESSION_ACTIVE_TIMEOUT_MS);
 
         int expectedCaptureResultCount = repeating ? REPEATING_CAPTURE_EXPECTED_RESULT_COUNT : 1;
-        verifyCaptureResults(mockCaptureListener, expectedCaptureResultCount);
+        verifyCaptureResults(mockCaptureCallback, expectedCaptureResultCount);
 
         if (repeating) {
             if (abort) {
@@ -802,18 +802,18 @@
             requestBuilder.addTarget(mReaderSurface);
             requests.add(requestBuilder.build());
         }
-        CameraCaptureSession.CaptureListener mockCaptureListener =
-                mock(CameraCaptureSession.CaptureListener.class);
+        CameraCaptureSession.CaptureCallback mockCaptureCallback =
+                mock(CameraCaptureSession.CaptureCallback.class);
 
         if (VERBOSE) {
             Log.v(TAG, String.format("Capturing burst shot for device %s", id));
         }
 
         if (!repeating) {
-            mSession.captureBurst(requests, mockCaptureListener, mHandler);
+            mSession.captureBurst(requests, mockCaptureCallback, mHandler);
         }
         else {
-            mSession.setRepeatingBurst(requests, mockCaptureListener, mHandler);
+            mSession.setRepeatingBurst(requests, mockCaptureCallback, mHandler);
         }
         waitForSessionState(SESSION_ACTIVE, SESSION_READY_TIMEOUT_MS);
 
@@ -822,7 +822,7 @@
             expectedResultCount *= REPEATING_CAPTURE_EXPECTED_RESULT_COUNT;
         }
 
-        verifyCaptureResults(mockCaptureListener, expectedResultCount);
+        verifyCaptureResults(mockCaptureCallback, expectedResultCount);
 
         if (repeating) {
             if (abort) {
@@ -854,7 +854,7 @@
         }
 
         // Create a new session listener each time, it's not reusable across cameras
-        mSessionMockListener = spy(new BlockingSessionListener());
+        mSessionMockListener = spy(new BlockingSessionCallback());
         mSessionWaiter = mSessionMockListener.getStateWaiter();
 
         List<Surface> outputSurfaces = new ArrayList<>(Arrays.asList(mReaderSurface));
@@ -876,7 +876,7 @@
     }
 
     private void verifyCaptureResults(
-            CameraCaptureSession.CaptureListener mockListener,
+            CameraCaptureSession.CaptureCallback mockListener,
             int expectResultCount) {
         final int TIMEOUT_PER_RESULT_MS = 2000;
         // Should receive expected number of capture results.
@@ -1304,11 +1304,11 @@
      *
      * @param request The {@link #CaptureRequest} to be captured.
      * @param repeating If the capture is single capture or repeating.
-     * @param listener The {@link #CaptureListener} camera device used to notify callbacks.
+     * @param listener The {@link #CaptureCallback} camera device used to notify callbacks.
      * @param handler The handler camera device used to post callbacks.
      */
     protected void startCapture(CaptureRequest request, boolean repeating,
-            CameraCaptureSession.CaptureListener listener, Handler handler)
+            CameraCaptureSession.CaptureCallback listener, Handler handler)
                     throws CameraAccessException {
         if (VERBOSE) Log.v(TAG, "Starting capture from session");
 
@@ -1321,7 +1321,7 @@
 
     /**
      * Close a {@link #CameraCaptureSession capture session}; blocking until
-     * the close finishes with a transition to {@link CameraCaptureSession.StateListener#onClosed}.
+     * the close finishes with a transition to {@link CameraCaptureSession.StateCallback#onClosed}.
      */
     protected void closeSession() {
         if (mSession == null) {
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
index a8c9896..192fb85 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
@@ -25,16 +25,16 @@
 import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CameraDevice;
-import android.hardware.camera2.CameraDevice.StateListener;
+import android.hardware.camera2.CameraDevice.StateCallback;
 import android.hardware.camera2.CameraManager;
-import android.hardware.camera2.cts.CameraTestUtils.MockStateListener;
+import android.hardware.camera2.cts.CameraTestUtils.MockStateCallback;
 import android.hardware.camera2.cts.helpers.CameraErrorCollector;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.test.AndroidTestCase;
 import android.util.Log;
 
-import com.android.ex.camera2.blocking.BlockingStateListener;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
 
 import org.mockito.ArgumentCaptor;
 import org.mockito.InOrder;
@@ -56,7 +56,7 @@
     private NoopCameraListener mListener;
     private HandlerThread mHandlerThread;
     private Handler mHandler;
-    private BlockingStateListener mCameraListener;
+    private BlockingStateCallback mCameraListener;
     private CameraErrorCollector mCollector;
 
     @Override
@@ -81,7 +81,7 @@
          */
         System.setProperty("dexmaker.dexcache", getContext().getCacheDir().toString());
 
-        mCameraListener = spy(new BlockingStateListener());
+        mCameraListener = spy(new BlockingStateCallback());
 
         mHandlerThread = new HandlerThread(TAG);
         mHandlerThread.start();
@@ -205,13 +205,13 @@
             for (int j = 0; j < NUM_CAMERA_REOPENS; j++) {
                 CameraDevice camera = null;
                 try {
-                    MockStateListener mockListener = MockStateListener.mock();
-                    mCameraListener = new BlockingStateListener(mockListener);
+                    MockStateCallback mockListener = MockStateCallback.mock();
+                    mCameraListener = new BlockingStateCallback(mockListener);
 
                     mCameraManager.openCamera(ids[i], mCameraListener, mHandler);
 
                     // Block until unConfigured
-                    mCameraListener.waitForState(BlockingStateListener.STATE_OPENED,
+                    mCameraListener.waitForState(BlockingStateCallback.STATE_OPENED,
                             CameraTestUtils.CAMERA_IDLE_TIMEOUT_MS);
 
                     // Ensure state transitions are in right order:
@@ -241,19 +241,19 @@
         }
 
         List<CameraDevice> cameraList = new ArrayList<CameraDevice>();
-        List<MockStateListener> listenerList = new ArrayList<MockStateListener>();
-        List<BlockingStateListener> blockingListenerList = new ArrayList<BlockingStateListener>();
+        List<MockStateCallback> listenerList = new ArrayList<MockStateCallback>();
+        List<BlockingStateCallback> blockingListenerList = new ArrayList<BlockingStateCallback>();
         try {
             for (int i = 0; i < ids.length; i++) {
                 // Ignore state changes from other cameras
-                MockStateListener mockListener = MockStateListener.mock();
-                mCameraListener = new BlockingStateListener(mockListener);
+                MockStateCallback mockListener = MockStateCallback.mock();
+                mCameraListener = new BlockingStateCallback(mockListener);
 
                 /**
                  * Track whether or not we got a synchronous error from openCamera.
                  *
                  * A synchronous error must also be accompanied by an asynchronous
-                 * StateListener#onError callback.
+                 * StateCallback#onError callback.
                  */
                 boolean expectingError = false;
 
@@ -271,16 +271,16 @@
                 }
 
                 List<Integer> expectedStates = new ArrayList<Integer>();
-                expectedStates.add(BlockingStateListener.STATE_OPENED);
-                expectedStates.add(BlockingStateListener.STATE_ERROR);
+                expectedStates.add(BlockingStateCallback.STATE_OPENED);
+                expectedStates.add(BlockingStateCallback.STATE_ERROR);
                 int state = mCameraListener.waitForAnyOfStates(
                         expectedStates, CameraTestUtils.CAMERA_IDLE_TIMEOUT_MS);
 
                 // It's possible that we got an asynchronous error transition only. This is ok.
                 if (expectingError) {
                     assertEquals("Throwing a CAMERA_ERROR exception must be accompanied with a " +
-                            "StateListener#onError callback",
-                            BlockingStateListener.STATE_ERROR, state);
+                            "StateCallback#onError callback",
+                            BlockingStateCallback.STATE_ERROR, state);
                 }
 
                 /**
@@ -297,7 +297,7 @@
                  */
 
                 CameraDevice camera;
-                if (state == BlockingStateListener.STATE_ERROR) {
+                if (state == BlockingStateCallback.STATE_ERROR) {
                     // Camera did not open because too many other cameras were opened
                     // => onError called exactly once with a non-null camera
                     assertTrue("At least one camera must be opened successfully",
@@ -309,13 +309,13 @@
                     verify(mockListener)
                             .onError(
                                     argument.capture(),
-                                    eq(CameraDevice.StateListener.ERROR_MAX_CAMERAS_IN_USE));
+                                    eq(CameraDevice.StateCallback.ERROR_MAX_CAMERAS_IN_USE));
                     verifyNoMoreInteractions(mockListener);
 
                     camera = argument.getValue();
                     assertNotNull("Expected a non-null camera for the error transition for ID: "
                             + ids[i], camera);
-                } else if (state == BlockingStateListener.STATE_OPENED) {
+                } else if (state == BlockingStateCallback.STATE_OPENED) {
                     // Camera opened successfully.
                     // => onOpened called exactly once
                     camera = verifyCameraStateOpened(cameraId,
@@ -334,9 +334,9 @@
             for (CameraDevice camera : cameraList) {
                 camera.close();
             }
-            for (BlockingStateListener blockingListener : blockingListenerList) {
+            for (BlockingStateCallback blockingListener : blockingListenerList) {
                 blockingListener.waitForState(
-                        BlockingStateListener.STATE_CLOSED,
+                        BlockingStateCallback.STATE_CLOSED,
                         CameraTestUtils.CAMERA_IDLE_TIMEOUT_MS);
             }
         }
@@ -346,7 +346,7 @@
          * after closing the cameras.
          */
         int i = 0;
-        for (MockStateListener listener : listenerList) {
+        for (MockStateCallback listener : listenerList) {
             CameraDevice camera = cameraList.get(i);
 
             verify(listener).onClosed(eq(camera));
@@ -373,7 +373,7 @@
      * @return The camera device (non-{@code null}).
      */
     private static CameraDevice verifyCameraStateOpened(String cameraId,
-            MockStateListener listener) {
+            MockStateCallback listener) {
         ArgumentCaptor<CameraDevice> argument =
                 ArgumentCaptor.forClass(CameraDevice.class);
         InOrder inOrder = inOrder(listener);
@@ -411,13 +411,13 @@
             mCollector.setCameraId(ids[i]);
 
             try {
-                MockStateListener mockSuccessListener = MockStateListener.mock();
-                MockStateListener mockFailListener = MockStateListener.mock();
+                MockStateCallback mockSuccessListener = MockStateCallback.mock();
+                MockStateCallback mockFailListener = MockStateCallback.mock();
 
-                BlockingStateListener successListener =
-                        new BlockingStateListener(mockSuccessListener);
-                BlockingStateListener failListener =
-                        new BlockingStateListener(mockFailListener);
+                BlockingStateCallback successListener =
+                        new BlockingStateCallback(mockSuccessListener);
+                BlockingStateCallback failListener =
+                        new BlockingStateCallback(mockFailListener);
 
                 mCameraManager.openCamera(ids[i], successListener, mHandler);
 
@@ -434,7 +434,7 @@
                             CameraAccessException.CAMERA_ERROR, e.getReason());
                 }
 
-                successListener.waitForState(BlockingStateListener.STATE_OPENED,
+                successListener.waitForState(BlockingStateCallback.STATE_OPENED,
                         CameraTestUtils.CAMERA_IDLE_TIMEOUT_MS);
                 // Have to get the successCamera here, otherwise, it won't be
                 // closed if STATE_ERROR timeout exception occurs.
@@ -442,7 +442,7 @@
                         ArgumentCaptor.forClass(CameraDevice.class);
                 verify(mockSuccessListener, atLeastOnce()).onOpened(argument.capture());
 
-                failListener.waitForState(BlockingStateListener.STATE_ERROR,
+                failListener.waitForState(BlockingStateCallback.STATE_ERROR,
                         CameraTestUtils.CAMERA_IDLE_TIMEOUT_MS);
 
                 successCamera = verifyCameraStateOpened(
@@ -451,7 +451,7 @@
                 verify(mockFailListener)
                         .onError(
                                 and(notNull(CameraDevice.class), not(eq(successCamera))),
-                                eq(StateListener.ERROR_CAMERA_IN_USE));
+                                eq(StateCallback.ERROR_CAMERA_IN_USE));
                 verifyNoMoreInteractions(mockFailListener);
             } finally {
                 if (successCamera != null) {
@@ -461,7 +461,7 @@
         }
     }
 
-    private class NoopCameraListener extends CameraManager.AvailabilityListener {
+    private class NoopCameraListener extends CameraManager.AvailabilityCallback {
         @Override
         public void onCameraAvailable(String cameraId) {
             // No-op
@@ -480,11 +480,11 @@
      * a listener that isn't registered should have no effect.
      */
     public void testCameraManagerListener() throws Exception {
-        mCameraManager.removeAvailabilityListener(mListener);
-        mCameraManager.addAvailabilityListener(mListener, mHandler);
-        mCameraManager.addAvailabilityListener(mListener, mHandler);
-        mCameraManager.removeAvailabilityListener(mListener);
-        mCameraManager.removeAvailabilityListener(mListener);
+        mCameraManager.unregisterAvailabilityCallback(mListener);
+        mCameraManager.registerAvailabilityCallback(mListener, mHandler);
+        mCameraManager.registerAvailabilityCallback(mListener, mHandler);
+        mCameraManager.unregisterAvailabilityCallback(mListener);
+        mCameraManager.unregisterAvailabilityCallback(mListener);
 
         // TODO: test the listener callbacks
     }
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
index 1f4fc49..f6fc86f 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
@@ -16,7 +16,7 @@
 
 package android.hardware.camera2.cts;
 
-import static com.android.ex.camera2.blocking.BlockingStateListener.*;
+import static com.android.ex.camera2.blocking.BlockingStateCallback.*;
 
 import android.graphics.BitmapFactory;
 import android.graphics.ImageFormat;
@@ -31,6 +31,7 @@
 import android.hardware.camera2.CaptureRequest;
 import android.hardware.camera2.CaptureResult;
 import android.hardware.camera2.TotalCaptureResult;
+import android.hardware.cts.helpers.CameraUtils;
 import android.util.Size;
 import android.hardware.camera2.params.MeteringRectangle;
 import android.hardware.camera2.params.StreamConfigurationMap;
@@ -43,8 +44,8 @@
 
 import com.android.ex.camera2.blocking.BlockingCameraManager;
 import com.android.ex.camera2.blocking.BlockingCameraManager.BlockingOpenException;
-import com.android.ex.camera2.blocking.BlockingSessionListener;
-import com.android.ex.camera2.blocking.BlockingStateListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
 import com.android.ex.camera2.exceptions.TimeoutRuntimeException;
 
 import junit.framework.Assert;
@@ -195,7 +196,7 @@
         }
     }
 
-    public static class SimpleCaptureListener extends CameraCaptureSession.CaptureListener {
+    public static class SimpleCaptureCallback extends CameraCaptureSession.CaptureCallback {
         private final LinkedBlockingQueue<CaptureResult> mQueue =
                 new LinkedBlockingQueue<CaptureResult>();
 
@@ -292,7 +293,7 @@
      *            If opening times out. Typically unrecoverable.
      */
     public static CameraDevice openCamera(CameraManager manager, String cameraId,
-            CameraDevice.StateListener listener, Handler handler) throws CameraAccessException,
+            CameraDevice.StateCallback listener, Handler handler) throws CameraAccessException,
             BlockingOpenException {
 
         /**
@@ -338,9 +339,9 @@
      */
     public static CameraCaptureSession configureCameraSession(CameraDevice camera,
             List<Surface> outputSurfaces,
-            CameraCaptureSession.StateListener listener, Handler handler)
+            CameraCaptureSession.StateCallback listener, Handler handler)
             throws CameraAccessException {
-        BlockingSessionListener sessionListener = new BlockingSessionListener(listener);
+        BlockingSessionCallback sessionListener = new BlockingSessionCallback(listener);
         camera.createCaptureSession(outputSurfaces, sessionListener, handler);
 
         return sessionListener.waitAndGetSession(SESSION_CONFIGURE_TIMEOUT_MS);
@@ -522,13 +523,8 @@
     public static class SizeComparator implements Comparator<Size> {
         @Override
         public int compare(Size lhs, Size rhs) {
-            long left = lhs.getWidth() * lhs.getHeight();
-            long right = rhs.getWidth() * rhs.getHeight();
-            if (left == right) {
-                left = lhs.getWidth();
-                right = rhs.getWidth();
-            }
-            return (left < right) ? -1 : (left > right ? 1 : 0);
+            return CameraUtils
+                    .compareSizes(lhs.getWidth(), lhs.getHeight(), rhs.getWidth(), rhs.getHeight());
         }
     }
 
@@ -781,19 +777,19 @@
     }
 
     /**
-     * Provide a mock for {@link CameraDevice.StateListener}.
+     * Provide a mock for {@link CameraDevice.StateCallback}.
      *
-     * <p>Only useful because mockito can't mock {@link CameraDevice.StateListener} which is an
+     * <p>Only useful because mockito can't mock {@link CameraDevice.StateCallback} which is an
      * abstract class.</p>
      *
      * <p>
      * Use this instead of other classes when needing to verify interactions, since
-     * trying to spy on {@link BlockingStateListener} (or others) will cause unnecessary extra
+     * trying to spy on {@link BlockingStateCallback} (or others) will cause unnecessary extra
      * interactions which will cause false test failures.
      * </p>
      *
      */
-    public static class MockStateListener extends CameraDevice.StateListener {
+    public static class MockStateCallback extends CameraDevice.StateCallback {
 
         @Override
         public void onOpened(CameraDevice camera) {
@@ -807,13 +803,13 @@
         public void onError(CameraDevice camera, int error) {
         }
 
-        private MockStateListener() {}
+        private MockStateCallback() {}
 
         /**
-         * Create a Mockito-ready mocked StateListener.
+         * Create a Mockito-ready mocked StateCallback.
          */
-        public static MockStateListener mock() {
-            return Mockito.spy(new MockStateListener());
+        public static MockStateCallback mock() {
+            return Mockito.spy(new MockStateCallback());
         }
     }
 
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
index fd4f338..3d55c85 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
@@ -27,7 +27,7 @@
 import android.hardware.camera2.CameraMetadata;
 import android.hardware.camera2.CaptureRequest;
 import android.hardware.camera2.CaptureResult;
-import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureListener;
+import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureCallback;
 import android.hardware.camera2.cts.testcases.Camera2SurfaceViewTestCase;
 import android.hardware.camera2.params.ColorSpaceTransform;
 import android.hardware.camera2.params.Face;
@@ -138,7 +138,7 @@
                     continue;
                 }
 
-                SimpleCaptureListener listener = new SimpleCaptureListener();
+                SimpleCaptureCallback listener = new SimpleCaptureCallback();
                 CaptureRequest.Builder requestBuilder =
                         mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
 
@@ -156,7 +156,7 @@
 
                 // Double the exposure time and gain, with black level still being locked.
                 changeExposure(requestBuilder, DEFAULT_EXP_TIME_NS * 2, DEFAULT_SENSITIVITY * 2);
-                listener = new SimpleCaptureListener();
+                listener = new SimpleCaptureCallback();
                 startPreview(requestBuilder, previewSz, listener);
                 waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
                 // Allow at most one lock OFF state as the exposure is changed once.
@@ -191,7 +191,7 @@
                     continue;
                 }
 
-                SimpleCaptureListener listener = new SimpleCaptureListener();
+                SimpleCaptureCallback listener = new SimpleCaptureCallback();
                 CaptureRequest.Builder requestBuilder =
                         mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
 
@@ -204,7 +204,7 @@
                 Size previewSz =
                         getMaxPreviewSize(mCamera.getId(), mCameraManager, PREVIEW_SIZE_BOUND);
 
-                listener = new SimpleCaptureListener();
+                listener = new SimpleCaptureCallback();
                 startPreview(requestBuilder, previewSz, listener);
                 waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
                 verifyShadingMap(listener, NUM_FRAMES_VERIFIED, SHADING_MODE_OFF);
@@ -213,7 +213,7 @@
                 // should output valid maps.
                 requestBuilder.set(CaptureRequest.SHADING_MODE, SHADING_MODE_FAST);
 
-                listener = new SimpleCaptureListener();
+                listener = new SimpleCaptureCallback();
                 startPreview(requestBuilder, previewSz, listener);
                 waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
                 // Allow at most one lock OFF state as the exposure is changed once.
@@ -223,7 +223,7 @@
                 // should output valid maps.
                 requestBuilder.set(CaptureRequest.SHADING_MODE, SHADING_MODE_HIGH_QUALITY);
 
-                listener = new SimpleCaptureListener();
+                listener = new SimpleCaptureCallback();
                 startPreview(requestBuilder, previewSz, listener);
                 waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
                 verifyShadingMap(listener, NUM_FRAMES_VERIFIED, SHADING_MODE_HIGH_QUALITY);
@@ -309,7 +309,7 @@
             try {
                 openDevice(mCameraIds[i]);
 
-                SimpleCaptureListener listener = new SimpleCaptureListener();
+                SimpleCaptureCallback listener = new SimpleCaptureCallback();
                 CaptureRequest.Builder requestBuilder =
                         mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
 
@@ -555,12 +555,12 @@
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
         int[] availableModes = mStaticInfo.getAvailableNoiseReductionModesChecked();
-        SimpleCaptureListener resultListener = new SimpleCaptureListener();
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
         startPreview(requestBuilder, maxPrevSize, resultListener);
 
         for (int mode : availableModes) {
             requestBuilder.set(CaptureRequest.NOISE_REDUCTION_MODE, mode);
-            resultListener = new SimpleCaptureListener();
+            resultListener = new SimpleCaptureCallback();
             mSession.setRepeatingRequest(requestBuilder.build(), resultListener, mHandler);
             waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
 
@@ -583,7 +583,7 @@
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
         requestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF);
-        SimpleCaptureListener resultListener = new SimpleCaptureListener();
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
         startPreview(requestBuilder, maxPrevSize, resultListener);
 
         CaptureRequest request;
@@ -591,7 +591,7 @@
         for (int i = 0; i < testDistances.length; i++) {
             requestBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, testDistances[i]);
             request = requestBuilder.build();
-            resultListener = new SimpleCaptureListener();
+            resultListener = new SimpleCaptureCallback();
             mSession.setRepeatingRequest(request, resultListener, mHandler);
             waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
             resultDistances[i] = verifyFocusDistanceControl(testDistances[i], request,
@@ -614,7 +614,7 @@
             if (hyperFocalDistance > 0) {
                 requestBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, hyperFocalDistance);
                 request = requestBuilder.build();
-                resultListener = new SimpleCaptureListener();
+                resultListener = new SimpleCaptureCallback();
                 mSession.setRepeatingRequest(request, resultListener, mHandler);
                 waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
 
@@ -651,7 +651,7 @@
      * @return the result focus distance
      */
     private float verifyFocusDistanceControl(float distance, CaptureRequest request,
-            SimpleCaptureListener resultListener) {
+            SimpleCaptureCallback resultListener) {
         // Need make sure the result corresponding to the request is back, then check.
         CaptureResult result =
                 resultListener.getCaptureResultForRequest(request, NUM_RESULTS_WAIT_TIMEOUT);
@@ -682,12 +682,12 @@
         int[] edgeModes = mStaticInfo.getAvailableEdgeModesChecked();
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-        SimpleCaptureListener resultListener = new SimpleCaptureListener();
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
         startPreview(requestBuilder, maxPrevSize, resultListener);
 
         for (int mode : edgeModes) {
             requestBuilder.set(CaptureRequest.EDGE_MODE, mode);
-            resultListener = new SimpleCaptureListener();
+            resultListener = new SimpleCaptureCallback();
             mSession.setRepeatingRequest(requestBuilder.build(), resultListener, mHandler);
             waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
 
@@ -717,7 +717,7 @@
         updatePreviewSurface(maxPreviewSz);
         CaptureRequest.Builder manualRequestBuilder = createRequestForPreview();
         CaptureRequest.Builder previewRequestBuilder = createRequestForPreview();
-        SimpleCaptureListener listener = new SimpleCaptureListener();
+        SimpleCaptureCallback listener = new SimpleCaptureCallback();
 
         startPreview(previewRequestBuilder, maxPreviewSz, listener);
 
@@ -814,7 +814,7 @@
      * @param listener The Capture listener that is used to wait for capture result
      * @param aeMode The AE mode for flash to test with
      */
-    private void flashTestByAeMode(SimpleCaptureListener listener, int aeMode) throws Exception {
+    private void flashTestByAeMode(SimpleCaptureCallback listener, int aeMode) throws Exception {
         CaptureResult result;
         final int NUM_FLASH_REQUESTS_TESTED = 10;
         CaptureRequest.Builder requestBuilder = createRequestForPreview();
@@ -892,7 +892,7 @@
                 result.get(CaptureResult.FLASH_MODE));
     }
 
-    private void verifyAntiBandingMode(SimpleCaptureListener listener, int numFramesVerified,
+    private void verifyAntiBandingMode(SimpleCaptureCallback listener, int numFramesVerified,
             int mode, boolean isAeManual, long requestExpTime) throws Exception {
         // Skip the first a couple of frames as antibanding may not be fully up yet.
         final int NUM_FRAMES_SKIPPED = 5;
@@ -959,7 +959,7 @@
         requestBuilder.set(CaptureRequest.CONTROL_AE_ANTIBANDING_MODE, mode);
 
         // Test auto AE mode anti-banding behavior
-        SimpleCaptureListener resultListener = new SimpleCaptureListener();
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
         startPreview(requestBuilder, size, resultListener);
         waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
         verifyAntiBandingMode(resultListener, NUM_FRAMES_VERIFIED, mode, /*isAeManual*/false,
@@ -970,7 +970,7 @@
         final long TEST_MANUAL_EXP_TIME_NS = 65000000L;
         long manualExpTime = mStaticInfo.getExposureClampToRange(TEST_MANUAL_EXP_TIME_NS);
         changeExposure(requestBuilder, manualExpTime);
-        resultListener = new SimpleCaptureListener();
+        resultListener = new SimpleCaptureCallback();
         startPreview(requestBuilder, size, resultListener);
         waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
         verifyAntiBandingMode(resultListener, NUM_FRAMES_VERIFIED, mode, /*isAeManual*/true,
@@ -1053,7 +1053,7 @@
         }
 
         final int NUM_CAPTURES_BEFORE_LOCK = 2;
-        SimpleCaptureListener listener =  new SimpleCaptureListener();
+        SimpleCaptureCallback listener =  new SimpleCaptureCallback();
 
         CaptureResult[] resultsDuringLock = new CaptureResult[numCapturesDuringLock];
 
@@ -1119,7 +1119,7 @@
 
         requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CONTROL_AE_MODE_OFF);
         configurePreviewOutput(requestBuilder);
-        SimpleCaptureListener listener =  new SimpleCaptureListener();
+        SimpleCaptureCallback listener =  new SimpleCaptureCallback();
 
         long[] expTimes = getExposureTimeTestValues();
         int[] sensitivities = getSensitivityTestValues();
@@ -1151,7 +1151,7 @@
     /**
      * Verify black level lock control.
      */
-    private void verifyBlackLevelLockResults(SimpleCaptureListener listener, int numFramesVerified,
+    private void verifyBlackLevelLockResults(SimpleCaptureCallback listener, int numFramesVerified,
             int maxLockOffCnt) throws Exception {
         int noLockCnt = 0;
         for (int i = 0; i < numFramesVerified; i++) {
@@ -1175,7 +1175,7 @@
     /**
      * Verify shading map for different shading modes.
      */
-    private void verifyShadingMap(SimpleCaptureListener listener, int numFramesVerified,
+    private void verifyShadingMap(SimpleCaptureCallback listener, int numFramesVerified,
             int shadingMode) throws Exception {
 
         for (int i = 0; i < numFramesVerified; i++) {
@@ -1225,7 +1225,7 @@
     private void faceDetectionTestByCamera() throws Exception {
         int[] faceDetectModes = mStaticInfo.getAvailableFaceDetectModesChecked();
 
-        SimpleCaptureListener listener;
+        SimpleCaptureCallback listener;
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
 
@@ -1238,7 +1238,7 @@
 
             // Create a new listener for each run to avoid the results from one run spill
             // into another run.
-            listener = new SimpleCaptureListener();
+            listener = new SimpleCaptureCallback();
             startPreview(requestBuilder, maxPreviewSz, listener);
             waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
             verifyFaceDetectionResults(listener, NUM_FACE_DETECTION_FRAMES_VERIFIED, mode);
@@ -1254,7 +1254,7 @@
      * @param numFramesVerified Number of results to be verified
      * @param faceDetectionMode Face detection mode to be verified against
      */
-    private void verifyFaceDetectionResults(SimpleCaptureListener listener, int numFramesVerified,
+    private void verifyFaceDetectionResults(SimpleCaptureCallback listener, int numFramesVerified,
             int faceDetectionMode) {
         for (int i = 0; i < numFramesVerified; i++) {
             CaptureResult result = listener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
@@ -1337,7 +1337,7 @@
             return;
         }
 
-        SimpleCaptureListener listener;
+        SimpleCaptureCallback listener;
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
 
@@ -1356,7 +1356,7 @@
                 requestBuilder.set(CaptureRequest.TONEMAP_CURVE, tcLinear);
                 // Create a new listener for each run to avoid the results from one run spill
                 // into another run.
-                listener = new SimpleCaptureListener();
+                listener = new SimpleCaptureCallback();
                 startPreview(requestBuilder, maxPreviewSz, listener);
                 waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
                 verifyToneMapModeResults(listener, NUM_FRAMES_VERIFIED, mode,
@@ -1367,7 +1367,7 @@
                 requestBuilder.set(CaptureRequest.TONEMAP_CURVE, tcSrgb);
                 // Create a new listener for each run to avoid the results from one run spill
                 // into another run.
-                listener = new SimpleCaptureListener();
+                listener = new SimpleCaptureCallback();
                 startPreview(requestBuilder, maxPreviewSz, listener);
                 waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
                 verifyToneMapModeResults(listener, NUM_FRAMES_VERIFIED, mode,
@@ -1375,7 +1375,7 @@
             } else {
                 // Create a new listener for each run to avoid the results from one run spill
                 // into another run.
-                listener = new SimpleCaptureListener();
+                listener = new SimpleCaptureCallback();
                 startPreview(requestBuilder, maxPreviewSz, listener);
                 waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
                 verifyToneMapModeResults(listener, NUM_FRAMES_VERIFIED, mode,
@@ -1398,7 +1398,7 @@
      * @param inputToneCurve Tonemap curve used by all 3 channels, ignored when
      * map mode is not CONTRAST_CURVE.
      */
-    private void verifyToneMapModeResults(SimpleCaptureListener listener, int numFramesVerified,
+    private void verifyToneMapModeResults(SimpleCaptureCallback listener, int numFramesVerified,
             int tonemapMode, float[] inputToneCurve) {
         final int MIN_TONEMAP_CURVE_POINTS = 2;
         final Float ZERO = new Float(0);
@@ -1459,9 +1459,9 @@
         startPreview(requestBuilder, maxPreviewSize, /*listener*/null);
 
         for (int mode : awbModes) {
-            SimpleCaptureListener listener;
+            SimpleCaptureCallback listener;
             requestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, mode);
-            listener = new SimpleCaptureListener();
+            listener = new SimpleCaptureCallback();
             mSession.setRepeatingRequest(requestBuilder.build(), listener, mHandler);
             waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
 
@@ -1471,7 +1471,7 @@
 
             // Verify color correction transform and gains stay unchanged after a lock.
             requestBuilder.set(CaptureRequest.CONTROL_AWB_LOCK, true);
-            listener = new SimpleCaptureListener();
+            listener = new SimpleCaptureCallback();
             mSession.setRepeatingRequest(requestBuilder.build(), listener, mHandler);
             waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
 
@@ -1484,7 +1484,7 @@
         }
     }
 
-    private void verifyAwbCaptureResultUnchanged(SimpleCaptureListener listener,
+    private void verifyAwbCaptureResultUnchanged(SimpleCaptureCallback listener,
             int numFramesVerified) {
         // Skip check if cc gains/transform/mode are not available
         if (!mStaticInfo.areKeysAvailable(
@@ -1532,9 +1532,9 @@
         startPreview(requestBuilder, maxPreviewSize, /*listener*/null);
 
         for (int mode : afModes) {
-            SimpleCaptureListener listener;
+            SimpleCaptureCallback listener;
             requestBuilder.set(CaptureRequest.CONTROL_AF_MODE, mode);
-            listener = new SimpleCaptureListener();
+            listener = new SimpleCaptureCallback();
             mSession.setRepeatingRequest(requestBuilder.build(), listener, mHandler);
             waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
 
@@ -1571,11 +1571,11 @@
         Size maxPreviewSize = mOrderedPreviewSizes.get(0);
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-        SimpleCaptureListener listener = new SimpleCaptureListener();
+        SimpleCaptureCallback listener = new SimpleCaptureCallback();
         startPreview(requestBuilder, maxPreviewSize, listener);
 
         for (int mode : videoStabModes) {
-            listener = new SimpleCaptureListener();
+            listener = new SimpleCaptureCallback();
             requestBuilder.set(CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE, mode);
             mSession.setRepeatingRequest(requestBuilder.build(), listener, mHandler);
             waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
@@ -1584,7 +1584,7 @@
         }
 
         for (int mode : opticalStabModes) {
-            listener = new SimpleCaptureListener();
+            listener = new SimpleCaptureCallback();
             requestBuilder.set(CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE, mode);
             mSession.setRepeatingRequest(requestBuilder.build(), listener, mHandler);
             waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
@@ -1630,7 +1630,7 @@
         MeteringRectangle[][] expectRegions = new MeteringRectangle[ZOOM_STEPS][];
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-        SimpleCaptureListener listener = new SimpleCaptureListener();
+        SimpleCaptureCallback listener = new SimpleCaptureCallback();
 
         updatePreviewSurface(previewSize);
         configurePreviewOutput(requestBuilder);
@@ -1793,13 +1793,13 @@
         Size maxPreviewSize = mOrderedPreviewSizes.get(0);
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-        SimpleCaptureListener listener = new SimpleCaptureListener();
+        SimpleCaptureCallback listener = new SimpleCaptureCallback();
         requestBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_USE_SCENE_MODE);
         startPreview(requestBuilder, maxPreviewSize, listener);
 
         for(int mode : sceneModes) {
             requestBuilder.set(CaptureRequest.CONTROL_SCENE_MODE, mode);
-            listener = new SimpleCaptureListener();
+            listener = new SimpleCaptureCallback();
             mSession.setRepeatingRequest(requestBuilder.build(), listener, mHandler);
             waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
 
@@ -1817,12 +1817,12 @@
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
         requestBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);
-        SimpleCaptureListener listener = new SimpleCaptureListener();
+        SimpleCaptureCallback listener = new SimpleCaptureCallback();
         startPreview(requestBuilder, maxPreviewSize, listener);
 
         for(int mode : effectModes) {
             requestBuilder.set(CaptureRequest.CONTROL_EFFECT_MODE, mode);
-            listener = new SimpleCaptureListener();
+            listener = new SimpleCaptureCallback();
             mSession.setRepeatingRequest(requestBuilder.build(), listener, mHandler);
             waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
 
@@ -1999,7 +1999,7 @@
      * @param numFramesVerified The number of capture results to be verified
      */
     private <T> void verifyCaptureResultForKey(CaptureResult.Key<T> key, T requestMode,
-            SimpleCaptureListener listener, int numFramesVerified) {
+            SimpleCaptureCallback listener, int numFramesVerified) {
         for (int i = 0; i < numFramesVerified; i++) {
             CaptureResult result = listener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
             validatePipelineDepth(result);
@@ -2035,7 +2035,7 @@
         Range<Integer>[] fpsRanges = mStaticInfo.getAeAvailableTargetFpsRangesChecked();
         boolean antiBandingOffIsSupported = mStaticInfo.isAntiBandingOffModeSupported();
         Range<Integer> fpsRange;
-        SimpleCaptureListener resultListener;
+        SimpleCaptureCallback resultListener;
 
         for (int i = 0; i < fpsRanges.length; i += 1) {
             fpsRange = fpsRanges[i];
@@ -2065,7 +2065,7 @@
                         " mode");
             }
 
-            resultListener = new SimpleCaptureListener();
+            resultListener = new SimpleCaptureCallback();
             startPreview(requestBuilder, previewSz, resultListener);
             long[] frameDurationRange =
                     new long[]{(long) (1e9 / fpsRange.getUpper()), (long) (1e9 / fpsRange.getLower())};
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
index 4b01081..79507d1 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
@@ -113,7 +113,7 @@
                 requestBuilder.addTarget(mReaderSurface);
 
                 // Start capture
-                SimpleCaptureListener captureListener = new SimpleCaptureListener();
+                SimpleCaptureCallback captureListener = new SimpleCaptureCallback();
                 startCapture(requestBuilder.build(), /*repeating*/true, captureListener, mHandler);
 
                 // Get the waived keys for current camera device
@@ -293,10 +293,10 @@
                 multiBuilder.addTarget(previewReader.getSurface());
                 multiBuilder.addTarget(jpegReader.getSurface());
 
-                CaptureListener mockCaptureListener = getMockCaptureListener();
+                CaptureCallback mockCaptureCallback = getMockCaptureListener();
 
                 // Capture targeting only preview
-                Pair<TotalCaptureResult, Long> result = captureAndVerifyResult(mockCaptureListener,
+                Pair<TotalCaptureResult, Long> result = captureAndVerifyResult(mockCaptureCallback,
                         session, previewBuilder.build(), mHandler);
 
                 // Check if all timestamps are the same
@@ -304,7 +304,7 @@
                         prevListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS), result.second);
 
                 // Capture targeting both jpeg and preview
-                Pair<TotalCaptureResult, Long> result2 = captureAndVerifyResult(mockCaptureListener,
+                Pair<TotalCaptureResult, Long> result2 = captureAndVerifyResult(mockCaptureCallback,
                         session, multiBuilder.build(), mHandler);
 
                 // Check if all timestamps are the same
@@ -319,9 +319,9 @@
 
                 // Capture two preview frames
                 long startTime = SystemClock.elapsedRealtimeNanos();
-                Pair<TotalCaptureResult, Long> result3 = captureAndVerifyResult(mockCaptureListener,
+                Pair<TotalCaptureResult, Long> result3 = captureAndVerifyResult(mockCaptureCallback,
                         session, previewBuilder.build(), mHandler);
-                Pair<TotalCaptureResult, Long> result4 = captureAndVerifyResult(mockCaptureListener,
+                Pair<TotalCaptureResult, Long> result4 = captureAndVerifyResult(mockCaptureCallback,
                         session, previewBuilder.build(), mHandler);
                 long clockDiff = SystemClock.elapsedRealtimeNanos() - startTime;
                 long resultDiff = result4.second - result3.second;
@@ -352,7 +352,7 @@
                 resultImage.getTimestamp(), captureTime);
     }
 
-    private void validateCaptureResult(SimpleCaptureListener captureListener,
+    private void validateCaptureResult(SimpleCaptureCallback captureListener,
             List<CaptureResult.Key<?>> skippedKeys, CaptureRequest.Builder requestBuilder,
             int numFramesVerified) throws Exception {
         CaptureResult result = null;
@@ -533,7 +533,7 @@
      * with multiple handlers.</p>
      * */
     private static class TotalAndPartialResultListener
-            extends CameraCaptureSession.CaptureListener {
+            extends CameraCaptureSession.CaptureCallback {
         static final int ERROR_DUPLICATED_REQUEST = 1 << 0;
         static final int ERROR_WRONG_CALLBACK_ORDER = 1 << 1;
 
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/DngCreatorTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/DngCreatorTest.java
index 1173eab..9ec649e 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/DngCreatorTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/DngCreatorTest.java
@@ -17,6 +17,7 @@
 package android.hardware.camera2.cts;
 
 import android.graphics.ImageFormat;
+import android.graphics.Rect;
 import android.hardware.camera2.CameraCaptureSession;
 import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CameraDevice;
@@ -40,6 +41,7 @@
 import java.util.List;
 
 import static android.hardware.camera2.cts.CameraTestUtils.configureCameraSession;
+import static android.hardware.camera2.cts.helpers.AssertHelpers.*;
 
 /**
  * Tests for the DngCreator API.
@@ -82,25 +84,34 @@
             try {
                 openDevice(deviceId);
 
-                Size[] targetCaptureSizes =
-                        mStaticInfo.getAvailableSizesForFormatChecked(ImageFormat.RAW_SENSOR,
-                                StaticMetadata.StreamDirection.Output);
-                if (targetCaptureSizes.length == 0) {
-                    if (VERBOSE) {
-                        Log.i(TAG, "Skipping testSingleImageBasic - " +
-                                "no raw output streams for camera " + deviceId);
-                    }
+                if (!mStaticInfo.isCapabilitySupported(
+                        CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_RAW)) {
+                    Log.i(TAG, "RAW capability is not supported in camera " + mCameraIds[i] +
+                            ". Skip the test.");
                     continue;
                 }
 
-                Size s = targetCaptureSizes[0];
+                Size[] targetCaptureSizes =
+                        mStaticInfo.getAvailableSizesForFormatChecked(ImageFormat.RAW_SENSOR,
+                                StaticMetadata.StreamDirection.Output);
+
+                assertTrue("No capture sizes available for RAW format!",
+                        targetCaptureSizes.length != 0);
+                Rect activeArray = mStaticInfo.getActiveArraySizeChecked();
+                Size activeArraySize = new Size(activeArray.width(), activeArray.height());
+                assertTrue("Missing ActiveArraySize", activeArray.width() > 0 &&
+                        activeArray.height() > 0);
+                // TODO: Allow PixelArraySize also.
+                assertArrayContains("Available sizes for RAW format must include ActiveArraySize",
+                        targetCaptureSizes, activeArraySize);
 
                 // Create capture image reader
                 CameraTestUtils.SimpleImageReaderListener captureListener
                         = new CameraTestUtils.SimpleImageReaderListener();
-                captureReader = createImageReader(s, ImageFormat.RAW_SENSOR, 2,
+                captureReader = createImageReader(activeArraySize, ImageFormat.RAW_SENSOR, 2,
                         captureListener);
-                Pair<Image, CaptureResult> resultPair = captureSingleRawShot(s, captureReader, captureListener);
+                Pair<Image, CaptureResult> resultPair = captureSingleRawShot(activeArraySize,
+                        captureReader, captureListener);
                 CameraCharacteristics characteristics = mStaticInfo.getCharacteristics();
 
                 // Test simple writeImage, no header checks
@@ -159,16 +170,26 @@
             try {
                 openDevice(deviceId);
 
+                if (!mStaticInfo.isCapabilitySupported(
+                        CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_RAW)) {
+                    Log.i(TAG, "RAW capability is not supported in camera " + mCameraIds[i] +
+                            ". Skip the test.");
+                    continue;
+                }
+
                 Size[] targetCaptureSizes =
                         mStaticInfo.getAvailableSizesForFormatChecked(ImageFormat.RAW_SENSOR,
                                 StaticMetadata.StreamDirection.Output);
-                if (targetCaptureSizes.length == 0) {
-                    if (VERBOSE) {
-                        Log.i(TAG, "Skipping testSingleImageThumbnail - " +
-                                "no raw output streams for camera " + deviceId);
-                    }
-                    continue;
-                }
+
+                assertTrue("No capture sizes available for RAW format!",
+                        targetCaptureSizes.length != 0);
+                Rect activeArray = mStaticInfo.getActiveArraySizeChecked();
+                Size activeArraySize = new Size(activeArray.width(), activeArray.height());
+                assertTrue("Missing ActiveArraySize", activeArray.width() > 0 &&
+                        activeArray.height() > 0);
+                // TODO: Allow PixelArraySize also.
+                assertArrayContains("Available sizes for RAW format must include ActiveArraySize",
+                        targetCaptureSizes, activeArraySize);
 
                 Size[] targetPreviewSizes =
                         mStaticInfo.getAvailableSizesForFormatChecked(ImageFormat.YUV_420_888,
@@ -176,12 +197,10 @@
                 // Get smallest preview size
                 Size previewSize = mOrderedPreviewSizes.get(mOrderedPreviewSizes.size() - 1);
 
-                Size s = targetCaptureSizes[0];
-
                 // Create capture image reader
                 CameraTestUtils.SimpleImageReaderListener captureListener
                         = new CameraTestUtils.SimpleImageReaderListener();
-                captureReaders.add(createImageReader(s, ImageFormat.RAW_SENSOR, 2,
+                captureReaders.add(createImageReader(activeArraySize, ImageFormat.RAW_SENSOR, 2,
                         captureListener));
                 captureListeners.add(captureListener);
 
@@ -192,8 +211,8 @@
                         previewListener));
                 captureListeners.add(previewListener);
 
-                Pair<List<Image>, CaptureResult> resultPair = captureSingleRawShot(s, captureReaders,
-                        captureListeners);
+                Pair<List<Image>, CaptureResult> resultPair = captureSingleRawShot(activeArraySize,
+                        captureReaders, captureListeners);
                 CameraCharacteristics characteristics = mStaticInfo.getCharacteristics();
 
                 // Test simple writeImage, no header checks
@@ -290,8 +309,8 @@
         CaptureRequest.Builder request = prepareCaptureRequestForSurfaces(outputSurfaces);
         request.set(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE,
                 CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE_ON);
-        CameraTestUtils.SimpleCaptureListener resultListener =
-                new CameraTestUtils.SimpleCaptureListener();
+        CameraTestUtils.SimpleCaptureCallback resultListener =
+                new CameraTestUtils.SimpleCaptureCallback();
 
         startCapture(request.build(), /*repeating*/false, resultListener, mHandler);
 
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
index a44b255..7d2341a 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
@@ -218,7 +218,7 @@
                 outputSurfaces.add(yuvSurface);
                 outputSurfaces.add(captureSurface);
                 CaptureRequest.Builder request = prepareCaptureRequestForSurfaces(outputSurfaces);
-                SimpleCaptureListener resultListener = new SimpleCaptureListener();
+                SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
 
                 for (int i = 0; i < NUM_SINGLE_CAPTURE_TESTED; i++) {
                     startCapture(request.build(), /*repeating*/false, resultListener, mHandler);
@@ -278,7 +278,7 @@
 
                 // Start capture.
                 CaptureRequest request = prepareCaptureRequest();
-                SimpleCaptureListener listener = new SimpleCaptureListener();
+                SimpleCaptureCallback listener = new SimpleCaptureCallback();
                 startCapture(request, repeating, listener, mHandler);
 
                 int numFrameVerified = repeating ? NUM_FRAME_VERIFIED : 1;
@@ -305,7 +305,7 @@
      * @param size The capture size.
      * @param listener The capture listener to get capture result callbacks.
      */
-    private void validateCaptureResult(int format, Size size, SimpleCaptureListener listener,
+    private void validateCaptureResult(int format, Size size, SimpleCaptureCallback listener,
             int numFrameVerified) {
         for (int i = 0; i < numFrameVerified; i++) {
             CaptureResult result = listener.getCaptureResult(CAPTURE_RESULT_TIMEOUT_MS);
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java
index 72e18bb..1033ecd 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java
@@ -126,7 +126,7 @@
             // The only error accepted is ERROR_MAX_CAMERAS_IN_USE, which means HAL doesn't support
             // concurrent camera streaming
             assertEquals("Camera device open failed",
-                    CameraDevice.StateListener.ERROR_MAX_CAMERAS_IN_USE, e.getCode());
+                    CameraDevice.StateCallback.ERROR_MAX_CAMERAS_IN_USE, e.getCode());
             Log.i(TAG, "Camera HAL does not support dual camera preview. Skip the test");
         } finally {
             for (int i = 0; i < NUM_CAMERAS_TESTED; i++) {
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
index 761a5a3..aeab4cf 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
@@ -16,11 +16,11 @@
 
 package android.hardware.camera2.cts;
 
-import static com.android.ex.camera2.blocking.BlockingSessionListener.*;
+import static com.android.ex.camera2.blocking.BlockingSessionCallback.*;
 
 import android.graphics.ImageFormat;
 import android.hardware.camera2.CameraCaptureSession;
-import android.hardware.camera2.CameraCaptureSession.CaptureListener;
+import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.CaptureRequest;
 import android.hardware.camera2.CaptureResult;
@@ -43,7 +43,7 @@
 import com.android.cts.util.ResultType;
 import com.android.cts.util.ResultUnit;
 import com.android.cts.util.Stat;
-import com.android.ex.camera2.blocking.BlockingSessionListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
 import com.android.ex.camera2.exceptions.TimeoutRuntimeException;
 
 import java.util.ArrayList;
@@ -121,8 +121,8 @@
                         configureStreamTimes[i] = configureTimeMs - openTimeMs;
 
                         // Blocking start preview (start preview to first image arrives)
-                        CameraTestUtils.SimpleCaptureListener resultListener =
-                                new CameraTestUtils.SimpleCaptureListener();
+                        CameraTestUtils.SimpleCaptureCallback resultListener =
+                                new CameraTestUtils.SimpleCaptureCallback();
                         blockingStartPreview(resultListener, imageListener);
                         previewStartedTimeMs = SystemClock.elapsedRealtime();
                         startPreviewTimes[i] = previewStartedTimeMs - configureTimeMs;
@@ -203,8 +203,8 @@
                             mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
                     CaptureRequest.Builder captureBuilder =
                             mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
-                    CameraTestUtils.SimpleCaptureListener previewResultListener =
-                            new CameraTestUtils.SimpleCaptureListener();
+                    CameraTestUtils.SimpleCaptureCallback previewResultListener =
+                            new CameraTestUtils.SimpleCaptureCallback();
                     SimpleTimingResultListener captureResultListener =
                             new SimpleTimingResultListener();
                     SimpleImageListener imageListener = new SimpleImageListener();
@@ -267,7 +267,7 @@
                 CameraTestUtils.SESSION_CLOSE_TIMEOUT_MS);
     }
 
-    private void blockingStartPreview(CaptureListener listener, SimpleImageListener imageListener)
+    private void blockingStartPreview(CaptureCallback listener, SimpleImageListener imageListener)
             throws Exception {
         if (mPreviewSurface == null || mReaderSurface == null) {
             throw new IllegalStateException("preview and reader surface must be initilized first");
@@ -281,7 +281,7 @@
         imageListener.waitForImageAvailable(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
     }
 
-    private void blockingCaptureImage(CaptureListener listener,
+    private void blockingCaptureImage(CaptureCallback listener,
             SimpleImageListener imageListener) throws Exception {
         if (mReaderSurface == null) {
             throw new IllegalStateException("reader surface must be initialized first");
@@ -301,7 +301,7 @@
         if (mPreviewSurface == null || mReaderSurface == null) {
             throw new IllegalStateException("preview and reader surface must be initilized first");
         }
-        mSessionListener = new BlockingSessionListener();
+        mSessionListener = new BlockingSessionCallback();
         List<Surface> outputSurfaces = new ArrayList<>();
         outputSurfaces.add(mPreviewSurface);
         outputSurfaces.add(mReaderSurface);
@@ -383,7 +383,7 @@
     }
 
     private static class SimpleTimingResultListener
-            extends CameraCaptureSession.CaptureListener {
+            extends CameraCaptureSession.CaptureCallback {
         private final LinkedBlockingQueue<Pair<CaptureResult, Long> > mPartialResultQueue =
                 new LinkedBlockingQueue<Pair<CaptureResult, Long> >();
         private final LinkedBlockingQueue<Pair<CaptureResult, Long> > mResultQueue =
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java
index f402da5..83c3afb 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java
@@ -12,7 +12,7 @@
 package android.hardware.camera2.cts;
 
 import static android.hardware.camera2.cts.CameraTestUtils.*;
-import static com.android.ex.camera2.blocking.BlockingSessionListener.*;
+import static com.android.ex.camera2.blocking.BlockingSessionCallback.*;
 
 import android.graphics.ImageFormat;
 import android.hardware.camera2.CameraCharacteristics;
@@ -39,7 +39,7 @@
 import android.util.Range;
 import android.view.Surface;
 
-import com.android.ex.camera2.blocking.BlockingSessionListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
 
 import junit.framework.AssertionFailedError;
 
@@ -337,7 +337,7 @@
         if (mReaderSurface != null) {
             outputSurfaces.add(mReaderSurface);
         }
-        mSessionListener = new BlockingSessionListener();
+        mSessionListener = new BlockingSessionCallback();
         mSession = configureCameraSession(mCamera, outputSurfaces, mSessionListener, mHandler);
 
         CaptureRequest.Builder recordingRequestBuilder =
@@ -581,7 +581,7 @@
             prepareRecordingWithProfile(profile);
 
             // prepare video snapshot
-            SimpleCaptureListener resultListener = new SimpleCaptureListener();
+            SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
             SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
             CaptureRequest.Builder videoSnapshotRequestBuilder =
                     mCamera.createCaptureRequest(CameraDevice.TEMPLATE_VIDEO_SNAPSHOT);
@@ -726,7 +726,7 @@
     }
 
     private void startRecording(boolean useMediaRecorder,
-            CameraCaptureSession.CaptureListener listener) throws Exception {
+            CameraCaptureSession.CaptureCallback listener) throws Exception {
         List<Surface> outputSurfaces = new ArrayList<Surface>(2);
         assertTrue("Both preview and recording surfaces should be valid",
                 mPreviewSurface.isValid() && mRecordingSurface.isValid());
@@ -736,7 +736,7 @@
         if (mReaderSurface != null) {
             outputSurfaces.add(mReaderSurface);
         }
-        mSessionListener = new BlockingSessionListener();
+        mSessionListener = new BlockingSessionCallback();
         mSession = configureCameraSession(mCamera, outputSurfaces, mSessionListener, mHandler);
 
         CaptureRequest.Builder recordingRequestBuilder =
@@ -841,7 +841,7 @@
      * Here frame drop is defined as frame duration >= 2 * expected frame duration.
      */
     private void validateFrameDropAroundVideoSnapshot(
-            SimpleCaptureListener resultListener, long imageTimeStamp) {
+            SimpleCaptureCallback resultListener, long imageTimeStamp) {
         int expectedDurationMs = 1000 / mVideoFrameRate;
         CaptureResult prevResult = resultListener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
         long prevTS = getValueNotNull(prevResult, CaptureResult.SENSOR_TIMESTAMP);
@@ -890,7 +890,7 @@
     /**
      * Validate frame jittering from the input simple listener's buffered results
      */
-    private void validateJittering(SimpleCaptureListener resultListener) {
+    private void validateJittering(SimpleCaptureCallback resultListener) {
         int expectedDurationMs = 1000 / mVideoFrameRate;
         CaptureResult prevResult = resultListener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
         long prevTS = getValueNotNull(prevResult, CaptureResult.SENSOR_TIMESTAMP);
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java
index bdbe44f..5b0f0fd 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java
@@ -25,7 +25,7 @@
 import android.util.Log;
 import android.view.Surface;
 
-import com.android.ex.camera2.blocking.BlockingSessionListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -60,12 +60,12 @@
                 CaptureRequest.Builder request =
                         mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
                 request.addTarget(surface);
-                CameraCaptureSession.CaptureListener mockCaptureListener =
-                        mock(CameraCaptureSession.CaptureListener.class);
+                CameraCaptureSession.CaptureCallback mockCaptureListener =
+                        mock(CameraCaptureSession.CaptureCallback.class);
 
                 // Check that correct session callback is hit.
-                CameraCaptureSession.StateListener sessionListener =
-                        mock(CameraCaptureSession.StateListener.class);
+                CameraCaptureSession.StateCallback sessionListener =
+                        mock(CameraCaptureSession.StateCallback.class);
                 mCamera.createCaptureSession(surfaces, sessionListener, mHandler);
                 verify(sessionListener, timeout(FAILED_CONFIGURE_TIMEOUT).atLeastOnce()).
                         onConfigureFailed(any(CameraCaptureSession.class));
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java
index 5c6328d..048b1cf 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java
@@ -17,6 +17,7 @@
 package android.hardware.camera2.cts;
 
 import static android.hardware.camera2.cts.CameraTestUtils.*;
+import static android.hardware.camera2.cts.helpers.AssertHelpers.assertArrayContains;
 import static junit.framework.Assert.assertNotNull;
 
 import android.graphics.ImageFormat;
@@ -32,7 +33,7 @@
 import android.media.ImageReader;
 import android.util.Pair;
 import android.util.Size;
-import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureListener;
+import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureCallback;
 import android.hardware.camera2.cts.CameraTestUtils.SimpleImageReaderListener;
 import android.hardware.camera2.cts.helpers.Camera2Focuser;
 import android.hardware.camera2.cts.testcases.Camera2SurfaceViewTestCase;
@@ -46,7 +47,7 @@
 import android.util.Rational;
 import android.view.Surface;
 
-import com.android.ex.camera2.blocking.BlockingSessionListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
 import com.android.ex.camera2.exceptions.TimeoutRuntimeException;
 
 import java.io.ByteArrayOutputStream;
@@ -391,8 +392,8 @@
         Size maxStillSz = mOrderedStillSizes.get(0);
         Size maxPreviewSz = mOrderedPreviewSizes.get(0);
 
-        SimpleCaptureListener resultListener = new SimpleCaptureListener();
-        SimpleCaptureListener stillResultListener = new SimpleCaptureListener();
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
+        SimpleCaptureCallback stillResultListener = new SimpleCaptureCallback();
         SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
         CaptureRequest.Builder previewRequest =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
@@ -443,7 +444,7 @@
         Size maxStillSz = mOrderedStillSizes.get(0);
         Size maxPreviewSz = mOrderedPreviewSizes.get(0);
         CaptureResult result;
-        SimpleCaptureListener resultListener = new SimpleCaptureListener();
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
         SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
         CaptureRequest.Builder previewRequest =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
@@ -496,7 +497,7 @@
         /**
          * Step 2: AF is already locked, wait for AWB converged, then lock it.
          */
-        resultListener = new SimpleCaptureListener();
+        resultListener = new SimpleCaptureCallback();
         boolean canSetAwbRegion =
                 (awbRegions != null) && isRegionsSupportedFor3A(MAX_REGIONS_AWB_INDEX);
         if (canSetAwbRegion) {
@@ -528,7 +529,7 @@
         /**
          * Step 3: trigger an AE precapture metering sequence and wait for AE converged.
          */
-        resultListener = new SimpleCaptureListener();
+        resultListener = new SimpleCaptureCallback();
         boolean canSetAeRegion =
                 (aeRegions != null) && isRegionsSupportedFor3A(MAX_REGIONS_AE_INDEX);
         if (canSetAeRegion) {
@@ -560,7 +561,7 @@
         /**
          * Step 4: take a picture when all 3A are in good state.
          */
-        resultListener = new SimpleCaptureListener();
+        resultListener = new SimpleCaptureCallback();
         CaptureRequest request = stillRequest.build();
         mSession.capture(request, resultListener, mHandler);
         // Validate the next result immediately for region and mode.
@@ -591,7 +592,7 @@
      * Test touch region for focus by camera.
      */
     private void touchForFocusTestByCamera() throws Exception {
-        SimpleCaptureListener listener = new SimpleCaptureListener();
+        SimpleCaptureCallback listener = new SimpleCaptureCallback();
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
         Size maxPreviewSz = mOrderedPreviewSizes.get(0);
@@ -610,7 +611,7 @@
     }
 
     private void previewStillCombinationTestByCamera() throws Exception {
-        SimpleCaptureListener resultListener = new SimpleCaptureListener();
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
         SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
 
         for (Size stillSz : mOrderedStillSizes)
@@ -641,140 +642,151 @@
     private void rawCaptureTestByCamera() throws Exception {
         Size maxPreviewSz = mOrderedPreviewSizes.get(0);
         Size[] rawSizes = mStaticInfo.getRawOutputSizesChecked();
-        for (Size size : rawSizes) {
-            if (VERBOSE) {
-                Log.v(TAG, "Testing Raw capture with size " + size.toString()
-                        + ", preview size " + maxPreviewSz);
-            }
 
-            // Prepare raw capture and start preview.
-            CaptureRequest.Builder previewBuilder =
-                    mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-            CaptureRequest.Builder rawBuilder =
-                    mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
-            SimpleCaptureListener resultListener = new SimpleCaptureListener();
-            SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
-            prepareRawCaptureAndStartPreview(previewBuilder, rawBuilder, maxPreviewSz, size,
-                    resultListener, imageListener);
+        assertTrue("No capture sizes available for RAW format!",
+                rawSizes.length != 0);
+        Rect activeArray = mStaticInfo.getActiveArraySizeChecked();
+        Size size = new Size(activeArray.width(), activeArray.height());
+        assertTrue("Missing ActiveArraySize", activeArray.width() > 0 &&
+                activeArray.height() > 0);
+        assertArrayContains("Available sizes for RAW format must include ActiveArraySize",
+                rawSizes, size);
 
-            CaptureRequest rawRequest = rawBuilder.build();
-            mSession.capture(rawRequest, resultListener, mHandler);
+        // Prepare raw capture and start preview.
+        CaptureRequest.Builder previewBuilder =
+                mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
+        CaptureRequest.Builder rawBuilder =
+                mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
+        SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
+        prepareRawCaptureAndStartPreview(previewBuilder, rawBuilder, maxPreviewSz, size,
+                resultListener, imageListener);
 
-            Image image = imageListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
-            validateRaw16Image(image, size);
-            if (DEBUG) {
-                byte[] rawBuffer = getDataFromImage(image);
-                String rawFileName =
-                        DEBUG_FILE_NAME_BASE + "/test" + "_" + size.toString() +
-                        "_cam" + mCamera.getId() +  ".raw16";
-                Log.d(TAG, "Dump raw file into " + rawFileName);
-                dumpFile(rawFileName, rawBuffer);
-            }
-
-            verifyRawCaptureResult(rawRequest, resultListener.getCaptureResultForRequest(rawRequest,
-                    NUM_RESULTS_WAIT_TIMEOUT));
-            stopPreview();
+        if (VERBOSE) {
+            Log.v(TAG, "Testing Raw capture with size " + size.toString()
+                    + ", preview size " + maxPreviewSz);
         }
+
+        CaptureRequest rawRequest = rawBuilder.build();
+        mSession.capture(rawRequest, resultListener, mHandler);
+
+        Image image = imageListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
+        validateRaw16Image(image, size);
+        if (DEBUG) {
+            byte[] rawBuffer = getDataFromImage(image);
+            String rawFileName = DEBUG_FILE_NAME_BASE + "/test" + "_" + size.toString() + "_cam" +
+                    mCamera.getId() + ".raw16";
+            Log.d(TAG, "Dump raw file into " + rawFileName);
+            dumpFile(rawFileName, rawBuffer);
+        }
+
+        verifyRawCaptureResult(rawRequest, resultListener.getCaptureResultForRequest(rawRequest,
+                NUM_RESULTS_WAIT_TIMEOUT));
+        stopPreview();
     }
 
     private void fullRawCaptureTestByCamera() throws Exception {
         Size maxPreviewSz = mOrderedPreviewSizes.get(0);
         Size maxStillSz = mOrderedStillSizes.get(0);
         Size[] rawSizes = mStaticInfo.getRawOutputSizesChecked();
-        for (Size size : rawSizes) {
-            if (VERBOSE) {
-                Log.v(TAG, "Testing multi capture with size " + size.toString()
-                        + ", preview size " + maxPreviewSz);
-            }
 
-            // Prepare raw capture and start preview.
-            CaptureRequest.Builder previewBuilder =
-                    mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-            CaptureRequest.Builder multiBuilder =
-                    mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
+        SimpleImageReaderListener jpegListener = new SimpleImageReaderListener();
+        SimpleImageReaderListener rawListener = new SimpleImageReaderListener();
 
-            SimpleCaptureListener resultListener = new SimpleCaptureListener();
-            SimpleImageReaderListener jpegListener = new SimpleImageReaderListener();
-            SimpleImageReaderListener rawListener = new SimpleImageReaderListener();
+        assertTrue("No capture sizes available for RAW format!",
+                rawSizes.length != 0);
+        Rect activeArray = mStaticInfo.getActiveArraySizeChecked();
+        Size size = new Size(activeArray.width(), activeArray.height());
+        assertTrue("Missing ActiveArraySize", activeArray.width() > 0 &&
+                activeArray.height() > 0);
+        assertArrayContains("Available sizes for RAW format must include ActiveArraySize",
+                rawSizes, size);
 
+        if (VERBOSE) {
+            Log.v(TAG, "Testing multi capture with size " + size.toString()
+                    + ", preview size " + maxPreviewSz);
+        }
+
+        // Prepare raw capture and start preview.
+        CaptureRequest.Builder previewBuilder =
+                mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
+        CaptureRequest.Builder multiBuilder =
+                mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
+
+        ImageReader rawReader = null;
+        ImageReader jpegReader = null;
+
+        try {
+            // Create ImageReaders.
+            rawReader = makeImageReader(size,
+                    ImageFormat.RAW_SENSOR, MAX_READER_IMAGES, rawListener, mHandler);
+            jpegReader = makeImageReader(maxStillSz,
+                    ImageFormat.JPEG, MAX_READER_IMAGES, jpegListener, mHandler);
             updatePreviewSurface(maxPreviewSz);
 
-            ImageReader rawReader = null;
-            ImageReader jpegReader = null;
-            try {
+            // Configure output streams with preview and jpeg streams.
+            List<Surface> outputSurfaces = new ArrayList<Surface>();
+            outputSurfaces.add(rawReader.getSurface());
+            outputSurfaces.add(jpegReader.getSurface());
+            outputSurfaces.add(mPreviewSurface);
+            mSessionListener = new BlockingSessionCallback();
+            mSession = configureCameraSession(mCamera, outputSurfaces,
+                    mSessionListener, mHandler);
 
-                // Create ImageReaders.
-                rawReader = makeImageReader(size,
-                        ImageFormat.RAW_SENSOR, MAX_READER_IMAGES, rawListener, mHandler);
-                jpegReader = makeImageReader(maxStillSz,
-                        ImageFormat.JPEG, MAX_READER_IMAGES, jpegListener, mHandler);
+            // Configure the requests.
+            previewBuilder.addTarget(mPreviewSurface);
+            multiBuilder.addTarget(mPreviewSurface);
+            multiBuilder.addTarget(rawReader.getSurface());
+            multiBuilder.addTarget(jpegReader.getSurface());
 
-                // Configure output streams with preview and jpeg streams.
-                List<Surface> outputSurfaces = new ArrayList<Surface>();
-                outputSurfaces.add(rawReader.getSurface());
-                outputSurfaces.add(jpegReader.getSurface());
-                outputSurfaces.add(mPreviewSurface);
-                mSessionListener = new BlockingSessionListener();
-                mSession = configureCameraSession(mCamera, outputSurfaces,
-                        mSessionListener, mHandler);
+            // Start preview.
+            mSession.setRepeatingRequest(previewBuilder.build(), null, mHandler);
 
-                // Configure the requests.
-                previewBuilder.addTarget(mPreviewSurface);
-                multiBuilder.addTarget(mPreviewSurface);
-                multiBuilder.addTarget(rawReader.getSurface());
-                multiBuilder.addTarget(jpegReader.getSurface());
+            // Poor man's 3A, wait 2 seconds for AE/AF (if any) to settle.
+            // TODO: Do proper 3A trigger and lock (see testTakePictureTest).
+            Thread.sleep(3000);
 
-                // Start preview.
-                mSession.setRepeatingRequest(previewBuilder.build(), null, mHandler);
+            multiBuilder.set(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE,
+                    CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE_ON);
+            CaptureRequest multiRequest = multiBuilder.build();
 
-                // Poor man's 3A, wait 2 seconds for AE/AF (if any) to settle.
-                // TODO: Do proper 3A trigger and lock (see testTakePictureTest).
-                Thread.sleep(3000);
+            mSession.capture(multiRequest, resultListener, mHandler);
 
-                multiBuilder.set(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE,
-                        CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE_ON);
-                CaptureRequest multiRequest = multiBuilder.build();
-
-                mSession.capture(multiRequest, resultListener, mHandler);
-
-                CaptureResult result = resultListener.getCaptureResultForRequest(multiRequest,
-                        NUM_RESULTS_WAIT_TIMEOUT);
-                Image jpegImage = jpegListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
-                basicValidateJpegImage(jpegImage, maxStillSz);
-                Image rawImage = rawListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
-                validateRaw16Image(rawImage, size);
-                verifyRawCaptureResult(multiRequest, result);
+            CaptureResult result = resultListener.getCaptureResultForRequest(multiRequest,
+                    NUM_RESULTS_WAIT_TIMEOUT);
+            Image jpegImage = jpegListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
+            basicValidateJpegImage(jpegImage, maxStillSz);
+            Image rawImage = rawListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
+            validateRaw16Image(rawImage, size);
+            verifyRawCaptureResult(multiRequest, result);
 
 
-                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-                try (DngCreator dngCreator =
-                        new DngCreator(mStaticInfo.getCharacteristics(), result)) {
-                    dngCreator.writeImage(outputStream, rawImage);
-                }
-
-                if (DEBUG) {
-                    byte[] rawBuffer = outputStream.toByteArray();
-                    String rawFileName =
-                            DEBUG_FILE_NAME_BASE + "/raw16_" + TAG + size.toString() +
-                                    "_cam_" + mCamera.getId() + ".dng";
-                    Log.d(TAG, "Dump raw file into " + rawFileName);
-                    dumpFile(rawFileName, rawBuffer);
-
-                    byte[] jpegBuffer = getDataFromImage(jpegImage);
-                    String jpegFileName =
-                            DEBUG_FILE_NAME_BASE + "/jpeg_" + TAG + size.toString() +
-                                    "_cam_" + mCamera.getId() + ".jpg";
-                    Log.d(TAG, "Dump jpeg file into " + rawFileName);
-                    dumpFile(jpegFileName, jpegBuffer);
-                }
-
-                stopPreview();
-            } finally {
-                CameraTestUtils.closeImageReader(rawReader);
-                CameraTestUtils.closeImageReader(jpegReader);
-                rawReader = null;
-                jpegReader = null;
+            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+            try (DngCreator dngCreator = new DngCreator(mStaticInfo.getCharacteristics(), result)) {
+                dngCreator.writeImage(outputStream, rawImage);
             }
+
+            if (DEBUG) {
+                byte[] rawBuffer = outputStream.toByteArray();
+                String rawFileName = DEBUG_FILE_NAME_BASE + "/raw16_" + TAG + size.toString() +
+                        "_cam_" + mCamera.getId() + ".dng";
+                Log.d(TAG, "Dump raw file into " + rawFileName);
+                dumpFile(rawFileName, rawBuffer);
+
+                byte[] jpegBuffer = getDataFromImage(jpegImage);
+                String jpegFileName = DEBUG_FILE_NAME_BASE + "/jpeg_" + TAG + size.toString() +
+                        "_cam_" + mCamera.getId() + ".jpg";
+                Log.d(TAG, "Dump jpeg file into " + rawFileName);
+                dumpFile(jpegFileName, jpegBuffer);
+            }
+
+            stopPreview();
+        } finally {
+            CameraTestUtils.closeImageReader(rawReader);
+            CameraTestUtils.closeImageReader(jpegReader);
+            rawReader = null;
+            jpegReader = null;
         }
     }
 
@@ -892,7 +904,7 @@
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
         CaptureRequest.Builder stillBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
-        SimpleCaptureListener resultListener = new SimpleCaptureListener();
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
         SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
         prepareStillCaptureAndStartPreview(previewBuilder, stillBuilder, maxPreviewSz, maxStillSz,
                 resultListener, imageListener);
@@ -1214,7 +1226,7 @@
 
         Size maxStillSz = mOrderedStillSizes.get(0);
         Size maxPreviewSz = mOrderedPreviewSizes.get(0);
-        SimpleCaptureListener resultListener = new SimpleCaptureListener();
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
         SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
         CaptureRequest.Builder previewRequest =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/SurfaceViewPreviewTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/SurfaceViewPreviewTest.java
index 6dd7c1e..aad9c2f 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/SurfaceViewPreviewTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/SurfaceViewPreviewTest.java
@@ -19,14 +19,14 @@
 import static android.hardware.camera2.cts.CameraTestUtils.*;
 
 import android.hardware.camera2.CameraCaptureSession;
-import android.hardware.camera2.CameraCaptureSession.CaptureListener;
+import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.CaptureFailure;
 import android.hardware.camera2.CaptureRequest;
 import android.hardware.camera2.CaptureResult;
 import android.hardware.camera2.TotalCaptureResult;
 import android.util.Size;
-import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureListener;
+import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureCallback;
 import android.hardware.camera2.cts.testcases.Camera2SurfaceViewTestCase;
 import android.util.Log;
 import android.util.Range;
@@ -64,7 +64,7 @@
      * Test all supported preview sizes for each camera device.
      * <p>
      * For the first  {@link #NUM_FRAMES_VERIFIED}  of capture results,
-     * the {@link CaptureListener} callback availability and the capture timestamp
+     * the {@link CaptureCallback} callback availability and the capture timestamp
      * (monotonically increasing) ordering are verified.
      * </p>
      */
@@ -129,7 +129,7 @@
         Range<Integer> fpsRange;
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-        SimpleCaptureListener resultListener = new SimpleCaptureListener();
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
         startPreview(requestBuilder, maxPreviewSz, resultListener);
 
         for (int i = 0; i < fpsRanges.length; i += 1) {
@@ -149,7 +149,7 @@
                         " mode");
             }
 
-            resultListener = new SimpleCaptureListener();
+            resultListener = new SimpleCaptureCallback();
             mSession.setRepeatingRequest(requestBuilder.build(), resultListener, mHandler);
 
             verifyPreviewTargetFpsRange(resultListener, NUM_FRAMES_VERIFIED, fpsRange,
@@ -159,7 +159,7 @@
         stopPreview();
     }
 
-    private void verifyPreviewTargetFpsRange(SimpleCaptureListener resultListener,
+    private void verifyPreviewTargetFpsRange(SimpleCaptureCallback resultListener,
             int numFramesVerified, Range<Integer> fpsRange, Size previewSz) {
         CaptureResult result = resultListener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
         List<Integer> capabilities = mStaticInfo.getAvailableCapabilitiesChecked();
@@ -206,11 +206,11 @@
             // TODO: vary the different settings like crop region to cover more cases.
             CaptureRequest.Builder requestBuilder =
                     mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-            CaptureListener mockCaptureListener =
-                    mock(CameraCaptureSession.CaptureListener.class);
+            CaptureCallback mockCaptureCallback =
+                    mock(CameraCaptureSession.CaptureCallback.class);
 
-            startPreview(requestBuilder, sz, mockCaptureListener);
-            verifyCaptureResults(mSession, mockCaptureListener, NUM_FRAMES_VERIFIED,
+            startPreview(requestBuilder, sz, mockCaptureCallback);
+            verifyCaptureResults(mSession, mockCaptureCallback, NUM_FRAMES_VERIFIED,
                     NUM_FRAMES_VERIFIED * FRAME_TIMEOUT_MS);
             stopPreview();
         }
@@ -221,7 +221,7 @@
         int[] testPatternModes = mStaticInfo.getAvailableTestPatternModesChecked();
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-        CaptureListener mockCaptureListener;
+        CaptureCallback mockCaptureCallback;
 
         final int[] TEST_PATTERN_DATA = {0, 0xFFFFFFFF, 0xFFFFFFFF, 0}; // G:100%, RB:0.
         for (int mode : testPatternModes) {
@@ -233,9 +233,9 @@
                 // Assign color pattern to SENSOR_TEST_PATTERN_MODE_DATA
                 requestBuilder.set(CaptureRequest.SENSOR_TEST_PATTERN_DATA, TEST_PATTERN_DATA);
             }
-            mockCaptureListener = mock(CaptureListener.class);
-            startPreview(requestBuilder, maxPreviewSize, mockCaptureListener);
-            verifyCaptureResults(mSession, mockCaptureListener, NUM_TEST_PATTERN_FRAMES_VERIFIED,
+            mockCaptureCallback = mock(CaptureCallback.class);
+            startPreview(requestBuilder, maxPreviewSize, mockCaptureCallback);
+            verifyCaptureResults(mSession, mockCaptureCallback, NUM_TEST_PATTERN_FRAMES_VERIFIED,
                     NUM_TEST_PATTERN_FRAMES_VERIFIED * FRAME_TIMEOUT_MS);
         }
 
@@ -256,7 +256,7 @@
 
     private void verifyCaptureResults(
             CameraCaptureSession session,
-            CaptureListener mockListener,
+            CaptureCallback mockListener,
             int expectResultCount,
             int timeOutMs) {
         // Should receive expected number of onCaptureStarted callbacks.
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/Camera2Focuser.java b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/Camera2Focuser.java
index c03caca..1c42629 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/Camera2Focuser.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/Camera2Focuser.java
@@ -19,7 +19,7 @@
 import android.graphics.Rect;
 import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCaptureSession;
-import android.hardware.camera2.CameraCaptureSession.CaptureListener;
+import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
 import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.params.MeteringRectangle;
@@ -215,7 +215,7 @@
         CaptureRequest.Builder requestBuilder = createRequestBuilder();
         mAutoFocus.setPassiveAutoFocus(/*picture*/true, mRepeatingBuilder);
         mAutoFocus.unlockAutoFocus(mRepeatingBuilder, requestBuilder);
-        CaptureListener listener = createCaptureListener();
+        CaptureCallback listener = createCaptureListener();
         mSession.setRepeatingRequest(mRepeatingBuilder.build(), listener, mHandler);
         mSession.capture(requestBuilder.build(), listener, mHandler);
     }
@@ -252,7 +252,7 @@
                 return;
             } else if (mSuccess) {
                 mAutoFocus.lockAutoFocus(mRepeatingBuilder, requestBuilder);
-                CaptureListener listener = createCaptureListener();
+                CaptureCallback listener = createCaptureListener();
                 mSession.setRepeatingRequest(mRepeatingBuilder.build(), listener, mHandler);
                 mSession.capture(requestBuilder.build(), listener, mHandler);
             } else {
@@ -276,7 +276,7 @@
         }
         mAutoFocus.resetState();
 
-        CaptureListener listener = createCaptureListener();
+        CaptureCallback listener = createCaptureListener();
         mSession.setRepeatingRequest(mRepeatingBuilder.build(), listener, mHandler);
         mSession.capture(requestBuilder.build(), listener, mHandler);
     }
@@ -332,7 +332,7 @@
         mAfRegions = new MeteringRectangle[] {
                 new MeteringRectangle(0, 0, 0, 0, MeteringRectangle.METERING_WEIGHT_DONT_CARE)};
     }
-    private CaptureListener createCaptureListener() {
+    private CaptureCallback createCaptureListener() {
 
         int thisAfRun;
         synchronized (this) {
@@ -341,7 +341,7 @@
 
         final int finalAfRun = thisAfRun;
 
-        return new CaptureListener() {
+        return new CaptureCallback() {
             private long mLatestFrameCount = -1;
 
             @Override
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/CameraSessionUtils.java b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/CameraSessionUtils.java
index 134d674..140a645 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/CameraSessionUtils.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/CameraSessionUtils.java
@@ -27,8 +27,8 @@
 import android.util.Pair;
 import android.view.Surface;
 
-import com.android.ex.camera2.blocking.BlockingCaptureListener;
-import com.android.ex.camera2.blocking.BlockingSessionListener;
+import com.android.ex.camera2.blocking.BlockingCaptureCallback;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
 import com.android.ex.camera2.exceptions.TimeoutRuntimeException;
 
 import junit.framework.Assert;
@@ -51,7 +51,7 @@
     /**
      * A blocking listener class for synchronously opening and configuring sessions.
      */
-    public static class SessionListener extends BlockingSessionListener {
+    public static class SessionListener extends BlockingSessionCallback {
         private final LinkedBlockingQueue<CameraCaptureSession> mSessionQueue =
                 new LinkedBlockingQueue<>();
 
@@ -91,7 +91,7 @@
     /**
      * A blocking listener class for synchronously capturing and results with a session.
      */
-    public static class CaptureListener extends BlockingCaptureListener {
+    public static class CaptureCallback extends BlockingCaptureCallback {
         private final LinkedBlockingQueue<TotalCaptureResult> mResultQueue =
                 new LinkedBlockingQueue<>();
         private final LinkedBlockingQueue<Long> mCaptureTimeQueue =
@@ -138,14 +138,14 @@
     }
 
     /**
-     * Get a mocked {@link CaptureListener}.
+     * Get a mocked {@link CaptureCallback}.
      */
-    public static CaptureListener getMockCaptureListener() {
-        return spy(new CaptureListener());
+    public static CaptureCallback getMockCaptureListener() {
+        return spy(new CaptureCallback());
     }
 
     /**
-     * Get a mocked {@link CaptureListener}.
+     * Get a mocked {@link CaptureCallback}.
      */
     public static SessionListener getMockSessionListener() {
         return spy(new SessionListener());
@@ -200,7 +200,7 @@
      * {@link CameraTestUtils#CAPTURE_RESULT_TIMEOUT_MS}.
      * </p>
      *
-     * @param listener a {@link CaptureListener} to use for callbacks.
+     * @param listener a {@link CaptureCallback} to use for callbacks.
      * @param session the {@link CameraCaptureSession} to use.
      * @param request the {@link CaptureRequest} to capture with.
      * @param handler the {@link Handler} to call callbacks on.
@@ -209,7 +209,7 @@
      * @throws CameraAccessException if any of the {@link CameraDevice} methods fail.
      * @throws TimeoutRuntimeException if no result was received before the timeout.
      */
-    public static Pair<TotalCaptureResult, Long> captureAndVerifyResult(CaptureListener listener,
+    public static Pair<TotalCaptureResult, Long> captureAndVerifyResult(CaptureCallback listener,
             CameraCaptureSession session, CaptureRequest request, Handler handler)
             throws CameraAccessException {
         checkNotNull(listener);
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java
index ed75d6c..5fc6321 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java
@@ -17,11 +17,11 @@
 package android.hardware.camera2.cts.testcases;
 
 import static android.hardware.camera2.cts.CameraTestUtils.*;
-import static com.android.ex.camera2.blocking.BlockingStateListener.*;
+import static com.android.ex.camera2.blocking.BlockingStateCallback.*;
 
 import android.content.Context;
 import android.hardware.camera2.CameraCaptureSession;
-import android.hardware.camera2.CameraCaptureSession.CaptureListener;
+import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.CameraManager;
 import android.hardware.camera2.CaptureRequest;
@@ -39,8 +39,8 @@
 import android.util.Log;
 import android.view.Surface;
 
-import com.android.ex.camera2.blocking.BlockingSessionListener;
-import com.android.ex.camera2.blocking.BlockingStateListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
 
 import java.util.List;
 
@@ -57,8 +57,8 @@
     protected CameraManager mCameraManager;
     protected CameraDevice mCamera;
     protected CameraCaptureSession mCameraSession;
-    protected BlockingSessionListener mCameraSessionListener;
-    protected BlockingStateListener mCameraListener;
+    protected BlockingSessionCallback mCameraSessionListener;
+    protected BlockingStateCallback mCameraListener;
     protected String[] mCameraIds;
     protected ImageReader mReader;
     protected Surface mReaderSurface;
@@ -79,7 +79,7 @@
 
     /**
      * Set up the camera2 test case required environments, including CameraManager,
-     * HandlerThread, Camera IDs, and CameraStateListener etc.
+     * HandlerThread, Camera IDs, and CameraStateCallback etc.
      */
     @Override
     protected void setUp() throws Exception {
@@ -98,7 +98,7 @@
         mHandlerThread = new HandlerThread(TAG);
         mHandlerThread.start();
         mHandler = new Handler(mHandlerThread.getLooper());
-        mCameraListener = new BlockingStateListener();
+        mCameraListener = new BlockingStateCallback();
         mCollector = new CameraErrorCollector();
     }
 
@@ -123,11 +123,11 @@
      *
      * @param request The {@link #CaptureRequest} to be captured.
      * @param repeating If the capture is single capture or repeating.
-     * @param listener The {@link #CaptureListener} camera device used to notify callbacks.
+     * @param listener The {@link #CaptureCallback} camera device used to notify callbacks.
      * @param handler The handler camera device used to post callbacks.
      */
     protected void startCapture(CaptureRequest request, boolean repeating,
-            CaptureListener listener, Handler handler) throws Exception {
+            CaptureCallback listener, Handler handler) throws Exception {
         if (VERBOSE) Log.v(TAG, "Starting capture from device");
 
         if (repeating) {
@@ -153,11 +153,11 @@
              */
             mCameraSession.abortCaptures();
             mCameraSessionListener.getStateWaiter().
-                    waitForState(BlockingSessionListener.SESSION_READY, CAMERA_IDLE_TIMEOUT_MS);
+                    waitForState(BlockingSessionCallback.SESSION_READY, CAMERA_IDLE_TIMEOUT_MS);
         } else {
             mCameraSession.close();
             mCameraSessionListener.getStateWaiter().
-                    waitForState(BlockingSessionListener.SESSION_CLOSED, CAMERA_IDLE_TIMEOUT_MS);
+                    waitForState(BlockingSessionCallback.SESSION_CLOSED, CAMERA_IDLE_TIMEOUT_MS);
         }
     }
 
@@ -175,9 +175,9 @@
      * Open a {@link #CameraDevice} and get the StaticMetadata for a given camera id and listener.
      *
      * @param cameraId The id of the camera device to be opened.
-     * @param listener The {@link #BlockingStateListener} used to wait for states.
+     * @param listener The {@link #BlockingStateCallback} used to wait for states.
      */
-    protected void openDevice(String cameraId, BlockingStateListener listener) throws Exception {
+    protected void openDevice(String cameraId, BlockingStateCallback listener) throws Exception {
         mCamera = CameraTestUtils.openCamera(
                 mCameraManager, cameraId, listener, mHandler);
         mCollector.setCameraId(cameraId);
@@ -199,7 +199,7 @@
      * @param outputSurfaces The set of output surfaces to configure for this session
      */
     protected void createSession(List<Surface> outputSurfaces) throws Exception {
-        mCameraSessionListener = new BlockingSessionListener();
+        mCameraSessionListener = new BlockingSessionCallback();
         mCameraSession = CameraTestUtils.configureCameraSession(mCamera, outputSurfaces,
                 mCameraSessionListener, mHandler);
     }
@@ -227,9 +227,9 @@
      * </p>
      *
      * @param cameraId The id of the camera device to be closed.
-     * @param listener The BlockingStateListener used to wait for states.
+     * @param listener The BlockingStateCallback used to wait for states.
      */
-    protected void closeDevice(String cameraId, BlockingStateListener listener) {
+    protected void closeDevice(String cameraId, BlockingStateCallback listener) {
         if (mCamera != null) {
             if (!cameraId.equals(mCamera.getId())) {
                 throw new IllegalStateException("Try to close a device that is not opened yet");
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2MultiViewTestCase.java b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2MultiViewTestCase.java
index f7d743e..ce0bd7b 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2MultiViewTestCase.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2MultiViewTestCase.java
@@ -17,8 +17,8 @@
 package android.hardware.camera2.cts.testcases;
 
 import static android.hardware.camera2.cts.CameraTestUtils.*;
-import static com.android.ex.camera2.blocking.BlockingSessionListener.*;
-import static com.android.ex.camera2.blocking.BlockingStateListener.*;
+import static com.android.ex.camera2.blocking.BlockingSessionCallback.*;
+import static com.android.ex.camera2.blocking.BlockingStateCallback.*;
 
 import android.content.Context;
 import android.content.res.Configuration;
@@ -26,7 +26,7 @@
 import android.graphics.RectF;
 import android.graphics.SurfaceTexture;
 import android.hardware.camera2.CameraCaptureSession;
-import android.hardware.camera2.CameraCaptureSession.CaptureListener;
+import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.CameraManager;
 import android.hardware.camera2.CaptureRequest;
@@ -45,8 +45,8 @@
 import android.view.TextureView;
 
 import com.android.ex.camera2.blocking.BlockingCameraManager;
-import com.android.ex.camera2.blocking.BlockingSessionListener;
-import com.android.ex.camera2.blocking.BlockingStateListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
 
 import junit.framework.Assert;
 
@@ -71,7 +71,7 @@
     protected Handler mHandler;
 
     private CameraManager mCameraManager;
-    private BlockingStateListener mCameraListener;
+    private BlockingStateCallback mCameraListener;
     private HandlerThread mHandlerThread;
     private Context mContext;
 
@@ -94,7 +94,7 @@
         mHandlerThread = new HandlerThread(TAG);
         mHandlerThread.start();
         mHandler = new Handler(mHandlerThread.getLooper());
-        mCameraListener = new BlockingStateListener();
+        mCameraListener = new BlockingStateCallback();
         Camera2MultiViewStubActivity activity = (Camera2MultiViewStubActivity) mContext;
         mTextureView[0] = activity.getTextureView(0);
         mTextureView[1] = activity.getTextureView(1);
@@ -229,7 +229,7 @@
     }
 
     protected void startPreview(
-            String cameraId, List<Surface> outputSurfaces, CaptureListener listener)
+            String cameraId, List<Surface> outputSurfaces, CaptureCallback listener)
             throws Exception {
         CameraHolder camera = getCameraHolder(cameraId);
         assertTrue("Camera " + cameraId + " is not openned", camera.isOpenned());
@@ -339,7 +339,7 @@
         private CameraDevice mCamera;
         private StaticMetadata mStaticInfo;
         private List<Size> mOrderedPreviewSizes;
-        private BlockingSessionListener mSessionListener;
+        private BlockingSessionCallback mSessionListener;
 
         public CameraHolder(String id){
             mCameraId = id;
@@ -380,9 +380,9 @@
             mOrderedPreviewSizes = null;
         }
 
-        public void startPreview(List<Surface> outputSurfaces, CaptureListener listener)
+        public void startPreview(List<Surface> outputSurfaces, CaptureCallback listener)
                 throws Exception {
-            mSessionListener = new BlockingSessionListener();
+            mSessionListener = new BlockingSessionCallback();
             mSession = configureCameraSession(mCamera, outputSurfaces, mSessionListener, mHandler);
 
             // TODO: vary the different settings like crop region to cover more cases.
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
index 9232151..bd8b546 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
@@ -17,7 +17,7 @@
 package android.hardware.camera2.cts.testcases;
 
 import static android.hardware.camera2.cts.CameraTestUtils.*;
-import static com.android.ex.camera2.blocking.BlockingStateListener.STATE_CLOSED;
+import static com.android.ex.camera2.blocking.BlockingStateCallback.STATE_CLOSED;
 
 import android.hardware.camera2.params.StreamConfigurationMap;
 import android.media.ImageReader;
@@ -33,7 +33,7 @@
 import android.graphics.ImageFormat;
 import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCaptureSession;
-import android.hardware.camera2.CameraCaptureSession.CaptureListener;
+import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.CameraManager;
 import android.hardware.camera2.CameraMetadata;
@@ -43,13 +43,13 @@
 import android.util.Range;
 import android.hardware.camera2.cts.Camera2SurfaceViewStubActivity;
 import android.hardware.camera2.cts.CameraTestUtils;
-import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureListener;
+import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureCallback;
 import android.hardware.camera2.cts.helpers.CameraErrorCollector;
 import android.hardware.camera2.cts.helpers.StaticMetadata;
 import android.hardware.camera2.cts.helpers.StaticMetadata.CheckLevel;
 
-import com.android.ex.camera2.blocking.BlockingSessionListener;
-import com.android.ex.camera2.blocking.BlockingStateListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
 import com.android.ex.camera2.exceptions.TimeoutRuntimeException;
 
 import java.util.ArrayList;
@@ -61,7 +61,7 @@
  *
  * <p>This class encapsulates the SurfaceView based preview common functionalities.
  * The setup and teardown of CameraManager, test HandlerThread, Activity, Camera IDs
- * and CameraStateListener are handled in this class. Some basic preview related utility
+ * and CameraStateCallback are handled in this class. Some basic preview related utility
  * functions are provided to facilitate the derived preview-based test classes.
  * </p>
  */
@@ -85,8 +85,8 @@
     protected String[] mCameraIds;
     protected HandlerThread mHandlerThread;
     protected Handler mHandler;
-    protected BlockingStateListener mCameraListener;
-    protected BlockingSessionListener mSessionListener;
+    protected BlockingStateCallback mCameraListener;
+    protected BlockingSessionCallback mSessionListener;
     protected CameraErrorCollector mCollector;
     // Per device fields:
     protected StaticMetadata mStaticInfo;
@@ -110,7 +110,7 @@
     protected void setUp() throws Exception {
         /**
          * Set up the camera preview required environments, including activity,
-         * CameraManager, HandlerThread, Camera IDs, and CameraStateListener.
+         * CameraManager, HandlerThread, Camera IDs, and CameraStateCallback.
          */
         super.setUp();
         mContext = getActivity();
@@ -128,7 +128,7 @@
         mHandlerThread = new HandlerThread(TAG);
         mHandlerThread.start();
         mHandler = new Handler(mHandlerThread.getLooper());
-        mCameraListener = new BlockingStateListener();
+        mCameraListener = new BlockingStateCallback();
         mCollector = new CameraErrorCollector();
     }
 
@@ -164,7 +164,7 @@
      *            capture is available.
      */
     protected void startPreview(CaptureRequest.Builder request, Size previewSz,
-            CaptureListener listener) throws Exception {
+            CaptureCallback listener) throws Exception {
         // Update preview size.
         updatePreviewSurface(previewSz);
         if (VERBOSE) {
@@ -185,7 +185,7 @@
             throws CameraAccessException {
         List<Surface> outputSurfaces = new ArrayList<Surface>(/*capacity*/1);
         outputSurfaces.add(mPreviewSurface);
-        mSessionListener = new BlockingSessionListener();
+        mSessionListener = new BlockingSessionCallback();
         mSession = configureCameraSession(mCamera, outputSurfaces, mSessionListener, mHandler);
 
         request.addTarget(mPreviewSurface);
@@ -233,7 +233,7 @@
      */
     protected void prepareStillCaptureAndStartPreview(CaptureRequest.Builder previewRequest,
             CaptureRequest.Builder stillRequest, Size previewSz, Size stillSz,
-            CaptureListener resultListener,
+            CaptureCallback resultListener,
             ImageReader.OnImageAvailableListener imageListener) throws Exception {
         prepareCaptureAndStartPreview(previewRequest, stillRequest, previewSz, stillSz,
                 ImageFormat.JPEG, resultListener, MAX_READER_IMAGES, imageListener);
@@ -252,7 +252,7 @@
      */
     protected void prepareStillCaptureAndStartPreview(CaptureRequest.Builder previewRequest,
             CaptureRequest.Builder stillRequest, Size previewSz, Size stillSz,
-            CaptureListener resultListener, int maxNumImages,
+            CaptureCallback resultListener, int maxNumImages,
             ImageReader.OnImageAvailableListener imageListener) throws Exception {
         prepareCaptureAndStartPreview(previewRequest, stillRequest, previewSz, stillSz,
                 ImageFormat.JPEG, resultListener, maxNumImages, imageListener);
@@ -274,7 +274,7 @@
      */
     protected void prepareRawCaptureAndStartPreview(CaptureRequest.Builder previewRequest,
             CaptureRequest.Builder rawRequest, Size previewSz, Size rawSz,
-            CaptureListener resultListener,
+            CaptureCallback resultListener,
             ImageReader.OnImageAvailableListener imageListener) throws Exception {
         prepareCaptureAndStartPreview(previewRequest, rawRequest, previewSz, rawSz,
                 ImageFormat.RAW_SENSOR, resultListener, MAX_READER_IMAGES, imageListener);
@@ -295,7 +295,7 @@
      * seen before the result matching myRequest arrives, or each individual wait
      * for result times out after {@value #WAIT_FOR_RESULT_TIMEOUT_MS}ms.
      */
-    protected static <T> void waitForResultValue(SimpleCaptureListener listener,
+    protected static <T> void waitForResultValue(SimpleCaptureCallback listener,
             CaptureResult.Key<T> resultKey,
             T expectedValue, int numResultsWait) {
         List<T> expectedValues = new ArrayList<T>();
@@ -319,7 +319,7 @@
      * seen before the result matching myRequest arrives, or each individual wait
      * for result times out after {@value #WAIT_FOR_RESULT_TIMEOUT_MS}ms.
      */
-    protected static <T> void waitForAnyResultValue(SimpleCaptureListener listener,
+    protected static <T> void waitForAnyResultValue(SimpleCaptureCallback listener,
             CaptureResult.Key<T> resultKey,
             List<T> expectedValues, int numResultsWait) {
         if (numResultsWait < 0 || listener == null || expectedValues == null) {
@@ -370,7 +370,7 @@
      * @throws CameraAccessException if capturing failed
      */
     protected int captureRequestsSynchronized(
-            CaptureRequest request, CaptureListener listener, Handler handler)
+            CaptureRequest request, CaptureCallback listener, Handler handler)
                     throws CameraAccessException {
         return captureRequestsSynchronized(request, /*count*/1, listener, handler);
     }
@@ -398,7 +398,7 @@
      * @throws CameraAccessException if capturing failed
      */
     protected int captureRequestsSynchronized(
-            CaptureRequest request, int count, CaptureListener listener, Handler handler)
+            CaptureRequest request, int count, CaptureCallback listener, Handler handler)
                     throws CameraAccessException {
         if (count < 1) {
             throw new IllegalArgumentException("count must be positive");
@@ -428,7 +428,7 @@
      *
      * @return the last result, or {@code null} if there was none
      */
-    protected static CaptureResult waitForNumResults(SimpleCaptureListener resultListener,
+    protected static CaptureResult waitForNumResults(SimpleCaptureCallback resultListener,
             int numResultsWait) {
         if (numResultsWait < 0 || resultListener == null) {
             throw new IllegalArgumentException(
@@ -450,7 +450,7 @@
      * @param numResultWaitForUnknownLatency Number of frame to wait if camera device latency is
      *                                       unknown.
      */
-    protected void waitForSettingsApplied(SimpleCaptureListener resultListener,
+    protected void waitForSettingsApplied(SimpleCaptureCallback resultListener,
             int numResultWaitForUnknownLatency) {
         int maxLatency = mStaticInfo.getSyncMaxLatency();
         if (maxLatency == CameraMetadata.SYNC_MAX_LATENCY_UNKNOWN) {
@@ -475,7 +475,7 @@
      * @param numResultWaitForUnknownLatency Number of frame to wait if camera device latency is
      *                                       unknown.
      */
-    protected void waitForAeStable(SimpleCaptureListener resultListener,
+    protected void waitForAeStable(SimpleCaptureCallback resultListener,
             int numResultWaitForUnknownLatency) {
         waitForSettingsApplied(resultListener, numResultWaitForUnknownLatency);
 
@@ -504,7 +504,7 @@
      * @param numResultWaitForUnknownLatency Number of frame to wait if camera device latency is
      *                                       unknown.
      */
-    protected void waitForAeLocked(SimpleCaptureListener resultListener,
+    protected void waitForAeLocked(SimpleCaptureCallback resultListener,
             int numResultWaitForUnknownLatency) {
 
         waitForSettingsApplied(resultListener, numResultWaitForUnknownLatency);
@@ -629,7 +629,7 @@
      */
     protected void prepareCaptureAndStartPreview(CaptureRequest.Builder previewRequest,
             CaptureRequest.Builder stillRequest, Size previewSz, Size captureSz, int format,
-            CaptureListener resultListener, int maxNumImages,
+            CaptureCallback resultListener, int maxNumImages,
             ImageReader.OnImageAvailableListener imageListener) throws Exception {
         if (VERBOSE) {
             Log.v(TAG, String.format("Prepare single capture (%s) and preview (%s)",
@@ -646,7 +646,7 @@
         List<Surface> outputSurfaces = new ArrayList<Surface>();
         outputSurfaces.add(mPreviewSurface);
         outputSurfaces.add(mReaderSurface);
-        mSessionListener = new BlockingSessionListener();
+        mSessionListener = new BlockingSessionCallback();
         mSession = configureCameraSession(mCamera, outputSurfaces, mSessionListener, mHandler);
 
         // Configure the requests.
diff --git a/tests/tests/hardware/src/android/hardware/cts/Camera_SizeTest.java b/tests/tests/hardware/src/android/hardware/cts/Camera_SizeTest.java
index 72d4ba3..827ab76 100644
--- a/tests/tests/hardware/src/android/hardware/cts/Camera_SizeTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/Camera_SizeTest.java
@@ -17,14 +17,20 @@
 package android.hardware.cts;
 
 
+import android.cts.util.CtsAndroidTestCase;
 import android.hardware.Camera;
 import android.hardware.Camera.Parameters;
+import android.hardware.cts.helpers.CameraUtils;
 import android.test.suitebuilder.annotation.LargeTest;
 
-import junit.framework.TestCase;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import java.util.Collections;
+import java.util.List;
 
 @LargeTest
-public class Camera_SizeTest extends TestCase {
+public class Camera_SizeTest extends CtsAndroidTestCase {
 
     private final int HEIGHT1 = 320;
     private final int WIDTH1 = 240;
@@ -33,6 +39,8 @@
     private final int HEIGHT3 = 640;
     private final int WIDTH3 = 480;
 
+    private static final float ASPECT_RATIO_TOLERANCE = 0.05f;
+
     public void testConstructor() {
         if (Camera.getNumberOfCameras() < 1) {
             return;
@@ -48,10 +56,61 @@
         camera.release();
     }
 
+    /**
+     * Check that the largest available preview and jpeg outputs have the same aspect ratio.  This
+     * aspect ratio must be the same as the physical camera sensor, and the FOV for these outputs
+     * must not be cropped.
+     *
+     * This is only required for backward compatibility of the Camera2 API when running in LEGACY
+     * mode.
+     *
+     * @see {@link android.hardware.camera2.CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL}
+     */
+    public void testMaxAspectRatios() throws Exception {
+        for (int id = 0; id < Camera.getNumberOfCameras(); ++id) {
+            if (CameraUtils.isLegacyHAL(getContext(), id)) {
+
+                Camera camera = Camera.open(id);
+                Parameters parameters = camera.getParameters();
+
+                List<Camera.Size> supportedJpegDimens = parameters.getSupportedPictureSizes();
+                List<Camera.Size> supportedPreviewDimens = parameters.getSupportedPreviewSizes();
+
+                Collections.sort(supportedJpegDimens, new CameraUtils.LegacySizeComparator());
+                Collections.sort(supportedPreviewDimens, new CameraUtils.LegacySizeComparator());
+
+                Camera.Size largestJpegDimen =
+                        supportedJpegDimens.get(supportedJpegDimens.size() - 1);
+                Camera.Size largestPreviewDimen =
+                        supportedPreviewDimens.get(supportedPreviewDimens.size() - 1);
+
+                float jpegAspect = largestJpegDimen.width / (float) largestJpegDimen.height;
+                float previewAspect =
+                        largestPreviewDimen.width / (float) largestPreviewDimen.height;
+
+                assertTrue("Largest preview dimension (w=" + largestPreviewDimen.width + ", h=" +
+                                largestPreviewDimen.height + ") must have the same aspect ratio " +
+                                "as the largest Jpeg dimension (w=" + largestJpegDimen.width +
+                                ", h=" + largestJpegDimen.height + ")",
+                        Math.abs(jpegAspect - previewAspect) < ASPECT_RATIO_TOLERANCE
+                );
+
+
+                camera.release();
+            }
+        }
+    }
+
     private void checkSize(Parameters parameters, int width, int height) {
         parameters.setPictureSize(width, height);
         assertEquals(width, parameters.getPictureSize().width);
         assertEquals(height, parameters.getPictureSize().height);
     }
+
+    private static void addTestToSuite(TestSuite testSuite, String testName) {
+        Camera_SizeTest test = new Camera_SizeTest();
+        test.setName(testName);
+        testSuite.addTest(test);
+    }
 }
 
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorTest.java b/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
index af881b4..5006d55 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
@@ -16,12 +16,7 @@
 
 package android.hardware.cts;
 
-import java.lang.IllegalArgumentException;
-import java.lang.Override;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
+import com.android.cts.util.TimeoutReq;
 
 import android.content.Context;
 import android.content.pm.PackageManager;
@@ -36,12 +31,13 @@
 import android.os.HandlerThread;
 import android.os.PowerManager;
 import android.os.SystemClock;
-import android.test.AndroidTestCase;
 import android.util.Log;
 
-import com.android.cts.util.TimeoutReq;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
-public class SensorTest extends AndroidTestCase {
+public class SensorTest extends SensorTestCase {
     private SensorManager mSensorManager;
     private TriggerListener mTriggerListener;
     private SensorListener mSensorListener;
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorTestCase.java b/tests/tests/hardware/src/android/hardware/cts/SensorTestCase.java
index 222da56..aee00ed 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SensorTestCase.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorTestCase.java
@@ -16,21 +16,22 @@
 
 package android.hardware.cts;
 
-import android.app.Instrumentation;
-import android.cts.util.CtsAndroidTestCase;
-import android.cts.util.DeviceReportLog;
-import android.hardware.cts.helpers.SensorNotSupportedException;
-import android.hardware.cts.helpers.SensorStats;
-import android.util.Log;
-
 import com.android.cts.util.ReportLog;
 import com.android.cts.util.ResultType;
 import com.android.cts.util.ResultUnit;
 
+import android.app.Instrumentation;
+import android.cts.util.DeviceReportLog;
+import android.hardware.cts.helpers.SensorNotSupportedException;
+import android.hardware.cts.helpers.SensorStats;
+import android.test.AndroidTestCase;
+import android.util.Log;
+
 /**
  * Test Case class that handles gracefully sensors that are not available in the device.
  */
-public abstract class SensorTestCase extends CtsAndroidTestCase {
+public abstract class SensorTestCase extends AndroidTestCase {
+    // TODO: consolidate all log tags
     protected final String LOG_TAG = "TestRunner";
 
     protected SensorTestCase() {}
diff --git a/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java b/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java
index d33a108..cc7f71c 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java
@@ -648,10 +648,6 @@
         op.setLogEvents(true);
         try {
             op.execute();
-
-            // Only report stats if it passes.
-            logSelectedStatsToReportLog(getInstrumentation(), 2, STAT_KEYS,
-                    op.getStats());
         } finally {
             SensorStats.logStats(TAG, op.getStats());
 
@@ -667,8 +663,6 @@
             String fileName = String.format("single_sensor_%s_%s%s.txt",
                     sensorName, sensorRate, batching);
             SensorStats.logStatsToFile(fileName, op.getStats());
-
-
         }
     }
 }
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/CameraUtils.java b/tests/tests/hardware/src/android/hardware/cts/helpers/CameraUtils.java
new file mode 100644
index 0000000..aaf9590
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/CameraUtils.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2014 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 android.hardware.cts.helpers;
+
+import android.content.Context;
+import android.hardware.Camera;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraManager;
+
+import java.util.Comparator;
+
+/**
+ * Utility class containing helper functions for the Camera CTS tests.
+ */
+public class CameraUtils {
+
+    /**
+     * Returns {@code true} if this device only supports {@code LEGACY} mode operation in the
+     * Camera2 API for the given camera ID.
+     *
+     * @param context {@link Context} to access the {@link CameraManager} in.
+     * @param cameraId the ID of the camera device to check.
+     * @return {@code true} if this device only supports {@code LEGACY} mode.
+     */
+    public static boolean isLegacyHAL(Context context, int cameraId) throws Exception {
+        CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
+        CameraCharacteristics characteristics =
+                manager.getCameraCharacteristics(Integer.toString(cameraId));
+
+        return characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) ==
+                CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY;
+    }
+
+    /**
+     * Shared size comparison method used by size comparators.
+     *
+     * <p>Compares the number of pixels it covers.If two the areas of two sizes are same, compare
+     * the widths.</p>
+     */
+     public static int compareSizes(int widthA, int heightA, int widthB, int heightB) {
+        long left = widthA * (long) heightA;
+        long right = widthB * (long) heightB;
+        if (left == right) {
+            left = widthA;
+            right = widthB;
+        }
+        return (left < right) ? -1 : (left > right ? 1 : 0);
+    }
+
+    /**
+     * Size comparator that compares the number of pixels it covers.
+     *
+     * <p>If two the areas of two sizes are same, compare the widths.</p>
+     */
+    public static class LegacySizeComparator implements Comparator<Camera.Size> {
+        @Override
+        public int compare(Camera.Size lhs, Camera.Size rhs) {
+            return compareSizes(lhs.width, lhs.height, rhs.width, rhs.height);
+        }
+    }
+
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEventListener.java b/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEventListener.java
index ddbc8c2..f06b9d7 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEventListener.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEventListener.java
@@ -16,13 +16,13 @@
 
 package android.hardware.cts.helpers;
 
+import junit.framework.Assert;
+
 import android.hardware.Sensor;
 import android.hardware.SensorEvent;
 import android.hardware.SensorEventListener2;
 import android.util.Log;
 
-import junit.framework.Assert;
-
 import java.util.Arrays;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
@@ -59,7 +59,16 @@
      * Construct a {@link TestSensorEventListener} that wraps a {@link SensorEventListener2}.
      */
     public TestSensorEventListener(SensorEventListener2 listener) {
-        mListener = listener;
+        if (listener != null) {
+            mListener = listener;
+        } else {
+            // use a Null Object to simplify handling the listener
+            mListener = new SensorEventListener2() {
+                public void onFlushCompleted(Sensor sensor) {}
+                public void onSensorChanged(SensorEvent sensorEvent) {}
+                public void onAccuracyChanged(Sensor sensor, int i) {}
+            };
+        }
     }
 
     /**
@@ -83,12 +92,11 @@
      */
     @Override
     public void onSensorChanged(SensorEvent event) {
-        if(mEventLatch != null) {
-            mEventLatch.countDown();
+        CountDownLatch eventLatch = mEventLatch;
+        if(eventLatch != null) {
+            eventLatch.countDown();
         }
-        if (mListener != null) {
-            mListener.onSensorChanged(event);
-        }
+        mListener.onSensorChanged(event);
         if (mLogEvents) {
             StringBuilder valuesSb = new StringBuilder();
             if (event.values.length == 1) {
@@ -113,9 +121,7 @@
      */
     @Override
     public void onAccuracyChanged(Sensor sensor, int accuracy) {
-        if (mListener != null) {
-            mListener.onAccuracyChanged(sensor, accuracy);
-        }
+        mListener.onAccuracyChanged(sensor, accuracy);
     }
 
     /**
@@ -128,15 +134,13 @@
         if(latch != null) {
             latch.countDown();
         }
-        if (mListener != null) {
-            mListener.onFlushCompleted(sensor);
-        }
+        mListener.onFlushCompleted(sensor);
     }
 
     /**
      * Wait for {@link #onFlushCompleted(Sensor)} to be called.
      *
-     * @throws AssertionError if there was a timeout after {@value #FLUSH_TIMEOUT_US} &micro;s
+     * @throws AssertionError if there was a timeout after {@link #FLUSH_TIMEOUT_US} &micro;s
      */
     public void waitForFlushComplete() {
         CountDownLatch latch = mFlushLatch;
@@ -154,7 +158,7 @@
     /**
      * Collect a specific number of {@link TestSensorEvent}s.
      *
-     * @throws AssertionError if there was a timeout after {@value #FLUSH_TIMEOUT_US} &micro;s
+     * @throws AssertionError if there was a timeout after {@link #FLUSH_TIMEOUT_US} &micro;s
      */
     public void waitForEvents(int eventCount) {
         mEventLatch = new CountDownLatch(eventCount);
diff --git a/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java b/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java
index 6635c12..369ae6e 100644
--- a/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java
+++ b/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java
@@ -593,6 +593,9 @@
                             mEventListener.onBufferReady(encodedData, info);
                             mEncoder.releaseOutputBuffer(index, false);
                         }
+                    } else if (index == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED){
+                        Log.i(TAG, "output buffer changed");
+                        encoderOutputBuffers = mEncoder.getOutputBuffers();
                     }
                 }
             } catch (Exception e) {
diff --git a/tests/tests/permission/src/android/permission/cts/Camera2PermissionTest.java b/tests/tests/permission/src/android/permission/cts/Camera2PermissionTest.java
index f9e19e0..021a501 100644
--- a/tests/tests/permission/src/android/permission/cts/Camera2PermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/Camera2PermissionTest.java
@@ -16,7 +16,7 @@
 
 package android.permission.cts;
 
-import static com.android.ex.camera2.blocking.BlockingStateListener.*;
+import static com.android.ex.camera2.blocking.BlockingStateCallback.*;
 
 import android.content.Context;
 import android.hardware.camera2.CameraDevice;
@@ -27,7 +27,7 @@
 import android.util.Log;
 
 import com.android.ex.camera2.blocking.BlockingCameraManager;
-import com.android.ex.camera2.blocking.BlockingStateListener;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
 
 /**
  * Tests for Camera2 API related Permissions. Currently, this means
@@ -40,7 +40,7 @@
 
     private CameraManager mCameraManager;
     private CameraDevice mCamera;
-    private BlockingStateListener mCameraListener;
+    private BlockingStateCallback mCameraListener;
     private String[] mCameraIds;
     protected Handler mHandler;
     protected HandlerThread mHandlerThread;
@@ -54,7 +54,7 @@
 
     /**
      * Set up the camera2 test case required environments, including CameraManager,
-     * HandlerThread, Camera IDs, and CameraStateListener etc.
+     * HandlerThread, Camera IDs, and CameraStateCallback etc.
      */
     @Override
     protected void setUp() throws Exception {
@@ -64,7 +64,7 @@
         mHandlerThread = new HandlerThread(TAG);
         mHandlerThread.start();
         mHandler = new Handler(mHandlerThread.getLooper());
-        mCameraListener = new BlockingStateListener();
+        mCameraListener = new BlockingStateCallback();
     }
 
     @Override
@@ -96,20 +96,20 @@
     /**
      * Add and remove availability listeners should work without permission.
      */
-    public void testAvailabilityListener() throws Exception {
+    public void testAvailabilityCallback() throws Exception {
         DummyCameraListener availabilityListener = new DummyCameraListener();
         // Remove a not-registered listener is a no-op.
-        mCameraManager.removeAvailabilityListener(availabilityListener);
-        mCameraManager.addAvailabilityListener(availabilityListener, mHandler);
-        mCameraManager.removeAvailabilityListener(availabilityListener);
-        mCameraManager.addAvailabilityListener(availabilityListener, mHandler);
-        mCameraManager.addAvailabilityListener(availabilityListener, mHandler);
-        mCameraManager.removeAvailabilityListener(availabilityListener);
+        mCameraManager.unregisterAvailabilityCallback(availabilityListener);
+        mCameraManager.registerAvailabilityCallback(availabilityListener, mHandler);
+        mCameraManager.unregisterAvailabilityCallback(availabilityListener);
+        mCameraManager.registerAvailabilityCallback(availabilityListener, mHandler);
+        mCameraManager.registerAvailabilityCallback(availabilityListener, mHandler);
+        mCameraManager.unregisterAvailabilityCallback(availabilityListener);
         // Remove a previously-added listener second time is a no-op.
-        mCameraManager.removeAvailabilityListener(availabilityListener);
+        mCameraManager.unregisterAvailabilityCallback(availabilityListener);
     }
 
-    private class DummyCameraListener extends CameraManager.AvailabilityListener {
+    private class DummyCameraListener extends CameraManager.AvailabilityCallback {
         @Override
         public void onCameraAvailable(String cameraId) {
         }
@@ -132,4 +132,3 @@
         }
     }
 }
-
diff --git a/tests/tests/permission/src/android/permission/cts/NoLocationPermissionTest.java b/tests/tests/permission/src/android/permission/cts/NoLocationPermissionTest.java
index b5a4f24..a2cbfb7 100644
--- a/tests/tests/permission/src/android/permission/cts/NoLocationPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/NoLocationPermissionTest.java
@@ -23,6 +23,7 @@
 import android.location.Location;
 import android.location.LocationListener;
 import android.location.LocationManager;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.Looper;
 import android.telephony.PhoneStateListener;
@@ -280,9 +281,13 @@
     }
 
     /**
-     * Helper method to verify that calling isProviderEnabled with given
-     * provider throws SecurityException.
-     * 
+     * Helper method to verify that calling
+     * {@link LocationManager#isProviderEnabled(String)} with given
+     * provider completes without an exception. (Note that under the conditions
+     * of these tests, that method threw SecurityException on OS levels before
+     * {@link android.os.Build.VERSION_CODES#L}. See the method's javadoc for
+     * details.)
+     *
      * @param provider the String provider name.
      */
     private void checkIsProviderEnabled(String provider) {
@@ -290,13 +295,7 @@
             // skip this test if the provider is unknown
             return;
         }
-
-        try {
-            mLocationManager.isProviderEnabled(provider);
-            fail("LocationManager.isProviderEnabled did not throw SecurityException as expected");
-        } catch (SecurityException e) {
-            // expected
-        }
+        mLocationManager.isProviderEnabled(provider);
     }
 
     /**
diff --git a/tests/tests/print/AndroidManifest.xml b/tests/tests/print/AndroidManifest.xml
index 4c94fd5..b4a2905 100644
--- a/tests/tests/print/AndroidManifest.xml
+++ b/tests/tests/print/AndroidManifest.xml
@@ -19,6 +19,8 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.android.cts.print">
 
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+
     <application android:allowBackup="false" >
 
         <uses-library android:name="android.test.runner"/>
diff --git a/tests/tests/renderscript/Android.mk b/tests/tests/renderscript/Android.mk
index f3f5123..81434ee 100644
--- a/tests/tests/renderscript/Android.mk
+++ b/tests/tests/renderscript/Android.mk
@@ -30,8 +30,6 @@
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src)
 
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
 LOCAL_SDK_VERSION := current
 
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/renderscript/AndroidManifest.xml b/tests/tests/renderscript/AndroidManifest.xml
index 2a23090..b9405ca 100644
--- a/tests/tests/renderscript/AndroidManifest.xml
+++ b/tests/tests/renderscript/AndroidManifest.xml
@@ -28,7 +28,7 @@
 
     <!-- This is a self-instrumenting test package. -->
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
-                     android:targetPackage="com.android.cts.stub"
+                     android:targetPackage="com.android.cts.renderscript"
                      android:label="CTS tests of Renderscript component">
         <meta-data android:name="listener"
             android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/res/raw/leak.bc b/tests/tests/renderscript/res/raw/leak.bc
similarity index 100%
rename from tests/res/raw/leak.bc
rename to tests/tests/renderscript/res/raw/leak.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_11.bc b/tests/tests/renderscript/res/raw/set_target_api_11.bc
similarity index 100%
rename from tests/res/raw/set_target_api_11.bc
rename to tests/tests/renderscript/res/raw/set_target_api_11.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_12.bc b/tests/tests/renderscript/res/raw/set_target_api_12.bc
similarity index 100%
rename from tests/res/raw/set_target_api_12.bc
rename to tests/tests/renderscript/res/raw/set_target_api_12.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_13.bc b/tests/tests/renderscript/res/raw/set_target_api_13.bc
similarity index 100%
rename from tests/res/raw/set_target_api_13.bc
rename to tests/tests/renderscript/res/raw/set_target_api_13.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_14.bc b/tests/tests/renderscript/res/raw/set_target_api_14.bc
similarity index 100%
rename from tests/res/raw/set_target_api_14.bc
rename to tests/tests/renderscript/res/raw/set_target_api_14.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_15.bc b/tests/tests/renderscript/res/raw/set_target_api_15.bc
similarity index 100%
rename from tests/res/raw/set_target_api_15.bc
rename to tests/tests/renderscript/res/raw/set_target_api_15.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_16.bc b/tests/tests/renderscript/res/raw/set_target_api_16.bc
similarity index 100%
rename from tests/res/raw/set_target_api_16.bc
rename to tests/tests/renderscript/res/raw/set_target_api_16.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_17.bc b/tests/tests/renderscript/res/raw/set_target_api_17.bc
similarity index 100%
rename from tests/res/raw/set_target_api_17.bc
rename to tests/tests/renderscript/res/raw/set_target_api_17.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_18.bc b/tests/tests/renderscript/res/raw/set_target_api_18.bc
similarity index 100%
rename from tests/res/raw/set_target_api_18.bc
rename to tests/tests/renderscript/res/raw/set_target_api_18.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_19.bc b/tests/tests/renderscript/res/raw/set_target_api_19.bc
similarity index 100%
rename from tests/res/raw/set_target_api_19.bc
rename to tests/tests/renderscript/res/raw/set_target_api_19.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_too_high.bc b/tests/tests/renderscript/res/raw/set_target_api_too_high.bc
similarity index 100%
rename from tests/res/raw/set_target_api_too_high.bc
rename to tests/tests/renderscript/res/raw/set_target_api_too_high.bc
Binary files differ
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/AllocationCopy2DRangeTest.java b/tests/tests/renderscript/src/android/renderscript/cts/AllocationCopy2DRangeTest.java
index 3ac9834..a549906 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/AllocationCopy2DRangeTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/AllocationCopy2DRangeTest.java
@@ -20,7 +20,6 @@
 import android.renderscript.Element;
 import android.renderscript.Type;
 import java.util.Random;
-import com.android.cts.stub.R;
 
 public class AllocationCopy2DRangeTest extends RSBaseCompute {
     private Allocation mInAllocation;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/AllocationResize.java b/tests/tests/renderscript/src/android/renderscript/cts/AllocationResize.java
index 7c711f5..96045af 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/AllocationResize.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/AllocationResize.java
@@ -20,7 +20,6 @@
 import android.renderscript.Allocation;
 import android.renderscript.Element;
 import android.renderscript.RSRuntimeException;
-import com.android.cts.stub.R;
 import java.util.Random;
 
 public class AllocationResize extends RSBaseCompute {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/AllocationTest.java b/tests/tests/renderscript/src/android/renderscript/cts/AllocationTest.java
index 10d2673..7e867f7 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/AllocationTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/AllocationTest.java
@@ -16,8 +16,6 @@
 
 package android.renderscript.cts;
 
-import com.android.cts.stub.R;
-
 import android.graphics.Bitmap;
 import android.renderscript.Allocation;
 import android.renderscript.AllocationAdapter;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ClearObjectTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ClearObjectTest.java
index e8a330a..9b1fbb7 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ClearObjectTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ClearObjectTest.java
@@ -22,7 +22,6 @@
 import android.renderscript.Sampler;
 import android.renderscript.Script;
 import android.renderscript.RSRuntimeException;
-import com.android.cts.stub.R;
 
 public class ClearObjectTest extends RSBaseCompute {
     int ObjectNum = 1;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/CompilerTest.java b/tests/tests/renderscript/src/android/renderscript/cts/CompilerTest.java
index adad6d5..9d119be 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/CompilerTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/CompilerTest.java
@@ -19,8 +19,6 @@
 import android.renderscript.RSRuntimeException;
 import android.util.Log;
 
-import com.android.cts.stub.R;
-
 /**
  * Test whether the driver properly handles compile-time issues.
  */
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ComputeTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ComputeTest.java
index e080f42..af176c2 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ComputeTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ComputeTest.java
@@ -48,8 +48,6 @@
 
 import android.renderscript.Type;
 
-import com.android.cts.stub.R;
-
 public class ComputeTest extends RSBaseCompute {
 
     public void testJavaVectorTypes() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ForEachTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ForEachTest.java
index 4100f6e..b90633e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ForEachTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ForEachTest.java
@@ -48,8 +48,6 @@
 
 import android.renderscript.Type;
 
-import com.android.cts.stub.R;
-
 public class ForEachTest extends RSBaseCompute {
     /**
      * Test support for reflected forEach() as well as validation of parameters.
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GetAllocationTest.java b/tests/tests/renderscript/src/android/renderscript/cts/GetAllocationTest.java
index 047ca93..f938569 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GetAllocationTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/GetAllocationTest.java
@@ -19,7 +19,6 @@
 import android.renderscript.Allocation;
 import android.renderscript.Element;
 import android.renderscript.RSRuntimeException;
-import com.android.cts.stub.R;
 import java.util.Random;
 
 public class GetAllocationTest extends RSBaseCompute {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GetElementAt.java b/tests/tests/renderscript/src/android/renderscript/cts/GetElementAt.java
index a37a46e..be56a62 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GetElementAt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/GetElementAt.java
@@ -20,7 +20,6 @@
 import android.renderscript.Element;
 import android.renderscript.Type;
 import android.renderscript.RSRuntimeException;
-import com.android.cts.stub.R;
 import java.util.Random;
 
 public class GetElementAt extends RSBaseCompute {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ImageProcessingTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ImageProcessingTest.java
index fae20f4..f38bdb0 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ImageProcessingTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ImageProcessingTest.java
@@ -59,8 +59,6 @@
 import android.renderscript.ScriptIntrinsicConvolve5x5;
 import android.renderscript.ScriptIntrinsicLUT;
 
-import com.android.cts.stub.R;
-
 public class ImageProcessingTest extends RSBaseCompute {
     private Allocation a1, a2;
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/InitTest.java b/tests/tests/renderscript/src/android/renderscript/cts/InitTest.java
index 53fe05b..ec22249 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/InitTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/InitTest.java
@@ -19,7 +19,6 @@
 import android.renderscript.Allocation;
 import android.renderscript.Element;
 import android.renderscript.RSRuntimeException;
-import com.android.cts.stub.R;
 
 public class InitTest extends RSBaseCompute {
     private Allocation mIn;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IsObjectTest.java b/tests/tests/renderscript/src/android/renderscript/cts/IsObjectTest.java
index 58ae448..0bb17cb 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/IsObjectTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IsObjectTest.java
@@ -21,7 +21,6 @@
 import android.renderscript.Element;
 import android.util.Log;
 import android.view.SurfaceHolder;
-import com.android.cts.stub.R;
 
 import junit.framework.Assert;
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/KernelTest.java b/tests/tests/renderscript/src/android/renderscript/cts/KernelTest.java
index 0a8c8bd..64368b6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/KernelTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/KernelTest.java
@@ -48,8 +48,6 @@
 
 import android.renderscript.Type;
 
-import com.android.cts.stub.R;
-
 public class KernelTest extends RSBaseCompute {
     /**
      * Test support for reflected forEach() as well as validation of parameters.
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/RSUtils.java b/tests/tests/renderscript/src/android/renderscript/cts/RSUtils.java
index a47af15..6038d90 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/RSUtils.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/RSUtils.java
@@ -19,7 +19,6 @@
 import android.content.res.Resources;
 import android.renderscript.Allocation;
 import android.renderscript.RSRuntimeException;
-import com.android.cts.stub.R;
 
 import java.util.Random;
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/RenderScriptTest.java b/tests/tests/renderscript/src/android/renderscript/cts/RenderScriptTest.java
index e31f3c6..4007260 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/RenderScriptTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/RenderScriptTest.java
@@ -16,8 +16,6 @@
 
 package android.renderscript.cts;
 
-import com.android.cts.stub.R;
-
 import android.renderscript.RenderScript;
 import android.test.AndroidTestCase;
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/RsPackColorTo8888Test.java b/tests/tests/renderscript/src/android/renderscript/cts/RsPackColorTo8888Test.java
index bb8b275..d6ea521 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/RsPackColorTo8888Test.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/RsPackColorTo8888Test.java
@@ -16,7 +16,6 @@
 
 package android.renderscript.cts;
 
-import com.android.cts.stub.R;
 import android.renderscript.Allocation;
 import android.renderscript.Element;
 import android.renderscript.Float3;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/RsUnpackColor8888Test.java b/tests/tests/renderscript/src/android/renderscript/cts/RsUnpackColor8888Test.java
index c32cc79..4754a9f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/RsUnpackColor8888Test.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/RsUnpackColor8888Test.java
@@ -16,7 +16,6 @@
 
 package android.renderscript.cts;
 
-import com.android.cts.stub.R;
 import android.renderscript.Allocation;
 import android.renderscript.Element;
 import android.renderscript.Float4;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/SampleTest.java b/tests/tests/renderscript/src/android/renderscript/cts/SampleTest.java
index 916fec3..bc69b0e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/SampleTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/SampleTest.java
@@ -16,8 +16,6 @@
 
 package android.renderscript.cts;
 
-import com.android.cts.stub.R;
-
 import android.graphics.Bitmap;
 import android.renderscript.Allocation;
 import android.renderscript.Allocation.MipmapControl;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ScriptGroupTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ScriptGroupTest.java
index c9a79c8..d44c305 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ScriptGroupTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ScriptGroupTest.java
@@ -16,8 +16,6 @@
 
 package android.renderscript.cts;
 
-import com.android.cts.stub.R;
-
 import android.graphics.Bitmap;
 import android.renderscript.Allocation;
 import android.renderscript.AllocationAdapter;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ScriptTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ScriptTest.java
index ed73b6a..8c41e14 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ScriptTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ScriptTest.java
@@ -28,8 +28,6 @@
 
 import android.renderscript.cts.ScriptC_negate;
 
-import com.android.cts.stub.R;
-
 public class ScriptTest extends RSBaseCompute {
 
     public void testScript() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/SendToClient.java b/tests/tests/renderscript/src/android/renderscript/cts/SendToClient.java
index f944af9..8b48bea 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/SendToClient.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/SendToClient.java
@@ -21,7 +21,6 @@
 import android.renderscript.Allocation;
 import android.renderscript.Element;
 import android.renderscript.RenderScript.RSMessageHandler;
-import com.android.cts.stub.R;
 
 public class SendToClient extends RSBaseCompute {
     private Allocation mInAllocation;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/SendToClientBlockingTest.java b/tests/tests/renderscript/src/android/renderscript/cts/SendToClientBlockingTest.java
index 00129e9..58fba9b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/SendToClientBlockingTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/SendToClientBlockingTest.java
@@ -21,8 +21,6 @@
 import java.util.concurrent.Semaphore;
 import java.util.Random;
 
-import com.android.cts.stub.R;
-
 public class SendToClientBlockingTest extends RSBaseCompute {
     private static final Semaphore mSync = new Semaphore(0);
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/SetObjectTest.java b/tests/tests/renderscript/src/android/renderscript/cts/SetObjectTest.java
index a6626ee..ef6687f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/SetObjectTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/SetObjectTest.java
@@ -20,7 +20,6 @@
 import android.renderscript.Allocation;
 import android.renderscript.Element;
 import android.util.Log;
-import com.android.cts.stub.R;
 
 import junit.framework.Assert;
 
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/StructArrayTest.java b/tests/tests/renderscript/src/android/renderscript/cts/StructArrayTest.java
index a851501..91e65f8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/StructArrayTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/StructArrayTest.java
@@ -15,7 +15,6 @@
  */
 
 package android.renderscript.cts;
-import com.android.cts.stub.R;
 
 public class StructArrayTest extends RSBaseCompute {
     /**
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/StructPadTest.java b/tests/tests/renderscript/src/android/renderscript/cts/StructPadTest.java
index 4832202..ee3483a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/StructPadTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/StructPadTest.java
@@ -17,7 +17,6 @@
 package android.renderscript.cts;
 
 import android.renderscript.Float4;
-import com.android.cts.stub.R;
 
 public class StructPadTest extends RSBaseCompute {
     /**
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/VersionTest.java b/tests/tests/renderscript/src/android/renderscript/cts/VersionTest.java
index 70fca9b..f167a86 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/VersionTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/VersionTest.java
@@ -18,7 +18,6 @@
 
 import android.renderscript.RenderScript.RSMessageHandler;
 import android.renderscript.RSRuntimeException;
-import com.android.cts.stub.R;
 
 /**
  * Test for appropriate handling of versioned bitcode.
diff --git a/tests/tests/rscpp/Android.mk b/tests/tests/rscpp/Android.mk
index 1f32dd5..f7d586f 100644
--- a/tests/tests/rscpp/Android.mk
+++ b/tests/tests/rscpp/Android.mk
@@ -30,8 +30,6 @@
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
 LOCAL_SDK_VERSION := current
 
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/rscpp/AndroidManifest.xml b/tests/tests/rscpp/AndroidManifest.xml
index c014382..b68ebc3 100644
--- a/tests/tests/rscpp/AndroidManifest.xml
+++ b/tests/tests/rscpp/AndroidManifest.xml
@@ -24,7 +24,7 @@
 
     <!-- This is a self-instrumenting test package. -->
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
-                     android:targetPackage="com.android.cts.stub"
+                     android:targetPackage="com.android.cts.rscpp"
                      android:label="CTS tests of RenderScript C++ component">
         <meta-data android:name="listener"
             android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/res/raw/rs_loopfilter_param.bin b/tests/tests/rscpp/res/raw/rs_loopfilter_param.bin
similarity index 100%
rename from tests/res/raw/rs_loopfilter_param.bin
rename to tests/tests/rscpp/res/raw/rs_loopfilter_param.bin
Binary files differ
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RS3DLUTTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RS3DLUTTest.java
index 7a85f57..470593c 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RS3DLUTTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RS3DLUTTest.java
@@ -16,8 +16,6 @@
 
 package android.cts.rscpp;
 
-import com.android.cts.stub.R;
-
 import android.content.Context;
 import android.content.res.Resources;
 import android.test.AndroidTestCase;
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSAllocationTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSAllocationTest.java
index 86662bf..76dbfee 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSAllocationTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSAllocationTest.java
@@ -16,8 +16,6 @@
 
 package android.cts.rscpp;
 
-import com.android.cts.stub.R;
-
 import android.content.Context;
 import android.content.res.Resources;
 import android.test.AndroidTestCase;
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSBlendTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSBlendTest.java
index 7c0ba38..025d470 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSBlendTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSBlendTest.java
@@ -16,8 +16,6 @@
 
 package android.cts.rscpp;
 
-import com.android.cts.stub.R;
-
 import android.content.Context;
 import android.content.res.Resources;
 import android.test.AndroidTestCase;
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSBlurTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSBlurTest.java
index e546516..70f15fc 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSBlurTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSBlurTest.java
@@ -16,8 +16,6 @@
 
 package android.cts.rscpp;
 
-import com.android.cts.stub.R;
-
 import android.content.Context;
 import android.content.res.Resources;
 import android.test.AndroidTestCase;
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSColorMatrixTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSColorMatrixTest.java
index d634c1f..efa28bb 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSColorMatrixTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSColorMatrixTest.java
@@ -16,8 +16,6 @@
 
 package android.cts.rscpp;
 
-import com.android.cts.stub.R;
-
 import android.content.Context;
 import android.content.res.Resources;
 import android.test.AndroidTestCase;
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSConvolveTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSConvolveTest.java
index ded67cc..0cd5c79 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSConvolveTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSConvolveTest.java
@@ -16,8 +16,6 @@
 
 package android.cts.rscpp;
 
-import com.android.cts.stub.R;
-
 import android.content.Context;
 import android.content.res.Resources;
 import android.test.AndroidTestCase;
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSCppTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSCppTest.java
index 9fa8216..b2bf33e 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSCppTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSCppTest.java
@@ -16,8 +16,6 @@
 
 package android.cts.rscpp;
 
-import com.android.cts.stub.R;
-
 import android.content.Context;
 import android.content.res.Resources;
 import android.test.AndroidTestCase;
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSInitTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSInitTest.java
index 7fd5ffa..ca6be9c 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSInitTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSInitTest.java
@@ -16,8 +16,6 @@
 
 package android.cts.rscpp;
 
-import com.android.cts.stub.R;
-
 import android.content.Context;
 import android.content.res.Resources;
 import android.test.AndroidTestCase;
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSLUTTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSLUTTest.java
index 2579666..f1ea040 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSLUTTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSLUTTest.java
@@ -16,8 +16,6 @@
 
 package android.cts.rscpp;
 
-import com.android.cts.stub.R;
-
 import android.content.Context;
 import android.content.res.Resources;
 import android.test.AndroidTestCase;
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSLoopFilterTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSLoopFilterTest.java
index cf72e94..189a7e9 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSLoopFilterTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSLoopFilterTest.java
@@ -16,7 +16,7 @@
 
 package android.cts.rscpp;
 
-import com.android.cts.stub.R;
+import com.android.cts.rscpp.R;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSUtils.java b/tests/tests/rscpp/src/android/cts/rscpp/RSUtils.java
index 58d665f..b40c3bd 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSUtils.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSUtils.java
@@ -20,7 +20,6 @@
 import java.util.Random;
 import android.renderscript.Allocation;
 import android.renderscript.RSRuntimeException;
-import com.android.cts.stub.R;
 
 /**
  * This class supplies some utils for renderscript tests
diff --git a/tests/tests/security/Android.mk b/tests/tests/security/Android.mk
index d0fefa1..699f798 100644
--- a/tests/tests/security/Android.mk
+++ b/tests/tests/security/Android.mk
@@ -18,16 +18,17 @@
 
 LOCAL_MODULE_TAGS := tests
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner guava
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestserver ctstestrunner guava
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
 
 LOCAL_JNI_SHARED_LIBRARIES := libctssecurity_jni
 
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES := $(call all-java-files-under, src)\
+                   src/android/security/cts/activity/ISecureRandomService.aidl
 
 LOCAL_PACKAGE_NAME := CtsSecurityTestCases
 
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
 LOCAL_SDK_VERSION := current
 
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/security/AndroidManifest.xml b/tests/tests/security/AndroidManifest.xml
index da95e5c..8ed74ba 100644
--- a/tests/tests/security/AndroidManifest.xml
+++ b/tests/tests/security/AndroidManifest.xml
@@ -21,6 +21,7 @@
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
     <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
     <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.INTERNET" />
 
     <application>
         <uses-library android:name="android.test.runner" />
@@ -29,10 +30,13 @@
                  android:process=":death_test_service"
                  android:isolatedProcess="true"
                  android:exported="true"/>
+
+        <service android:name="android.security.cts.activity.SecureRandomService"
+                 android:process=":secureRandom"/>
     </application>
 
     <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
-                     android:targetPackage="com.android.cts.stub"
+                     android:targetPackage="com.android.cts.security"
                      android:label="CTS tests of com.android.cts.security">
         <meta-data android:name="listener"
             android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/assets/selinux_policy.xml b/tests/tests/security/assets/selinux_policy.xml
similarity index 100%
rename from tests/assets/selinux_policy.xml
rename to tests/tests/security/assets/selinux_policy.xml
diff --git a/tests/tests/security/jni/Android.mk b/tests/tests/security/jni/Android.mk
index fe47e2e..84f62c0 100644
--- a/tests/tests/security/jni/Android.mk
+++ b/tests/tests/security/jni/Android.mk
@@ -30,10 +30,12 @@
 		android_security_cts_NativeCodeTest.cpp \
 		android_security_cts_SeccompDeathTestService.cpp \
 		android_security_cts_SELinuxTest.cpp \
-		android_security_cts_MMapExecutableTest.cpp
+		android_security_cts_MMapExecutableTest.cpp \
+		android_security_cts_FileUtils.cpp \
+		android_security_cts_NetlinkSocket.cpp
 
 LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
 
-LOCAL_SHARED_LIBRARIES := libnativehelper liblog libbinder libutils libmedia libselinux
+LOCAL_SHARED_LIBRARIES := libnativehelper liblog libbinder libutils libmedia libselinux libdl
 
 include $(BUILD_SHARED_LIBRARY)
diff --git a/tests/tests/security/jni/CtsSecurityJniOnLoad.cpp b/tests/tests/security/jni/CtsSecurityJniOnLoad.cpp
index 41a3df9..d9a5f28 100644
--- a/tests/tests/security/jni/CtsSecurityJniOnLoad.cpp
+++ b/tests/tests/security/jni/CtsSecurityJniOnLoad.cpp
@@ -16,6 +16,7 @@
 
 #include <jni.h>
 #include <stdio.h>
+#include "android_security_cts_NetlinkSocket.h"
 
 extern int register_android_security_cts_KernelSettingsTest(JNIEnv*);
 extern int register_android_security_cts_CharDeviceTest(JNIEnv*);
@@ -25,6 +26,7 @@
 extern int register_android_security_cts_SeccompDeathTestService(JNIEnv*);
 extern int register_android_security_cts_SELinuxTest(JNIEnv*);
 extern int register_android_security_cts_MMapExecutableTest(JNIEnv* env);
+extern int register_android_security_cts_FileUtils(JNIEnv*);
 
 jint JNI_OnLoad(JavaVM *vm, void *reserved) {
     JNIEnv *env = NULL;
@@ -65,5 +67,13 @@
         return JNI_ERR;
     }
 
+    if (register_android_security_cts_FileUtils(env)) {
+        return JNI_ERR;
+    }
+
+    if (register_android_security_cts_NetlinkSocket(env)) {
+        return JNI_ERR;
+    }
+
     return JNI_VERSION_1_4;
 }
diff --git a/tests/tests/security/jni/android_security_cts_FileUtils.cpp b/tests/tests/security/jni/android_security_cts_FileUtils.cpp
new file mode 100644
index 0000000..8009c04
--- /dev/null
+++ b/tests/tests/security/jni/android_security_cts_FileUtils.cpp
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
+#include <grp.h>
+#include <jni.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <assert.h>
+
+static jclass gFileStatusClass;
+static jfieldID gFileStatusDevFieldID;
+static jfieldID gFileStatusInoFieldID;
+static jfieldID gFileStatusModeFieldID;
+static jfieldID gFileStatusNlinkFieldID;
+static jfieldID gFileStatusUidFieldID;
+static jfieldID gFileStatusGidFieldID;
+static jfieldID gFileStatusSizeFieldID;
+static jfieldID gFileStatusBlksizeFieldID;
+static jfieldID gFileStatusBlocksFieldID;
+static jfieldID gFileStatusAtimeFieldID;
+static jfieldID gFileStatusMtimeFieldID;
+static jfieldID gFileStatusCtimeFieldID;
+
+/*
+ * Native methods used by
+ * cts/tests/src/android/security/cts/FileUtils.java
+ *
+ * Copied from hidden API: frameworks/base/core/jni/android_security_FileUtils.cpp
+ */
+
+jboolean android_security_cts_FileUtils_getFileStatus(JNIEnv* env, jobject thiz,
+        jstring path, jobject fileStatus, jboolean statLinks)
+{
+    const char* pathStr = env->GetStringUTFChars(path, NULL);
+    jboolean ret = false;
+    struct stat s;
+
+    int res = statLinks == true ? lstat(pathStr, &s) : stat(pathStr, &s);
+
+    if (res == 0) {
+        ret = true;
+        if (fileStatus != NULL) {
+            env->SetIntField(fileStatus, gFileStatusDevFieldID, s.st_dev);
+            env->SetIntField(fileStatus, gFileStatusInoFieldID, s.st_ino);
+            env->SetIntField(fileStatus, gFileStatusModeFieldID, s.st_mode);
+            env->SetIntField(fileStatus, gFileStatusNlinkFieldID, s.st_nlink);
+            env->SetIntField(fileStatus, gFileStatusUidFieldID, s.st_uid);
+            env->SetIntField(fileStatus, gFileStatusGidFieldID, s.st_gid);
+            env->SetLongField(fileStatus, gFileStatusSizeFieldID, s.st_size);
+            env->SetIntField(fileStatus, gFileStatusBlksizeFieldID, s.st_blksize);
+            env->SetLongField(fileStatus, gFileStatusBlocksFieldID, s.st_blocks);
+            env->SetLongField(fileStatus, gFileStatusAtimeFieldID, s.st_atime);
+            env->SetLongField(fileStatus, gFileStatusMtimeFieldID, s.st_mtime);
+            env->SetLongField(fileStatus, gFileStatusCtimeFieldID, s.st_ctime);
+        }
+    }
+
+    env->ReleaseStringUTFChars(path, pathStr);
+
+    return ret;
+}
+
+jstring android_security_cts_FileUtils_getUserName(JNIEnv* env, jobject thiz,
+        jint uid)
+{
+    struct passwd *pwd = getpwuid(uid);
+    return env->NewStringUTF(pwd->pw_name);
+}
+
+jstring android_security_cts_FileUtils_getGroupName(JNIEnv* env, jobject thiz,
+        jint gid)
+{
+    struct group *grp = getgrgid(gid);
+    return env->NewStringUTF(grp->gr_name);
+}
+
+jint android_security_cts_FileUtils_setPermissions(JNIEnv* env, jobject clazz,
+        jstring file, jint mode)
+{
+    const char *fileStr = env->GetStringUTFChars(file, NULL);
+    if (fileStr == NULL) {
+        return -1;
+    }
+
+    if (strlen(fileStr) <= 0) {
+        env->ReleaseStringUTFChars(file, fileStr);
+        return ENOENT;
+    }
+
+    jint returnValue = chmod(fileStr, mode) == 0 ? 0 : errno;
+    env->ReleaseStringUTFChars(file, fileStr);
+    return returnValue;
+}
+
+static JNINativeMethod gMethods[] = {
+    {  "getFileStatus", "(Ljava/lang/String;Landroid/security/cts/FileUtils$FileStatus;Z)Z",
+            (void *) android_security_cts_FileUtils_getFileStatus  },
+    {  "getUserName", "(I)Ljava/lang/String;",
+            (void *) android_security_cts_FileUtils_getUserName  },
+    {  "getGroupName", "(I)Ljava/lang/String;",
+            (void *) android_security_cts_FileUtils_getGroupName  },
+    {  "setPermissions", "(Ljava/lang/String;I)I",
+            (void *) android_security_cts_FileUtils_setPermissions },
+};
+
+int register_android_security_cts_FileUtils(JNIEnv* env)
+{
+    jclass clazz = env->FindClass("android/security/cts/FileUtils");
+    assert(clazz != null);
+
+    gFileStatusClass = env->FindClass("android/security/cts/FileUtils$FileStatus");
+    assert(gFileStatusClass != null);
+    gFileStatusDevFieldID = env->GetFieldID(gFileStatusClass, "dev", "I");
+    gFileStatusInoFieldID = env->GetFieldID(gFileStatusClass, "ino", "I");
+    gFileStatusModeFieldID = env->GetFieldID(gFileStatusClass, "mode", "I");
+    gFileStatusNlinkFieldID = env->GetFieldID(gFileStatusClass, "nlink", "I");
+    gFileStatusUidFieldID = env->GetFieldID(gFileStatusClass, "uid", "I");
+    gFileStatusGidFieldID = env->GetFieldID(gFileStatusClass, "gid", "I");
+    gFileStatusSizeFieldID = env->GetFieldID(gFileStatusClass, "size", "J");
+    gFileStatusBlksizeFieldID = env->GetFieldID(gFileStatusClass, "blksize", "I");
+    gFileStatusBlocksFieldID = env->GetFieldID(gFileStatusClass, "blocks", "J");
+    gFileStatusAtimeFieldID = env->GetFieldID(gFileStatusClass, "atime", "J");
+    gFileStatusMtimeFieldID = env->GetFieldID(gFileStatusClass, "mtime", "J");
+    gFileStatusCtimeFieldID = env->GetFieldID(gFileStatusClass, "ctime", "J");
+
+    return env->RegisterNatives(clazz, gMethods,
+            sizeof(gMethods) / sizeof(JNINativeMethod));
+}
diff --git a/tests/jni/android_net_cts_NetlinkSocket.cpp b/tests/tests/security/jni/android_security_cts_NetlinkSocket.cpp
similarity index 79%
rename from tests/jni/android_net_cts_NetlinkSocket.cpp
rename to tests/tests/security/jni/android_security_cts_NetlinkSocket.cpp
index f2fc38f..2411f74 100644
--- a/tests/jni/android_net_cts_NetlinkSocket.cpp
+++ b/tests/tests/security/jni/android_security_cts_NetlinkSocket.cpp
@@ -24,22 +24,22 @@
 #include <string.h>
 #include "JNIHelp.h"
 
-#include "android_net_cts_NetlinkSocket.h"
+#include "android_security_cts_NetlinkSocket.h"
 
-static void android_net_cts_NetlinkSocket_create(JNIEnv* env, jclass,
+static void android_security_cts_NetlinkSocket_create(JNIEnv* env, jclass,
     jobject fileDescriptor)
 {
     int sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
     if (sock == -1) {
         ALOGE("Can't create socket %s", strerror(errno));
-        jclass SocketException = env->FindClass("java/net/SocketException");
+        jclass SocketException = env->FindClass("java/security/SocketException");
         env->ThrowNew(SocketException, "Can't create socket");
         return;
     }
     jniSetFileDescriptorOfFD(env, fileDescriptor, sock);
 }
 
-static int android_net_cts_NetlinkSocket_sendmsg(JNIEnv *e, jclass,
+static int android_security_cts_NetlinkSocket_sendmsg(JNIEnv *e, jclass,
     jobject fileDescriptor, jint pid, jbyteArray packet)
 {
     void *bytes = (void *)e->GetByteArrayElements(packet, NULL);
@@ -60,13 +60,13 @@
 
 
 static JNINativeMethod gMethods[] = {
-    {  "sendmsg", "(Ljava/io/FileDescriptor;I[B)I", (void *) android_net_cts_NetlinkSocket_sendmsg },
-    {  "create_native", "(Ljava/io/FileDescriptor;)V", (void *) android_net_cts_NetlinkSocket_create },
+    {  "sendmsg", "(Ljava/io/FileDescriptor;I[B)I", (void *) android_security_cts_NetlinkSocket_sendmsg },
+    {  "create_native", "(Ljava/io/FileDescriptor;)V", (void *) android_security_cts_NetlinkSocket_create },
 };
 
-int register_android_net_cts_NetlinkSocket(JNIEnv* env)
+int register_android_security_cts_NetlinkSocket(JNIEnv* env)
 {
-    jclass clazz = env->FindClass("android/net/cts/NetlinkSocket");
+    jclass clazz = env->FindClass("android/security/cts/NetlinkSocket");
 
     return env->RegisterNatives(clazz, gMethods,
             sizeof(gMethods) / sizeof(JNINativeMethod));
diff --git a/tests/jni/android_net_cts_NetlinkSocket.h b/tests/tests/security/jni/android_security_cts_NetlinkSocket.h
similarity index 78%
rename from tests/jni/android_net_cts_NetlinkSocket.h
rename to tests/tests/security/jni/android_security_cts_NetlinkSocket.h
index d406892..6e61c75 100644
--- a/tests/jni/android_net_cts_NetlinkSocket.h
+++ b/tests/tests/security/jni/android_security_cts_NetlinkSocket.h
@@ -14,9 +14,9 @@
  * limitations under the License.
  */
 
-#ifndef __ANDROID_NET_CTS_H__
-#define __ANDROID_NET_CTS_H__
+#ifndef __ANDROID_SECURITY_CTS_H__
+#define __ANDROID_SECURITY_CTS_H__
 
-int register_android_net_cts_NetlinkSocket(JNIEnv*);
+int register_android_security_cts_NetlinkSocket(JNIEnv*);
 
-#endif /* __ANDROID_NET_CTS_H__ */
+#endif /* __ANDROID_SECURITY_CTS_H__ */
diff --git a/tests/res/raw/sig_devkeys.bin b/tests/tests/security/res/raw/sig_devkeys.bin
similarity index 100%
rename from tests/res/raw/sig_devkeys.bin
rename to tests/tests/security/res/raw/sig_devkeys.bin
Binary files differ
diff --git a/tests/res/raw/sig_devkeys_media.bin b/tests/tests/security/res/raw/sig_devkeys_media.bin
similarity index 100%
rename from tests/res/raw/sig_devkeys_media.bin
rename to tests/tests/security/res/raw/sig_devkeys_media.bin
Binary files differ
diff --git a/tests/res/raw/sig_devkeys_platform.bin b/tests/tests/security/res/raw/sig_devkeys_platform.bin
similarity index 100%
rename from tests/res/raw/sig_devkeys_platform.bin
rename to tests/tests/security/res/raw/sig_devkeys_platform.bin
Binary files differ
diff --git a/tests/res/raw/sig_devkeys_shared.bin b/tests/tests/security/res/raw/sig_devkeys_shared.bin
similarity index 100%
rename from tests/res/raw/sig_devkeys_shared.bin
rename to tests/tests/security/res/raw/sig_devkeys_shared.bin
Binary files differ
diff --git a/tests/res/raw/sig_media.bin b/tests/tests/security/res/raw/sig_media.bin
similarity index 100%
rename from tests/res/raw/sig_media.bin
rename to tests/tests/security/res/raw/sig_media.bin
Binary files differ
diff --git a/tests/res/raw/sig_platform.bin b/tests/tests/security/res/raw/sig_platform.bin
similarity index 100%
rename from tests/res/raw/sig_platform.bin
rename to tests/tests/security/res/raw/sig_platform.bin
Binary files differ
diff --git a/tests/res/raw/sig_shared.bin b/tests/tests/security/res/raw/sig_shared.bin
similarity index 100%
rename from tests/res/raw/sig_shared.bin
rename to tests/tests/security/res/raw/sig_shared.bin
Binary files differ
diff --git a/tests/res/raw/sig_testkey.bin b/tests/tests/security/res/raw/sig_testkey.bin
similarity index 100%
rename from tests/res/raw/sig_testkey.bin
rename to tests/tests/security/res/raw/sig_testkey.bin
Binary files differ
diff --git a/tests/tests/security/src/android/security/cts/AslrTest.java b/tests/tests/security/src/android/security/cts/AslrTest.java
index 1e76d90..f1552f6 100644
--- a/tests/tests/security/src/android/security/cts/AslrTest.java
+++ b/tests/tests/security/src/android/security/cts/AslrTest.java
@@ -24,7 +24,7 @@
 import java.io.FileReader;
 import java.io.IOException;
 
-import android.os.cts.ReadElf;
+import android.security.cts.ReadElf;
 
 /**
  * Verify that ASLR is properly enabled on Android Compatible devices.
diff --git a/tests/tests/security/src/android/security/cts/BannedFilesTest.java b/tests/tests/security/src/android/security/cts/BannedFilesTest.java
index ce0b48c..a71dcce 100644
--- a/tests/tests/security/src/android/security/cts/BannedFilesTest.java
+++ b/tests/tests/security/src/android/security/cts/BannedFilesTest.java
@@ -16,7 +16,7 @@
 
 package android.security.cts;
 
-import android.os.cts.FileUtils;
+import android.security.cts.FileUtils;
 
 import junit.framework.TestCase;
 
diff --git a/tests/tests/security/src/android/security/cts/FileUtils.java b/tests/tests/security/src/android/security/cts/FileUtils.java
new file mode 100644
index 0000000..3708f68
--- /dev/null
+++ b/tests/tests/security/src/android/security/cts/FileUtils.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2014 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 android.security.cts;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/** Bits and pieces copied from hidden API of android.os.FileUtils. */
+public class FileUtils {
+
+    public static final int S_IFMT  = 0170000;
+    public static final int S_IFSOCK = 0140000;
+    public static final int S_IFLNK = 0120000;
+    public static final int S_IFREG = 0100000;
+    public static final int S_IFBLK = 0060000;
+    public static final int S_IFDIR = 0040000;
+    public static final int S_IFCHR = 0020000;
+    public static final int S_IFIFO = 0010000;
+
+    public static final int S_ISUID = 0004000;
+    public static final int S_ISGID = 0002000;
+    public static final int S_ISVTX = 0001000;
+
+    public static final int S_IRWXU = 00700;
+    public static final int S_IRUSR = 00400;
+    public static final int S_IWUSR = 00200;
+    public static final int S_IXUSR = 00100;
+
+    public static final int S_IRWXG = 00070;
+    public static final int S_IRGRP = 00040;
+    public static final int S_IWGRP = 00020;
+    public static final int S_IXGRP = 00010;
+
+    public static final int S_IRWXO = 00007;
+    public static final int S_IROTH = 00004;
+    public static final int S_IWOTH = 00002;
+    public static final int S_IXOTH = 00001;
+
+    static {
+        System.loadLibrary("ctssecurity_jni");
+    }
+
+    public static class FileStatus {
+
+        public int dev;
+        public int ino;
+        public int mode;
+        public int nlink;
+        public int uid;
+        public int gid;
+        public int rdev;
+        public long size;
+        public int blksize;
+        public long blocks;
+        public long atime;
+        public long mtime;
+        public long ctime;
+
+        public boolean hasModeFlag(int flag) {
+            if (((S_IRWXU | S_IRWXG | S_IRWXO) & flag) != flag) {
+                throw new IllegalArgumentException("Inappropriate flag " + flag);
+            }
+            return (mode & flag) == flag;
+        }
+
+        public boolean isOfType(int type) {
+            if ((type & S_IFMT) != type) {
+                throw new IllegalArgumentException("Unknown type " + type);
+            }
+            return (mode & S_IFMT) == type;
+        }
+    }
+
+    /**
+     * @param path of the file to stat
+     * @param status object to set the fields on
+     * @param statLinks or don't stat links (lstat vs stat)
+     * @return whether or not we were able to stat the file
+     */
+    public native static boolean getFileStatus(String path, FileStatus status, boolean statLinks);
+
+    public native static String getUserName(int uid);
+
+    public native static String getGroupName(int gid);
+
+    public native static int setPermissions(String file, int mode);
+
+    /**
+     * Copy data from a source stream to destFile.
+     * Return true if succeed, return false if failed.
+     */
+    public static boolean copyToFile(InputStream inputStream, File destFile) {
+        try {
+            if (destFile.exists()) {
+                destFile.delete();
+            }
+            FileOutputStream out = new FileOutputStream(destFile);
+            try {
+                byte[] buffer = new byte[4096];
+                int bytesRead;
+                while ((bytesRead = inputStream.read(buffer)) >= 0) {
+                    out.write(buffer, 0, bytesRead);
+                }
+            } finally {
+                out.flush();
+                try {
+                    out.getFD().sync();
+                } catch (IOException e) {
+                }
+                out.close();
+            }
+            return true;
+        } catch (IOException e) {
+            return false;
+        }
+    }
+
+    public static void createFile(File file, int numBytes) throws IOException {
+        File parentFile = file.getParentFile();
+        if (parentFile != null) {
+            parentFile.mkdirs();
+        }
+        byte[] buffer = new byte[numBytes];
+        FileOutputStream output = new FileOutputStream(file);
+        try {
+            output.write(buffer);
+        } finally {
+            output.close();
+        }
+    }
+
+    public static byte[] readInputStreamFully(InputStream is) {
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        byte[] buffer = new byte[32768];
+        int count;
+        try {
+            while ((count = is.read(buffer)) != -1) {
+                os.write(buffer, 0, count);
+            }
+            is.close();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return os.toByteArray();
+    }
+}
diff --git a/tests/src/android/net/cts/NetlinkSocket.java b/tests/tests/security/src/android/security/cts/NetlinkSocket.java
similarity index 94%
rename from tests/src/android/net/cts/NetlinkSocket.java
rename to tests/tests/security/src/android/security/cts/NetlinkSocket.java
index 1635843..1ea6d26 100644
--- a/tests/src/android/net/cts/NetlinkSocket.java
+++ b/tests/tests/security/src/android/security/cts/NetlinkSocket.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package android.net.cts;
+package android.security.cts;
 
 import java.io.FileDescriptor;
 import java.io.IOException;
@@ -22,7 +22,7 @@
 public class NetlinkSocket {
 
     static {
-        System.loadLibrary("cts_jni");
+        System.loadLibrary("ctssecurity_jni");
     }
 
     private static native void create_native(FileDescriptor fd);
diff --git a/tests/tests/security/src/android/security/cts/PackageSignatureTest.java b/tests/tests/security/src/android/security/cts/PackageSignatureTest.java
index 5d8a050..069fa72 100644
--- a/tests/tests/security/src/android/security/cts/PackageSignatureTest.java
+++ b/tests/tests/security/src/android/security/cts/PackageSignatureTest.java
@@ -16,7 +16,7 @@
 
 package android.security.cts;
 
-import com.android.cts.stub.R;
+import com.android.cts.security.R;
 
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
diff --git a/tests/tests/security/src/android/security/cts/ReadElf.java b/tests/tests/security/src/android/security/cts/ReadElf.java
new file mode 100644
index 0000000..a9a4e3c
--- /dev/null
+++ b/tests/tests/security/src/android/security/cts/ReadElf.java
@@ -0,0 +1,523 @@
+/*
+ * Copyright (C) 2014 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 android.security.cts;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * A poor man's implementation of the readelf command. This program is
+ * designed to parse ELF (Executable and Linkable Format) files.
+ */
+public class ReadElf implements AutoCloseable {
+    /** The magic values for the ELF identification. */
+    private static final byte[] ELF_IDENT = {
+            (byte) 0x7F, (byte) 'E', (byte) 'L', (byte) 'F',
+    };
+
+    private static final int EI_CLASS = 4;
+    private static final int EI_DATA = 5;
+
+    private static final int EM_386 = 3;
+    private static final int EM_MIPS = 8;
+    private static final int EM_ARM = 40;
+    // http://en.wikipedia.org/wiki/Qualcomm_Hexagon
+    private static final int EM_QDSP6 = 164;
+
+    /** Size of the e_ident[] structure in the ELF header. */
+    private static final int EI_NIDENT = 16;
+
+    /** Offset from end of ident structure in half-word sizes. */
+    private static final int OFFSET_TYPE = 0;
+
+    /** Machine type. */
+    private static final int OFFSET_MACHINE = 1;
+
+    /** ELF version. */
+    private static final int OFFSET_VERSION = 2;
+
+    /**
+     * The offset to which the system transfers control. e.g., the first thing
+     * executed.
+     */
+    private static final int OFFSET_ENTRY = 4;
+
+    /** Program header offset in bytes. */
+    private static final int OFFSET_PHOFF = 6;
+
+    /** Segment header offset in bytes. */
+    private static final int OFFSET_SHOFF = 8;
+
+    /** Processor-specific flags for binary. */
+    private static final int OFFSET_FLAGS = 10;
+
+    /** ELF header size in bytes. */
+    private static final int OFFSET_EHSIZE = 12;
+
+    /** All program headers entry size in bytes. */
+    private static final int OFFSET_PHENTSIZE = 13;
+
+    /** Number of program headers in ELF. */
+    private static final int OFFSET_PHNUM = 14;
+
+    /** All segment headers entry size in bytes. */
+    private static final int OFFSET_SHENTSIZE = 15;
+
+    /** Number of segment headers in ELF. */
+    private static final int OFFSET_SHNUM = 16;
+
+    /** The section header index that refers to string table. */
+    private static final int OFFSET_SHSTRNDX = 17;
+
+    /** Program header offset for type of this program header. */
+    private static final int PHOFF_TYPE = 0;
+
+    /** Program header offset for absolute offset in file. */
+    private static final int PHOFF_OFFSET = 2;
+
+    /** Program header offset for virtual address. */
+    private static final int PHOFF_VADDR = 4;
+
+    /** Program header offset for physical address. */
+    private static final int PHOFF_PADDR = 6;
+
+    /** Program header offset for file size in bytes. */
+    private static final int PHOFF_FILESZ = 8;
+
+    /** Program header offset for memory size in bytes. */
+    private static final int PHOFF_MEMSZ = 10;
+
+    /** Program header offset for flags. */
+    private static final int PHOFF_FLAGS = 12;
+
+    /**
+     * Program header offset for required alignment. 0 or 1 means no alignment
+     * necessary.
+     */
+    private static final int PHOFF_ALIGN = 14;
+
+    /** Index into string pool for segment name. */
+    private static final long SHOFF_NAME = 0;
+
+    /** Segment header offset for type (half-words) */
+    private static final long SHOFF_TYPE = 2;
+
+    /** Segment header offset for offset (meta!) (half-words) */
+    private static final long SHOFF_OFFSET = 8;
+
+    /** Segment header offset for size (half-words) */
+    private static final long SHOFF_SIZE = 10;
+
+    /** Data is presented in LSB format. */
+    private static final int ELFDATA2LSB = 1;
+
+    /** Date is presented in MSB format. */
+    private static final int ELFDATA2MSB = 2;
+
+    private static final int ELFCLASS32 = 1;
+
+    private static final int ELFCLASS64 = 2;
+
+    private static final long PT_LOAD = 1;
+
+    /** Section Type: Symbol Table */
+    private static final int SHT_SYMTAB = 2;
+
+    /** Section Type: String Table */
+    private static final int SHT_STRTAB = 3;
+
+    /** Section Type: Dynamic **/
+    private static final int SHT_DYNAMIC = 6;
+
+    /** Section Type: Dynamic Symbol Table */
+    private static final int SHT_DYNSYM = 11;
+
+    /** Symbol Table Entry: Name offset */
+    private static final int SYMTAB_NAME = 0;
+
+    /** Symbol Table Entry: SymTab Info */
+    private static final int SYMTAB_ST_INFO = 6;
+
+    /** Symbol Table Entry size (half-words) */
+    private static final int SYMTAB_ENTRY_HALFWORD_SIZE = 7;
+
+    /**
+     * Symbol Table Entry size (extra in bytes) to cover "st_info" and
+     * "st_other"
+     */
+    private static final int SYMTAB_ENTRY_BYTE_EXTRA_SIZE = 2;
+
+    public static class Symbol {
+        public static final int STB_LOCAL = 0;
+
+        public static final int STB_GLOBAL = 1;
+
+        public static final int STB_WEAK = 2;
+
+        public static final int STB_LOPROC = 13;
+
+        public static final int STB_HIPROC = 15;
+
+        public final String name;
+
+        public final int bind;
+
+        public final int type;
+
+        Symbol(String name, int st_info) {
+            this.name = name;
+            this.bind = (st_info >> 4) & 0x0F;
+            this.type = st_info & 0x0F;
+        }
+    };
+
+    private final String mPath;
+    private final RandomAccessFile mFile;
+    private final byte[] mBuffer = new byte[512];
+    private int mEndian;
+    private boolean mIsDynamic;
+    private boolean mIsPIE;
+    private int mType;
+    private int mWordSize;
+    private int mHalfWordSize;
+
+    /** Symbol Table offset */
+    private long mSymTabOffset;
+
+    /** Symbol Table size */
+    private long mSymTabSize;
+
+    /** Dynamic Symbol Table offset */
+    private long mDynSymOffset;
+
+    /** Dynamic Symbol Table size */
+    private long mDynSymSize;
+
+    /** Section Header String Table offset */
+    private long mShStrTabOffset;
+
+    /** Section Header String Table size */
+    private long mShStrTabSize;
+
+    /** String Table offset */
+    private long mStrTabOffset;
+
+    /** String Table size */
+    private long mStrTabSize;
+
+    /** Dynamic String Table offset */
+    private long mDynStrOffset;
+
+    /** Dynamic String Table size */
+    private long mDynStrSize;
+
+    /** Symbol Table symbol names */
+    private Map<String, Symbol> mSymbols;
+
+    /** Dynamic Symbol Table symbol names */
+    private Map<String, Symbol> mDynamicSymbols;
+
+    public static ReadElf read(File file) throws IOException {
+        return new ReadElf(file);
+    }
+
+    public boolean isDynamic() {
+        return mIsDynamic;
+    }
+
+    public int getType() {
+        return mType;
+    }
+
+    public boolean isPIE() {
+        return mIsPIE;
+    }
+
+    private ReadElf(File file) throws IOException {
+        mPath = file.getPath();
+        mFile = new RandomAccessFile(file, "r");
+
+        if (mFile.length() < EI_NIDENT) {
+            throw new IllegalArgumentException("Too small to be an ELF file: " + file);
+        }
+
+        readIdent();
+        readHeader();
+    }
+
+    public void close() {
+        try {
+            mFile.close();
+        } catch (IOException ignored) {
+        }
+    }
+
+    protected void finalize() throws Throwable {
+        try {
+            close();
+        } finally {
+            super.finalize();
+        }
+    }
+
+    private void readHeader() throws IOException {
+        mType = readHalf(getHeaderOffset(OFFSET_TYPE));
+        int e_machine = readHalf(getHeaderOffset(OFFSET_MACHINE));
+        if (e_machine != EM_386 && e_machine != EM_MIPS && e_machine != EM_ARM &&
+                e_machine != EM_QDSP6) {
+            throw new IOException("Invalid ELF e_machine: " + e_machine + ": " + mPath);
+        }
+
+        final long shOffset = readWord(getHeaderOffset(OFFSET_SHOFF));
+        final int shNumber = readHalf(getHeaderOffset(OFFSET_SHNUM));
+        final int shSize = readHalf(getHeaderOffset(OFFSET_SHENTSIZE));
+        final int shStrIndex = readHalf(getHeaderOffset(OFFSET_SHSTRNDX));
+
+        readSectionHeaders(shOffset, shNumber, shSize, shStrIndex);
+
+        final long phOffset = readWord(getHeaderOffset(OFFSET_PHOFF));
+        final int phNumber = readHalf(getHeaderOffset(OFFSET_PHNUM));
+        final int phSize = readHalf(getHeaderOffset(OFFSET_PHENTSIZE));
+
+        readProgramHeaders(phOffset, phNumber, phSize);
+    }
+
+    private void readSectionHeaders(long tableOffset, int shNumber, int shSize, int shStrIndex)
+            throws IOException {
+        // Read the Section Header String Table offset first.
+        {
+            final long shStrTabShOffset = tableOffset + shStrIndex * shSize;
+            final long type = readWord(shStrTabShOffset + mHalfWordSize * SHOFF_TYPE);
+
+            if (type == SHT_STRTAB) {
+                mShStrTabOffset = readWord(shStrTabShOffset + mHalfWordSize * SHOFF_OFFSET);
+                mShStrTabSize = readWord(shStrTabShOffset + mHalfWordSize * SHOFF_SIZE);
+            }
+        }
+
+        for (int i = 0; i < shNumber; i++) {
+            // Don't bother to re-read the Section Header StrTab.
+            if (i == shStrIndex) {
+                continue;
+            }
+
+            final long shOffset = tableOffset + i * shSize;
+
+            final long type = readWord(shOffset + mHalfWordSize * SHOFF_TYPE);
+            if ((type == SHT_SYMTAB) || (type == SHT_DYNSYM)) {
+                final long nameOffset = readWord(shOffset + mHalfWordSize * SHOFF_NAME);
+                final long offset = readWord(shOffset + mHalfWordSize * SHOFF_OFFSET);
+                final long size = readWord(shOffset + mHalfWordSize * SHOFF_SIZE);
+
+                final String symTabName = readShStrTabEntry(nameOffset);
+                if (".symtab".equals(symTabName)) {
+                    mSymTabOffset = offset;
+                    mSymTabSize = size;
+                } else if (".dynsym".equals(symTabName)) {
+                    mDynSymOffset = offset;
+                    mDynSymSize = size;
+                }
+            } else if (type == SHT_STRTAB) {
+                final long nameOffset = readWord(shOffset + mHalfWordSize * SHOFF_NAME);
+                final long offset = readWord(shOffset + mHalfWordSize * SHOFF_OFFSET);
+                final long size = readWord(shOffset + mHalfWordSize * SHOFF_SIZE);
+
+                final String strTabName = readShStrTabEntry(nameOffset);
+                if (".strtab".equals(strTabName)) {
+                    mStrTabOffset = offset;
+                    mStrTabSize = size;
+                } else if (".dynstr".equals(strTabName)) {
+                    mDynStrOffset = offset;
+                    mDynStrSize = size;
+                }
+            } else if (type == SHT_DYNAMIC) {
+                mIsDynamic = true;
+            }
+        }
+    }
+
+    private void readProgramHeaders(long phOffset, int phNumber, int phSize) throws IOException {
+        for (int i = 0; i < phNumber; i++) {
+            final long baseOffset = phOffset + i * phSize;
+            final long type = readWord(baseOffset);
+            if (type == PT_LOAD) {
+                final long virtAddress = readWord(baseOffset + mHalfWordSize * PHOFF_VADDR);
+                if (virtAddress == 0) {
+                    mIsPIE = true;
+                }
+            }
+        }
+    }
+
+    private void readSymbolTable(Map<String, Symbol> symbolMap, long symStrOffset, long symStrSize,
+            long symOffset, long symSize) throws IOException {
+        final long symEnd = symOffset + symSize;
+        for (long off = symOffset; off < symEnd; off += SYMTAB_ENTRY_HALFWORD_SIZE * mHalfWordSize
+                + SYMTAB_ENTRY_BYTE_EXTRA_SIZE) {
+            long strOffset = readWord(off + SYMTAB_NAME);
+            if (strOffset == 0) {
+                continue;
+            }
+
+            final String symName = readStrTabEntry(symStrOffset, symStrSize, strOffset);
+            if (symName != null) {
+                final int st_info = readByte(off + SYMTAB_ST_INFO);
+                symbolMap.put(symName, new Symbol(symName, st_info));
+            }
+        }
+    }
+
+    private String readShStrTabEntry(long strOffset) throws IOException {
+        if ((mShStrTabOffset == 0) || (strOffset < 0) || (strOffset >= mShStrTabSize)) {
+            return null;
+        }
+
+        return readString(mShStrTabOffset + strOffset);
+    }
+
+    private String readStrTabEntry(long tableOffset, long tableSize, long strOffset)
+            throws IOException {
+        if ((tableOffset == 0) || (strOffset < 0) || (strOffset >= tableSize)) {
+            return null;
+        }
+
+        return readString(tableOffset + strOffset);
+    }
+
+    private int getHeaderOffset(int halfWorldOffset) {
+        return EI_NIDENT + halfWorldOffset * mHalfWordSize;
+    }
+
+    private int readByte(long offset) throws IOException {
+        mFile.seek(offset);
+        mFile.readFully(mBuffer, 0, 1);
+
+        return mBuffer[0] & 0xff;
+    }
+
+    private int readHalf(long offset) throws IOException {
+        mFile.seek(offset);
+        mFile.readFully(mBuffer, 0, mWordSize);
+
+        final int answer;
+        if (mEndian == ELFDATA2LSB) {
+            answer = mBuffer[1] << 8 | (mBuffer[0] & 0xff);
+        } else {
+            answer = mBuffer[0] << 8 | (mBuffer[1] & 0xff);
+        }
+
+        return answer;
+    }
+
+    private long readWord(long offset) throws IOException {
+        mFile.seek(offset);
+        mFile.readFully(mBuffer, 0, mWordSize);
+
+        int answer = 0;
+        if (mEndian == ELFDATA2LSB) {
+            for (int i = mWordSize - 1; i >= 0; i--) {
+                answer = (answer << 8) | (mBuffer[i] & 0xff);
+            }
+        } else {
+            final int N = mWordSize - 1;
+            for (int i = 0; i <= N; i++) {
+                answer = (answer << 8) | (mBuffer[i] & 0xff);
+            }
+        }
+
+        return answer;
+    }
+
+    private String readString(long offset) throws IOException {
+        mFile.seek(offset);
+        mFile.readFully(mBuffer, 0, (int) Math.min(mBuffer.length, mFile.length() - offset));
+
+        for (int i = 0; i < mBuffer.length; i++) {
+            if (mBuffer[i] == 0) {
+                return new String(mBuffer, 0, i);
+            }
+        }
+
+        return null;
+    }
+
+    private void readIdent() throws IOException {
+        mFile.seek(0);
+        mFile.readFully(mBuffer, 0, EI_NIDENT);
+
+        if ((mBuffer[0] != ELF_IDENT[0]) || (mBuffer[1] != ELF_IDENT[1])
+                || (mBuffer[2] != ELF_IDENT[2]) || (mBuffer[3] != ELF_IDENT[3])) {
+            throw new IllegalArgumentException("Invalid ELF file: " + mPath);
+        }
+
+        int elfClass = mBuffer[EI_CLASS];
+        if (elfClass == ELFCLASS32) {
+            mWordSize = 4;
+            mHalfWordSize = 2;
+        } else if (elfClass == ELFCLASS64) {
+            throw new IOException("Unsupported ELFCLASS64 file: " + mPath);
+        } else {
+            throw new IOException("Invalid ELF EI_CLASS: " + elfClass + ": " + mPath);
+        }
+
+        mEndian = mBuffer[EI_DATA];
+        if (mEndian == ELFDATA2LSB) {
+        } else if (mEndian == ELFDATA2MSB) {
+            throw new IOException("Unsupported ELFDATA2MSB file: " + mPath);
+        } else {
+            throw new IOException("Invalid ELF EI_DATA: " + mEndian + ": " + mPath);
+        }
+    }
+
+    public Symbol getSymbol(String name) {
+        if ((mSymTabOffset == 0) && (mSymTabSize == 0)) {
+            return null;
+        }
+
+        if (mSymbols == null) {
+            mSymbols = new HashMap<String, Symbol>();
+            try {
+                readSymbolTable(mSymbols, mStrTabOffset, mStrTabSize, mSymTabOffset, mSymTabSize);
+            } catch (IOException e) {
+                return null;
+            }
+        }
+
+        return mSymbols.get(name);
+    }
+
+    public Symbol getDynamicSymbol(String name) {
+        if ((mDynSymOffset == 0) && (mDynSymSize == 0)) {
+            return null;
+        }
+
+        if (mDynamicSymbols == null) {
+            mDynamicSymbols = new HashMap<String, Symbol>();
+            try {
+                readSymbolTable(mDynamicSymbols, mDynStrOffset, mDynStrSize, mDynSymOffset,
+                        mDynSymSize);
+            } catch (IOException e) {
+                return null;
+            }
+        }
+
+        return mDynamicSymbols.get(name);
+    }
+}
diff --git a/tests/tests/security/src/android/security/cts/VoldExploitTest.java b/tests/tests/security/src/android/security/cts/VoldExploitTest.java
index 486d5f0..edaf82a 100644
--- a/tests/tests/security/src/android/security/cts/VoldExploitTest.java
+++ b/tests/tests/security/src/android/security/cts/VoldExploitTest.java
@@ -18,7 +18,6 @@
 
 import android.content.Context;
 import android.content.pm.PackageManager;
-import android.net.cts.NetlinkSocket;
 import android.os.storage.StorageManager;
 import android.test.AndroidTestCase;
 
diff --git a/tests/src/android/security/cts/activity/ISecureRandomService.aidl b/tests/tests/security/src/android/security/cts/activity/ISecureRandomService.aidl
similarity index 100%
rename from tests/src/android/security/cts/activity/ISecureRandomService.aidl
rename to tests/tests/security/src/android/security/cts/activity/ISecureRandomService.aidl
diff --git a/tests/src/android/security/cts/activity/SecureRandomService.java b/tests/tests/security/src/android/security/cts/activity/SecureRandomService.java
similarity index 100%
rename from tests/src/android/security/cts/activity/SecureRandomService.java
rename to tests/tests/security/src/android/security/cts/activity/SecureRandomService.java
diff --git a/tests/tests/telephony/src/android/telephony/cts/SimRestrictedApisTest.java b/tests/tests/telephony/src/android/telephony/cts/SimRestrictedApisTest.java
index 1123cb0..599bf79 100644
--- a/tests/tests/telephony/src/android/telephony/cts/SimRestrictedApisTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/SimRestrictedApisTest.java
@@ -214,25 +214,13 @@
     }
 
     /**
-     * Tests the TelephonyManager.setPreferredNetworkType() API. This makes a call to
-     * setPreferredNetworkType() API and expects a SecurityException since the test apk
+     * Tests the TelephonyManager.setGlobalPreferredNetworkType() API. This makes a call to
+     * setGlobalPreferredNetworkType() API and expects a SecurityException since the test apk
      * is not signed by certificate on the SIM.
      */
-    public void testSetPreferredNetworkType() {
+    public void testSetGlobalPreferredNetworkType() {
         try {
-            TelephonyManager.getDefault().setPreferredNetworkType(0);
-            fail("Expected SecurityException. App doesn't have carrier privileges.");
-        } catch (SecurityException expected) {}
-    }
-
-    /**
-     * Tests the TelephonyManager.setCdmaSubscription() API. This makes a call to
-     * setCdmaSubscription() API and expects a SecurityException since the test apk
-     * is not signed by certificate on the SIM.
-     */
-    public void testSetCdmaSubscription() {
-        try {
-            TelephonyManager.getDefault().setCdmaSubscription(0);
+            TelephonyManager.getDefault().setGlobalPreferredNetworkType();
             fail("Expected SecurityException. App doesn't have carrier privileges.");
         } catch (SecurityException expected) {}
     }
@@ -255,7 +243,7 @@
      */
     public void testSetOperatorBrandOverride() {
         try {
-            TelephonyManager.getDefault().setOperatorBrandOverride("", "");
+            TelephonyManager.getDefault().setOperatorBrandOverride("");
             fail("Expected SecurityException. App doesn't have carrier privileges.");
         } catch (SecurityException expected) {}
     }
diff --git a/tests/tests/tv/src/android/media/tv/cts/BundledTvInputServiceTest.java b/tests/tests/tv/src/android/media/tv/cts/BundledTvInputServiceTest.java
index 53b53b4..46ed5cc 100644
--- a/tests/tests/tv/src/android/media/tv/cts/BundledTvInputServiceTest.java
+++ b/tests/tests/tv/src/android/media/tv/cts/BundledTvInputServiceTest.java
@@ -20,19 +20,16 @@
 import android.app.Instrumentation;
 import android.content.Context;
 import android.cts.util.PollingCheck;
-import android.test.ActivityInstrumentationTestCase2;
 import android.media.tv.TvContract;
 import android.media.tv.TvInputInfo;
 import android.media.tv.TvInputManager;
 import android.media.tv.TvView;
-import android.media.tv.cts.Utils;
-import android.net.Uri;
+import android.test.ActivityInstrumentationTestCase2;
 import android.util.ArrayMap;
 
 import com.android.cts.tv.R;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
@@ -42,7 +39,6 @@
  */
 public class BundledTvInputServiceTest
         extends ActivityInstrumentationTestCase2<TvViewStubActivity> {
-    private static final String TAG = BundledTvInputServiceTest.class.getSimpleName();
     /** The maximum time to wait for an operation. */
     private static final long TIME_OUT = 15000L;
 
@@ -50,12 +46,12 @@
     private Activity mActivity;
     private Instrumentation mInstrumentation;
     private TvInputManager mManager;
-    private List<TvInputInfo> mPassthroughInputList = new ArrayList<>();
-    private final MockListener mListener = new MockListener();
+    private final List<TvInputInfo> mPassthroughInputList = new ArrayList<>();
+    private final MockCallback mCallback = new MockCallback();
 
-    private static class MockListener extends TvView.TvInputListener {
+    private static class MockCallback extends TvView.TvInputCallback {
         private final Map<String, Integer> mVideoUnavailableReasonMap = new ArrayMap<>();
-        private Object mLock = new Object();
+        private final Object mLock = new Object();
         private final int VIDEO_AVAILABLE = -1;
 
         public Integer getVideoUnavailableReason(String inputId) {
@@ -109,7 +105,7 @@
                 mPassthroughInputList.add(info);
             }
         }
-        mTvView.setTvInputListener(mListener);
+        mTvView.setCallback(mCallback);
     }
 
     @Override
@@ -138,7 +134,7 @@
             new PollingCheck(TIME_OUT) {
                 @Override
                 protected boolean check() {
-                    Integer reason = mListener.getVideoUnavailableReason(info.getId());
+                    Integer reason = mCallback.getVideoUnavailableReason(info.getId());
                     return reason != null
                             && reason != TvInputManager.VIDEO_UNAVAILABLE_REASON_TUNING
                             && reason != TvInputManager.VIDEO_UNAVAILABLE_REASON_BUFFERING;
@@ -162,7 +158,7 @@
                 new PollingCheck(TIME_OUT) {
                     @Override
                     protected boolean check() {
-                        Integer reason = mListener.getVideoUnavailableReason(info.getId());
+                        Integer reason = mCallback.getVideoUnavailableReason(info.getId());
                         return reason != null
                                 && reason != TvInputManager.VIDEO_UNAVAILABLE_REASON_TUNING
                                 && reason != TvInputManager.VIDEO_UNAVAILABLE_REASON_BUFFERING;
diff --git a/tests/tests/tv/src/android/media/tv/cts/TvContractTest.java b/tests/tests/tv/src/android/media/tv/cts/TvContractTest.java
index 6d31a80..6d9fe74 100644
--- a/tests/tests/tv/src/android/media/tv/cts/TvContractTest.java
+++ b/tests/tests/tv/src/android/media/tv/cts/TvContractTest.java
@@ -27,14 +27,12 @@
 import android.media.tv.TvContentRating;
 import android.media.tv.TvContract;
 import android.net.Uri;
-import android.os.RemoteException;
 import android.test.AndroidTestCase;
 
 import com.android.cts.tv.R;
 
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.util.Arrays;
 
 /**
  * Test for {@link android.media.tv.TvContract}.
diff --git a/tests/tests/tv/src/android/media/tv/cts/TvInputInfoTest.java b/tests/tests/tv/src/android/media/tv/cts/TvInputInfoTest.java
index 335e7dc..440ecb2 100644
--- a/tests/tests/tv/src/android/media/tv/cts/TvInputInfoTest.java
+++ b/tests/tests/tv/src/android/media/tv/cts/TvInputInfoTest.java
@@ -52,7 +52,7 @@
         if (!Utils.hasTvInputFramework(getContext())) {
             return;
         }
-        Intent intent = mStubInfo.getIntentForSettingsActivity();
+        Intent intent = mStubInfo.createSettingsIntent();
 
         assertEquals(intent.getComponent(), new ComponentName(getContext(),
                 TvInputSettingsActivityStub.class));
@@ -64,7 +64,7 @@
         if (!Utils.hasTvInputFramework(getContext())) {
             return;
         }
-        Intent intent = mStubInfo.getIntentForSetupActivity();
+        Intent intent = mStubInfo.createSetupIntent();
 
         assertEquals(intent.getComponent(), new ComponentName(getContext(),
                 TvInputSetupActivityStub.class));
diff --git a/tests/tests/tv/src/android/media/tv/cts/TvInputManagerTest.java b/tests/tests/tv/src/android/media/tv/cts/TvInputManagerTest.java
index 3b486f6..790adf9 100644
--- a/tests/tests/tv/src/android/media/tv/cts/TvInputManagerTest.java
+++ b/tests/tests/tv/src/android/media/tv/cts/TvInputManagerTest.java
@@ -16,15 +16,10 @@
 
 package android.media.tv.cts;
 
-import android.content.ComponentName;
 import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.test.AndroidTestCase;
 import android.media.tv.TvInputInfo;
 import android.media.tv.TvInputManager;
-import android.media.tv.TvInputService;
-import android.media.tv.cts.Utils;
+import android.test.AndroidTestCase;
 
 import java.util.List;
 
diff --git a/tests/tests/tv/src/android/media/tv/cts/TvInputServiceTest.java b/tests/tests/tv/src/android/media/tv/cts/TvInputServiceTest.java
index 202319f..6e30421 100644
--- a/tests/tests/tv/src/android/media/tv/cts/TvInputServiceTest.java
+++ b/tests/tests/tv/src/android/media/tv/cts/TvInputServiceTest.java
@@ -19,32 +19,24 @@
 import android.app.Activity;
 import android.app.Instrumentation;
 import android.content.Context;
-import android.content.pm.PackageManager;
 import android.cts.util.PollingCheck;
-import android.database.Cursor;
-import android.test.ActivityInstrumentationTestCase2;
 import android.media.tv.TvContentRating;
 import android.media.tv.TvContract;
 import android.media.tv.TvInputInfo;
 import android.media.tv.TvInputManager;
-import android.media.tv.TvInputService;
 import android.media.tv.TvTrackInfo;
 import android.media.tv.TvView;
-import android.media.tv.TvInputService.Session;
 import android.media.tv.cts.TvInputServiceTest.CountingTvInputService.CountingSession;
-import android.media.tv.cts.Utils;
 import android.net.Uri;
-import android.util.ArrayMap;
-import android.util.SparseIntArray;
+import android.test.ActivityInstrumentationTestCase2;
 import android.view.KeyEvent;
-import android.view.MotionEvent;
 import android.view.Surface;
 
 import com.android.cts.tv.R;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
+
 
 /**
  * Test {@link android.media.tv.TvInputService}.
@@ -58,9 +50,9 @@
     private Instrumentation mInstrumentation;
     private TvInputManager mManager;
     private TvInputInfo mStubInfo;
-    private final StubListener mListener = new StubListener();
+    private final StubCallback mCallback = new StubCallback();
 
-    private static class StubListener extends TvView.TvInputListener {
+    private static class StubCallback extends TvView.TvInputCallback {
         private int mChannelRetunedCount;
         private int mVideoAvailableCount;
         private int mVideoUnavailableCount;
@@ -126,7 +118,7 @@
             }
         }
         assertNotNull(mStubInfo);
-        mTvView.setTvInputListener(mListener);
+        mTvView.setCallback(mCallback);
 
         CountingTvInputService.sSession = null;
     }
@@ -171,7 +163,7 @@
     }
 
     public void verifyCommandSetStreamVolume() {
-        mTvView.setStreamVolume(1.0f);;
+        mTvView.setStreamVolume(1.0f);
         mInstrumentation.waitForIdleSync();
         new PollingCheck(TIME_OUT) {
             @Override
@@ -226,7 +218,7 @@
         new PollingCheck(TIME_OUT) {
             @Override
             protected boolean check() {
-                return mListener.mChannelRetunedCount > 0;
+                return mCallback.mChannelRetunedCount > 0;
             }
         }.run();
     }
@@ -238,7 +230,7 @@
         new PollingCheck(TIME_OUT) {
             @Override
             protected boolean check() {
-                return mListener.mVideoAvailableCount > 0;
+                return mCallback.mVideoAvailableCount > 0;
             }
         }.run();
     }
@@ -250,7 +242,7 @@
         new PollingCheck(TIME_OUT) {
             @Override
             protected boolean check() {
-                return mListener.mVideoUnavailableCount > 0;
+                return mCallback.mVideoUnavailableCount > 0;
             }
         }.run();
     }
@@ -262,7 +254,7 @@
         new PollingCheck(TIME_OUT) {
             @Override
             protected boolean check() {
-                return mListener.mTrackChangedCount > 0;
+                return mCallback.mTrackChangedCount > 0;
             }
         }.run();
     }
@@ -274,7 +266,7 @@
         new PollingCheck(TIME_OUT) {
             @Override
             protected boolean check() {
-                return mListener.mTrackSelectedCount > 0;
+                return mCallback.mTrackSelectedCount > 0;
             }
         }.run();
     }
@@ -286,7 +278,7 @@
         new PollingCheck(TIME_OUT) {
             @Override
             protected boolean check() {
-                return mListener.mContentAllowedCount > 0;
+                return mCallback.mContentAllowedCount > 0;
             }
         }.run();
     }
@@ -300,7 +292,7 @@
         new PollingCheck(TIME_OUT) {
             @Override
             protected boolean check() {
-                return mListener.mContentBlockedCount > 0;
+                return mCallback.mContentBlockedCount > 0;
             }
         }.run();
     }
diff --git a/tests/tests/tv/src/android/media/tv/cts/TvViewTest.java b/tests/tests/tv/src/android/media/tv/cts/TvViewTest.java
index 960aef7..9dc3bb0 100644
--- a/tests/tests/tv/src/android/media/tv/cts/TvViewTest.java
+++ b/tests/tests/tv/src/android/media/tv/cts/TvViewTest.java
@@ -21,15 +21,14 @@
 import android.content.Context;
 import android.cts.util.PollingCheck;
 import android.database.Cursor;
-import android.test.ActivityInstrumentationTestCase2;
-import android.media.tv.TvContentRating;
 import android.media.tv.TvContract;
 import android.media.tv.TvInputInfo;
 import android.media.tv.TvInputManager;
 import android.media.tv.TvTrackInfo;
 import android.media.tv.TvView;
-import android.media.tv.cts.Utils;
+import android.media.tv.TvView.TvInputCallback;
 import android.net.Uri;
+import android.test.ActivityInstrumentationTestCase2;
 import android.util.ArrayMap;
 import android.util.SparseIntArray;
 import android.view.InputEvent;
@@ -54,13 +53,13 @@
     private Instrumentation mInstrumentation;
     private TvInputManager mManager;
     private TvInputInfo mStubInfo;
-    private final MockListener mListener = new MockListener();
+    private final MockCallback mCallback = new MockCallback();
 
-    private static class MockListener extends TvView.TvInputListener {
+    private static class MockCallback extends TvInputCallback {
         private final Map<String, Boolean> mVideoAvailableMap = new ArrayMap<>();
         private final Map<String, SparseIntArray> mSelectedTrackGenerationMap = new ArrayMap<>();
         private final Map<String, Integer> mTracksGenerationMap = new ArrayMap<>();
-        private Object mLock = new Object();
+        private final Object mLock = new Object();
 
         public boolean isVideoAvailable(String inputId) {
             synchronized (mLock) {
@@ -80,13 +79,6 @@
             }
         }
 
-        public int getTrackGeneration(String inputId) {
-            synchronized (mLock) {
-                Integer tracksGeneration = mTracksGenerationMap.get(inputId);
-                return tracksGeneration == null ? 0 : tracksGeneration.intValue();
-            }
-        }
-
         @Override
         public void onVideoAvailable(String inputId) {
             synchronized (mLock) {
@@ -159,7 +151,7 @@
             }
         }
         assertNotNull(mStubInfo);
-        mTvView.setTvInputListener(mListener);
+        mTvView.setCallback(mCallback);
     }
 
     @Override
@@ -203,7 +195,7 @@
                 new PollingCheck(TIME_OUT) {
                     @Override
                     protected boolean check() {
-                        return mListener.isVideoAvailable(mStubInfo.getId());
+                        return mCallback.isVideoAvailable(mStubInfo.getId());
                     }
                 }.run();
 
@@ -223,13 +215,13 @@
 
     private void selectTrackAndVerify(final int type, final TvTrackInfo track,
             List<TvTrackInfo> tracks) {
-        final int previousGeneration = mListener.getSelectedTrackGeneration(
+        final int previousGeneration = mCallback.getSelectedTrackGeneration(
                 mStubInfo.getId(), type);
         mTvView.selectTrack(type, track == null ? null : track.getId());
         new PollingCheck(TIME_OUT) {
             @Override
             protected boolean check() {
-                return mListener.getSelectedTrackGeneration(
+                return mCallback.getSelectedTrackGeneration(
                         mStubInfo.getId(), type) > previousGeneration;
             }
         }.run();
@@ -304,7 +296,6 @@
                 final int[] types = { TvTrackInfo.TYPE_AUDIO, TvTrackInfo.TYPE_VIDEO,
                     TvTrackInfo.TYPE_SUBTITLE };
                 for (int type : types) {
-                    final int typeF = type;
                     for (TvTrackInfo track : mTvView.getTracks(type)) {
                         selectTrackAndVerify(type, track, tracks);
                     }
@@ -355,7 +346,7 @@
             new PollingCheck(TIME_OUT) {
                 @Override
                 protected boolean check() {
-                    return mListener.isVideoAvailable(mStubInfo.getId());
+                    return mCallback.isVideoAvailable(mStubInfo.getId());
                 }
             }.run();
         }
diff --git a/tools/utils/buildCts.py b/tools/utils/buildCts.py
index 0f74a81..aa5bbf1 100755
--- a/tools/utils/buildCts.py
+++ b/tools/utils/buildCts.py
@@ -164,7 +164,7 @@
 
     # CTS Stable plan
     plan = tools.TestPlan(packages)
-    plan.Exclude(r'android\.display')
+    plan.Exclude(r'com\.android\.cts\.browserbench')
     for package, test_list in flaky_tests.iteritems():
       plan.ExcludeTests(package, test_list)
     self.__WritePlan(plan, 'CTS-stable')
@@ -172,7 +172,7 @@
     # CTS Flaky plan - inversion of CTS Stable
     plan = tools.TestPlan(packages)
     plan.Exclude('.*')
-    plan.Include(r'android\.display')
+    plan.Include(r'com\.android\.cts\.browserbench')
     for package, test_list in flaky_tests.iteritems():
       plan.Include(package)
       plan.IncludeTests(package, test_list)
@@ -187,6 +187,8 @@
           'cts.ActivityManagerTest#testIsRunningInTestHarness',
           'cts.AlertDialogTest#testAlertDialogCancelable',
           'cts.ExpandableListActivityTest#testCallback',],
+      'android.dpi' : [
+          'cts.DefaultManifestAttributesSdkTest#testPackageHasExpectedSdkVersion',],
       'android.hardware' : [
           'camera2.cts.CameraDeviceTest#testCameraDeviceRepeatingRequest',
           'camera2.cts.ImageReaderTest#testImageReaderFromCameraJpeg',
@@ -213,6 +215,9 @@
           'wifi.cts.NsdManagerTest#testAndroidTestCaseSetupProperly',
           'wifi.cts.ScanResultTest#testAndroidTestCaseSetupProperly',
           'wifi.cts.ScanResultTest#testScanResultTimeStamp',],
+      'android.os' : [
+          'cts.BuildVersionTest#testReleaseVersion',
+          'cts.BuildTest#testIsSecureUserBuild',],
       'android.security' : [
           'cts.BannedFilesTest#testNoSu',
           'cts.BannedFilesTest#testNoSuInPath',