diff --git a/OldCtsTestCaseList.mk b/OldCtsTestCaseList.mk
index 1c6bd7f..d2eb85b 100644
--- a/OldCtsTestCaseList.mk
+++ b/OldCtsTestCaseList.mk
@@ -155,12 +155,12 @@
     CtsAppTestCases \
     CtsAppWidgetTestCases \
     CtsAssistTestCases \
-    CtsAutomotiveTestCases \
     CtsBluetoothTestCases \
     CtsBrowserTestCases \
     CtsCalendarcommon2TestCases \
     CtsCallLogTestCases \
     CtsCameraTestCases \
+    CtsCarTestCases \
     CtsContentTestCases \
     CtsDatabaseTestCases \
     CtsDisplayTestCases \
@@ -196,6 +196,7 @@
     CtsNetTestCasesLegacyApi22 \
     CtsNetTestCasesLegacyPermission22 \
     CtsNetSecConfigAttributeTestCases \
+    CtsNetSecConfigCleartextTrafficTestCases \
     CtsNetSecConfigBasicDebugDisabledTestCases \
     CtsNetSecConfigBasicDebugEnabledTestCases \
     CtsNetSecConfigBasicDomainConfigTestCases \
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/DocumentsTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/DocumentsTest.java
index 25ee645..c2f17c53 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/DocumentsTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/DocumentsTest.java
@@ -109,6 +109,16 @@
                 "testOpenExternalDirectory_notAskedAgain");
     }
 
+    public void testOpenExternalDirectory_deniesOnceButAllowsAskingAgain() throws Exception {
+        runDeviceTests(CLIENT_PKG, ".DocumentsClientTest",
+                "testOpenExternalDirectory_deniesOnceButAllowsAskingAgain");
+    }
+
+    public void testOpenExternalDirectory_deniesOnceForAll() throws Exception {
+        runDeviceTests(CLIENT_PKG, ".DocumentsClientTest",
+                "testOpenExternalDirectory_deniesOnceForAll");
+    }
+
     public void testOpenExternalDirectory_userAcceptsNewDirectory() throws Exception {
         // TODO: figure out a better way to remove the directory.
         final String command = "rm -rf /sdcard/Pictures";
diff --git a/hostsidetests/appsecurity/test-apps/DocumentClient/src/com/android/cts/documentclient/DocumentsClientTest.java b/hostsidetests/appsecurity/test-apps/DocumentClient/src/com/android/cts/documentclient/DocumentsClientTest.java
index 69583a7..6c9108d 100644
--- a/hostsidetests/appsecurity/test-apps/DocumentClient/src/com/android/cts/documentclient/DocumentsClientTest.java
+++ b/hostsidetests/appsecurity/test-apps/DocumentClient/src/com/android/cts/documentclient/DocumentsClientTest.java
@@ -384,14 +384,10 @@
     public void testOpenExternalDirectory_userRejects() throws Exception {
         if (!supportedHardware()) return;
 
-        final String externalRoot = getExternalStorageDirectory().getPath();
-
         final StorageVolume primaryVolume = getPrimaryVolume();
 
         // Tests user clicking DENY button, for all valid directories.
         for (String directory : STANDARD_DIRECTORIES) {
-            final Uri uri = Uri.fromFile(new File(externalRoot, directory));
-
             final UiAlertDialog dialog = openExternalDirectoryValidPath(primaryVolume, directory);
             dialog.noButton.click();
             assertActivityFailed();
@@ -430,6 +426,56 @@
         assertNotEqual(grantedUri, grantedUri2);
     }
 
+    public void testOpenExternalDirectory_deniesOnceButAllowsAskingAgain() throws Exception {
+        if (!supportedHardware())
+            return;
+
+        for (StorageVolume volume : getVolumes()) {
+            // Rejects the first attempt...
+            UiAlertDialog dialog = openExternalDirectoryValidPath(volume, DIRECTORY_DCIM);
+            dialog.assertDoNotAskAgainVisibility(false);
+            dialog.noButton.click();
+            assertActivityFailed();
+
+            // ...and the second.
+            dialog = openExternalDirectoryValidPath(volume, DIRECTORY_DCIM);
+            dialog.assertDoNotAskAgainVisibility(true);
+            dialog.noButton.click();
+            assertActivityFailed();
+
+            // Third time is a charm...
+            userAcceptsOpenExternalDirectoryTest(volume, DIRECTORY_DCIM);
+        }
+    }
+
+    public void testOpenExternalDirectory_deniesOnceForAll() throws Exception {
+        if (!supportedHardware())
+            return;
+        for (StorageVolume volume : getVolumes()) {
+            // Rejects the first attempt...
+            UiAlertDialog dialog = openExternalDirectoryValidPath(volume, DIRECTORY_RINGTONES);
+            dialog.assertDoNotAskAgainVisibility(false);
+            dialog.noButton.click();
+            assertActivityFailed();
+
+            // ...and the second, checking the box
+            dialog = openExternalDirectoryValidPath(volume, DIRECTORY_RINGTONES);
+            UiObject checkbox = dialog.assertDoNotAskAgainVisibility(true);
+            assertTrue("checkbox should not be checkable", checkbox.isCheckable());
+            assertFalse("checkbox should not be checked", checkbox.isChecked());
+            checkbox.click();
+            assertTrue("checkbox should be checked", checkbox.isChecked()); // Sanity check
+            assertFalse("allow button should be disabled", dialog.yesButton.isEnabled());
+
+            dialog.noButton.click();
+            assertActivityFailed();
+
+            // Third strike out...
+            sendOpenExternalDirectoryIntent(volume, DIRECTORY_RINGTONES);
+            assertActivityFailed();
+        }
+    }
+
     private Uri userAcceptsOpenExternalDirectoryTest(StorageVolume volume, String directoryName)
             throws Exception {
         // Asserts dialog contain the proper message.
@@ -721,6 +767,7 @@
     }
 
     private final class UiAlertDialog {
+        final UiObject dialog;
         final UiObject messageText;
         final UiObject yesButton;
         final UiObject noButton;
@@ -729,11 +776,31 @@
             final String id = "android:id/parentPanel";
             boolean gotIt = mDevice.wait(Until.hasObject(By.res(id)), TIMEOUT);
             assertTrue("object with id '(" + id + "') not visible yet", gotIt);
-            final UiObject dialog = mDevice.findObject(new UiSelector().resourceId(id));
+            dialog = mDevice.findObject(new UiSelector().resourceId(id));
             assertTrue("object with id '(" + id + "') doesn't exist", dialog.exists());
-            messageText = dialog.getChild(new UiSelector().resourceId("android:id/message"));
+            messageText = dialog.getChild(
+                    new UiSelector().resourceId("com.android.documentsui:id/message"));
             yesButton = dialog.getChild(new UiSelector().resourceId("android:id/button1"));
             noButton  = dialog.getChild(new UiSelector().resourceId("android:id/button2"));
         }
+
+        private UiObject getDoNotAskAgainCheckBox() throws UiObjectNotFoundException {
+            return dialog.getChild(
+                    new UiSelector().resourceId("com.android.documentsui:id/do_not_ask_checkbox"));
+        }
+
+        UiObject assertDoNotAskAgainVisibility(boolean expectVisible) {
+            UiObject checkbox = null;
+            try {
+                checkbox = getDoNotAskAgainCheckBox();
+                assertEquals("Wrong value for 'DoNotAskAgain.exists()",
+                        expectVisible, checkbox.exists());
+            } catch (UiObjectNotFoundException e) {
+                if (expectVisible) {
+                    fail("'Do Not Ask Again' not found");
+                }
+            }
+            return checkbox;
+        }
     }
 }
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/CreateAndManageUserTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/CreateAndManageUserTest.java
index 91663c7..391ef15 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/CreateAndManageUserTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/CreateAndManageUserTest.java
@@ -16,6 +16,7 @@
 
 package com.android.cts.deviceowner;
 
+import android.app.ActivityManager;
 import android.app.admin.DeviceAdminReceiver;
 import android.app.admin.DevicePolicyManager;
 import android.content.BroadcastReceiver;
@@ -46,6 +47,7 @@
     private static final int BROADCAST_TIMEOUT = 15_000;
     private static final int USER_SWITCH_DELAY = 10_000;
     private PackageManager mPackageManager;
+    private ActivityManager mActivityManager;
     private volatile boolean mReceived;
     private volatile boolean mTestProfileOwnerWasUsed;
     private volatile boolean mSetupComplete;
@@ -55,6 +57,7 @@
     protected void setUp() throws Exception {
         super.setUp();
         mPackageManager = mContext.getPackageManager();
+        mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
     }
 
     @Override
@@ -241,7 +244,11 @@
     }
 
     public void testCreateAndManageUser_DontSkipSetupWizard() {
-        createAndManageUserTest(0);
+        if (!mActivityManager.isRunningInTestHarness()) {
+            // In test harness, the setup wizard will be disabled by default, so this test is always
+            // failing.
+            createAndManageUserTest(0);
+        }
     }
 
     // createAndManageUser should circumvent the DISALLOW_ADD_USER restriction
diff --git a/hostsidetests/devicepolicy/app/PackageInstaller/src/com/android/cts/packageinstaller/ManualPackageInstallTest.java b/hostsidetests/devicepolicy/app/PackageInstaller/src/com/android/cts/packageinstaller/ManualPackageInstallTest.java
index 96affae..1bb797f 100644
--- a/hostsidetests/devicepolicy/app/PackageInstaller/src/com/android/cts/packageinstaller/ManualPackageInstallTest.java
+++ b/hostsidetests/devicepolicy/app/PackageInstaller/src/com/android/cts/packageinstaller/ManualPackageInstallTest.java
@@ -33,11 +33,11 @@
     private static final BySelector POPUP_BUTTON_SELECTOR = By
             .clazz(android.widget.Button.class.getName())
             .res("android:id/button1")
-            .pkg("com.google.android.packageinstaller");
-    private static final BySelector POPUP_TEXT_SELECTOR = By
-            .clazz(android.widget.TextView.class.getName())
-            .res("android:id/alertTitle")
-            .pkg("com.google.android.packageinstaller");
+            .pkg("com.android.settings");
+    private static final BySelector POPUP_IMAGE_SELECTOR = By
+            .clazz(android.widget.ImageView.class.getName())
+            .res("com.android.settings:id/admin_support_icon")
+            .pkg("com.android.settings");
     private static final BySelector INSTALL_BUTTON_SELECTOR = By
             .clazz(android.widget.Button.class.getName())
             .res("com.android.packageinstaller:id/ok_button")
@@ -106,9 +106,9 @@
     }
 
     private void automateDismissInstallBlockedDialog() {
-        mDevice.wait(Until.hasObject(POPUP_TEXT_SELECTOR), AUTOMATOR_WAIT_TIMEOUT);
-        UiObject2 text = mDevice.findObject(POPUP_TEXT_SELECTOR);
-        assertNotNull("Alert dialog not found", text);
+        mDevice.wait(Until.hasObject(POPUP_IMAGE_SELECTOR), AUTOMATOR_WAIT_TIMEOUT);
+        UiObject2 icon = mDevice.findObject(POPUP_IMAGE_SELECTOR);
+        assertNotNull("Policy transparency dialog icon not found", icon);
         // "OK" button only present in the dialog if it is blocked by policy.
         UiObject2 button = mDevice.findObject(POPUP_BUTTON_SELECTOR);
         assertNotNull("OK button not found", button);
diff --git a/tests/accessibility/src/android/view/accessibility/cts/AccessibilityManagerTest.java b/tests/accessibility/src/android/view/accessibility/cts/AccessibilityManagerTest.java
index bc88085..bb199b4 100644
--- a/tests/accessibility/src/android/view/accessibility/cts/AccessibilityManagerTest.java
+++ b/tests/accessibility/src/android/view/accessibility/cts/AccessibilityManagerTest.java
@@ -24,6 +24,7 @@
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityManager;
 import android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener;
+import android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener;
 
 import java.util.List;
 
@@ -63,6 +64,19 @@
         };
         assertTrue(mAccessibilityManager.addAccessibilityStateChangeListener(listener));
         assertTrue(mAccessibilityManager.removeAccessibilityStateChangeListener(listener));
+        assertFalse(mAccessibilityManager.removeAccessibilityStateChangeListener(listener));
+    }
+
+    public void testAddAndRemoveTouchExplorationStateChangeListener() throws Exception {
+        TouchExplorationStateChangeListener listener = new TouchExplorationStateChangeListener() {
+            @Override
+            public void onTouchExplorationStateChanged(boolean enabled) {
+                // Do nothing.
+            }
+        };
+        assertTrue(mAccessibilityManager.addTouchExplorationStateChangeListener(listener));
+        assertTrue(mAccessibilityManager.removeTouchExplorationStateChangeListener(listener));
+        assertFalse(mAccessibilityManager.removeTouchExplorationStateChangeListener(listener));
     }
 
     public void testIsTouchExplorationEnabled() throws Exception {
@@ -173,6 +187,10 @@
                 AccessibilityEvent.TYPE_VIEW_CLICKED));
     }
 
+    public void testTouchExplorationStateChanged() throws Exception {
+        waitForTouchExplorationEnabled();
+    }
+
     private void waitForAccessibilityEnabled() throws InterruptedException {
         final Object waitObject = new Object();
 
@@ -192,6 +210,29 @@
             }
         }
         mAccessibilityManager.removeAccessibilityStateChangeListener(listener);
-        assertTrue("Time out enabling accessibility", mAccessibilityManager.isEnabled());
+        assertTrue("Timed out enabling accessibility", mAccessibilityManager.isEnabled());
+    }
+
+    private void waitForTouchExplorationEnabled() throws InterruptedException {
+        final Object waitObject = new Object();
+
+        TouchExplorationStateChangeListener listener = new TouchExplorationStateChangeListener() {
+            @Override
+            public void onTouchExplorationStateChanged(boolean b) {
+                synchronized (waitObject) {
+                    waitObject.notifyAll();
+                }
+            }
+        };
+        mAccessibilityManager.addTouchExplorationStateChangeListener(listener);
+        long timeoutTime = System.currentTimeMillis() + WAIT_FOR_ACCESSIBILITY_ENABLED_TIMEOUT;
+        synchronized (waitObject) {
+            if (!mAccessibilityManager.isEnabled() && (System.currentTimeMillis() < timeoutTime)) {
+                waitObject.wait(timeoutTime - System.currentTimeMillis());
+            }
+        }
+        mAccessibilityManager.removeTouchExplorationStateChangeListener(listener);
+        assertTrue("Timed out enabling touch exploration",
+                mAccessibilityManager.isTouchExplorationEnabled());
     }
 }
diff --git a/tests/accessibility/src/android/view/accessibility/cts/AccessibilityNodeInfo_CollectionInfoTest.java b/tests/accessibility/src/android/view/accessibility/cts/AccessibilityNodeInfo_CollectionInfoTest.java
new file mode 100644
index 0000000..d64bd94
--- /dev/null
+++ b/tests/accessibility/src/android/view/accessibility/cts/AccessibilityNodeInfo_CollectionInfoTest.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.accessibility.cts;
+
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.accessibility.AccessibilityNodeInfo.CollectionInfo;
+
+/**
+ * Class for testing {@link CollectionInfo}.
+ */
+public class AccessibilityNodeInfo_CollectionInfoTest extends AndroidTestCase {
+
+    @SmallTest
+    public void testObtain() {
+        CollectionInfo c;
+
+        c = CollectionInfo.obtain(0, 1, true);
+        assertNotNull(c);
+        assertEquals(0, c.getRowCount());
+        assertEquals(1, c.getColumnCount());
+        assertTrue(c.isHierarchical());
+        assertEquals(CollectionInfo.SELECTION_MODE_NONE, c.getSelectionMode());
+
+        c = CollectionInfo.obtain(1, 2, true, CollectionInfo.SELECTION_MODE_MULTIPLE);
+        assertNotNull(c);
+        assertEquals(1, c.getRowCount());
+        assertEquals(2, c.getColumnCount());
+        assertTrue(c.isHierarchical());
+        assertEquals(CollectionInfo.SELECTION_MODE_MULTIPLE, c.getSelectionMode());
+    }
+}
diff --git a/tests/accessibility/src/android/view/accessibility/cts/AccessibilityNodeInfo_RangeInfoTest.java b/tests/accessibility/src/android/view/accessibility/cts/AccessibilityNodeInfo_RangeInfoTest.java
new file mode 100644
index 0000000..954d762
--- /dev/null
+++ b/tests/accessibility/src/android/view/accessibility/cts/AccessibilityNodeInfo_RangeInfoTest.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.accessibility.cts;
+
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityNodeInfo.RangeInfo;
+
+/**
+ * Class for testing {@link AccessibilityNodeInfo.RangeInfo}.
+ */
+public class AccessibilityNodeInfo_RangeInfoTest extends AndroidTestCase {
+
+    /** Allowed tolerance for floating point equality comparisons. */
+    public static final float FLOAT_TOLERANCE = 0.001f;
+
+    @SmallTest
+    public void testObtain() {
+        RangeInfo r;
+
+        r = RangeInfo.obtain(RangeInfo.RANGE_TYPE_INT, -100, 0, -50);
+        assertEquals(RangeInfo.RANGE_TYPE_INT, r.getType());
+        assertEquals(-100, r.getMin(), FLOAT_TOLERANCE);
+        assertEquals(0, r.getMax(), FLOAT_TOLERANCE);
+        assertEquals(-50, r.getCurrent(), FLOAT_TOLERANCE);
+
+        r = RangeInfo.obtain(RangeInfo.RANGE_TYPE_FLOAT, -1.5f, 1.5f, 0.0f);
+        assertEquals(RangeInfo.RANGE_TYPE_FLOAT, r.getType());
+        assertEquals(-1.5f, r.getMin(), FLOAT_TOLERANCE);
+        assertEquals(1.5f, r.getMax(), FLOAT_TOLERANCE);
+        assertEquals(0.0f, r.getCurrent(), FLOAT_TOLERANCE);
+
+        r = RangeInfo.obtain(RangeInfo.RANGE_TYPE_PERCENT, 0.0f, 100.0f, 50.0f);
+        assertEquals(RangeInfo.RANGE_TYPE_PERCENT, r.getType());
+        assertEquals(0.0f, r.getMin(), FLOAT_TOLERANCE);
+        assertEquals(100.0f, r.getMax(), FLOAT_TOLERANCE);
+        assertEquals(50.0f, r.getCurrent(), FLOAT_TOLERANCE);
+    }
+}
diff --git a/tests/accessibility/src/android/view/accessibility/cts/AccessibilityNodeProviderTest.java b/tests/accessibility/src/android/view/accessibility/cts/AccessibilityNodeProviderTest.java
new file mode 100644
index 0000000..eeee235
--- /dev/null
+++ b/tests/accessibility/src/android/view/accessibility/cts/AccessibilityNodeProviderTest.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.accessibility.cts;
+
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.accessibility.AccessibilityNodeProvider;
+
+/**
+ * Class for testing {@link AccessibilityNodeProvider}.
+ */
+public class AccessibilityNodeProviderTest extends AndroidTestCase {
+    @SmallTest
+    public void testDefaultBehavior() {
+        AccessibilityNodeProvider p = new AccessibilityNodeProvider() {
+            // Class is abstract, but has no abstract methods.
+        };
+
+        assertNull(p.createAccessibilityNodeInfo(0));
+        assertNull(p.findAccessibilityNodeInfosByText(null, 0));
+        assertNull(p.findFocus(0));
+        assertFalse(p.performAction(0, 0, null));
+    }
+}
diff --git a/tests/accessibility/src/android/view/accessibility/cts/AccessibilityWindowInfoTest.java b/tests/accessibility/src/android/view/accessibility/cts/AccessibilityWindowInfoTest.java
new file mode 100644
index 0000000..293feec
--- /dev/null
+++ b/tests/accessibility/src/android/view/accessibility/cts/AccessibilityWindowInfoTest.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.accessibility.cts;
+
+import android.graphics.Rect;
+import android.os.Parcel;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.accessibility.AccessibilityWindowInfo;
+
+/**
+ * Class for testing {@link AccessibilityWindowInfo}.
+ */
+public class AccessibilityWindowInfoTest extends AndroidTestCase {
+
+    @SmallTest
+    public void testObtain() {
+        AccessibilityWindowInfo w1 = AccessibilityWindowInfo.obtain();
+        assertNotNull(w1);
+
+        AccessibilityWindowInfo w2 = AccessibilityWindowInfo.obtain(w1);
+        assertNotSame(w1, w2);
+        assertEquals(w1, w2);
+    }
+
+    @SmallTest
+    public void testParceling() {
+        Parcel parcel = Parcel.obtain();
+        AccessibilityWindowInfo w1 = AccessibilityWindowInfo.obtain();
+        w1.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+        AccessibilityWindowInfo w2 = AccessibilityWindowInfo.CREATOR.createFromParcel(parcel);
+        assertNotSame(w1, w2);
+        assertEquals(w1, w2);
+
+    }
+
+    @SmallTest
+    public void testDefaultValues() {
+        AccessibilityWindowInfo w = AccessibilityWindowInfo.obtain();
+        assertEquals(0, w.getChildCount());
+        assertEquals(-1, w.getType());
+        assertEquals(-1, w.getLayer());
+        assertEquals(-1, w.getId());
+        assertEquals(0, w.describeContents());
+        assertNull(w.getParent());
+        assertNull(w.getRoot());
+        assertFalse(w.isAccessibilityFocused());
+        assertFalse(w.isActive());
+        assertFalse(w.isFocused());
+
+        Rect rect = new Rect();
+        w.getBoundsInScreen(rect);
+        assertTrue(rect.isEmpty());
+
+        try {
+            w.getChild(0);
+            fail("Expected IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException e) {
+            // Expected.
+        }
+    }
+
+    @SmallTest
+    public void testRecycle() {
+        AccessibilityWindowInfo w = AccessibilityWindowInfo.obtain();
+        w.recycle();
+
+        try {
+            w.recycle();
+            fail("Expected IllegalStateException");
+        } catch (IllegalStateException e) {
+            // Expected.
+        }
+    }
+}
diff --git a/tests/accessibility/src/android/view/accessibility/cts/CaptioningManagerTest.java b/tests/accessibility/src/android/view/accessibility/cts/CaptioningManagerTest.java
index 34beb59..997ee61 100644
--- a/tests/accessibility/src/android/view/accessibility/cts/CaptioningManagerTest.java
+++ b/tests/accessibility/src/android/view/accessibility/cts/CaptioningManagerTest.java
@@ -67,7 +67,9 @@
         putSecureSetting("accessibility_captioning_enabled", "1");
         assertTrue("Observed enabled change", listener.wasEnabledChangedCalled);
 
+        // Style change gets posted in a Runnable, so we need to wait for idle.
         putSecureSetting("accessibility_captioning_preset", "-1");
+        getInstrumentation().waitForIdleSync();
         assertTrue("Observed user style change", listener.wasUserStyleChangedCalled);
 
         putSecureSetting("accessibility_captioning_locale", "ja_JP");
diff --git a/tests/accessibility/src/android/view/accessibility/cts/SpeakingAccessibilityService.java b/tests/accessibility/src/android/view/accessibility/cts/SpeakingAccessibilityService.java
index afa08cd..219a2ff 100644
--- a/tests/accessibility/src/android/view/accessibility/cts/SpeakingAccessibilityService.java
+++ b/tests/accessibility/src/android/view/accessibility/cts/SpeakingAccessibilityService.java
@@ -17,6 +17,7 @@
 package android.view.accessibility.cts;
 
 import android.accessibilityservice.AccessibilityService;
+import android.accessibilityservice.AccessibilityServiceInfo;
 import android.view.accessibility.AccessibilityEvent;
 
 /**
@@ -34,6 +35,10 @@
 
     @Override
     protected void onServiceConnected() {
+        final AccessibilityServiceInfo info = getServiceInfo();
+        info.flags |= AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE;
+        setServiceInfo(info);
+
         synchronized (sWaitObjectForConnecting) {
             sConnectedInstance = this;
             sWaitObjectForConnecting.notifyAll();
diff --git a/tests/accessibility/src/android/view/accessibility/cts/VibratingAccessibilityService.java b/tests/accessibility/src/android/view/accessibility/cts/VibratingAccessibilityService.java
index 6bf522e..41edf9f 100644
--- a/tests/accessibility/src/android/view/accessibility/cts/VibratingAccessibilityService.java
+++ b/tests/accessibility/src/android/view/accessibility/cts/VibratingAccessibilityService.java
@@ -17,6 +17,7 @@
 package android.view.accessibility.cts;
 
 import android.accessibilityservice.AccessibilityService;
+import android.accessibilityservice.AccessibilityServiceInfo;
 import android.view.accessibility.AccessibilityEvent;
 
 /**
@@ -34,6 +35,10 @@
 
     @Override
     protected void onServiceConnected() {
+        final AccessibilityServiceInfo info = getServiceInfo();
+        info.flags |= AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE;
+        setServiceInfo(info);
+
         synchronized (sWaitObjectForConnecting) {
             sConnectedInstance = this;
             sWaitObjectForConnecting.notifyAll();
diff --git a/tests/app/src/android/app/cts/AlertDialog_BuilderCursorTest.java b/tests/app/src/android/app/cts/AlertDialog_BuilderCursorTest.java
new file mode 100644
index 0000000..6305adb
--- /dev/null
+++ b/tests/app/src/android/app/cts/AlertDialog_BuilderCursorTest.java
@@ -0,0 +1,261 @@
+/*
+ * Copyright (C) 2008 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.app.cts;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.AlertDialog.Builder;
+import android.app.Instrumentation;
+import android.app.stubs.DialogStubActivity;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
+import android.content.DialogInterface.OnMultiChoiceClickListener;
+import android.cts.util.PollingCheck;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteCursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.support.test.InstrumentationRegistry;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.suitebuilder.annotation.MediumTest;
+import android.widget.ListView;
+
+import java.io.File;
+
+import static org.mockito.Mockito.*;
+
+@MediumTest
+public class AlertDialog_BuilderCursorTest
+        extends ActivityInstrumentationTestCase2<DialogStubActivity> {
+    private Builder mBuilder;
+    private Context mContext;
+    private Instrumentation mInstrumentation;
+    private AlertDialog mDialog;
+    private ListView mListView;
+
+    private static final String TEXT_COLUMN_NAME = "text";
+    private static final String CHECKED_COLUMN_NAME = "checked";
+
+    private String[] mTextContent;
+    private boolean[] mCheckedContent;
+
+    private String[] mProjectionWithChecked;
+    private String[] mProjectionWithoutChecked;
+
+    private SQLiteDatabase mDatabase;
+    private File mDatabaseFile;
+    private Cursor mCursor;
+
+    private OnClickListener mOnClickListener = mock(OnClickListener.class);
+
+    /**
+     * Multi-choice click listener that is registered on our {@link AlertDialog} when it's in
+     * multi-choide mode. Note that this needs to be a separate class that is also protected (not
+     * private) so that Mockito can "spy" on it.
+     */
+    protected class MultiChoiceClickListener implements OnMultiChoiceClickListener {
+        private boolean[] mCheckedTracker;
+
+        public MultiChoiceClickListener(boolean[] checkedTracker) {
+            mCheckedTracker = checkedTracker;
+        }
+
+        @Override
+        public void onClick(DialogInterface dialog, int which,
+                boolean isChecked) {
+            // Update the underlying database with the new checked
+            // state for the specific row
+            mCursor.moveToPosition(which);
+            ContentValues valuesToUpdate = new ContentValues();
+            valuesToUpdate.put(CHECKED_COLUMN_NAME, isChecked ? 1 : 0);
+            mDatabase.update("test", valuesToUpdate,
+                    TEXT_COLUMN_NAME + " = ?",
+                    new String[] { mCursor.getString(1) } );
+            mCursor.requery();
+            mCheckedTracker[which] = isChecked;
+        }
+    }
+
+    public AlertDialog_BuilderCursorTest() {
+        super("android.app.stubs", DialogStubActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mBuilder = null;
+        mInstrumentation = getInstrumentation();
+        mContext = getActivity();
+        final Activity activity = getActivity();
+        new PollingCheck() {
+            @Override
+            protected boolean check() {
+                return activity.hasWindowFocus();
+            }
+        }.run();
+        mListView = null;
+        mDialog = null;
+
+        // Local test data for the tests
+        mTextContent = new String[] { "Adele", "Beyonce", "Ciara", "Dido" };
+        mCheckedContent = new boolean[] { false, false, true, false };
+
+        // Two projections - one with "checked" column and one without
+        mProjectionWithChecked = new String[] {
+                "_id",                       // 0
+                TEXT_COLUMN_NAME,            // 1
+                CHECKED_COLUMN_NAME          // 2
+        };
+        mProjectionWithoutChecked = new String[] {
+                "_id",                       // 0
+                TEXT_COLUMN_NAME             // 1
+        };
+
+        File dbDir = mContext.getDir("tests", Context.MODE_PRIVATE);
+        mDatabaseFile = new File(dbDir, "database_alert_dialog_test.db");
+        if (mDatabaseFile.exists()) {
+            mDatabaseFile.delete();
+        }
+        mDatabase = SQLiteDatabase.openOrCreateDatabase(mDatabaseFile.getPath(), null);
+        assertNotNull(mDatabase);
+        // Create and populate a test table
+        mDatabase.execSQL(
+                "CREATE TABLE test (_id INTEGER PRIMARY KEY, " + TEXT_COLUMN_NAME +
+                        " TEXT, " + CHECKED_COLUMN_NAME + " INTEGER);");
+        for (int i = 0; i < mTextContent.length; i++) {
+            mDatabase.execSQL("INSERT INTO test (" + TEXT_COLUMN_NAME + ", " +
+                    CHECKED_COLUMN_NAME + ") VALUES ('" + mTextContent[i] + "', " +
+                    (mCheckedContent[i] ? "1" : "0") + ");");
+        }
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (mCursor != null) {
+            // Close the cursor on the UI thread as the list view in the alert dialog
+            // will get notified of any change to the underlying cursor.
+            InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+                @Override
+                public void run() {
+                    mCursor.close();
+                    mCursor = null;
+                }
+            });
+        }
+        if (mDatabase != null) {
+            mDatabase.close();
+        }
+        if (mDatabaseFile != null) {
+            mDatabaseFile.delete();
+        }
+
+        super.tearDown();
+    }
+
+    public void testSetCursor() throws Throwable {
+        // Use a projection without "checked" column
+        mCursor = mDatabase.query("test", mProjectionWithoutChecked,
+                null, null, null, null, null);
+        assertNotNull(mCursor);
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mBuilder = new Builder(mContext);
+                mBuilder.setCursor(mCursor, mOnClickListener, TEXT_COLUMN_NAME);
+                mDialog = mBuilder.show();
+                mListView = mDialog.getListView();
+                mListView.performItemClick(null, 0, 0);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+        final SQLiteCursor selected = (SQLiteCursor) mListView.getSelectedItem();
+        assertEquals(mCursor.getString(1), selected.getString(1));
+        verify(mOnClickListener, times(1)).onClick(mDialog, 0);
+        verifyNoMoreInteractions(mOnClickListener);
+    }
+
+    public void testSetSingleChoiceItemsWithParamCursor() throws Throwable {
+        // Use a projection without "checked" column
+        mCursor = mDatabase.query("test", mProjectionWithoutChecked,
+                null, null, null, null, null);
+        assertNotNull(mCursor);
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mBuilder = new Builder(mContext);
+                mBuilder.setSingleChoiceItems(mCursor, 0, TEXT_COLUMN_NAME, mOnClickListener);
+                mDialog = mBuilder.show();
+                mListView = mDialog.getListView();
+                mListView.performItemClick(null, 0, 0);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+        final SQLiteCursor selected = (SQLiteCursor) mListView.getSelectedItem();
+        assertEquals(mCursor.getString(1), selected.getString(1));
+        verify(mOnClickListener, times(1)).onClick(mDialog, 0);
+        verifyNoMoreInteractions(mOnClickListener);
+    }
+
+    public void testSetMultiChoiceItemsWithParamCursor() throws Throwable {
+        mCursor = mDatabase.query("test", mProjectionWithChecked,
+                null, null, null, null, null);
+        assertNotNull(mCursor);
+
+        final boolean[] checkedTracker = mCheckedContent.clone();
+        final OnMultiChoiceClickListener mockMultiChoiceClickListener =
+                spy(new MultiChoiceClickListener(checkedTracker));
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mBuilder = new Builder(mContext);
+                mBuilder.setMultiChoiceItems(mCursor, CHECKED_COLUMN_NAME, TEXT_COLUMN_NAME,
+                        mockMultiChoiceClickListener);
+                mDialog = mBuilder.show();
+                mListView = mDialog.getListView();
+                mListView.performItemClick(null, 0, 0);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        SQLiteCursor selected = (SQLiteCursor) mListView.getSelectedItem();
+        assertEquals(mCursor.getString(0), selected.getString(0));
+        verify(mockMultiChoiceClickListener, times(1)).onClick(mDialog, 0, true);
+        // Verify that our multi-choice listener was invoked to update our tracker array
+        assertTrue(checkedTracker[0]);
+        assertFalse(checkedTracker[1]);
+        assertTrue(checkedTracker[2]);
+        assertFalse(checkedTracker[3]);
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mListView.performItemClick(null, 1, 1);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        selected = (SQLiteCursor) mListView.getSelectedItem();
+        assertEquals(mCursor.getString(1), selected.getString(1));
+        verify(mockMultiChoiceClickListener, times(1)).onClick(mDialog, 1, true);
+        // Verify that our multi-choice listener was invoked to update our tracker array
+        assertTrue(checkedTracker[0]);
+        assertTrue(checkedTracker[1]);
+        assertTrue(checkedTracker[2]);
+        assertFalse(checkedTracker[3]);
+
+        verifyNoMoreInteractions(mockMultiChoiceClickListener);
+    }
+}
diff --git a/tests/app/src/android/app/cts/AlertDialog_BuilderTest.java b/tests/app/src/android/app/cts/AlertDialog_BuilderTest.java
index ff9d772..d13585a 100644
--- a/tests/app/src/android/app/cts/AlertDialog_BuilderTest.java
+++ b/tests/app/src/android/app/cts/AlertDialog_BuilderTest.java
@@ -22,8 +22,6 @@
 import android.app.Instrumentation;
 import android.app.stubs.DialogStubActivity;
 import android.app.stubs.R;
-import android.content.ContentResolver;
-import android.content.ContentValues;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.DialogInterface.OnCancelListener;
@@ -33,10 +31,7 @@
 import android.content.DialogInterface.OnMultiChoiceClickListener;
 import android.content.res.TypedArray;
 import android.cts.util.PollingCheck;
-import android.database.Cursor;
-import android.database.CursorWrapper;
 import android.graphics.drawable.Drawable;
-import android.provider.Contacts.People;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.view.KeyEvent;
@@ -61,9 +56,6 @@
     private AlertDialog mDialog;
     private Button mButton;
     private CharSequence mSelectedItem;
-    private final String[] mPROJECTION = new String[] {
-            People._ID, People.NAME
-    };
 
     private View mView;
     private ListView mListView;
@@ -419,27 +411,6 @@
         assertEquals(adapter, mListView.getAdapter());
     }
 
-    public void testSetCursor() throws Throwable {
-        preparePeople();
-        final Cursor c = mContext.getContentResolver().query(People.CONTENT_URI, mPROJECTION, null,
-                null, null);
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mBuilder = new AlertDialog.Builder(mContext);
-                mBuilder.setCursor(c, mOnClickListener, People.NAME);
-                mDialog = mBuilder.show();
-                mListView = mDialog.getListView();
-                mListView.performItemClick(null, 0, 0);
-            }
-        });
-        mInstrumentation.waitForIdleSync();
-        final CursorWrapper selected = (CursorWrapper)mListView.getSelectedItem();
-        assertEquals(c.getString(1), selected.getString(1));
-        verify(mOnClickListener, times(1)).onClick(mDialog, 0);
-        verifyNoMoreInteractions(mOnClickListener);
-    }
-
     public void testSetMultiChoiceItemsWithParamInt() throws Throwable {
 
         final CharSequence[] items = mContext.getResources().getTextArray(
@@ -488,30 +459,6 @@
         assertEquals(items[0], mListView.getItemAtPosition(0));
     }
 
-    public void testSetMultiChoiceItemsWithParamCursor() throws Throwable {
-        preparePeople();
-        final Cursor c = mContext.getContentResolver().query(People.CONTENT_URI, mPROJECTION, null,
-                null, null);
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mBuilder = new AlertDialog.Builder(mContext);
-                mBuilder.setMultiChoiceItems(c, People.NAME, People.NAME,
-                        mOnMultiChoiceClickListener);
-                mDialog = mBuilder.show();
-                mListView = mDialog.getListView();
-                mListView.performItemClick(null, 0, 0);
-                mListView.performItemClick(null, 1, 0);
-            }
-        });
-        mInstrumentation.waitForIdleSync();
-        final CursorWrapper selected = (CursorWrapper)mListView.getSelectedItem();
-        assertEquals(c.getString(1), selected.getString(1));
-        verify(mOnMultiChoiceClickListener, times(1)).onClick(mDialog, 0, true);
-        verify(mOnMultiChoiceClickListener, times(1)).onClick(mDialog, 1, true);
-        verifyNoMoreInteractions(mOnMultiChoiceClickListener);
-    }
-
     public void testSetSingleChoiceItemsWithParamInt() throws Throwable {
         final CharSequence[] items = mContext.getResources().getTextArray(
                 R.array.difficultyLevel);
@@ -534,39 +481,6 @@
         verifyNoMoreInteractions(mOnClickListener);
     }
 
-    private void preparePeople() {
-        final ContentResolver mResolver = mContext.getContentResolver();
-        mResolver.delete(People.CONTENT_URI, null, null);
-        final ContentValues values = new ContentValues();
-        values.put(People._ID, "1");
-        values.put(People.NAME, "name");
-        mResolver.insert(People.CONTENT_URI, values);
-    }
-
-    public void testSetSingleChoiceItemsWithParamCursor() throws Throwable {
-        final String[] PROJECTION = new String[] {
-                People._ID, People.NAME
-        };
-        preparePeople();
-        final Cursor c = mContext.getContentResolver().query(People.CONTENT_URI, PROJECTION, null,
-                null, null);
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mBuilder = new AlertDialog.Builder(mContext);
-                mBuilder.setSingleChoiceItems(c, 0, People.NAME, mOnClickListener);
-                mDialog = mBuilder.show();
-                mListView = mDialog.getListView();
-                mListView.performItemClick(null, 0, 0);
-            }
-        });
-        mInstrumentation.waitForIdleSync();
-        final CursorWrapper selected = (CursorWrapper)mListView.getSelectedItem();
-        assertEquals(c.getString(1), selected.getString(1));
-        verify(mOnClickListener, times(1)).onClick(mDialog, 0);
-        verifyNoMoreInteractions(mOnClickListener);
-    }
-
     public void testSetSingleChoiceItemsWithParamCharSequence() throws Throwable {
         final CharSequence[] items = mContext.getResources().getTextArray(
                 R.array.difficultyLevel);
diff --git a/tests/camera/AndroidTest.xml b/tests/camera/AndroidTest.xml
index df15689..b54e1a22 100644
--- a/tests/camera/AndroidTest.xml
+++ b/tests/camera/AndroidTest.xml
@@ -21,5 +21,7 @@
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="android.camera.cts" />
         <option name="runtime-hint" value="12m7s" />
+        <!-- test-timeout unit is ms, value = 30 min -->
+        <option name="test-timeout" value="1800000" />
     </test>
 </configuration>
diff --git a/tests/camera/src/android/hardware/camera2/cts/StillCaptureTest.java b/tests/camera/src/android/hardware/camera2/cts/StillCaptureTest.java
index ce229b1..a9b4ad2 100644
--- a/tests/camera/src/android/hardware/camera2/cts/StillCaptureTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/StillCaptureTest.java
@@ -402,7 +402,7 @@
                     continue;
                 }
                 takePictureTestByCamera(/*aeRegions*/null, /*awbRegions*/null, /*afRegions*/null,
-                        /*addAeTriggerCancel*/true, /*allocateBitmap*/true);
+                        /*addAeTriggerCancel*/false, /*allocateBitmap*/true);
             } finally {
                 closeDevice();
                 closeImageReader();
diff --git a/tests/expectations/knownfailures.txt b/tests/expectations/knownfailures.txt
index 185fc56..2d1443a 100644
--- a/tests/expectations/knownfailures.txt
+++ b/tests/expectations/knownfailures.txt
@@ -342,5 +342,22 @@
       "android.security.cts.MediaCryptoTest#testMediaCryptoWidevine"
   ],
   bug: 27218502
+},
+{
+  description: "Still investigating this, root cause unknown yet",
+  bug: 27578806,
+  names: ["com.android.cts.cpptools.RunAsHostTest#testRunAs"]
+},
+{
+  description: "Some SensorBatchingTest cases fails due to test imperection",
+  names: [
+      "android.hardware.cts.SensorBatchingTests#testGyroscope_fastest_batching",
+      "android.hardware.cts.SensorBatchingTests#testGravity_50hz_batching",
+      "android.hardware.cts.SensorBatchingTests#testGravity_fastest_batching",
+      "android.hardware.cts.SensorBatchingTests#testLinearAcceleration_50hz_batching",
+      "android.hardware.cts.SensorBatchingTests#testLinearAcceleration_fastest_batching",
+      "android.hardware.cts.SensorBatchingTests#testRotationVector_50hz_batching"
+      ],
+  bug: 27534791
 }
 ]
diff --git a/tests/tests/automotive/Android.mk b/tests/tests/car/Android.mk
similarity index 95%
rename from tests/tests/automotive/Android.mk
rename to tests/tests/car/Android.mk
index abef2ac..0138317 100644
--- a/tests/tests/automotive/Android.mk
+++ b/tests/tests/car/Android.mk
@@ -16,7 +16,7 @@
 
 include $(CLEAR_VARS)
 
-LOCAL_PACKAGE_NAME := CtsAutomotiveTestCases
+LOCAL_PACKAGE_NAME := CtsCarTestCases
 
 # Don't include this package in any target.
 LOCAL_MODULE_TAGS := optional
diff --git a/tests/tests/automotive/AndroidManifest.xml b/tests/tests/car/AndroidManifest.xml
similarity index 100%
rename from tests/tests/automotive/AndroidManifest.xml
rename to tests/tests/car/AndroidManifest.xml
diff --git a/tests/tests/automotive/AndroidTest.xml b/tests/tests/car/AndroidTest.xml
similarity index 87%
rename from tests/tests/automotive/AndroidTest.xml
rename to tests/tests/car/AndroidTest.xml
index b4af1f5..d82c101 100644
--- a/tests/tests/automotive/AndroidTest.xml
+++ b/tests/tests/car/AndroidTest.xml
@@ -16,9 +16,9 @@
 <configuration description="Config for CTS Automotive test cases">
     <target_preparer class="com.android.compatibility.common.tradefed.targetprep.ApkInstaller">
         <option name="cleanup-apks" value="true" />
-        <option name="test-file-name" value="CtsAutomotiveTestCases.apk" />
+        <option name="test-file-name" value="CtsCarTestCases.apk" />
     </target_preparer>
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
-        <option name="package" value="android.support.car.cts" />
+        <option name="package" value="android.car.cts" />
     </test>
 </configuration>
diff --git a/tests/tests/automotive/src/android/car/cts/CarApiTestBase.java b/tests/tests/car/src/android/car/cts/CarApiTestBase.java
similarity index 100%
rename from tests/tests/automotive/src/android/car/cts/CarApiTestBase.java
rename to tests/tests/car/src/android/car/cts/CarApiTestBase.java
diff --git a/tests/tests/automotive/src/android/car/cts/CarAppContextManagerTest.java b/tests/tests/car/src/android/car/cts/CarAppContextManagerTest.java
similarity index 100%
rename from tests/tests/automotive/src/android/car/cts/CarAppContextManagerTest.java
rename to tests/tests/car/src/android/car/cts/CarAppContextManagerTest.java
diff --git a/tests/tests/automotive/src/android/car/cts/CarInfoManagerTest.java b/tests/tests/car/src/android/car/cts/CarInfoManagerTest.java
similarity index 100%
rename from tests/tests/automotive/src/android/car/cts/CarInfoManagerTest.java
rename to tests/tests/car/src/android/car/cts/CarInfoManagerTest.java
diff --git a/tests/tests/automotive/src/android/car/cts/CarPackageManagerTest.java b/tests/tests/car/src/android/car/cts/CarPackageManagerTest.java
similarity index 100%
rename from tests/tests/automotive/src/android/car/cts/CarPackageManagerTest.java
rename to tests/tests/car/src/android/car/cts/CarPackageManagerTest.java
diff --git a/tests/tests/automotive/src/android/car/cts/CarSensorManagerTest.java b/tests/tests/car/src/android/car/cts/CarSensorManagerTest.java
similarity index 100%
rename from tests/tests/automotive/src/android/car/cts/CarSensorManagerTest.java
rename to tests/tests/car/src/android/car/cts/CarSensorManagerTest.java
diff --git a/tests/tests/automotive/src/android/car/cts/CarTest.java b/tests/tests/car/src/android/car/cts/CarTest.java
similarity index 100%
rename from tests/tests/automotive/src/android/car/cts/CarTest.java
rename to tests/tests/car/src/android/car/cts/CarTest.java
diff --git a/tests/tests/automotive/src/android/car/cts/CarUiProviderTest.java b/tests/tests/car/src/android/car/cts/CarUiProviderTest.java
similarity index 100%
rename from tests/tests/automotive/src/android/car/cts/CarUiProviderTest.java
rename to tests/tests/car/src/android/car/cts/CarUiProviderTest.java
diff --git a/tests/tests/automotive/src/android/car/cts/ExceptionsTest.java b/tests/tests/car/src/android/car/cts/ExceptionsTest.java
similarity index 100%
rename from tests/tests/automotive/src/android/car/cts/ExceptionsTest.java
rename to tests/tests/car/src/android/car/cts/ExceptionsTest.java
diff --git a/tests/tests/content/res/color-land/testcolor_orientation.xml b/tests/tests/content/res/color-land/testcolor_orientation.xml
new file mode 100644
index 0000000..f9e285b
--- /dev/null
+++ b/tests/tests/content/res/color-land/testcolor_orientation.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="@android:color/white" />
+</selector>
diff --git a/tests/tests/content/res/drawable/testcolor.xml b/tests/tests/content/res/color/testcolor.xml
similarity index 100%
rename from tests/tests/content/res/drawable/testcolor.xml
rename to tests/tests/content/res/color/testcolor.xml
diff --git a/tests/tests/content/res/color/testcolor_orientation.xml b/tests/tests/content/res/color/testcolor_orientation.xml
new file mode 100644
index 0000000..bef1ef6
--- /dev/null
+++ b/tests/tests/content/res/color/testcolor_orientation.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="@android:color/black" />
+</selector>
diff --git a/tests/tests/content/res/color/testcolor_themed.xml b/tests/tests/content/res/color/testcolor_themed.xml
new file mode 100644
index 0000000..eee0526
--- /dev/null
+++ b/tests/tests/content/res/color/testcolor_themed.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="?attr/themeColor" />
+</selector>
diff --git a/tests/tests/content/res/drawable/colordrawable_themed.xml b/tests/tests/content/res/drawable/colordrawable_themed.xml
new file mode 100644
index 0000000..eacbe65
--- /dev/null
+++ b/tests/tests/content/res/drawable/colordrawable_themed.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+-->
+<color xmlns:android="http://schemas.android.com/apk/res/android"
+       android:color="?attr/themeColor" />
diff --git a/tests/tests/content/res/values/attrs.xml b/tests/tests/content/res/values/attrs.xml
index ac88ef6..12b731b 100644
--- a/tests/tests/content/res/values/attrs.xml
+++ b/tests/tests/content/res/values/attrs.xml
@@ -48,6 +48,9 @@
     <attr name="type14" format="string"/>
     <attr name="type15" format="reference"/>
     <attr name="type16" format="string"/>
+    <attr name="type17" format="reference|color"/>
+    <attr name="typeEmpty" format="reference"/>
+    <attr name="typeUndefined" format="reference"/>
     <declare-styleable name="style1">
         <attr name="type1"/>
         <attr name="type2"/>
@@ -65,6 +68,9 @@
         <attr name="type14"/>
         <attr name="type15"/>
         <attr name="type16"/>
+        <attr name="type17"/>
+        <attr name="typeEmpty"/>
+        <attr name="typeUndefined"/>
     </declare-styleable>
     <attr name="testEnum">
         <enum name="val1" value="1" />
diff --git a/tests/tests/content/res/values/styles.xml b/tests/tests/content/res/values/styles.xml
index b27968d..c6e4b1d 100644
--- a/tests/tests/content/res/values/styles.xml
+++ b/tests/tests/content/res/values/styles.xml
@@ -33,6 +33,9 @@
         <item name="type14">TypedArray Test!</item>
         <item name="type15">@array/difficultyLevel</item>
         <item name="type16">Typed Value!</item>
+        <item name="type17">@color/testcolor_orientation</item>
+        <item name="typeEmpty">@empty</item>
+        <item name="typeUndefined">@null</item>
     </style>
 
     <style name="TextViewWithoutColorAndAppearance">
diff --git a/tests/tests/content/src/android/content/res/cts/AssetFileDescriptorTest.java b/tests/tests/content/src/android/content/res/cts/AssetFileDescriptorTest.java
index e4a9500..f5dc5ca 100644
--- a/tests/tests/content/src/android/content/res/cts/AssetFileDescriptorTest.java
+++ b/tests/tests/content/src/android/content/res/cts/AssetFileDescriptorTest.java
@@ -24,9 +24,11 @@
 import java.util.Arrays;
 
 import android.content.res.AssetFileDescriptor;
+import android.os.Bundle;
 import android.os.Parcel;
 import android.os.ParcelFileDescriptor;
 import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
 
 public class AssetFileDescriptorTest extends AndroidTestCase {
     private static final long START_OFFSET = 0;
@@ -66,6 +68,31 @@
         getContext().deleteFile(FILE_NAME);
     }
 
+    @SmallTest
+    public void testConstructor() throws IOException {
+        ParcelFileDescriptor fd = ParcelFileDescriptor.open(
+                mFile, ParcelFileDescriptor.MODE_READ_WRITE);
+        AssetFileDescriptor assetFileDes;
+        Bundle extras;
+
+        assetFileDes = new AssetFileDescriptor(fd, START_OFFSET, LENGTH);
+        assertNotNull(assetFileDes);
+        assetFileDes.close();
+
+        extras = null;
+        assetFileDes = new AssetFileDescriptor(fd, START_OFFSET, LENGTH, extras);
+        assertEquals(extras, assetFileDes.getExtras());
+        assertNotNull(assetFileDes);
+        assetFileDes.close();
+
+        extras = new Bundle();
+        assetFileDes = new AssetFileDescriptor(fd, START_OFFSET, LENGTH, extras);
+        assertEquals(extras, assetFileDes.getExtras());
+        assertNotNull(assetFileDes);
+        assetFileDes.close();
+    }
+
+    @SmallTest
     public void testInputOutputStream() throws IOException {
         /*
          * test createOutputStream() and createInputStrean()
@@ -150,6 +177,7 @@
         }
     }
 
+    @SmallTest
     public void testMiscMethod() {
         // test getLength()
         assertEquals(LENGTH, mAssetFileDes.getLength());
diff --git a/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java b/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java
index b861264..4893ec1 100644
--- a/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java
+++ b/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java
@@ -26,6 +26,7 @@
 import android.content.res.Resources;
 import android.content.res.XmlResourceParser;
 import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
 import android.util.TypedValue;
 
 import java.io.BufferedReader;
@@ -45,6 +46,7 @@
         mAssets = mContext.getAssets();
     }
 
+    @SmallTest
     public void testAssetOperations() throws IOException, XmlPullParserException {
         final Resources res = getContext().getResources();
         final TypedValue value = new TypedValue();
@@ -117,7 +119,23 @@
 
     }
 
+    @SmallTest
+    public void testClose() throws IOException, XmlPullParserException {
+        final AssetManager assets = new AssetManager();
+        assets.close();
 
+        // Should no-op.
+        assets.close();
+
+        try {
+            assets.openXmlResourceParser("AndroidManifest.xml");
+            fail("Expected RuntimeException");
+        } catch (RuntimeException e) {
+            // Expected.
+        }
+    }
+
+    @SmallTest
     public void testGetNonSystemLocales() {
         // This is the list of locales built into this test package. It is basically the locales
         // specified in the Android.mk files (assuming they have corresponding resources), plus the
diff --git a/tests/tests/content/src/android/content/res/cts/ColorStateListTest.java b/tests/tests/content/src/android/content/res/cts/ColorStateListTest.java
index 2222ce4..2029b95 100644
--- a/tests/tests/content/src/android/content/res/cts/ColorStateListTest.java
+++ b/tests/tests/content/src/android/content/res/cts/ColorStateListTest.java
@@ -20,51 +20,110 @@
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
+import android.content.pm.ActivityInfo;
 import android.content.res.ColorStateList;
 import android.content.res.Resources;
 import android.content.res.Resources.NotFoundException;
+import android.content.res.Resources.Theme;
 import android.graphics.Color;
 import android.os.Parcel;
 import android.test.AndroidTestCase;
 
 import android.content.cts.R;
-
+import android.test.suitebuilder.annotation.SmallTest;
 
 public class ColorStateListTest extends AndroidTestCase {
-    public void testColorStateList() throws NotFoundException, XmlPullParserException, IOException {
-        final int[][] state = new int[][] { { 0 }, { 0 } };
-        final int[] colors = new int[] { Color.RED, Color.BLUE };
-        ColorStateList c = new ColorStateList(state, colors);
+
+    @SmallTest
+    public void testConstructor() {
+        final int[][] state = new int[][]{{0}, {0}};
+        final int[] colors = new int[]{Color.RED, Color.BLUE};
+        final ColorStateList c = new ColorStateList(state, colors);
         assertTrue(c.isStateful());
         assertEquals(Color.RED, c.getDefaultColor());
+    }
 
-        final int alpha = 36;
-        final ColorStateList c1 = c.withAlpha(alpha);
-        assertNotSame(Color.RED, c1.getDefaultColor());
-        // check alpha
-        assertEquals(alpha, c1.getDefaultColor() >>> 24);
-        assertEquals(Color.RED & 0x00FF0000, c1.getDefaultColor() & 0x00FF0000);
-
-        final int xmlId = R.drawable.testcolor;
-        final int colorInXml = 0xFFA6C839;// this color value is define in testcolor.xml file.
+    @SmallTest
+    public void testCreateFromXml() throws Exception {
+        final int xmlId = R.color.testcolor;
+        final int colorInXml = 0xFFA6C839; // this color value is defined in testcolor.xml file.
         final Resources res = getContext().getResources();
-        c = ColorStateList.createFromXml(res, res.getXml(xmlId));
+        final ColorStateList c = ColorStateList.createFromXml(res, res.getXml(xmlId));
         assertEquals(colorInXml, c.getDefaultColor());
         assertEquals(0, c.describeContents());
         assertFalse(c.isStateful());
         assertNotNull(c.toString());
         assertEquals(colorInXml, c.getColorForState(new int[]{0}, 0));
+    }
 
-        c = ColorStateList.valueOf(Color.GRAY);
+    @SmallTest
+    public void testCreateFromXmlThemed() throws Exception {
+        final int xmlId = R.color.testcolor_themed;
+        final int colorInXml = Color.BLACK; // this color value is defined in styles.xml file.
+        final Resources res = getContext().getResources();
+        final Theme theme = res.newTheme();
+        theme.applyStyle(R.style.Theme_ThemedDrawableTest, true);
+        final ColorStateList c = ColorStateList.createFromXml(res, res.getXml(xmlId), theme);
+        assertEquals(colorInXml, c.getDefaultColor());
+        assertEquals(0, c.describeContents());
+        assertFalse(c.isStateful());
+        assertNotNull(c.toString());
+        assertEquals(colorInXml, c.getColorForState(new int[]{0}, 0));
+    }
+
+    @SmallTest
+    public void testGetChangingConfigurations() {
+        final Resources res = getContext().getResources();
+        ColorStateList c;
+
+        c = res.getColorStateList(R.color.testcolor, null);
+        assertEquals(c.getChangingConfigurations(), 0);
+
+        c = res.getColorStateList(R.color.testcolor_orientation, null);
+        assertEquals(ActivityInfo.CONFIG_ORIENTATION, c.getChangingConfigurations());
+    }
+
+    @SmallTest
+    public void testWithAlpha() {
+        final int[][] state = new int[][]{{0}, {0}};
+        final int[] colors = new int[]{Color.RED, Color.BLUE};
+        final ColorStateList c = new ColorStateList(state, colors);
+        final int alpha = 36;
+        final ColorStateList c1 = c.withAlpha(alpha);
+        assertNotSame(Color.RED, c1.getDefaultColor());
+        assertEquals(alpha, c1.getDefaultColor() >>> 24);
+        assertEquals(Color.RED & 0x00FF0000, c1.getDefaultColor() & 0x00FF0000);
+    }
+
+    @SmallTest
+    public void testValueOf() {
+        final ColorStateList c = ColorStateList.valueOf(Color.GRAY);
         assertEquals(Color.GRAY, c.getDefaultColor());
+    }
 
+    @SmallTest
+    public void testParcelable() {
+        final ColorStateList c = ColorStateList.valueOf(Color.GRAY);
         final Parcel parcel = Parcel.obtain();
         c.writeToParcel(parcel, 0);
         parcel.setDataPosition(0);
-        ColorStateList actual = ColorStateList.CREATOR.createFromParcel(parcel);
-        // can only compare the state and the default color. because no API to
-        // get every color of ColorStateList
+
+        final ColorStateList actual = ColorStateList.CREATOR.createFromParcel(parcel);
         assertEquals(c.isStateful(), actual.isStateful());
         assertEquals(c.getDefaultColor(), actual.getDefaultColor());
     }
+
+    @SmallTest
+    public void testIsOpaque() {
+        ColorStateList c;
+
+        c = ColorStateList.valueOf(Color.GRAY);
+        assertTrue(c.isOpaque());
+
+        c = ColorStateList.valueOf(0x80FFFFFF);
+        assertFalse(c.isOpaque());
+
+        c = ColorStateList.valueOf(Color.TRANSPARENT);
+        assertFalse(c.isOpaque());
+    }
 }
diff --git a/tests/tests/content/src/android/content/res/cts/ConfigurationTest.java b/tests/tests/content/src/android/content/res/cts/ConfigurationTest.java
index c1ee6c4..bc0f42e 100644
--- a/tests/tests/content/src/android/content/res/cts/ConfigurationTest.java
+++ b/tests/tests/content/src/android/content/res/cts/ConfigurationTest.java
@@ -403,6 +403,14 @@
         assertEquals(View.LAYOUT_DIRECTION_RTL, config.getLayoutDirection());
     }
 
+    public void testIsScreenRound() {
+        Configuration config = new Configuration();
+        assertFalse(config.isScreenRound());
+
+        config.screenLayout |= Configuration.SCREENLAYOUT_ROUND_YES;
+        assertTrue(config.isScreenRound());
+    }
+
     public void testFixUpLocaleList() {
         Configuration config = new Configuration();
 
diff --git a/tests/tests/content/src/android/content/res/cts/Resources_NotFoundExceptionTest.java b/tests/tests/content/src/android/content/res/cts/Resources_NotFoundExceptionTest.java
index 8fa8d7b..d75fcdd 100644
--- a/tests/tests/content/src/android/content/res/cts/Resources_NotFoundExceptionTest.java
+++ b/tests/tests/content/src/android/content/res/cts/Resources_NotFoundExceptionTest.java
@@ -23,41 +23,57 @@
 public class Resources_NotFoundExceptionTest extends TestCase {
 
     public void testNotFoundException() {
-        NotFoundException ne = null;
-        boolean isThrowed = false;
-        boolean isFinnalyRun = false;
+        NotFoundException ne;
+        boolean wasThrown;
+
+        wasThrown = false;
+        ne = new NotFoundException();
+
         try {
-            ne = new NotFoundException();
             throw ne;
         } catch (NotFoundException e) {
             // expected
             assertSame(ne, e);
-            isThrowed = true;
+            wasThrown = true;
         } finally {
-            if (!isThrowed) {
+            if (!wasThrown) {
                 fail("should throw out NotFoundException");
             }
-            isFinnalyRun = true;
         }
-        assertTrue(isFinnalyRun);
 
-        isThrowed = false;
-        isFinnalyRun = false;
         final String MESSAGE = "test";
+        wasThrown = false;
+        ne = new NotFoundException(MESSAGE);
+
         try {
-            ne = new NotFoundException(MESSAGE);
             throw ne;
         } catch (NotFoundException e) {
             // expected
             assertSame(ne, e);
             assertEquals(MESSAGE, e.getMessage());
-            isThrowed = true;
+            wasThrown = true;
         } finally {
-            if (!isThrowed) {
+            if (!wasThrown) {
                 fail("should throw out NotFoundException");
             }
-            isFinnalyRun = true;
         }
-        assertTrue(isFinnalyRun);
+
+        final Exception CAUSE = new NullPointerException();
+        wasThrown = false;
+        ne = new NotFoundException(MESSAGE, CAUSE);
+
+        try {
+            throw ne;
+        } catch (NotFoundException e) {
+            // expected
+            assertSame(ne, e);
+            assertEquals(MESSAGE, e.getMessage());
+            assertEquals(CAUSE, e.getCause());
+            wasThrown = true;
+        } finally {
+            if (!wasThrown) {
+                fail("should throw out NotFoundException");
+            }
+        }
     }
 }
diff --git a/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java b/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java
index 533b186..b7a621f 100644
--- a/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java
+++ b/tests/tests/content/src/android/content/res/cts/Resources_ThemeTest.java
@@ -23,7 +23,10 @@
 import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.content.res.Resources.Theme;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
 import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
 import android.util.AttributeSet;
 import android.util.TypedValue;
 import android.util.Xml;
@@ -44,6 +47,7 @@
         mResTheme = getContext().getResources().newTheme();
     }
 
+    @SmallTest
     public void testSetMethods() {
         // call a native method, and have no way to get the style
         mResTheme.applyStyle(R.raw.testmp3, false);
@@ -54,6 +58,7 @@
         mResTheme.setTo(other);
     }
 
+    @SmallTest
     public void testObtainStyledAttributes() {
         final int[] attrs = new int[1];
         attrs[0] = R.raw.testmp3;
@@ -77,12 +82,14 @@
         testTypedArray.recycle();
     }
 
+    @SmallTest
     public void testResolveAttribute() {
         final TypedValue value = new TypedValue();
         getContext().getResources().getValue(R.raw.testmp3, value, true);
         assertFalse(mResTheme.resolveAttribute(R.raw.testmp3, value, false));
     }
 
+    @SmallTest
     public void testGetChangingConfigurations() {
         Resources.Theme theme = getContext().getResources().newTheme();
         assertEquals("Initial changing configuration mask is empty",
@@ -104,6 +111,7 @@
                 theme.getChangingConfigurations());
     }
 
+    @SmallTest
     public void testRebase() {
         Resources res = getContext().getResources();
         Configuration config = res.getConfiguration();
@@ -132,4 +140,21 @@
         assertEquals("Theme was rebased in RTL config", true, t.getBoolean(0, false));
         t.recycle();
     }
+
+    @SmallTest
+    public void testGetDrawable() {
+        final Resources res = getContext().getResources();
+        final Theme theme = res.newTheme();
+        theme.applyStyle(R.style.Theme_ThemedDrawableTest, true);
+
+        final ColorDrawable dr = (ColorDrawable) theme.getDrawable(R.drawable.colordrawable_themed);
+        assertEquals(Color.BLACK, dr.getColor());
+    }
+
+    @SmallTest
+    public void testGetResources() {
+        final Resources res = getContext().getResources();
+        final Theme theme = res.newTheme();
+        assertSame(res, theme.getResources());
+    }
 }
diff --git a/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java b/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java
index 2eb82a8..ee7449c 100644
--- a/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java
+++ b/tests/tests/content/src/android/content/res/cts/TypedArrayTest.java
@@ -16,11 +16,11 @@
 
 package android.content.res.cts;
 
-import android.content.cts.R;
-
 import org.xmlpull.v1.XmlPullParserException;
 
+import android.content.cts.R;
 import android.content.cts.util.XmlUtils;
+import android.content.pm.ActivityInfo;
 import android.content.res.TypedArray;
 import android.content.res.XmlResourceParser;
 import android.test.AndroidTestCase;
@@ -30,12 +30,10 @@
 
 import java.io.IOException;
 
-
-public class TypedArrayTest extends AndroidTestCase{
-    private TypedArray mTypedArray;
+public class TypedArrayTest extends AndroidTestCase {
     private static final int DEFINT = -1;
     private static final float DEFFLOAT = -1.0f;
-    private static final int EXPECTEDCLOLOR = 0xff0000ff;
+    private static final int EXPECTED_COLOR = 0xff0000ff;
     private static final int EXPECTED_COLOR_STATE = 0xff00ff00;
     private static final float EXPECTED_DIMENSION = 0.75f;
     private static final int EXPECTED_PIXEL_OFFSET = 10;
@@ -47,20 +45,23 @@
     private static final String EXPECTED_STRING = "Hello, Android!";
     private static final String EXPECTED_TEXT = "TypedArray Test!";
     private static final String[] EXPECTED_TEXT_ARRAY = {"Easy", "Medium", "Hard"};
-    private static final int EXPETED_INDEX = 15;
+    private static final int EXPECTED_INDEX = 15;
     private static final TypedValue DEF_VALUE = new TypedValue();
-    private static final int EXPECTED_INDEX_COUNT = 16;
+    private static final int EXPECTED_INDEX_COUNT = 17;
     private static final String EXPTECTED_POS_DESCRIP = "<internal>";
-    private static final int EXPECTED_LENGTH = 16;
+    private static final int EXPECTED_LENGTH = 19;
     private static final String EXPECTED_NON_RESOURCE_STRING = "testNonResourcesString";
     private static final String XML_BEGIN = "resources";
     private static final int EXPECTED_INT_ATT = 86400;
+    private static final int EXPECTED_CHANGING_CONFIG =
+            ActivityInfo.CONFIG_ORIENTATION | ActivityInfo.CONFIG_LOCALE;
+
+    private TypedArray mTypedArray;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        final int[] attrs = R.styleable.style1;
-        mTypedArray = getContext().getTheme().obtainStyledAttributes(R.style.Whatever, attrs);
+        mTypedArray = getContext().getTheme().obtainStyledAttributes(R.style.Whatever, R.styleable.style1);
     }
 
     @Override
@@ -69,85 +70,126 @@
         mTypedArray.recycle();
     }
 
-    /*
-     * Test all get attrs methods, all test value are in styles.xml and attrs.xml.
-     */
-    public void testAttrsMethod() {
-        // getBoolean test
-        assertTrue(mTypedArray.getBoolean(R.styleable.style1_type1, false));
-        assertFalse(mTypedArray.getBoolean(R.styleable.style1_type2, true));
+    public void testGetType() {
+        final TypedArray t = getContext().getTheme().obtainStyledAttributes(
+                R.style.Whatever, R.styleable.style1);
 
-        assertEquals(EXPECTEDCLOLOR, mTypedArray.getColor(R.styleable.style1_type3, DEFINT));
+        assertEquals(TypedValue.TYPE_INT_BOOLEAN, t.getType(R.styleable.style1_type1));
+        assertEquals(TypedValue.TYPE_INT_BOOLEAN, t.getType(R.styleable.style1_type2));
+        assertEquals(TypedValue.TYPE_INT_COLOR_ARGB8, t.getType(R.styleable.style1_type3));
+        assertEquals(TypedValue.TYPE_INT_COLOR_ARGB8, t.getType(R.styleable.style1_type4));
+        assertEquals(TypedValue.TYPE_DIMENSION, t.getType(R.styleable.style1_type5));
+        assertEquals(TypedValue.TYPE_DIMENSION, t.getType(R.styleable.style1_type6));
+        assertEquals(TypedValue.TYPE_DIMENSION, t.getType(R.styleable.style1_type7));
+        assertEquals(TypedValue.TYPE_STRING, t.getType(R.styleable.style1_type8));
+        assertEquals(TypedValue.TYPE_FLOAT, t.getType(R.styleable.style1_type9));
+        assertEquals(TypedValue.TYPE_FRACTION, t.getType(R.styleable.style1_type10));
+        assertEquals(TypedValue.TYPE_INT_DEC, t.getType(R.styleable.style1_type11));
+        assertEquals(TypedValue.TYPE_INT_DEC, t.getType(R.styleable.style1_type12));
+        assertEquals(TypedValue.TYPE_STRING, t.getType(R.styleable.style1_type13));
+        assertEquals(TypedValue.TYPE_STRING, t.getType(R.styleable.style1_type14));
+        assertEquals(TypedValue.TYPE_REFERENCE, t.getType(R.styleable.style1_type15));
+        assertEquals(TypedValue.TYPE_STRING, t.getType(R.styleable.style1_type16));
+        assertEquals(TypedValue.TYPE_NULL, t.getType(R.styleable.style1_typeEmpty));
+        assertEquals(TypedValue.TYPE_NULL, t.getType(R.styleable.style1_typeUndefined));
 
-        // getColorStateList test
-        final int[] set = new int[1];
-        set[0] = 0;
+        t.recycle();
+    }
+
+    public void testBasics() {
+        final TypedArray t = getContext().getTheme().obtainStyledAttributes(
+                R.style.Whatever, R.styleable.style1);
+
+        assertEquals(EXPECTED_CHANGING_CONFIG, t.getChangingConfigurations());
+        assertEquals(EXPECTED_INDEX_COUNT, t.getIndexCount());
+        assertEquals(EXPTECTED_POS_DESCRIP, t.getPositionDescription());
+        assertEquals(EXPECTED_LENGTH, t.length());
+        assertEquals(getContext().getResources(), t.getResources());
+        assertNotNull(t.toString());
+
+        t.recycle();
+    }
+
+    public void testGetAttributes() {
+        final TypedArray t = getContext().getTheme().obtainStyledAttributes(
+                R.style.Whatever, R.styleable.style1);
+
+        assertTrue(t.getBoolean(R.styleable.style1_type1, false));
+        assertFalse(t.getBoolean(R.styleable.style1_type2, true));
+
+        assertEquals(EXPECTED_COLOR,
+                t.getColor(R.styleable.style1_type3, DEFINT));
         assertEquals(EXPECTED_COLOR_STATE,
-                mTypedArray.getColorStateList(R.styleable.style1_type4).
-                getColorForState(set, DEFINT));
+                t.getColorStateList(R.styleable.style1_type4).getDefaultColor());
 
         // This get values equals attribute dimension value set in styles.xml
         // multiplied by the appropriate metric, the metric is unknown.
         assertEquals(EXPECTED_DIMENSION,
-                mTypedArray.getDimension(R.styleable.style1_type5, DEFFLOAT));
+                t.getDimension(R.styleable.style1_type5, DEFFLOAT));
+
         assertEquals(EXPECTED_PIXEL_OFFSET,
-                mTypedArray.getDimensionPixelOffset(R.styleable.style1_type6, DEFINT));
+                t.getDimensionPixelOffset(R.styleable.style1_type6, DEFINT));
         assertEquals(EXPECTED_LAYOUT_DIMENSION,
-                mTypedArray.getLayoutDimension(R.styleable.style1_type6, "type6"));
+                t.getLayoutDimension(R.styleable.style1_type6, "type6"));
         assertEquals(EXPECTED_LAYOUT_DIMENSION,
-                mTypedArray.getLayoutDimension(R.styleable.style1_type6, 0));
+                t.getLayoutDimension(R.styleable.style1_type6, 0));
+
         assertEquals(EXPECTED_PIXEL_SIZE,
-                mTypedArray.getDimensionPixelSize(R.styleable.style1_type7, DEFINT));
+                t.getDimensionPixelSize(R.styleable.style1_type7, DEFINT));
 
-        // getDrawable test
-        assertNotNull(mTypedArray.getDrawable(R.styleable.style1_type8));
-        // getResourceId test
-        assertEquals(R.drawable.pass,
-                mTypedArray.getResourceId(R.styleable.style1_type8, DEFINT));
+        assertNotNull(t.getDrawable(R.styleable.style1_type8));
+        assertEquals(R.drawable.pass, t.getResourceId(R.styleable.style1_type8, DEFINT));
 
-        assertEquals(EXPECTED_FLOAT, mTypedArray.getFloat(R.styleable.style1_type9, DEFFLOAT));
-
+        assertEquals(EXPECTED_FLOAT,
+                t.getFloat(R.styleable.style1_type9, DEFFLOAT));
         assertEquals(EXPECTED_FRACTION,
-                mTypedArray.getFraction(R.styleable.style1_type10, 10, 10, DEFFLOAT));
+                t.getFraction(R.styleable.style1_type10, 10, 10, DEFFLOAT));
+        assertEquals(EXPECTED_INT,
+                t.getInt(R.styleable.style1_type11, DEFINT));
+        assertEquals(EXPECTED_INT_ATT,
+                t.getInteger(R.styleable.style1_type12, DEFINT));
 
-        assertEquals(EXPECTED_INT, mTypedArray.getInt(R.styleable.style1_type11, DEFINT));
+        assertEquals(EXPECTED_STRING, t.getString(R.styleable.style1_type13));
+        assertNull(t.getNonResourceString(R.styleable.style1_type14));
+        assertEquals(EXPECTED_TEXT, t.getText(R.styleable.style1_type14));
 
-        assertEquals(EXPECTED_INT_ATT, mTypedArray.getInteger(R.styleable.style1_type12, DEFINT));
-
-        assertEquals(EXPECTED_STRING, mTypedArray.getString(R.styleable.style1_type13));
-
-        // getNonResourceString test
-        assertNull(mTypedArray.getNonResourceString(R.styleable.style1_type14));
-
-        assertEquals(EXPECTED_TEXT, mTypedArray.getText(R.styleable.style1_type14));
-
-        CharSequence[] textArray = mTypedArray.getTextArray(R.styleable.style1_type15);
+        final CharSequence[] textArray = t.getTextArray(R.styleable.style1_type15);
         assertEquals(EXPECTED_TEXT_ARRAY[0], textArray[0]);
         assertEquals(EXPECTED_TEXT_ARRAY[1], textArray[1]);
         assertEquals(EXPECTED_TEXT_ARRAY[2], textArray[2]);
 
-        // getIndex test
-        int index = mTypedArray.getIndex(R.styleable.style1_type16);
-        assertEquals(EXPETED_INDEX, index);
-        assertTrue(mTypedArray.getValue(index, DEF_VALUE));
-        // hasValue test
-        assertTrue(mTypedArray.hasValue(R.styleable.style1_type16));
+        final int index = t.getIndex(R.styleable.style1_type16);
+        assertEquals(EXPECTED_INDEX, index);
+        assertTrue(t.getValue(index, DEF_VALUE));
+    }
 
-        // peekValue test
-        assertNotNull(mTypedArray.peekValue(R.styleable.style1_type16));
+    public void testPeekValue() {
+        final TypedArray t = getContext().getTheme().obtainStyledAttributes(
+                R.style.Whatever, R.styleable.style1);
 
-        assertEquals(EXPECTED_INDEX_COUNT, mTypedArray.getIndexCount());
+        final TypedValue v = t.peekValue(R.styleable.style1_type11);
+        assertNotNull(v);
+        assertEquals(TypedValue.TYPE_INT_DEC, v.type);
+        assertEquals(EXPECTED_INT, v.data);
 
-        assertEquals(EXPTECTED_POS_DESCRIP,
-                mTypedArray.getPositionDescription());
+        t.recycle();
+    }
 
-        // getResources test
-        assertEquals(getContext().getResources(), mTypedArray.getResources());
+    public void testHasValue() {
+        final TypedArray t = getContext().getTheme().obtainStyledAttributes(
+                R.style.Whatever, R.styleable.style1);
 
-        assertEquals(EXPECTED_LENGTH, mTypedArray.length());
+        // hasValue()
+        assertTrue(t.hasValue(R.styleable.style1_type16));
+        assertFalse(t.hasValue(R.styleable.style1_typeEmpty));
+        assertFalse(t.hasValue(R.styleable.style1_typeUndefined));
 
-        // toString test
-        assertNotNull(mTypedArray.toString());
+        // hasValueOrEmpty()
+        assertTrue(t.hasValueOrEmpty(R.styleable.style1_type16));
+        assertTrue(t.hasValueOrEmpty(R.styleable.style1_typeEmpty));
+        assertFalse(t.hasValueOrEmpty(R.styleable.style1_typeUndefined));
+
+        t.recycle();
     }
 
     public void testRecycle() {
diff --git a/tests/tests/graphics/res/color/fill_gradient_linear.xml b/tests/tests/graphics/res/color/fill_gradient_linear.xml
index e0e3f03..d9b7497 100644
--- a/tests/tests/graphics/res/color/fill_gradient_linear.xml
+++ b/tests/tests/graphics/res/color/fill_gradient_linear.xml
@@ -18,8 +18,8 @@
 -->
 <gradient xmlns:android="http://schemas.android.com/apk/res/android"
           android:angle="90"
-          android:startColor="?android:attr/colorPrimary"
-          android:endColor="?android:attr/colorControlActivated"
+          android:startColor="?attr/themeColor"
+          android:endColor="#0f0"
           android:centerColor="#00ff0000"
           android:startX="0"
           android:startY="0"
diff --git a/tests/tests/graphics/res/color/fill_gradient_linear_item.xml b/tests/tests/graphics/res/color/fill_gradient_linear_item.xml
index cfb1236..c1fb560 100644
--- a/tests/tests/graphics/res/color/fill_gradient_linear_item.xml
+++ b/tests/tests/graphics/res/color/fill_gradient_linear_item.xml
@@ -18,15 +18,15 @@
 -->
 <gradient xmlns:android="http://schemas.android.com/apk/res/android"
           android:angle="90"
-          android:startColor="?android:attr/colorPrimary"
-          android:endColor="?android:attr/colorControlActivated"
+          android:startColor="?attr/themeColor"
+          android:endColor="#0f0"
           android:centerColor="#f00"
           android:startX="0"
           android:startY="0"
           android:endX="100"
           android:endY="100"
           android:type="linear">
-    <item android:offset="0.1" android:color="?android:attr/colorPrimary"/>
+    <item android:offset="0.1" android:color="?attr/themeColor"/>
     <item android:offset="0.4" android:color="#fff"/>
-    <item android:offset="0.9" android:color="?android:attr/colorControlActivated"/>
+    <item android:offset="0.9" android:color="#0f0"/>
 </gradient>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/color/fill_gradient_linear_item_overlap.xml b/tests/tests/graphics/res/color/fill_gradient_linear_item_overlap.xml
index 18274b9..a5b261a 100644
--- a/tests/tests/graphics/res/color/fill_gradient_linear_item_overlap.xml
+++ b/tests/tests/graphics/res/color/fill_gradient_linear_item_overlap.xml
@@ -18,16 +18,16 @@
 -->
 <gradient xmlns:android="http://schemas.android.com/apk/res/android"
           android:angle="90"
-          android:startColor="?android:attr/colorPrimary"
-          android:endColor="?android:attr/colorControlActivated"
+          android:startColor="?attr/themeColor"
+          android:endColor="#0f0"
           android:centerColor="#f00"
           android:startX="0"
           android:startY="0"
           android:endX="100"
           android:endY="100"
           android:type="linear">
-    <item android:offset="0.1" android:color="?android:attr/colorPrimary"/>
+    <item android:offset="0.1" android:color="?attr/themeColor"/>
     <item android:offset="0.4" android:color="#f00"/>
     <item android:offset="0.4" android:color="#fff"/>
-    <item android:offset="0.9" android:color="?android:attr/colorControlActivated"/>
+    <item android:offset="0.9" android:color="#0f0"/>
 </gradient>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/color/fill_gradient_radial.xml b/tests/tests/graphics/res/color/fill_gradient_radial.xml
index ef6fd70..389a0fc 100644
--- a/tests/tests/graphics/res/color/fill_gradient_radial.xml
+++ b/tests/tests/graphics/res/color/fill_gradient_radial.xml
@@ -18,10 +18,10 @@
 -->
 <gradient xmlns:android="http://schemas.android.com/apk/res/android"
           android:centerColor="#ff0000"
-          android:endColor="?android:attr/colorControlActivated"
+          android:endColor="#0f0"
           android:centerX="300"
           android:centerY="300"
           android:gradientRadius="100"
-          android:startColor="?android:attr/colorPrimary"
+          android:startColor="?attr/themeColor"
           android:type="radial">
 </gradient>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/color/fill_gradient_radial_item.xml b/tests/tests/graphics/res/color/fill_gradient_radial_item.xml
index c6cea7c..2f116c9 100644
--- a/tests/tests/graphics/res/color/fill_gradient_radial_item.xml
+++ b/tests/tests/graphics/res/color/fill_gradient_radial_item.xml
@@ -24,7 +24,7 @@
           android:gradientRadius="100"
           android:startColor="#ffffffff"
           android:type="radial">
-    <item android:offset="0.1" android:color="?android:attr/colorPrimary"/>
+    <item android:offset="0.1" android:color="?attr/themeColor"/>
     <item android:offset="0.4" android:color="#fff"/>
-    <item android:offset="0.9" android:color="?android:attr/colorControlActivated"/>
+    <item android:offset="0.9" android:color="#0f0"/>
 </gradient>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/color/fill_gradient_radial_item_short.xml b/tests/tests/graphics/res/color/fill_gradient_radial_item_short.xml
index fefbe9f..111d023 100644
--- a/tests/tests/graphics/res/color/fill_gradient_radial_item_short.xml
+++ b/tests/tests/graphics/res/color/fill_gradient_radial_item_short.xml
@@ -21,6 +21,6 @@
           android:centerY="300"
           android:gradientRadius="100"
           android:type="radial">
-    <item android:offset="0.1" android:color="?android:attr/colorPrimary"/>
-    <item android:offset="0.9" android:color="?android:attr/colorControlActivated"/>
+    <item android:offset="0.1" android:color="?attr/themeColor"/>
+    <item android:offset="0.9" android:color="#0f0"/>
 </gradient>
\ No newline at end of file
diff --git a/tests/tests/graphics/res/color/fill_gradient_sweep_item.xml b/tests/tests/graphics/res/color/fill_gradient_sweep_item.xml
index 332b9389..2a010c0 100644
--- a/tests/tests/graphics/res/color/fill_gradient_sweep_item.xml
+++ b/tests/tests/graphics/res/color/fill_gradient_sweep_item.xml
@@ -24,7 +24,7 @@
           android:gradientRadius="10"
           android:startColor="#ffffffff"
           android:type="sweep">
-    <item android:offset="0.1" android:color="?android:attr/colorPrimary"/>
+    <item android:offset="0.1" android:color="?attr/themeColor"/>
     <item android:offset="0.4" android:color="#fff"/>
-    <item android:offset="0.9" android:color="?android:attr/colorControlActivated"/>
+    <item android:offset="0.9" android:color="#0f0"/>
 </gradient>
diff --git a/tests/tests/graphics/res/color/fill_gradient_sweep_item_long.xml b/tests/tests/graphics/res/color/fill_gradient_sweep_item_long.xml
index 3931288..7b0bbef 100644
--- a/tests/tests/graphics/res/color/fill_gradient_sweep_item_long.xml
+++ b/tests/tests/graphics/res/color/fill_gradient_sweep_item_long.xml
@@ -22,9 +22,9 @@
           android:gradientRadius="10"
           android:type="sweep">
     <item android:offset="-0.3" android:color="#f00"/>
-    <item android:offset="0.1" android:color="?android:attr/colorPrimary"/>
+    <item android:offset="0.1" android:color="?attr/themeColor"/>
     <item android:offset="0.4" android:color="#0f0"/>
     <item android:offset="0.6" android:color="#00f"/>
-    <item android:offset="0.7" android:color="?android:attr/colorControlActivated"/>
+    <item android:offset="0.7" android:color="#0f0"/>
     <item android:offset="1.5" android:color="#00f"/>
 </gradient>
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_gradient_1_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_gradient_1_golden.png
index 638802f..d5288d1 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_gradient_1_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_gradient_1_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_gradient_2_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_gradient_2_golden.png
index 1f248e3..54fbca7 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_gradient_2_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_gradient_2_golden.png
Binary files differ
diff --git a/tests/tests/graphics/res/drawable-nodpi/vector_icon_gradient_3_golden.png b/tests/tests/graphics/res/drawable-nodpi/vector_icon_gradient_3_golden.png
index 085e72a..09fd92f 100644
--- a/tests/tests/graphics/res/drawable-nodpi/vector_icon_gradient_3_golden.png
+++ b/tests/tests/graphics/res/drawable-nodpi/vector_icon_gradient_3_golden.png
Binary files differ
diff --git a/tests/tests/graphics/src/android/graphics/cts/OutlineTest.java b/tests/tests/graphics/src/android/graphics/cts/OutlineTest.java
new file mode 100644
index 0000000..0dcff12
--- /dev/null
+++ b/tests/tests/graphics/src/android/graphics/cts/OutlineTest.java
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.graphics.cts;
+
+import android.graphics.Outline;
+import android.graphics.Path;
+import android.graphics.Rect;
+import android.test.suitebuilder.annotation.SmallTest;
+import junit.framework.TestCase;
+import org.junit.Test;
+
+@SmallTest
+public class OutlineTest extends TestCase {
+    @Test
+    public void testDefaults() {
+        Outline outline = new Outline();
+
+        assertEquals(0.0f, outline.getAlpha());
+        assertTrue(outline.isEmpty());
+        Rect outRect = new Rect();
+        assertFalse(outline.getRect(outRect));
+        assertTrue(outline.getRadius() < 0);
+    }
+
+    @Test
+    public void testGetSetAlpha() {
+        Outline outline = new Outline();
+
+        outline.setAlpha(1.0f);
+        assertEquals(1.0f, outline.getAlpha());
+
+        outline.setAlpha(0.0f);
+        assertEquals(0.0f, outline.getAlpha());
+
+        outline.setAlpha(0.45f);
+        assertEquals(0.45f, outline.getAlpha());
+
+        // define out of range getter/setter behavior: (note will be clamped in native when consumed)
+        outline.setAlpha(4f);
+        assertEquals(4f, outline.getAlpha());
+        outline.setAlpha(-30f);
+        assertEquals(-30f, outline.getAlpha());
+    }
+
+    @Test
+    public void testSetRect() {
+        Outline outline = new Outline();
+        Rect outRect = new Rect();
+
+        outline.setRect(0, 0, 0, 0);
+        assertTrue(outline.isEmpty());
+
+        outline.setRect(10, 5, 4, 5);
+        assertTrue(outline.isEmpty());
+
+        outline.setRect(new Rect());
+        assertTrue(outline.isEmpty());
+
+        outline.setRect(10, 10, 20, 20);
+        assertFalse(outline.isEmpty());
+        assertTrue(outline.getRect(outRect));
+        assertEquals(new Rect(10, 10, 20, 20), outRect);
+        assertTrue(outline.canClip());
+
+        outline.setRect(new Rect(10, 10, 20, 20));
+        assertFalse(outline.isEmpty());
+        assertTrue(outline.getRect(outRect));
+        assertEquals(new Rect(10, 10, 20, 20), outRect);
+        assertTrue(outline.canClip());
+    }
+
+    @Test
+    public void testSetRoundRect() {
+        Outline outline = new Outline();
+        Rect outRect = new Rect();
+
+        outline.setRoundRect(0, 0, 0, 0, 1f);
+        assertTrue(outline.isEmpty());
+
+        outline.setRoundRect(10, 5, 4, 5, 1f);
+        assertTrue(outline.isEmpty());
+
+        outline.setRoundRect(new Rect(), 1f);
+        assertTrue(outline.isEmpty());
+
+        outline.setRoundRect(10, 10, 20, 20, 5f);
+        assertFalse(outline.isEmpty());
+        assertTrue(outline.getRect(outRect));
+        assertEquals(new Rect(10, 10, 20, 20), outRect);
+        assertEquals(5f, outline.getRadius());
+        assertTrue(outline.canClip());
+
+        outline.setRoundRect(new Rect(10, 10, 20, 20), 4f);
+        assertFalse(outline.isEmpty());
+        assertTrue(outline.getRect(outRect));
+        assertEquals(new Rect(10, 10, 20, 20), outRect);
+        assertEquals(4f, outline.getRadius());
+        assertTrue(outline.canClip());
+    }
+
+    @Test
+    public void testSetOval() {
+        Outline outline = new Outline();
+
+        outline.setOval(0, 0, 0, 0);
+        assertTrue(outline.isEmpty());
+
+        outline.setOval(10, 5, 4, 5);
+        assertTrue(outline.isEmpty());
+
+        Rect outRect = new Rect();
+        outline.setOval(0, 0, 50, 51); // different x & y radii, so not round rect
+        assertFalse(outline.getRect(outRect)); // not round rect, doesn't work
+        assertFalse(outline.canClip()); // not round rect, doesn't work
+        assertFalse(outline.isEmpty());
+
+        outline.setOval(0, 0, 50, 50); // same x & y radii, so round rect
+        assertTrue(outline.getRect(outRect)); // is round rect, so works
+        assertTrue(outline.canClip()); // is round rect, so works
+        assertFalse(outline.isEmpty());
+    }
+
+    @Test
+    public void testSetConvexPath() {
+        Outline outline = new Outline();
+        Path path = new Path();
+
+        assertTrue(path.isEmpty());
+        outline.setConvexPath(path);
+        assertTrue(outline.isEmpty());
+
+        path.addCircle(50, 50, 50, Path.Direction.CW);
+        outline.setConvexPath(path);
+        assertFalse(outline.isEmpty());
+    }
+
+    @Test
+    public void testGetRectRadius() {
+        Outline outline = new Outline();
+
+        Rect outRect = new Rect();
+        outline.setRoundRect(15, 10, 45, 40, 30.0f);
+        assertEquals(30.0f, outline.getRadius());
+        assertTrue(outline.getRect(outRect));
+        assertEquals(new Rect(15, 10, 45, 40), outRect);
+
+        outline.setRect(5, 10, 15, 20);
+        assertEquals(0.0f, outline.getRadius());
+        assertTrue(outline.getRect(outRect));
+        assertEquals(new Rect(5, 10, 15, 20), outRect);
+
+        outline.setOval(0, 0, 50, 60);
+        assertTrue(outline.getRadius() < 0);
+        assertFalse(outline.getRect(outRect));
+    }
+
+    @Test
+    public void testOffset() {
+        Outline outline = new Outline();
+
+        Rect outRect = new Rect();
+        outline.setRoundRect(15, 10, 45, 40, 30.0f);
+        outline.offset(-15, -10);
+        assertTrue(outline.getRect(outRect));
+        assertEquals(new Rect(0, 0, 30, 30), outRect);
+
+        outline.setRect(5, 10, 15, 20);
+        outline.offset(-5, -10);
+        assertTrue(outline.getRect(outRect));
+        assertEquals(new Rect(0, 0, 10, 10), outRect);
+    }
+}
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/VectorDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/VectorDrawableTest.java
index f174f01..ac1d9b3 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/VectorDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/VectorDrawableTest.java
@@ -197,7 +197,9 @@
                 throw new XmlPullParserException("No start tag found");
             }
 
-            mVectorDrawable.inflate(mResources, parser, attrs, mContext.getTheme());
+            Theme theme = mResources.newTheme();
+            theme.applyStyle(R.style.Theme_ThemedDrawableTest, true);
+            mVectorDrawable.inflate(mResources, parser, attrs, theme);
 
             if (stateSet != null) {
                 mVectorDrawable.setState(stateSet);
diff --git a/tests/tests/icu/resources/android/icu/cts/expectations/icu-known-failures.txt b/tests/tests/icu/resources/android/icu/cts/expectations/icu-known-failures.txt
index e667c08..b92e754 100644
--- a/tests/tests/icu/resources/android/icu/cts/expectations/icu-known-failures.txt
+++ b/tests/tests/icu/resources/android/icu/cts/expectations/icu-known-failures.txt
@@ -16,9 +16,9 @@
   bug: "27310873"
 },
 {
-  description: "Cannot find any classes to test because APK doesn't have entries for directories, android/icu/",
+  description: "Cannot find any classes to test because .class files are not treated as resources in APK",
   name: "android.icu.dev.test.serializable.CoverageTest",
-  bug: "27310873"
+  bug: "27666677"
 },
 {
   description: "Serialized forms have not been converted to use repackaged classes",
@@ -34,6 +34,21 @@
   description: "A completely empty test case",
   name: "android.icu.dev.test.duration.PeriodBuilderTest"
 },
+{
+  description: "Fails on host and on device in same way before and after packaging",
+  name: "android.icu.dev.test.bidi.TestCompatibility#testCompatibility",
+  bug: "23995372"
+},
+{
+  description: "Problem with negative multiplier, not a regression",
+  name: "android.icu.dev.test.format.NumberFormatTest#TestNonpositiveMultiplier",
+  bug: "19185440"
+},
+{
+  description: "Wrong case for exponent separator",
+  name: "android.icu.dev.test.format.PluralRulesTest#testOverUnderflow",
+  bug: "27566754"
+},
 // The following are known to be broken but the reason is not yet known. They are expected to
 // succeed and so will be run and will fail but that is intentional so that they do not get
 // forgotten and are investigated to determine whether it is correct behavior on Android or a bug
@@ -41,35 +56,12 @@
 {
   description: "Broken and not yet triaged",
   names: [
-    "android.icu.dev.test.bidi.TestCompatibility#testCompatibility",
-    "android.icu.dev.test.calendar.ChineseTest#TestCoverage",
-    "android.icu.dev.test.calendar.ChineseTest#TestInitWithCurrentTime",
-    "android.icu.dev.test.calendar.IBMCalendarTest#TestAddRollEra0AndEraBounds",
-    "android.icu.dev.test.duration.ICUDurationTest#TestBasics",
-    "android.icu.dev.test.format.DataDrivenFormatTest#TestConsistentPivot",
-    "android.icu.dev.test.format.DataDrivenFormatTest#TestDateFormatBasic",
-    "android.icu.dev.test.format.DateFormatRegressionTest#Test4073003",
-    "android.icu.dev.test.format.DateFormatRegressionTest#Test4151706",
-    "android.icu.dev.test.format.DateFormatRegressionTest#Test4182066",
-    "android.icu.dev.test.format.DateFormatTest#TestBadInput135",
-    "android.icu.dev.test.format.DateFormatTest#TestDotAndAtLeniency",
-    "android.icu.dev.test.format.DateFormatTest#TestGenericTime",
-    "android.icu.dev.test.format.DateFormatTest#TestPartialParse994",
-    "android.icu.dev.test.format.DateFormatTest#TestQuarters",
-    "android.icu.dev.test.format.DateFormatTest#TestSpaceParsing",
-    "android.icu.dev.test.format.DateFormatTest#TestTwoDigitYear",
-    "android.icu.dev.test.format.DateFormatTest#TestWhiteSpaceParsing",
     "android.icu.dev.test.format.NumberFormatTest#TestDataDrivenJDK",
-    "android.icu.dev.test.format.NumberFormatTest#TestNonpositiveMultiplier",
-    "android.icu.dev.test.format.PluralRulesTest#testOverUnderflow",
-    "android.icu.dev.test.timezone.TimeZoneBoundaryTest#TestStepwise",
-    "android.icu.dev.test.timezone.TimeZoneTest#TestObservesDaylightTime",
-    "android.icu.dev.test.util.CurrencyTest#TestGetKeywordValues"
   ],
   result: "SUCCESS"
 },
 {
-  description: "Broken due to warnings, not yet triaged",
+  description: "Collation rules data has been removed from ICU4J data on Android",
   names: [
     "android.icu.dev.test.collator.CollationCreationMethodTest#TestRuleVsLocaleCreationMonkey",
     "android.icu.dev.test.collator.CollationMiscTest#TestImport",
@@ -78,6 +70,6 @@
     "android.icu.dev.test.collator.CollationTest#TestDataDriven",
     "android.icu.dev.test.collator.G7CollationTest#TestG7Data"
   ],
-  result: "SUCCESS"
+  bug: "27552651"
 }
 ]
diff --git a/tests/tests/net/src/android/net/cts/TheaterModeTest.java b/tests/tests/net/src/android/net/cts/TheaterModeTest.java
new file mode 100644
index 0000000..10fca6f
--- /dev/null
+++ b/tests/tests/net/src/android/net/cts/TheaterModeTest.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.cts;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.provider.Settings;
+import android.test.AndroidTestCase;
+import android.util.Log;
+
+import java.lang.Thread;
+
+public class TheaterModeTest extends AndroidTestCase {
+    private static final String TAG = "TheaterModeTest";
+    private static final String FEATURE_BLUETOOTH = "android.hardware.bluetooth";
+    private static final String FEATURE_WIFI = "android.hardware.wifi";
+    private static final int TIMEOUT_MS = 10 * 1000;
+    private boolean mHasFeature;
+    private Context mContext;
+    private ContentResolver resolver;
+
+    public void setup() {
+        mContext= getContext();
+        resolver = mContext.getContentResolver();
+        mHasFeature = (mContext.getPackageManager().hasSystemFeature(FEATURE_BLUETOOTH)
+                       || mContext.getPackageManager().hasSystemFeature(FEATURE_WIFI));
+    }
+
+    public void testTheaterMode() {
+        setup();
+        if (!mHasFeature) {
+            Log.i(TAG, "The device doesn't support network bluetooth or wifi feature");
+            return;
+        }
+
+        for (int testCount = 0; testCount < 2; testCount++) {
+            if (!doOneTest()) {
+                fail("Theater mode failed to change in " + TIMEOUT_MS + "msec");
+                return;
+            }
+        }
+    }
+
+    private boolean doOneTest() {
+        boolean theaterModeOn = isTheaterModeOn();
+
+        setTheaterModeOn(!theaterModeOn);
+        try {
+            Thread.sleep(TIMEOUT_MS);
+        } catch (InterruptedException e) {
+            Log.e(TAG, "Sleep time interrupted.", e);
+        }
+
+        if (theaterModeOn == isTheaterModeOn()) {
+            return false;
+        }
+        return true;
+    }
+
+    private void setTheaterModeOn(boolean enabling) {
+        // Change the system setting for theater mode
+        Settings.Global.putInt(resolver, Settings.Global.THEATER_MODE_ON, enabling ? 1 : 0);
+    }
+
+    private boolean isTheaterModeOn() {
+        // Read the system setting for theater mode
+        return Settings.Global.getInt(mContext.getContentResolver(),
+                                      Settings.Global.THEATER_MODE_ON, 0) != 0;
+    }
+}
diff --git a/tests/tests/automotive/Android.mk b/tests/tests/networksecurityconfig/networksecurityconfig-cleartext/Android.mk
similarity index 73%
copy from tests/tests/automotive/Android.mk
copy to tests/tests/networksecurityconfig/networksecurityconfig-cleartext/Android.mk
index abef2ac..df29b5f 100644
--- a/tests/tests/automotive/Android.mk
+++ b/tests/tests/networksecurityconfig/networksecurityconfig-cleartext/Android.mk
@@ -11,28 +11,24 @@
 # 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.
-
-LOCAL_PATH:= $(call my-dir)
+#
+LOCAL_PATH := $(call my-dir)
 
 include $(CLEAR_VARS)
+LOCAL_PACKAGE_NAME := CtsNetSecConfigCleartextTrafficTestCases
 
-LOCAL_PACKAGE_NAME := CtsAutomotiveTestCases
-
-# Don't include this package in any target.
-LOCAL_MODULE_TAGS := optional
-
-# When built, explicitly put it in the data partition.
+LOCAL_MODULE_TAGS := tests
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
-
-LOCAL_JAVA_LIBRARIES := android.car
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner org.apache.http.legacy android-support-test
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES += $(call all-java-files-under, ../src)
+
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res/
 
 # Tag this module as a cts test artifact
 LOCAL_COMPATIBILITY_SUITE := cts
 
 LOCAL_SDK_VERSION := current
-
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/networksecurityconfig/networksecurityconfig-cleartext/AndroidManifest.xml b/tests/tests/networksecurityconfig/networksecurityconfig-cleartext/AndroidManifest.xml
new file mode 100644
index 0000000..dbb4770
--- /dev/null
+++ b/tests/tests/networksecurityconfig/networksecurityconfig-cleartext/AndroidManifest.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="android.security.net.config.cts.CtsNetSecConfigCleartextTrafficTestCases">
+  <application>
+      <uses-library android:name="android.test.runner"/>
+      <meta-data android:name="android.security.net.config"
+                 android:resource="@xml/network_security_config" />
+  </application>
+
+  <uses-permission android:name="android.permission.INTERNET" />
+  <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+                   android:targetPackage="android.security.net.config.cts.CtsNetSecConfigCleartextTrafficTestCases"
+                   android:label="">
+        <meta-data android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener" />
+    </instrumentation>
+</manifest>
diff --git a/tests/tests/automotive/AndroidTest.xml b/tests/tests/networksecurityconfig/networksecurityconfig-cleartext/AndroidTest.xml
similarity index 75%
copy from tests/tests/automotive/AndroidTest.xml
copy to tests/tests/networksecurityconfig/networksecurityconfig-cleartext/AndroidTest.xml
index b4af1f5..9957342 100644
--- a/tests/tests/automotive/AndroidTest.xml
+++ b/tests/tests/networksecurityconfig/networksecurityconfig-cleartext/AndroidTest.xml
@@ -13,12 +13,12 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<configuration description="Config for CTS Automotive test cases">
+<configuration description="Config for CTS CtsNetSecConfigCleartextTraffic test cases">
     <target_preparer class="com.android.compatibility.common.tradefed.targetprep.ApkInstaller">
         <option name="cleanup-apks" value="true" />
-        <option name="test-file-name" value="CtsAutomotiveTestCases.apk" />
+        <option name="test-file-name" value="CtsNetSecConfigCleartextTrafficTestCases.apk" />
     </target_preparer>
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
-        <option name="package" value="android.support.car.cts" />
+        <option name="package" value="android.security.net.config.cts.CtsNetSecConfigCleartextTrafficTestCases" />
     </test>
 </configuration>
diff --git a/tests/tests/networksecurityconfig/networksecurityconfig-cleartext/res/xml/network_security_config.xml b/tests/tests/networksecurityconfig/networksecurityconfig-cleartext/res/xml/network_security_config.xml
new file mode 100644
index 0000000..987b178
--- /dev/null
+++ b/tests/tests/networksecurityconfig/networksecurityconfig-cleartext/res/xml/network_security_config.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<network-security-config>
+  <domain-config cleartextTrafficPermitted="false">
+    <domain includeSubdomains="true">android.com</domain>
+    <domain-config cleartextTrafficPermitted="true">
+      <domain>developer.android.com</domain>
+    </domain-config>
+  </domain-config>
+</network-security-config>
diff --git a/tests/tests/networksecurityconfig/networksecurityconfig-cleartext/src/android/security/net/config/cts/CleartextPermittedTest.java b/tests/tests/networksecurityconfig/networksecurityconfig-cleartext/src/android/security/net/config/cts/CleartextPermittedTest.java
new file mode 100644
index 0000000..401b5ac
--- /dev/null
+++ b/tests/tests/networksecurityconfig/networksecurityconfig-cleartext/src/android/security/net/config/cts/CleartextPermittedTest.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.security.net.config.cts;
+
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import javax.net.ssl.X509TrustManager;
+import junit.framework.TestCase;
+
+public class CleartextPermittedTest extends TestCase {
+    public void testDefaultAllowed() throws Exception {
+        TestUtils.assertCleartextConnectionSucceeds("google.com", 80);
+        TestUtils.assertTlsConnectionSucceeds("google.com", 443);
+    }
+
+    public void testCleartextBlocked() throws Exception {
+        TestUtils.assertCleartextConnectionFails("android.com", 80);
+        TestUtils.assertTlsConnectionSucceeds("android.com", 443);
+        // subdomains of android.com are also disallowed.
+        TestUtils.assertCleartextConnectionFails("www.android.com", 80);
+        TestUtils.assertTlsConnectionSucceeds("www.android.com", 443);
+    }
+
+    public void testNestedCleartextPermitted() throws Exception {
+        // developer.android.com is explicitly permitted.
+        TestUtils.assertCleartextConnectionSucceeds("developer.android.com", 80);
+        TestUtils.assertTlsConnectionSucceeds("developer.android.com", 443);
+    }
+}
diff --git a/tests/tests/networksecurityconfig/src/android/security/net/config/cts/TestUtils.java b/tests/tests/networksecurityconfig/src/android/security/net/config/cts/TestUtils.java
index 0952cd3..d114ab5 100644
--- a/tests/tests/networksecurityconfig/src/android/security/net/config/cts/TestUtils.java
+++ b/tests/tests/networksecurityconfig/src/android/security/net/config/cts/TestUtils.java
@@ -20,6 +20,7 @@
 
 import java.io.InputStream;
 import java.io.IOException;
+import java.net.HttpURLConnection;
 import java.net.Socket;
 import java.net.URL;
 import java.security.KeyStore;
@@ -28,7 +29,6 @@
 import java.security.cert.X509Certificate;
 import java.util.List;
 import java.util.ArrayList;
-import javax.net.ssl.HttpsURLConnection;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLHandshakeException;
 import javax.net.ssl.TrustManager;
@@ -45,17 +45,26 @@
     private TestUtils() {
     }
 
-
     public static void assertTlsConnectionSucceeds(String host, int port) throws Exception {
         assertSslSocketSucceeds(host, port);
-        assertHttpClientHttpsSucceeds(host, port);
-        assertUrlConnectionHttpsSucceeds(host, port);
+        assertHttpClientSucceeds(host, port, true /* https */);
+        assertUrlConnectionSucceeds(host, port, true /* https */);
     }
 
     public static void assertTlsConnectionFails(String host, int port) throws Exception {
         assertSslSocketFails(host, port);
-        assertHttpClientHttpsFails(host, port);
-        assertUrlConnectionHttpsFails(host, port);
+        assertHttpClientFails(host, port, true /* https */);
+        assertUrlConnectionFails(host, port, true /* https */);
+    }
+
+    public static void assertCleartextConnectionSucceeds(String host, int port) throws Exception {
+        assertHttpClientSucceeds(host, port, false /* http */);
+        assertUrlConnectionSucceeds(host, port, false /* http */);
+    }
+
+    public static void assertCleartextConnectionFails(String host, int port) throws Exception {
+        assertHttpClientFails(host, port, false /* http */);
+        assertUrlConnectionFails(host, port, false /* http */);
     }
 
     public static X509TrustManager getDefaultTrustManager() throws Exception {
@@ -95,26 +104,27 @@
         s.getInputStream();
     }
 
-    private static void assertUrlConnectionHttpsFails(String host, int port)
+    private static void assertUrlConnectionFails(String host, int port, boolean https)
             throws Exception {
-        URL url = new URL("https://" + host + ":" + port);
-        HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
+        URL url = new URL((https ? "https://" : "http://") + host + ":" + port);
+        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
         try {
             connection.getInputStream();
             fail("Connection to " + host + ":" + port + " succeeded");
-        } catch (SSLHandshakeException expected) {
+        } catch (IOException expected) {
         }
     }
 
-    private static void assertUrlConnectionHttpsSucceeds(String host, int port)
+    private static void assertUrlConnectionSucceeds(String host, int port, boolean https)
             throws Exception {
-        URL url = new URL("https://" + host + ":" + port);
-        HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
+        URL url = new URL((https ? "https://" : "http://") + host + ":" + port);
+        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
         connection.getInputStream();
     }
 
-    private static void assertHttpClientHttpsSucceeds(String host, int port) throws Exception {
-        URL url = new URL("https://" + host + ":" + port);
+    private static void assertHttpClientSucceeds(String host, int port, boolean https)
+            throws Exception {
+        URL url = new URL((https ? "https://" : "http://") + host + ":" + port);
         AndroidHttpClient httpClient = AndroidHttpClient.newInstance(null);
         try {
             HttpResponse response = httpClient.execute(new HttpGet(url.toString()));
@@ -123,8 +133,9 @@
         }
     }
 
-    private static void assertHttpClientHttpsFails(String host, int port) throws Exception {
-        URL url = new URL("https://" + host + ":" + port);
+    private static void assertHttpClientFails(String host, int port, boolean https)
+            throws Exception {
+        URL url = new URL((https ? "https://" : "http://") + host + ":" + port);
         AndroidHttpClient httpClient = AndroidHttpClient.newInstance(null);
         try {
             HttpResponse response = httpClient.execute(new HttpGet(url.toString()));
diff --git a/tests/tests/telecom/src/android/telecom/cts/BaseTelecomTestWithMockServices.java b/tests/tests/telecom/src/android/telecom/cts/BaseTelecomTestWithMockServices.java
index 6810b71..8cf20bd 100644
--- a/tests/tests/telecom/src/android/telecom/cts/BaseTelecomTestWithMockServices.java
+++ b/tests/tests/telecom/src/android/telecom/cts/BaseTelecomTestWithMockServices.java
@@ -756,6 +756,24 @@
         );
     }
 
+    void assertDisconnectReason(final Connection connection, final String disconnectReason) {
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return disconnectReason;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return connection.getDisconnectCause().getReason();
+                    }
+                },
+                WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Connection should have been disconnected with reason: " + disconnectReason
+        );
+    }
+
     void assertConferenceState(final Conference conference, final int state) {
         waitUntilConditionIsTrueOrTimeout(
                 new Condition() {
diff --git a/tests/tests/telecom/src/android/telecom/cts/ExtendedInCallServiceTest.java b/tests/tests/telecom/src/android/telecom/cts/ExtendedInCallServiceTest.java
index 7d71c0f..fbda2a3 100644
--- a/tests/tests/telecom/src/android/telecom/cts/ExtendedInCallServiceTest.java
+++ b/tests/tests/telecom/src/android/telecom/cts/ExtendedInCallServiceTest.java
@@ -285,6 +285,29 @@
         assertConnectionState(connection, Connection.STATE_DISCONNECTED);
     }
 
+    public void testRejectIncomingCallWithMessage() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        String disconnectReason = "Test reason for disconnect";
+
+        addAndVerifyNewIncomingCall(createTestNumber(), null);
+        final MockConnection connection = verifyConnectionForIncomingCall();
+
+        final MockInCallService inCallService = mInCallCallbacks.getService();
+
+        final Call call = inCallService.getLastCall();
+
+        assertCallState(call, Call.STATE_RINGING);
+        assertConnectionState(connection, Connection.STATE_RINGING);
+
+        call.reject(true, disconnectReason);
+
+        assertCallState(call, Call.STATE_DISCONNECTED);
+        assertConnectionState(connection, Connection.STATE_DISCONNECTED);
+        assertDisconnectReason(connection, disconnectReason);
+    }
+
     public void testCanAddCall_CannotAddForExistingDialingCall() {
         if (!mShouldTestTelecom) {
             return;
diff --git a/tests/tests/telecom/src/android/telecom/cts/MockConnection.java b/tests/tests/telecom/src/android/telecom/cts/MockConnection.java
index 9bb83a1..fe33a8d 100644
--- a/tests/tests/telecom/src/android/telecom/cts/MockConnection.java
+++ b/tests/tests/telecom/src/android/telecom/cts/MockConnection.java
@@ -70,6 +70,16 @@
     }
 
     @Override
+    public void onReject(String reason) {
+        super.onReject();
+        setDisconnected(new DisconnectCause(DisconnectCause.REJECTED, reason));
+        if (mRemoteConnection != null) {
+            mRemoteConnection.reject();
+        }
+        destroy();
+    }
+
+    @Override
     public void onHold() {
         super.onHold();
         setOnHold();
diff --git a/tests/tests/telecom/src/android/telecom/cts/MockConnectionService.java b/tests/tests/telecom/src/android/telecom/cts/MockConnectionService.java
index ad64e5c..48a1c94 100644
--- a/tests/tests/telecom/src/android/telecom/cts/MockConnectionService.java
+++ b/tests/tests/telecom/src/android/telecom/cts/MockConnectionService.java
@@ -73,6 +73,9 @@
             ConnectionRequest request) {
         final MockConnection connection = new MockConnection();
         connection.setAddress(request.getAddress(), CONNECTION_PRESENTATION);
+        connection.setConnectionCapabilities(
+                connection.getConnectionCapabilities() |
+                        Connection.CAPABILITY_CAN_SEND_RESPONSE_VIA_CONNECTION);
         connection.createMockVideoProvider();
         ((Connection) connection).setVideoState(request.getVideoState());
 
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/CanvasStateTests.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/CanvasStateTests.java
index becc2f7..0e5fb0f 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/CanvasStateTests.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/CanvasStateTests.java
@@ -24,6 +24,9 @@
 import android.uirendering.cts.testinfrastructure.ActivityTestBase;
 import android.uirendering.cts.testinfrastructure.CanvasClient;
 
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
 /**
  * Tests of state query-able from canvas at draw time.
  *
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ColorFilterAlphaTest.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ColorFilterAlphaTest.java
new file mode 100644
index 0000000..56ca467
--- /dev/null
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ColorFilterAlphaTest.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.uirendering.cts.testclasses;
+
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Point;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.PorterDuffColorFilter;
+import android.test.suitebuilder.annotation.MediumTest;
+import android.uirendering.cts.bitmapverifiers.SamplePointVerifier;
+import android.uirendering.cts.testinfrastructure.ActivityTestBase;
+import android.uirendering.cts.testinfrastructure.CanvasClient;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.util.List;
+
+@RunWith(Parameterized.class)
+public class ColorFilterAlphaTest extends ActivityTestBase {
+    // We care about one point in each of the four rectangles of different alpha values, as well as
+    // the area outside the rectangles
+
+    public static final int FILTER_COLOR = 0xFFBB0000;
+
+    private static final Point[] TEST_POINTS = new Point[] {
+            new Point(9, 45),
+            new Point(27, 45),
+            new Point(45, 45),
+            new Point(63, 45),
+            new Point(81, 45)
+    };
+
+    private static Object[][] MODES_AND_EXPECTED_COLORS = new Object[][] {
+        { PorterDuff.Mode.DST, new int[] {
+                0xFFE6E6E6, 0xFFCCCCCC, 0xFFB3B3B3, 0xFF999999, 0xFFFFFFFF } },
+
+        { PorterDuff.Mode.SRC_OVER, new int[] {
+                0xFFBB0000, 0xFFBB0000, 0xFFBB0000, 0xFFBB0000, 0xFFBB0000 } },
+
+        { PorterDuff.Mode.DST_OVER, new int[] {
+                0xFFAF1A1A, 0xFFA33333, 0xFF984D4D, 0xFF8B6666, 0xFFBB0000 } },
+
+        { PorterDuff.Mode.SRC_IN, new int[] {
+                0xFFF1CCCC, 0xFFE49999, 0xFFD66666, 0xFFC83333, 0xFFFFFFFF } },
+
+        { PorterDuff.Mode.DST_IN, new int[] {
+                0xFFE6E6E6, 0xFFCCCCCC, 0xFFB3B3B3, 0xFF999999, 0xFFFFFFFF } },
+
+        { PorterDuff.Mode.SRC_OUT, new int[] {
+                0xFFC83333, 0xFFD66666, 0xFFE49999, 0xFFF1CCCC, 0xFFBB0000 } },
+
+        { PorterDuff.Mode.DST_OUT, new int[] {
+                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF } },
+
+        { PorterDuff.Mode.SRC_ATOP, new int[] {
+                0xFFF1CCCC, 0xFFE49999, 0xFFD66666, 0xFFC93333, 0xFFFFFFFF } },
+
+        { PorterDuff.Mode.DST_ATOP, new int[] {
+                0xFFB01A1A, 0xFFA33333, 0xFF984D4D, 0xFF8B6666, 0xFFBB0000 } },
+
+        { PorterDuff.Mode.XOR, new int[] {
+                0xFFC93333, 0xFFD66666, 0xFFE49999, 0xFFF1CCCC, 0xFFBB0000 } },
+
+        { PorterDuff.Mode.MULTIPLY, new int[] {
+                0xFFDFCCCC, 0xFFBE9999, 0xFF9E6666, 0xFF7E3333, 0xFFFFFFFF } },
+
+        { PorterDuff.Mode.SCREEN, new int[] {
+                0xFFC21A1A, 0xFFC93333, 0xFFD04D4D, 0xFFD66666, 0xFFBB0000 } },
+    };
+
+    @Parameterized.Parameters(name = "{0}")
+    public static List<XfermodeTest.Config> configs() {
+        return XfermodeTest.configs(MODES_AND_EXPECTED_COLORS);
+    }
+
+    private final XfermodeTest.Config mConfig;
+
+    public ColorFilterAlphaTest(XfermodeTest.Config config) {
+        mConfig = config;
+    }
+
+    private static final int[] BLOCK_COLORS = new int[] {
+            0x33808080,
+            0x66808080,
+            0x99808080,
+            0xCC808080,
+            0x00000000
+    };
+
+    private static Bitmap createMultiRectBitmap() {
+        Bitmap bitmap = Bitmap.createBitmap(TEST_WIDTH, TEST_HEIGHT, Bitmap.Config.ARGB_8888);
+        Canvas canvas = new Canvas(bitmap);
+        Paint paint = new Paint();
+        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
+        final int blockCount = BLOCK_COLORS.length;
+        final int blockWidth = TEST_WIDTH / blockCount;
+        for (int i = 0 ; i < blockCount; i++) {
+            paint.setColor(BLOCK_COLORS[i]);
+            canvas.drawRect(i * blockWidth, 0, (i + 1) * blockWidth, TEST_HEIGHT, paint);
+        }
+        return bitmap;
+    }
+
+    private CanvasClient mCanvasClient = new CanvasClient() {
+        final Paint mPaint = new Paint();
+        private final Bitmap mBitmap = createMultiRectBitmap();
+
+        @Override
+        public void draw(Canvas canvas, int width, int height) {
+            mPaint.setColorFilter(new PorterDuffColorFilter(FILTER_COLOR, mConfig.mode));
+            canvas.drawBitmap(mBitmap, 0, 0, mPaint);
+        }
+    };
+
+    @Test
+    @MediumTest
+    public void test() {
+        createTest()
+                .addCanvasClient(mCanvasClient, mConfig.hardwareAccelerated)
+                .runWithVerifier(new SamplePointVerifier(TEST_POINTS, mConfig.expectedColors));
+    }
+}
+
+
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/LayerTests.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/LayerTests.java
index a1338bc..30dbb03 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/LayerTests.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/LayerTests.java
@@ -23,15 +23,20 @@
 import android.graphics.Paint;
 import android.graphics.PorterDuff;
 import android.graphics.PorterDuffXfermode;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.test.suitebuilder.annotation.MediumTest;
 import android.uirendering.cts.bitmapverifiers.ColorVerifier;
 import android.uirendering.cts.testinfrastructure.ActivityTestBase;
 import android.uirendering.cts.testinfrastructure.ViewInitializer;
 import android.view.View;
 import android.uirendering.cts.R;
+import org.junit.Test;
+import org.junit.runner.RunWith;
 
+@MediumTest
+@RunWith(AndroidJUnit4.class)
 public class LayerTests extends ActivityTestBase {
-    @SmallTest
+    @Test
     public void testLayerPaintAlpha() {
         // red channel full strength, other channels 75% strength
         // (since 25% alpha red subtracts from them)
@@ -53,7 +58,7 @@
                 .runWithVerifier(new ColorVerifier(expectedColor));
     }
 
-    @SmallTest
+    @Test
     public void testLayerPaintColorFilter() {
         // Red, fully desaturated. Note that it's not 255/3 in each channel.
         // See ColorMatrix#setSaturation()
@@ -73,7 +78,7 @@
                 .runWithVerifier(new ColorVerifier(expectedColor));
     }
 
-    @SmallTest
+    @Test
     public void testLayerPaintBlend() {
         // Red, drawn underneath opaque white, so output should be white.
         // TODO: consider doing more interesting blending test here
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/PathClippingTests.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/PathClippingTests.java
index 8c00ecc..ae5f05d 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/PathClippingTests.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/PathClippingTests.java
@@ -34,6 +34,8 @@
 import android.webkit.WebView;
 import android.uirendering.cts.R;
 
+import static org.junit.Assert.assertNotNull;
+
 public class PathClippingTests extends ActivityTestBase {
     // draw circle with hole in it, with stroked circle
     static final CanvasClient sTorusDrawCanvasClient = new CanvasClient() {
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ShadowTests.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ShadowTests.java
index 26c2402..bc76757 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ShadowTests.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/ShadowTests.java
@@ -23,8 +23,22 @@
 
 import android.test.suitebuilder.annotation.SmallTest;
 import android.uirendering.cts.testinfrastructure.ActivityTestBase;
+import android.uirendering.cts.util.CompareUtils;
 
 public class ShadowTests extends ActivityTestBase {
+
+    private class GrayScaleVerifier extends SamplePointVerifier {
+        public GrayScaleVerifier(Point[] testPoints, int[] expectedColors, int tolerance) {
+            super(testPoints, expectedColors, tolerance) ;
+        }
+
+        @Override
+        protected boolean verifyPixel(int color, int expectedColor) {
+            return super.verifyPixel(color, expectedColor)
+                    && CompareUtils.verifyPixelGrayScale(color, 1);
+        }
+    }
+
     @SmallTest
     public void testShadowLayout() {
         int shadowColorValue = 0xDB;
@@ -32,8 +46,9 @@
         if (getActivity().getOnTv()) {
             shadowColorValue = 0xBB;
         }
-        // Use a higher threshold (36) than default value (20);
-        SamplePointVerifier verifier = new SamplePointVerifier(
+
+        // Use a higher threshold than default value (20), since we also double check gray scale;
+        GrayScaleVerifier verifier = new GrayScaleVerifier(
                 new Point[] {
                         // view area
                         new Point(25, 64),
@@ -48,7 +63,8 @@
                         Color.rgb(shadowColorValue, shadowColorValue, shadowColorValue),
                         Color.rgb(shadowColorValue, shadowColorValue, shadowColorValue),
                 },
-                36);
+                48);
+
         createTest()
                 .addLayout(R.layout.simple_shadow_layout, null, true/* HW only */)
                 .runWithVerifier(verifier);
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/SweepTests.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/SweepTests.java
index 71b4f3f..f5f59b3 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/SweepTests.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/SweepTests.java
@@ -20,21 +20,16 @@
 import android.graphics.Color;
 import android.graphics.LinearGradient;
 import android.graphics.Paint;
-import android.graphics.Point;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffXfermode;
 import android.graphics.Rect;
-import android.graphics.RectF;
 import android.graphics.Shader;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.test.suitebuilder.annotation.MediumTest;
 import android.uirendering.cts.bitmapcomparers.BitmapComparer;
 import android.uirendering.cts.bitmapcomparers.MSSIMComparer;
-import android.uirendering.cts.bitmapverifiers.BitmapVerifier;
-import android.uirendering.cts.bitmapverifiers.SamplePointVerifier;
 import android.uirendering.cts.testinfrastructure.ActivityTestBase;
 import android.uirendering.cts.testinfrastructure.CanvasClient;
 import android.uirendering.cts.testinfrastructure.DisplayModifier;
 import android.uirendering.cts.testinfrastructure.ResourceModifier;
+import org.junit.Test;
 
 import java.util.LinkedHashMap;
 import java.util.Map;
@@ -42,222 +37,8 @@
 /**
  * Test cases of all combination of resource modifications.
  */
+@MediumTest
 public class SweepTests extends ActivityTestBase {
-    private static final String TAG = "SweepTests";
-
-    public static final int BG_COLOR = 0xFFFFFFFF;
-    public static final int DST_COLOR = 0xFFFFCC44;
-    public static final int SRC_COLOR = 0xFF66AAFF;
-    public static final int MULTIPLY_COLOR = 0xFF668844;
-    public static final int SCREEN_COLOR = 0xFFFFEEFF;
-
-    // These points are in pairs, the first being the lower left corner, the second is only in the
-    // Destination bitmap, the third is the intersection of the two bitmaps, and the fourth is in
-    // the Source bitmap.
-    private final static Point[] XFERMODE_TEST_POINTS = new Point[] {
-            new Point(1, 80), new Point(25, 25), new Point(35, 35), new Point(70, 70)
-    };
-
-    /**
-     * There are 4 locations we care about in any filter testing.
-     *
-     * 1) Both empty
-     * 2) Only src, dst empty
-     * 3) Both src + dst
-     * 4) Only dst, src empty
-     */
-    private final Map<PorterDuff.Mode, int[]> XFERMODE_COLOR_MAP = new LinkedHashMap<PorterDuff.Mode, int[]>() {
-        {
-            put(PorterDuff.Mode.SRC, new int[] {
-                    BG_COLOR, BG_COLOR, SRC_COLOR, SRC_COLOR
-            });
-
-            put(PorterDuff.Mode.DST, new int[] {
-                    BG_COLOR, DST_COLOR, DST_COLOR, BG_COLOR
-            });
-
-            put(PorterDuff.Mode.SRC_OVER, new int[] {
-                    BG_COLOR, DST_COLOR, SRC_COLOR, SRC_COLOR
-            });
-
-            put(PorterDuff.Mode.DST_OVER, new int[] {
-                    BG_COLOR, DST_COLOR, DST_COLOR, SRC_COLOR
-            });
-
-            put(PorterDuff.Mode.SRC_IN, new int[] {
-                    BG_COLOR, BG_COLOR, SRC_COLOR, BG_COLOR
-            });
-
-            put(PorterDuff.Mode.DST_IN, new int[] {
-                    BG_COLOR, BG_COLOR, DST_COLOR, BG_COLOR
-            });
-
-            put(PorterDuff.Mode.SRC_OUT, new int[] {
-                    BG_COLOR, BG_COLOR, BG_COLOR, SRC_COLOR
-            });
-
-            put(PorterDuff.Mode.DST_OUT, new int[] {
-                    BG_COLOR, DST_COLOR, BG_COLOR, BG_COLOR
-            });
-
-            put(PorterDuff.Mode.SRC_ATOP, new int[] {
-                    BG_COLOR, DST_COLOR, SRC_COLOR, BG_COLOR
-            });
-
-            put(PorterDuff.Mode.DST_ATOP, new int[] {
-                    BG_COLOR, BG_COLOR, DST_COLOR, SRC_COLOR
-            });
-
-            put(PorterDuff.Mode.XOR, new int[] {
-                    BG_COLOR, DST_COLOR, BG_COLOR, SRC_COLOR
-            });
-
-            put(PorterDuff.Mode.MULTIPLY, new int[] {
-                    BG_COLOR, BG_COLOR, MULTIPLY_COLOR, BG_COLOR
-            });
-
-            put(PorterDuff.Mode.SCREEN, new int[] {
-                    BG_COLOR, DST_COLOR, SCREEN_COLOR, SRC_COLOR
-            });
-        }
-    };
-
-    private final static DisplayModifier XFERMODE_MODIFIER = new DisplayModifier() {
-        private final RectF mSrcRect = new RectF(30, 30, 80, 80);
-        private final RectF mDstRect = new RectF(10, 10, 60, 60);
-        private final Bitmap mSrcBitmap = createSrc();
-        private final Bitmap mDstBitmap = createDst();
-
-        @Override
-        public void modifyDrawing(Paint paint, Canvas canvas) {
-            int sc = canvas.saveLayer(0, 0, TEST_WIDTH, TEST_HEIGHT, null);
-
-            canvas.drawBitmap(mDstBitmap, 0, 0, null);
-            canvas.drawBitmap(mSrcBitmap, 0, 0, paint);
-
-            canvas.restoreToCount(sc);
-        }
-
-        private Bitmap createSrc() {
-            Bitmap srcB = Bitmap.createBitmap(TEST_WIDTH, TEST_HEIGHT, Bitmap.Config.ARGB_8888);
-            Canvas srcCanvas = new Canvas(srcB);
-            Paint srcPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
-            srcPaint.setColor(SRC_COLOR);
-            srcCanvas.drawRect(mSrcRect, srcPaint);
-            return srcB;
-        }
-
-        private Bitmap createDst() {
-            Bitmap dstB = Bitmap.createBitmap(TEST_WIDTH, TEST_HEIGHT, Bitmap.Config.ARGB_8888);
-            Canvas dstCanvas = new Canvas(dstB);
-            Paint dstPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
-            dstPaint.setColor(DST_COLOR);
-            dstCanvas.drawOval(mDstRect, dstPaint);
-            return dstB;
-        }
-    };
-
-    // We care about one point in each of the four rectangles of different alpha values, as well as
-    // the area outside the rectangles
-    private final static Point[] COLOR_FILTER_ALPHA_POINTS = new Point[] {
-            new Point(9, 45),
-            new Point(27, 45),
-            new Point(45, 45),
-            new Point(63, 45),
-            new Point(81, 45)
-    };
-
-    public static final int FILTER_COLOR = 0xFFBB0000;
-    private final Map<PorterDuff.Mode, int[]> COLOR_FILTER_ALPHA_MAP
-            = new LinkedHashMap<PorterDuff.Mode, int[]>() {
-        {
-            put(PorterDuff.Mode.SRC, new int[] {
-                    FILTER_COLOR, FILTER_COLOR, FILTER_COLOR, FILTER_COLOR, FILTER_COLOR
-            });
-
-            put(PorterDuff.Mode.DST, new int[] {
-                    0xFFE6E6E6, 0xFFCCCCCC, 0xFFB3B3B3, 0xFF999999, 0xFFFFFFFF
-            });
-
-            put(PorterDuff.Mode.SRC_OVER, new int[] {
-                    0xFFBB0000, 0xFFBB0000, 0xFFBB0000, 0xFFBB0000, 0xFFBB0000
-            });
-
-            put(PorterDuff.Mode.DST_OVER, new int[] {
-                    0xFFAF1A1A, 0xFFA33333, 0xFF984D4D, 0xFF8B6666, 0xFFBB0000
-            });
-
-            put(PorterDuff.Mode.SRC_IN, new int[] {
-                    0xFFF1CCCC, 0xFFE49999, 0xFFD66666, 0xFFC83333, 0xFFFFFFFF
-            });
-
-            put(PorterDuff.Mode.DST_IN, new int[] {
-                    0xFFE6E6E6, 0xFFCCCCCC, 0xFFB3B3B3, 0xFF999999, 0xFFFFFFFF
-            });
-
-            put(PorterDuff.Mode.SRC_OUT, new int[] {
-                    0xFFC83333, 0xFFD66666, 0xFFE49999, 0xFFF1CCCC, 0xFFBB0000
-            });
-
-            put(PorterDuff.Mode.DST_OUT, new int[] {
-                    0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
-            });
-
-            put(PorterDuff.Mode.SRC_ATOP, new int[] {
-                    0xFFF1CCCC, 0xFFE49999, 0xFFD66666, 0xFFC93333, 0xFFFFFFFF
-            });
-
-            put(PorterDuff.Mode.DST_ATOP, new int[] {
-                    0xFFB01A1A, 0xFFA33333, 0xFF984D4D, 0xFF8B6666, 0xFFBB0000
-            });
-
-            put(PorterDuff.Mode.XOR, new int[] {
-                    0xFFC93333, 0xFFD66666, 0xFFE49999, 0xFFF1CCCC, 0xFFBB0000
-            });
-
-            put(PorterDuff.Mode.MULTIPLY, new int[] {
-                    0xFFDFCCCC, 0xFFBE9999, 0xFF9E6666, 0xFF7E3333, 0xFFFFFFFF
-            });
-
-            put(PorterDuff.Mode.SCREEN, new int[] {
-                    0xFFC21A1A, 0xFFC93333, 0xFFD04D4D, 0xFFD66666, 0xFFBB0000
-            });
-        }
-    };
-
-    /**
-     * Draws 5 blocks of different color/opacity to be blended against
-     */
-    private final static DisplayModifier COLOR_FILTER_ALPHA_MODIFIER = new DisplayModifier() {
-        private final int[] BLOCK_COLORS = new int[] {
-                0x33808080,
-                0x66808080,
-                0x99808080,
-                0xCC808080,
-                0x00000000
-        };
-
-        private final Bitmap mBitmap = createQuadRectBitmap();
-
-        public void modifyDrawing(Paint paint, Canvas canvas) {
-            canvas.drawBitmap(mBitmap, 0, 0, paint);
-        }
-
-        private Bitmap createQuadRectBitmap() {
-            Bitmap bitmap = Bitmap.createBitmap(TEST_WIDTH, TEST_HEIGHT, Bitmap.Config.ARGB_8888);
-            Canvas canvas = new Canvas(bitmap);
-            Paint paint = new Paint();
-            paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
-            final int blockCount = BLOCK_COLORS.length;
-            final int blockWidth = TEST_WIDTH / blockCount;
-            for (int i = 0 ; i < blockCount; i++) {
-                paint.setColor(BLOCK_COLORS[i]);
-                canvas.drawRect(i * blockWidth, 0, (i + 1) * blockWidth, TEST_HEIGHT, paint);
-            }
-            return bitmap;
-        }
-    };
-
     private final static DisplayModifier COLOR_FILTER_GRADIENT_MODIFIER = new DisplayModifier() {
         private final Rect mBounds = new Rect(30, 30, 150, 150);
         private final int[] mColors = new int[] {
@@ -299,54 +80,25 @@
             new MSSIMComparer(HIGH_THRESHOLD)
     };
 
-    @SmallTest
+    @Test
     public void testBasicDraws() {
-        sweepModifiersForMask(DisplayModifier.Accessor.SHAPES_MASK, null, DEFAULT_MSSIM_COMPARER,
-                null);
+        sweepModifiersForMask(DisplayModifier.Accessor.SHAPES_MASK, null, DEFAULT_MSSIM_COMPARER);
     }
 
-    @SmallTest
+    @Test
     public void testBasicShaders() {
         sweepModifiersForMask(DisplayModifier.Accessor.SHADER_MASK, mCircleDrawModifier,
-                DEFAULT_MSSIM_COMPARER, null);
+                DEFAULT_MSSIM_COMPARER);
     }
 
-    @SmallTest
+    @Test
     public void testColorFilterUsingGradient() {
         sweepModifiersForMask(DisplayModifier.Accessor.COLOR_FILTER_MASK,
-                COLOR_FILTER_GRADIENT_MODIFIER, DEFAULT_MSSIM_COMPARER, null);
-    }
-
-    @SmallTest
-    public void testColorFiltersAlphas() {
-        BitmapVerifier[] bitmapVerifiers =
-                new BitmapVerifier[DisplayModifier.PORTERDUFF_MODES.length];
-        int index = 0;
-        for (PorterDuff.Mode mode : DisplayModifier.PORTERDUFF_MODES) {
-            bitmapVerifiers[index] = new SamplePointVerifier(COLOR_FILTER_ALPHA_POINTS,
-                    COLOR_FILTER_ALPHA_MAP.get(mode));
-            index++;
-        }
-        sweepModifiersForMask(DisplayModifier.Accessor.COLOR_FILTER_MASK,
-                COLOR_FILTER_ALPHA_MODIFIER, null, bitmapVerifiers);
-    }
-
-    @SmallTest
-    public void testXfermodes() {
-        BitmapVerifier[] bitmapVerifiers =
-                new BitmapVerifier[DisplayModifier.PORTERDUFF_MODES.length];
-        int index = 0;
-        for (PorterDuff.Mode mode : DisplayModifier.PORTERDUFF_MODES) {
-            bitmapVerifiers[index] = new SamplePointVerifier(XFERMODE_TEST_POINTS,
-                    XFERMODE_COLOR_MAP.get(mode));
-            index++;
-        }
-        sweepModifiersForMask(DisplayModifier.Accessor.XFERMODE_MASK, XFERMODE_MODIFIER,
-                null, bitmapVerifiers);
+                COLOR_FILTER_GRADIENT_MODIFIER, DEFAULT_MSSIM_COMPARER);
     }
 
     protected void sweepModifiersForMask(int mask, final DisplayModifier drawOp,
-            BitmapComparer[] bitmapComparers, BitmapVerifier[] bitmapVerifiers) {
+                BitmapComparer[] bitmapComparers) {
         if ((mask & DisplayModifier.Accessor.ALL_OPTIONS_MASK) == 0) {
             throw new IllegalArgumentException("Attempt to test with a mask that is invalid");
         }
@@ -371,13 +123,8 @@
         // Create the test cases with each combination
         do {
             canvasClient.setDebugString(modifierAccessor.getDebugString());
-            if (bitmapComparers != null) {
-                int arrIndex = Math.min(index, bitmapComparers.length - 1);
-                createTest().addCanvasClient(canvasClient).runWithComparer(bitmapComparers[arrIndex]);
-            } else {
-                int arrIndex = Math.min(index, bitmapVerifiers.length - 1);
-                createTest().addCanvasClient(canvasClient).runWithVerifier(bitmapVerifiers[arrIndex]);
-            }
+            int arrIndex = Math.min(index, bitmapComparers.length - 1);
+            createTest().addCanvasClient(canvasClient).runWithComparer(bitmapComparers[arrIndex]);
             index++;
         } while (modifierAccessor.step());
     }
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testclasses/XfermodeTest.java b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/XfermodeTest.java
new file mode 100644
index 0000000..857d3ab
--- /dev/null
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testclasses/XfermodeTest.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.uirendering.cts.testclasses;
+
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Point;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.RectF;
+import android.test.suitebuilder.annotation.MediumTest;
+import android.uirendering.cts.bitmapverifiers.SamplePointVerifier;
+import android.uirendering.cts.testinfrastructure.ActivityTestBase;
+import android.uirendering.cts.testinfrastructure.CanvasClient;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(Parameterized.class)
+public class XfermodeTest extends ActivityTestBase {
+    /**
+     * There are 4 locations we care about in testing each filter:
+     *
+     * 1) Both empty
+     * 2) Only src, dst empty
+     * 3) Both src + dst
+     * 4) Only dst, src empty
+     */
+    private final static Point[] TEST_POINTS = new Point[] {
+            new Point(1, 80),
+            new Point(25, 25),
+            new Point(35, 35),
+            new Point(70, 70)
+    };
+
+    public static class Config {
+        final boolean hardwareAccelerated;
+        final PorterDuff.Mode mode;
+        final int[] expectedColors;
+
+        Config(boolean hardwareAccelerated, Object[] modeAndExpectedColors) {
+            this.hardwareAccelerated = hardwareAccelerated;
+            mode = (PorterDuff.Mode) modeAndExpectedColors[0];
+            expectedColors = (int[]) modeAndExpectedColors[1];
+        }
+
+        @Override
+        public String toString() {
+            return mode.name() + ", hardwareAccelerated=" + hardwareAccelerated;
+        }
+    };
+
+    public static List<XfermodeTest.Config> configs(Object[][] modesAndExpectedColors) {
+        List<XfermodeTest.Config> configs = new ArrayList<>();
+        for (boolean hardwareAccelerated : new boolean[] {false, true}) {
+            for (Object[] modeAndExpectedColors : modesAndExpectedColors) {
+                configs.add(new XfermodeTest.Config(hardwareAccelerated, modeAndExpectedColors));
+            }
+        }
+        return configs;
+    }
+
+    private static final int BG_COLOR = 0xFFFFFFFF;
+    private static final int DST_COLOR = 0xFFFFCC44;
+    private static final int SRC_COLOR = 0xFF66AAFF;
+    private static final int MULTIPLY_COLOR = 0xFF668844;
+    private static final int SCREEN_COLOR = 0xFFFFEEFF;
+
+    private static Object[][] MODES_AND_EXPECTED_COLORS = new Object[][] {
+        { PorterDuff.Mode.SRC, new int[] {
+                BG_COLOR, BG_COLOR, SRC_COLOR, SRC_COLOR } },
+
+        { PorterDuff.Mode.DST, new int[] {
+                BG_COLOR, DST_COLOR, DST_COLOR, BG_COLOR } },
+
+        { PorterDuff.Mode.SRC_OVER, new int[] {
+                BG_COLOR, DST_COLOR, SRC_COLOR, SRC_COLOR } },
+
+        { PorterDuff.Mode.DST_OVER, new int[] {
+                BG_COLOR, DST_COLOR, DST_COLOR, SRC_COLOR } },
+
+        { PorterDuff.Mode.SRC_IN, new int[] {
+                BG_COLOR, BG_COLOR, SRC_COLOR, BG_COLOR } },
+
+        { PorterDuff.Mode.DST_IN, new int[] {
+                BG_COLOR, BG_COLOR, DST_COLOR, BG_COLOR } },
+
+        { PorterDuff.Mode.SRC_OUT, new int[] {
+                BG_COLOR, BG_COLOR, BG_COLOR, SRC_COLOR } },
+
+        { PorterDuff.Mode.DST_OUT, new int[] {
+                BG_COLOR, DST_COLOR, BG_COLOR, BG_COLOR } },
+
+        { PorterDuff.Mode.SRC_ATOP, new int[] {
+                BG_COLOR, DST_COLOR, SRC_COLOR, BG_COLOR } },
+
+        { PorterDuff.Mode.DST_ATOP, new int[] {
+                BG_COLOR, BG_COLOR, DST_COLOR, SRC_COLOR } },
+
+        { PorterDuff.Mode.XOR, new int[] {
+                BG_COLOR, DST_COLOR, BG_COLOR, SRC_COLOR } },
+
+        { PorterDuff.Mode.MULTIPLY, new int[] {
+                BG_COLOR, BG_COLOR, MULTIPLY_COLOR, BG_COLOR } },
+
+        { PorterDuff.Mode.SCREEN, new int[] {
+                BG_COLOR, DST_COLOR, SCREEN_COLOR, SRC_COLOR } },
+    };
+
+    @Parameterized.Parameters(name = "{0}")
+    public static List<Config> configs() {
+        return configs(MODES_AND_EXPECTED_COLORS);
+    }
+
+    private final Config mConfig;
+
+    public XfermodeTest(Config config) {
+        mConfig = config;
+    }
+
+    private CanvasClient mCanvasClient = new CanvasClient() {
+        final Paint mPaint = new Paint();
+        private final RectF mSrcRect = new RectF(30, 30, 80, 80);
+        private final RectF mDstRect = new RectF(10, 10, 60, 60);
+        private final Bitmap mSrcBitmap = createSrc();
+        private final Bitmap mDstBitmap = createDst();
+
+        @Override
+        public void draw(Canvas canvas, int width, int height) {
+            int sc = canvas.saveLayer(0, 0, TEST_WIDTH, TEST_HEIGHT, null);
+
+            canvas.drawBitmap(mDstBitmap, 0, 0, null);
+            mPaint.setXfermode(new PorterDuffXfermode(mConfig.mode));
+            canvas.drawBitmap(mSrcBitmap, 0, 0, mPaint);
+
+            canvas.restoreToCount(sc);
+        }
+
+        private Bitmap createSrc() {
+            Bitmap srcB = Bitmap.createBitmap(TEST_WIDTH, TEST_HEIGHT, Bitmap.Config.ARGB_8888);
+            Canvas srcCanvas = new Canvas(srcB);
+            Paint srcPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+            srcPaint.setColor(SRC_COLOR);
+            srcCanvas.drawRect(mSrcRect, srcPaint);
+            return srcB;
+        }
+
+        private Bitmap createDst() {
+            Bitmap dstB = Bitmap.createBitmap(TEST_WIDTH, TEST_HEIGHT, Bitmap.Config.ARGB_8888);
+            Canvas dstCanvas = new Canvas(dstB);
+            Paint dstPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+            dstPaint.setColor(DST_COLOR);
+            dstCanvas.drawOval(mDstRect, dstPaint);
+            return dstB;
+        }
+    };
+
+    @Test
+    @MediumTest
+    public void test() {
+        createTest()
+                .addCanvasClient(mCanvasClient, mConfig.hardwareAccelerated)
+                .runWithVerifier(new SamplePointVerifier(TEST_POINTS, mConfig.expectedColors));
+    }
+}
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ActivityTestBase.java b/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ActivityTestBase.java
index 69cb688..f82bb40 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ActivityTestBase.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/testinfrastructure/ActivityTestBase.java
@@ -16,11 +16,13 @@
 package android.uirendering.cts.testinfrastructure;
 
 import android.annotation.Nullable;
+import android.app.Activity;
+import android.app.Instrumentation;
 import android.graphics.Bitmap;
 import android.graphics.Point;
 import android.renderscript.Allocation;
 import android.renderscript.RenderScript;
-import android.test.ActivityInstrumentationTestCase2;
+import android.support.test.rule.ActivityTestRule;
 import android.uirendering.cts.bitmapcomparers.BitmapComparer;
 import android.uirendering.cts.bitmapverifiers.BitmapVerifier;
 import android.uirendering.cts.differencevisualizers.DifferenceVisualizer;
@@ -29,18 +31,23 @@
 import android.util.Log;
 
 import android.support.test.InstrumentationRegistry;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.rules.TestName;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
+import static org.junit.Assert.assertTrue;
+
 /**
  * This class contains the basis for the graphics hardware test classes. Contained within this class
  * are several methods that help with the execution of tests, and should be extended to gain the
  * functionality built in.
  */
-public abstract class ActivityTestBase extends
-        ActivityInstrumentationTestCase2<DrawActivity> {
+public abstract class ActivityTestBase {
     public static final String TAG = "ActivityTestBase";
     public static final boolean DEBUG = false;
     public static final boolean USE_RS = false;
@@ -57,12 +64,18 @@
     private RenderScript mRenderScript;
     private TestCaseBuilder mTestCaseBuilder;
 
+    @Rule
+    public ActivityTestRule<DrawActivity> mActivityRule = new ActivityTestRule<>(
+            DrawActivity.class);
+
+    @Rule
+    public TestName name = new TestName();
+
     /**
      * The default constructor creates the package name and sets the DrawActivity as the class that
      * we would use.
      */
     public ActivityTestBase() {
-        super(DrawActivity.class);
         mDifferenceVisualizer = new PassFailVisualizer();
 
         // Create a location for the files to be held, if it doesn't exist already
@@ -74,26 +87,27 @@
         }
     }
 
-    /**
-     * This method is called before each test case and should be called from the test class that
-     * extends this class.
-     */
-    @Override
+    protected DrawActivity getActivity() {
+        return mActivityRule.getActivity();
+    }
+
+    protected String getName() {
+        return name.getMethodName();
+    }
+
+    protected Instrumentation getInstrumentation() {
+        return InstrumentationRegistry.getInstrumentation();
+    }
+
+    @Before
     public void setUp() {
-        // As the way to access Instrumentation is changed in the new runner, we need to inject it
-        // manually into ActivityInstrumentationTestCase2. ActivityInstrumentationTestCase2 will
-        // be marked as deprecated and replaced with ActivityTestRule.
-        injectInstrumentation(InstrumentationRegistry.getInstrumentation());
         mDifferenceVisualizer = new PassFailVisualizer();
         if (USE_RS) {
             mRenderScript = RenderScript.create(getActivity().getApplicationContext());
         }
     }
 
-    /**
-     * This method will kill the activity so that it can be reset depending on the test.
-     */
-    @Override
+    @After
     public void tearDown() {
         if (mTestCaseBuilder != null) {
             List<TestCase> testCases = mTestCaseBuilder.getTestCases();
@@ -102,7 +116,6 @@
                 throw new IllegalStateException("Must have at least one test case");
             }
 
-
             for (TestCase testCase : testCases) {
                 if (!testCase.wasTestRan) {
                     Log.w(TAG, getName() + " not all of the tests ran");
@@ -111,16 +124,6 @@
             }
             mTestCaseBuilder = null;
         }
-
-        Runnable finishRunnable = new Runnable() {
-
-            @Override
-            public void run() {
-                getActivity().finish();
-            }
-        };
-
-        getActivity().runOnUiThread(finishRunnable);
     }
 
     public Bitmap takeScreenshot(Point testOffset) {
diff --git a/tests/tests/uirendering/src/android/uirendering/cts/util/CompareUtils.java b/tests/tests/uirendering/src/android/uirendering/cts/util/CompareUtils.java
index 4f246a4..c80a778 100644
--- a/tests/tests/uirendering/src/android/uirendering/cts/util/CompareUtils.java
+++ b/tests/tests/uirendering/src/android/uirendering/cts/util/CompareUtils.java
@@ -12,4 +12,17 @@
                 + Math.abs(Color.blue(color) - Color.blue(expectedColor));
         return diff <= threshold;
     }
+
+    /**
+     * @param threshold Per channel differences for R / G / B channel against the average of these 3
+     *                  channels. Should be less than 2 normally.
+     * @return True if the color is close enough to be a gray scale color.
+     */
+    public static boolean verifyPixelGrayScale(int color, int threshold) {
+        int average =  Color.red(color) + Color.green(color) + Color.blue(color);
+        average /= 3;
+        return Math.abs(Color.red(color) - average) <= threshold
+                && Math.abs(Color.green(color) - average) <= threshold
+                && Math.abs(Color.blue(color) - average) <= threshold;
+    }
 }
diff --git a/tests/tests/widget/res/layout/popupwindow.xml b/tests/tests/widget/res/layout/popupwindow.xml
index 7746da8..0c7b5e8 100644
--- a/tests/tests/widget/res/layout/popupwindow.xml
+++ b/tests/tests/widget/res/layout/popupwindow.xml
@@ -20,6 +20,14 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
+    <android.widget.cts.MockViewForListPopupWindow
+        android:id="@+id/anchor_upper_left"
+        android:layout_width="10dp"
+        android:layout_height="10dp"
+        android:layout_alignParentTop="true"
+        android:layout_alignParentLeft="true"
+        android:background="#f0f" />
+
     <View android:id="@+id/anchor_upper"
         android:layout_width="10dp"
         android:layout_height="10dp"
diff --git a/tests/tests/widget/res/menu/popup_menu.xml b/tests/tests/widget/res/menu/popup_menu.xml
new file mode 100644
index 0000000..f50efc5
--- /dev/null
+++ b/tests/tests/widget/res/menu/popup_menu.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 Google Inc.
+
+     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.
+-->
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:id="@+id/action_highlight"
+          android:title="@string/popup_menu_highlight" />
+    <item android:id="@+id/action_edit"
+          android:title="@string/popup_menu_edit" />
+    <item android:id="@+id/action_delete"
+          android:title="@string/popup_menu_delete" />
+    <item android:id="@+id/action_ignore"
+          android:title="@string/popup_menu_ignore" />
+    <item android:id="@+id/action_share"
+          android:title="@string/popup_menu_share">
+        <menu>
+            <item android:id="@+id/action_share_email"
+                  android:title="@string/popup_menu_share_email" />
+            <item android:id="@+id/action_share_circles"
+                  android:title="@string/popup_menu_share_circles" />
+        </menu>
+    </item>
+    <item android:id="@+id/action_print"
+          android:title="@string/popup_menu_print" />
+</menu>
diff --git a/tests/tests/widget/res/values/strings.xml b/tests/tests/widget/res/values/strings.xml
index 51d8708..d889772 100644
--- a/tests/tests/widget/res/values/strings.xml
+++ b/tests/tests/widget/res/values/strings.xml
@@ -177,4 +177,14 @@
 text, I would love to see the kind of devices you guys now use! Guys, maybe some devices need longer string!
 I think so, so how about double this string, like copy and paste! </string>
     <string name="rectangle200">"M 0,0 l 200,0 l 0, 200 l -200, 0 z"</string>
+
+    <string name="popup_show">Show popup</string>
+    <string name="popup_menu_highlight">Highlight</string>
+    <string name="popup_menu_edit">Edit</string>
+    <string name="popup_menu_delete">Delete</string>
+    <string name="popup_menu_ignore">Ignore</string>
+    <string name="popup_menu_share">Share</string>
+    <string name="popup_menu_share_email">Via email</string>
+    <string name="popup_menu_share_circles">To my circles</string>
+    <string name="popup_menu_print">Print</string>
 </resources>
diff --git a/tests/tests/widget/res/values/styles.xml b/tests/tests/widget/res/values/styles.xml
index 81925cc..14d575b 100644
--- a/tests/tests/widget/res/values/styles.xml
+++ b/tests/tests/widget/res/values/styles.xml
@@ -169,4 +169,5 @@
         <item name="android:windowSwipeToDismiss">false</item>
     </style>
 
+    <style name="PopupEmptyStyle" />
 </resources>
diff --git a/tests/tests/widget/src/android/widget/cts/FrameLayoutTest.java b/tests/tests/widget/src/android/widget/cts/FrameLayoutTest.java
index 1fc0cef..bdda79a 100644
--- a/tests/tests/widget/src/android/widget/cts/FrameLayoutTest.java
+++ b/tests/tests/widget/src/android/widget/cts/FrameLayoutTest.java
@@ -16,22 +16,19 @@
 
 package android.widget.cts;
 
-import android.content.res.ColorStateList;
-import android.cts.util.WidgetTestUtils;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.ColorFilter;
-import android.graphics.PorterDuff;
-
-import android.widget.cts.R;
-
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
 import android.app.Activity;
 import android.app.Instrumentation;
 import android.content.Context;
+import android.content.res.ColorStateList;
 import android.cts.util.PollingCheck;
+import android.cts.util.WidgetTestUtils;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ColorFilter;
+import android.graphics.PorterDuff;
 import android.graphics.Rect;
 import android.graphics.Region;
 import android.graphics.drawable.BitmapDrawable;
@@ -47,6 +44,8 @@
 import android.widget.FrameLayout.LayoutParams;
 import android.widget.LinearLayout;
 import android.widget.TextView;
+import android.widget.cts.R;
+import android.widget.cts.util.ViewTestUtils;
 
 import java.io.IOException;
 
@@ -88,12 +87,8 @@
         assertTrue(mFrameLayout.getWidth() > foreground.getIntrinsicWidth());
         assertNull(mFrameLayout.getForeground());
 
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                mFrameLayout.setForeground(foreground);
-            }
-        });
-        mInstrumentation.waitForIdleSync();
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mFrameLayout,
+                () -> mFrameLayout.setForeground(foreground));
         assertSame(foreground, mFrameLayout.getForeground());
         // check the default gravity FILL, it completely fills its container
         assertTrue(foreground.isVisible());
@@ -108,18 +103,16 @@
         assertEquals(mFrameLayout.getWidth(), rect.right - rect.left);
 
         // should get a new foreground again, because former foreground has been stretched
-        final BitmapDrawable newForeground
-                = (BitmapDrawable) mActivity.getResources().getDrawable(R.drawable.size_48x48);
+        final BitmapDrawable newForeground =
+                (BitmapDrawable) mActivity.getResources().getDrawable(R.drawable.size_48x48);
         compareScaledPixels(48, newForeground.getIntrinsicHeight());
         compareScaledPixels(48, newForeground.getIntrinsicWidth());
         assertTrue(mFrameLayout.getHeight() > newForeground.getIntrinsicHeight());
         assertTrue(mFrameLayout.getWidth() > foreground.getIntrinsicWidth());
 
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                mFrameLayout.setForeground(newForeground);
-                mFrameLayout.setForegroundGravity(Gravity.CENTER);
-            }
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mFrameLayout, () -> {
+            mFrameLayout.setForeground(newForeground);
+            mFrameLayout.setForegroundGravity(Gravity.CENTER);
         });
         mInstrumentation.waitForIdleSync();
         assertSame(newForeground, mFrameLayout.getForeground());
@@ -132,24 +125,19 @@
     }
 
     public void testGatherTransparentRegion() {
-        final LinearLayout container
-                = (LinearLayout) mActivity.findViewById(R.id.framelayout_container);
+        final LinearLayout container =
+                (LinearLayout) mActivity.findViewById(R.id.framelayout_container);
         final Drawable foreground = mActivity.getResources().getDrawable(R.drawable.size_48x48);
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                mFrameLayout.setForeground(foreground);
-                mFrameLayout.setForegroundGravity(Gravity.CENTER);
-            }
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mFrameLayout, () -> {
+            mFrameLayout.setForeground(foreground);
+            mFrameLayout.setForegroundGravity(Gravity.CENTER);
         });
         mInstrumentation.waitForIdleSync();
         Region region = new Region(foreground.getBounds());
         assertTrue(mFrameLayout.gatherTransparentRegion(region));
 
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                container.requestTransparentRegion(mFrameLayout);
-            }
-        });
+        ViewTestUtils.runOnMainAndDrawSync(mInstrumentation, mFrameLayout,
+                () -> container.requestTransparentRegion(mFrameLayout));
         mInstrumentation.waitForIdleSync();
         region = new Region(foreground.getBounds());
         assertTrue(mFrameLayout.gatherTransparentRegion(region));
@@ -168,11 +156,9 @@
         assertEquals(textView.getMeasuredWidth(), frameLayout.getMeasuredWidth());
 
         // measureAll is false and text view is GONE, text view will NOT be measured
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                textView.setVisibility(View.GONE);
-                frameLayout.requestLayout();
-            }
+        mActivity.runOnUiThread(() -> {
+            textView.setVisibility(View.GONE);
+            frameLayout.requestLayout();
         });
         mInstrumentation.waitForIdleSync();
         assertFalse(frameLayout.getConsiderGoneChildrenWhenMeasuring());
@@ -183,11 +169,9 @@
         assertEquals(button.getMeasuredWidth(), frameLayout.getMeasuredWidth());
 
         // measureAll is true and text view is GONE, text view will be measured
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                frameLayout.setMeasureAllChildren(true);
-                frameLayout.requestLayout();
-            }
+        mActivity.runOnUiThread(() -> {
+            frameLayout.setMeasureAllChildren(true);
+            frameLayout.requestLayout();
         });
         mInstrumentation.waitForIdleSync();
         assertTrue(frameLayout.getConsiderGoneChildrenWhenMeasuring());
diff --git a/tests/tests/widget/src/android/widget/cts/ListPopupWindowTest.java b/tests/tests/widget/src/android/widget/cts/ListPopupWindowTest.java
index da5b9fe..1bdde5a 100644
--- a/tests/tests/widget/src/android/widget/cts/ListPopupWindowTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ListPopupWindowTest.java
@@ -28,6 +28,7 @@
 import android.test.suitebuilder.annotation.SmallTest;
 import android.view.Display;
 import android.view.Gravity;
+import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
 import android.view.View;
@@ -569,6 +570,44 @@
         verifyNoMoreInteractions(mPopupWindowBuilder.mOnItemSelectedListener);
     }
 
+    public void testNoDefaultDismissalWithBackButton() throws Throwable {
+        mPopupWindowBuilder = new Builder().withDismissListener();
+        mPopupWindowBuilder.show();
+
+        // Send BACK key event. As we don't have any custom code that dismisses ListPopupWindow,
+        // and ListPopupWindow doesn't track that system-level key event on its own, ListPopupWindow
+        // should stay visible
+        mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
+        verify(mPopupWindowBuilder.mOnDismissListener, never()).onDismiss();
+        assertTrue(mPopupWindow.isShowing());
+    }
+
+    public void testCustomDismissalWithBackButton() throws Throwable {
+        mPopupWindowBuilder = new Builder().withAnchor(R.id.anchor_upper_left)
+                .withDismissListener();
+        mPopupWindowBuilder.show();
+
+        // "Point" our custom extension of EditText to our ListPopupWindow
+        final MockViewForListPopupWindow anchor =
+                (MockViewForListPopupWindow) mPopupWindow.getAnchorView();
+        anchor.wireTo(mPopupWindow);
+        // Request focus on our EditText
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                anchor.requestFocus();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        // Send BACK key event. As our custom extension of EditText calls
+        // ListPopupWindow.onKeyPreIme, the end result should be the dismissal of the
+        // ListPopupWindow
+        mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
+        verify(mPopupWindowBuilder.mOnDismissListener, times(1)).onDismiss();
+        assertFalse(mPopupWindow.isShowing());
+    }
+
     /**
      * Inner helper class to configure an instance of <code>ListPopupWindow</code> for the
      * specific test. The main reason for its existence is that once a popup window is shown
@@ -585,6 +624,7 @@
         private int mHorizontalOffset;
         private int mVerticalOffset;
         private int mDropDownGravity;
+        private int mAnchorId = R.id.anchor_upper;
 
         private boolean mHasWindowLayoutType;
         private int mWindowLayoutType;
@@ -600,6 +640,11 @@
             mPopupWindow = new ListPopupWindow(mActivity);
         }
 
+        public Builder withAnchor(int anchorId) {
+            mAnchorId = anchorId;
+            return this;
+        }
+
         public Builder ignoreContentWidth() {
             mIgnoreContentWidth = true;
             return this;
@@ -727,7 +772,7 @@
             };
 
             mPopupWindow.setAdapter(listPopupAdapter);
-            mPopupWindow.setAnchorView(mActivity.findViewById(R.id.anchor_upper));
+            mPopupWindow.setAnchorView(mActivity.findViewById(mAnchorId));
 
             // The following mock listeners have to be set before the call to show() as
             // they are set on the internally constructed drop down.
diff --git a/tests/tests/widget/src/android/widget/cts/MockViewForListPopupWindow.java b/tests/tests/widget/src/android/widget/cts/MockViewForListPopupWindow.java
new file mode 100644
index 0000000..8e280fe
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/MockViewForListPopupWindow.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.KeyEvent;
+import android.widget.EditText;
+import android.widget.ListPopupWindow;
+
+public class MockViewForListPopupWindow extends EditText {
+    private ListPopupWindow mListPopupWindow;
+
+    public MockViewForListPopupWindow(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public MockViewForListPopupWindow(Context context) {
+        super(context);
+    }
+
+    public void wireTo(ListPopupWindow listPopupWindow) {
+        mListPopupWindow = listPopupWindow;
+    }
+
+    @Override
+    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
+        if (mListPopupWindow != null) {
+            return mListPopupWindow.onKeyPreIme(keyCode, event);
+        }
+        return super.onKeyPreIme(keyCode, event);
+    }
+}
+
diff --git a/tests/tests/widget/src/android/widget/cts/PopupMenuTest.java b/tests/tests/widget/src/android/widget/cts/PopupMenuTest.java
index 206b794..8df2930 100644
--- a/tests/tests/widget/src/android/widget/cts/PopupMenuTest.java
+++ b/tests/tests/widget/src/android/widget/cts/PopupMenuTest.java
@@ -16,21 +16,32 @@
 
 package android.widget.cts;
 
-import static org.mockito.Mockito.*;
-
 import android.app.Activity;
 import android.app.Instrumentation;
+import android.os.SystemClock;
+import android.support.test.InstrumentationRegistry;
 import android.test.ActivityInstrumentationTestCase2;
+import android.test.suitebuilder.annotation.SmallTest;
 import android.view.Gravity;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.MotionEvent;
+import android.view.SubMenu;
+import android.view.View;
 import android.widget.PopupMenu;
 
-import android.widget.cts.R;
+import static org.mockito.Mockito.*;
 
+@SmallTest
 public class PopupMenuTest extends
         ActivityInstrumentationTestCase2<MockPopupWindowCtsActivity> {
     private Instrumentation mInstrumentation;
     private Activity mActivity;
 
+    private Builder mBuilder;
+    private PopupMenu mPopupMenu;
+
     public PopupMenuTest() {
         super("android.widget.cts", MockPopupWindowCtsActivity.class);
     }
@@ -42,43 +53,255 @@
         mActivity = getActivity();
     }
 
-    public void testAccessGravity() {
-        PopupMenu popupMenu = new PopupMenu(mActivity,
-                mActivity.findViewById(R.id.anchor_middle_left));
-        assertEquals(Gravity.NO_GRAVITY, popupMenu.getGravity());
-
-        popupMenu.setGravity(Gravity.TOP);
-        assertEquals(Gravity.TOP, popupMenu.getGravity());
+    @Override
+    protected void tearDown() throws Exception {
+        if (mPopupMenu != null) {
+            try {
+                runTestOnUiThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        mPopupMenu.dismiss();
+                    }
+                });
+            } catch (Throwable t) {
+                throw new RuntimeException(t);
+            }
+        }
+        super.tearDown();
     }
 
-    public void testOnDismissListener() {
-        final PopupMenu popupMenu = new PopupMenu(mActivity,
-                mActivity.findViewById(R.id.anchor_middle_left));
-        PopupMenu.OnDismissListener listener = mock(PopupMenu.OnDismissListener.class);
-        popupMenu.setOnDismissListener(listener);
+    private void verifyMenuContent() {
+        final Menu menu = mPopupMenu.getMenu();
+        assertEquals(6, menu.size());
+        assertEquals(R.id.action_highlight, menu.getItem(0).getItemId());
+        assertEquals(R.id.action_edit, menu.getItem(1).getItemId());
+        assertEquals(R.id.action_delete, menu.getItem(2).getItemId());
+        assertEquals(R.id.action_ignore, menu.getItem(3).getItemId());
+        assertEquals(R.id.action_share, menu.getItem(4).getItemId());
+        assertEquals(R.id.action_print, menu.getItem(5).getItemId());
 
-        mInstrumentation.runOnMainSync(new Runnable() {
-            public void run() {
-                popupMenu.show();
-            }
-        });
-        mInstrumentation.waitForIdleSync();
-        verify(listener, never()).onDismiss(popupMenu);
-
-        mInstrumentation.runOnMainSync(new Runnable() {
-            public void run() {
-                popupMenu.dismiss();
-            }
-        });
-        mInstrumentation.waitForIdleSync();
-        verify(listener, times(1)).onDismiss(popupMenu);
-
-        mInstrumentation.runOnMainSync(new Runnable() {
-            public void run() {
-                popupMenu.dismiss();
-            }
-        });
-        mInstrumentation.waitForIdleSync();
-        verify(listener, times(1)).onDismiss(popupMenu);
+        final SubMenu shareSubMenu = menu.getItem(4).getSubMenu();
+        assertNotNull(shareSubMenu);
+        assertEquals(2, shareSubMenu.size());
+        assertEquals(R.id.action_share_email, shareSubMenu.getItem(0).getItemId());
+        assertEquals(R.id.action_share_circles, shareSubMenu.getItem(1).getItemId());
     }
-}
+
+    public void testPopulateViaInflater() throws Throwable {
+        mBuilder = new Builder().inflateWithInflater(true);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mBuilder.show();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        verifyMenuContent();
+    }
+
+    public void testDirectPopulate() throws Throwable {
+        mBuilder = new Builder().inflateWithInflater(false);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mBuilder.show();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        verifyMenuContent();
+    }
+
+    public void testAccessGravity() throws Throwable {
+        mBuilder = new Builder();
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mBuilder.show();
+            }
+        });
+
+        assertEquals(Gravity.NO_GRAVITY, mPopupMenu.getGravity());
+        mPopupMenu.setGravity(Gravity.TOP);
+        assertEquals(Gravity.TOP, mPopupMenu.getGravity());
+    }
+
+    public void testDismissalViaAPI() throws Throwable {
+        mBuilder = new Builder().withDismissListener();
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mBuilder.show();
+            }
+        });
+
+        mInstrumentation.waitForIdleSync();
+        verify(mBuilder.mOnDismissListener, never()).onDismiss(mPopupMenu);
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mPopupMenu.dismiss();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+        verify(mBuilder.mOnDismissListener, times(1)).onDismiss(mPopupMenu);
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mPopupMenu.dismiss();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+        // Shouldn't have any more interactions with our dismiss listener since the menu was
+        // already dismissed when we called dismiss()
+        verifyNoMoreInteractions(mBuilder.mOnDismissListener);
+    }
+
+    public void testDismissalViaTouch() throws Throwable {
+        // Use empty popup style to remove all transitions from the popup. That way we don't
+        // need to synchronize with the popup window enter transition before proceeding to
+        // emulate a click outside the popup window bounds.
+        mBuilder = new Builder().withDismissListener()
+                .withPopupStyleAttr(R.style.PopupEmptyStyle);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mBuilder.show();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        // Determine the location of the anchor on the screen so that we can emulate
+        // a tap outside of the popup bounds to dismiss the popup
+        final int[] anchorOnScreenXY = new int[2];
+        mBuilder.mAnchor.getLocationOnScreen(anchorOnScreenXY);
+
+        int emulatedTapX = anchorOnScreenXY[0] + 10;
+        int emulatedTapY = anchorOnScreenXY[1] - 20;
+
+        // The logic below uses Instrumentation to emulate a tap outside the bounds of the
+        // displayed popup menu. This tap is then treated by the framework to be "split" as
+        // the ACTION_OUTSIDE for the popup itself, as well as DOWN / MOVE / UP for the underlying
+        // view root if the popup is not modal.
+        // It is not correct to emulate these two sequences separately in the test, as it
+        // wouldn't emulate the user-facing interaction for this test. Note that usage
+        // of Instrumentation is necessary here since Espresso's actions operate at the level
+        // of view or data. Also, we don't want to use View.dispatchTouchEvent directly as
+        // that would require emulation of two separate sequences as well.
+
+        // Inject DOWN event
+        long downTime = SystemClock.uptimeMillis();
+        MotionEvent eventDown = MotionEvent.obtain(
+                downTime, downTime, MotionEvent.ACTION_DOWN, emulatedTapX, emulatedTapY, 1);
+        mInstrumentation.sendPointerSync(eventDown);
+
+        // Inject MOVE event
+        long moveTime = SystemClock.uptimeMillis();
+        MotionEvent eventMove = MotionEvent.obtain(
+                moveTime, moveTime, MotionEvent.ACTION_MOVE, emulatedTapX, emulatedTapY, 1);
+        mInstrumentation.sendPointerSync(eventMove);
+
+        // Inject UP event
+        long upTime = SystemClock.uptimeMillis();
+        MotionEvent eventUp = MotionEvent.obtain(
+                upTime, upTime, MotionEvent.ACTION_UP, emulatedTapX, emulatedTapY, 1);
+        mInstrumentation.sendPointerSync(eventUp);
+
+        // Wait for the system to process all events in the queue
+        mInstrumentation.waitForIdleSync();
+
+        // At this point our popup should have notified its dismiss listener
+        verify(mBuilder.mOnDismissListener, times(1)).onDismiss(mPopupMenu);
+    }
+
+    public void testSimpleMenuItemClickViaAPI() throws Throwable {
+        mBuilder = new Builder().withMenuItemClickListener().withDismissListener();
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mBuilder.show();
+            }
+        });
+
+        // Verify that our menu item click listener hasn't been called yet
+        verify(mBuilder.mOnMenuItemClickListener, never()).onMenuItemClick(any(MenuItem.class));
+
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                mPopupMenu.getMenu().performIdentifierAction(R.id.action_highlight, 0);
+            }
+        });
+
+        // Verify that our menu item click listener has been called with the expected menu item
+        verify(mBuilder.mOnMenuItemClickListener, times(1)).onMenuItemClick(
+                mPopupMenu.getMenu().findItem(R.id.action_highlight));
+
+        // Popup menu should be automatically dismissed on selecting an item
+        verify(mBuilder.mOnDismissListener, times(1)).onDismiss(mPopupMenu);
+    }
+
+    /**
+     * Inner helper class to configure an instance of {@link PopupMenu} for the specific test.
+     * The main reason for its existence is that once a popup menu is shown with the show() method,
+     * most of its configuration APIs are no-ops. This means that we can't add logic that is
+     * specific to a certain test once it's shown and we have a reference to a displayed
+     * {@link PopupMenu}.
+     */
+    public class Builder {
+        private boolean mHasDismissListener;
+        private boolean mHasMenuItemClickListener;
+        private boolean mInflateWithInflater;
+        private int mPopupStyleAttr = android.R.attr.popupMenuStyle;
+
+        private PopupMenu.OnMenuItemClickListener mOnMenuItemClickListener;
+        private PopupMenu.OnDismissListener mOnDismissListener;
+
+        private View mAnchor;
+
+        public Builder withMenuItemClickListener() {
+            mHasMenuItemClickListener = true;
+            return this;
+        }
+
+        public Builder withDismissListener() {
+            mHasDismissListener = true;
+            return this;
+        }
+
+        public Builder inflateWithInflater(boolean inflateWithInflater) {
+            mInflateWithInflater = inflateWithInflater;
+            return this;
+        }
+
+        public Builder withPopupStyleAttr(int popupStyleAttr) {
+            mPopupStyleAttr = popupStyleAttr;
+            return this;
+        }
+
+        private void configure() {
+            mAnchor = mActivity.findViewById(R.id.anchor_middle_left);
+            mPopupMenu = new PopupMenu(mActivity, mAnchor, Gravity.NO_GRAVITY, mPopupStyleAttr, 0);
+            if (mInflateWithInflater) {
+                final MenuInflater menuInflater = mPopupMenu.getMenuInflater();
+                menuInflater.inflate(R.menu.popup_menu, mPopupMenu.getMenu());
+            } else {
+                mPopupMenu.inflate(R.menu.popup_menu);
+            }
+
+            if (mHasMenuItemClickListener) {
+                // Register a mock listener to be notified when a menu item in our popup menu has
+                // been clicked.
+                mOnMenuItemClickListener = mock(PopupMenu.OnMenuItemClickListener.class);
+                mPopupMenu.setOnMenuItemClickListener(mOnMenuItemClickListener);
+            }
+
+            if (mHasDismissListener) {
+                // Register a mock listener to be notified when our popup menu is dismissed.
+                mOnDismissListener = mock(PopupMenu.OnDismissListener.class);
+                mPopupMenu.setOnDismissListener(mOnDismissListener);
+            }
+        }
+
+        public void show() {
+            configure();
+            // Show the popup menu
+            mPopupMenu.show();
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/widget/src/android/widget/cts/util/ViewTestUtils.java b/tests/tests/widget/src/android/widget/cts/util/ViewTestUtils.java
index ca6c528..02ac28c 100644
--- a/tests/tests/widget/src/android/widget/cts/util/ViewTestUtils.java
+++ b/tests/tests/widget/src/android/widget/cts/util/ViewTestUtils.java
@@ -23,7 +23,7 @@
 import android.view.ViewTreeObserver;
 import android.view.ViewTreeObserver.OnDrawListener;
 
-import java.util.concurrent.Semaphore;
+import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -41,34 +41,25 @@
      */
     public static void runOnMainAndDrawSync(Instrumentation instrumentation,
             final View view, final Runnable runner) {
-        final Semaphore token = new Semaphore(0);
-        final Runnable releaseToken = new Runnable() {
-            @Override
-            public void run() {
-                token.release();
-            }
-        };
+        final CountDownLatch latch = new CountDownLatch(1);
 
-        instrumentation.runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                final ViewTreeObserver observer = view.getViewTreeObserver();
-                final OnDrawListener listener = new OnDrawListener() {
-                    @Override
-                    public void onDraw() {
-                        observer.removeOnDrawListener(this);
-                        view.post(releaseToken);
-                    }
-                };
+        instrumentation.runOnMainSync(() -> {
+            final ViewTreeObserver observer = view.getViewTreeObserver();
+            final OnDrawListener listener = new OnDrawListener() {
+                @Override
+                public void onDraw() {
+                    observer.removeOnDrawListener(this);
+                    view.post(() -> latch.countDown());
+                }
+            };
 
-                observer.addOnDrawListener(listener);
-                runner.run();
-            }
+            observer.addOnDrawListener(listener);
+            runner.run();
         });
 
         try {
             Assert.assertTrue("Expected draw pass occurred within 5 seconds",
-                    token.tryAcquire(5, TimeUnit.SECONDS));
+                    latch.await(5, TimeUnit.SECONDS));
         } catch (InterruptedException e) {
             throw new RuntimeException(e);
         }
diff --git a/tools/cts-tradefed/res/config/cts.xml b/tools/cts-tradefed/res/config/cts.xml
index 8104570..c54f355 100644
--- a/tools/cts-tradefed/res/config/cts.xml
+++ b/tools/cts-tradefed/res/config/cts.xml
@@ -27,7 +27,7 @@
     <option name="compatibility:exclude-filter" value="CtsSampleHostTestCases" />
 
     <!-- Exclude automotive only test cases for now -->
-    <option name="compatibility:exclude-filter" value="CtsAutomotiveTestCases" />
+    <option name="compatibility:exclude-filter" value="CtsCarTestCases" />
 
     <target_preparer class="com.android.compatibility.common.tradefed.targetprep.PropertyCheck">
         <option name="property-name" value="ro.build.type" />
