Merge "Restrict the SensorAdditionalInfoTest only to hardware/non-synthetic sensors" into rvc-qpr-dev am: 8e21d5d814

Original change: https://googleplex-android-review.googlesource.com/c/platform/cts/+/12998097

Change-Id: I6b4367a602cb4db729638f86ec309855d232eeb1
diff --git a/Android.mk b/Android.mk
deleted file mode 100644
index 311b4eb..0000000
--- a/Android.mk
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# 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.
-#
-include cts/CtsCoverage.mk
-include $(call all-subdir-makefiles)
diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg
index 7b9c427..2572b01 100644
--- a/PREUPLOAD.cfg
+++ b/PREUPLOAD.cfg
@@ -36,6 +36,9 @@
                       tests/tests/view/
                       tests/tests/widget/
                       common/device-side/util/
+                      hostsidetests/car/
+                      hostsidetests/multiuser/
+                      hostsidetests/scopedstorage/
                       hostsidetests/stagedinstall/
                       hostsidetests/userspacereboot/
                       tests/tests/packageinstaller/atomicinstall/
diff --git a/apps/Android.mk b/apps/Android.mk
deleted file mode 100644
index 4343259..0000000
--- a/apps/Android.mk
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# Copyright (C) 2010 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-include $(call all-subdir-makefiles)
diff --git a/apps/CameraITS/Android.mk b/apps/CameraITS/Android.mk
index 8f7ed7c..b0cabc7 100644
--- a/apps/CameraITS/Android.mk
+++ b/apps/CameraITS/Android.mk
@@ -13,6 +13,8 @@
 # limitations under the License.
 #
 
+LOCAL_PATH := $(call my-dir)
+
 its-dir-name := CameraITS
 its-dir := $(HOST_OUT)/$(its-dir-name)
 its-build-stamp := $(its-dir)/build_stamp
@@ -21,11 +23,11 @@
 
 .PHONY: camera-its
 
-$(its-dir): $(its-build-stamp)
-
-$(its-build-stamp): $(ACP)
-	echo $(its_dir)
-	mkdir -p $(its-dir)
-	$(ACP) -rfp cts/apps/$(its-dir-name)/* $(its-dir)
-	rm $(its-dir)/Android.mk
+$(its-build-stamp): PRIVATE_PATH := $(LOCAL_PATH)
+$(its-build-stamp): PRIVATE_OUT := $(its-dir)
+$(its-build-stamp): $(ACP) $(call find-files-in-subdirs,.,*,$(LOCAL_PATH))
+	rm -rf $(PRIVATE_OUT)
+	mkdir -p $(PRIVATE_OUT)
+	$(ACP) -rfp $(PRIVATE_PATH)/* $(PRIVATE_OUT)/
+	rm $(PRIVATE_OUT)/Android.mk
 	touch $@
diff --git a/apps/CameraITS/pymodules/its/cv2image.py b/apps/CameraITS/pymodules/its/cv2image.py
index 807c869..c71ef24 100644
--- a/apps/CameraITS/pymodules/its/cv2image.py
+++ b/apps/CameraITS/pymodules/its/cv2image.py
@@ -31,9 +31,9 @@
 CHART_SCALE_STOP = 1.35
 CHART_SCALE_STEP = 0.025
 
-FOV_THRESH_SUPER_TELE = 45
+FOV_THRESH_SUPER_TELE = 40
 FOV_THRESH_TELE = 60
-FOV_THRESH_WFOV = 90
+FOV_THRESH_WFOV = 91
 
 SCALE_RFOV_IN_WFOV_BOX = 0.67
 SCALE_TELE_IN_RFOV_BOX = 0.67
diff --git a/apps/CameraITS/pymodules/its/image.py b/apps/CameraITS/pymodules/its/image.py
index 289bf08..1c13c8f 100644
--- a/apps/CameraITS/pymodules/its/image.py
+++ b/apps/CameraITS/pymodules/its/image.py
@@ -14,7 +14,6 @@
 
 import matplotlib
 matplotlib.use('Agg')
-
 import its.error
 import sys
 from PIL import Image
@@ -44,6 +43,12 @@
 
 NUM_TRYS = 2
 NUM_FRAMES = 4
+G_CHANNEL = 1
+LIGHT_ON_THRESHOLD = 0.1
+IMG_L = 0
+IMG_R = 1
+IMG_T = 0
+IMG_B = 1
 
 
 def convert_capture_to_rgb_image(cap,
@@ -669,6 +674,41 @@
     else:
         return img[ytile:ytile+htile,xtile:xtile+wtile,:].copy()
 
+def validate_lighting(img):
+    """Evaluate four corner patches of image to check if light is ON or OFF.
+    Args:
+        img: numpy float array of RGB image, with pixel values in [0, 1].
+
+    Returns:
+        True if the G channel of the RGB mean is <LIGHT_ON_THRESHOLD;
+        otherwise assertion fails.
+    """
+
+    patch_w = 0.05
+    patch_h = 0.05
+    img_b = IMG_B - patch_h
+    img_r = IMG_R - patch_w
+
+    patch_tl = its.image.get_image_patch(img, IMG_L, IMG_T, patch_w, patch_h)
+    patch_tr = its.image.get_image_patch(img, img_r, IMG_T, patch_w, patch_h)
+    patch_bl = its.image.get_image_patch(img, IMG_L, img_b, patch_w, patch_h)
+    patch_br = its.image.get_image_patch(img, img_r, img_b, patch_w, patch_h)
+    g_mean_tl = its.image.compute_image_means(patch_tl)[G_CHANNEL]
+    g_mean_tr = its.image.compute_image_means(patch_tr)[G_CHANNEL]
+    g_mean_bl = its.image.compute_image_means(patch_bl)[G_CHANNEL]
+    g_mean_br = its.image.compute_image_means(patch_br)[G_CHANNEL]
+    print "Corner patch green values. TL: %3.3f, TR: %.3f, BL: %.3f, BR: %.3f" % (
+            g_mean_tl, g_mean_tr, g_mean_bl, g_mean_br)
+    if (g_mean_tl > LIGHT_ON_THRESHOLD or
+        g_mean_tr > LIGHT_ON_THRESHOLD or
+        g_mean_bl > LIGHT_ON_THRESHOLD or
+        g_mean_br > LIGHT_ON_THRESHOLD):
+        print "Lights are ON in test rig."
+        return True
+    else:
+        assert 0, "Lights are OFF in test rig. Please turn lights on and retry."
+        return False
+
 
 def compute_image_means(img):
     """Calculate the mean of each color channel in the image.
diff --git a/apps/CameraITS/tests/scene0/test_metadata.py b/apps/CameraITS/tests/scene0/test_metadata.py
index 88c7eef..a3c91ac 100644
--- a/apps/CameraITS/tests/scene0/test_metadata.py
+++ b/apps/CameraITS/tests/scene0/test_metadata.py
@@ -88,8 +88,8 @@
         fmts = props["android.scaler.streamConfigurationMap"]["availableStreamConfigurations"]
         fmts = sorted(fmts, key=lambda k: k["width"]*k["height"], reverse=True)
         sensor_size = props["android.sensor.info.physicalSize"]
-        pixel_pitch_h = (sensor_size["height"] / fmts[0]["height"] * 1E3)
-        pixel_pitch_w = (sensor_size["width"] / fmts[0]["width"] * 1E3)
+        pixel_pitch_h = (float(sensor_size["height"]) / fmts[0]["height"] * 1E3)
+        pixel_pitch_w = (float(sensor_size["width"]) / fmts[0]["width"] * 1E3)
         print "Assert pixel_pitch WxH: %.2f um, %.2f um" % (pixel_pitch_w,
                                                             pixel_pitch_h)
         assert 0.7 <= pixel_pitch_w <= 10
diff --git a/apps/CameraITS/tests/scene1_1/test_dng_noise_model.py b/apps/CameraITS/tests/scene1_1/test_dng_noise_model.py
index e257937..c022e70 100644
--- a/apps/CameraITS/tests/scene1_1/test_dng_noise_model.py
+++ b/apps/CameraITS/tests/scene1_1/test_dng_noise_model.py
@@ -113,12 +113,17 @@
                             mean_img_ch, var_model, mean_minus_3sigma)
                     assert 0, e_msg
                 else:
-                    print 'mean:', mean_img_ch,
-                    var_measured[i].append(
-                            its.image.compute_image_variances(tile_norm)[0])
-                    print 'var:', var_measured[i][-1],
+                    var = its.image.compute_image_variances(tile_norm)[0]
+                    var_measured[i].append(var)
                     var_expected[i].append(var_model)
-                    print 'var_model:', var_expected[i][-1]
+                    abs_diff = abs(var - var_model)
+                    if var_model:
+                        rel_diff = abs_diff / var_model
+                    else:
+                        raise ValueError('var_model=0!')
+                    print ('%s mean: %.3f, var: %.3e, var_model: %.3e, '
+                           'abs_diff: %.5f, rel_diff: %.3f' %
+                           (ch, mean_img_ch, var, var_model, abs_diff, rel_diff))
             print ''
             sens_valid.append(sens)
 
diff --git a/apps/CameraITS/tests/scene1_1/test_multi_camera_match.py b/apps/CameraITS/tests/scene1_1/test_multi_camera_match.py
index 2429837..5aa8620 100644
--- a/apps/CameraITS/tests/scene1_1/test_multi_camera_match.py
+++ b/apps/CameraITS/tests/scene1_1/test_multi_camera_match.py
@@ -47,8 +47,7 @@
             if i == ids[0]:  # get_available_output_sizes returns sorted list
                 yuv_match_sizes = yuv_sizes[i]
             else:
-                yuv_match_sizes = list(
-                        set(yuv_sizes[i]).intersection(yuv_match_sizes))
+                list(set(yuv_sizes[i]).intersection(yuv_match_sizes))
 
         # find matched size for captures
         yuv_match_sizes.sort()
diff --git a/apps/CameraITS/tests/scene4/test_multi_camera_alignment.py b/apps/CameraITS/tests/scene4/test_multi_camera_alignment.py
index 6d64f8d..67f3806 100644
--- a/apps/CameraITS/tests/scene4/test_multi_camera_alignment.py
+++ b/apps/CameraITS/tests/scene4/test_multi_camera_alignment.py
@@ -563,10 +563,10 @@
 
             # Find focal length and pixel & sensor size
             fl[i] = physical_props[i]['android.lens.info.availableFocalLengths'][0]
-            ar = physical_props[i]['android.sensor.info.activeArraySize']
+            ar = physical_props[i]['android.sensor.info.pixelArraySize']
             sensor_size = physical_props[i]['android.sensor.info.physicalSize']
-            pixel_size_w = sensor_size['width'] / (ar['right'] - ar['left'])
-            pixel_size_h = sensor_size['height'] / (ar['bottom'] - ar['top'])
+            pixel_size_w = sensor_size['width'] / (ar['width'])
+            pixel_size_h = sensor_size['height'] / (ar['height'])
             print 'pixel size(um): %.2f x %.2f' % (
                 pixel_size_w*1E3, pixel_size_h*1E3)
             pixel_sizes[i] = (pixel_size_w + pixel_size_h) / 2 * 1E3
diff --git a/apps/CameraITS/tools/load_scene.py b/apps/CameraITS/tools/load_scene.py
index 97b6ead..1993a54 100644
--- a/apps/CameraITS/tools/load_scene.py
+++ b/apps/CameraITS/tools/load_scene.py
@@ -23,10 +23,10 @@
 
 LOAD_SCENE_DELAY = 2  # seconds
 
-
 def main():
     """Load charts on device and display."""
     scene = None
+    out_path = ""
     for s in sys.argv[1:]:
         if s[:6] == 'scene=' and len(s) > 6:
             scene = s[6:]
@@ -36,11 +36,16 @@
             chart_distance = float(re.sub('cm', '', s[5:]))
         elif s[:4] == 'fov=' and len(s) > 4:
             camera_fov = float(s[4:])
+        elif s[:7] == "camera=" and len(s) > 7:
+            camera_id = str(s[7:])
 
     cmd = ('adb -s %s shell am force-stop com.google.android.apps.docs' %
            screen_id)
     subprocess.Popen(cmd.split())
 
+    if out_path != "":
+        scene_name = re.split("/|\.", out_path)[-2]
+
     if not scene:
         print 'Error: need to specify which scene to load'
         assert False
@@ -72,6 +77,25 @@
     cmd = ("adb -s %s wait-for-device shell am start -d 'file://%s'"
            " -a android.intent.action.VIEW" % (screen_id, dst_scene_file))
     subprocess.Popen(cmd.split())
+    time.sleep(LOAD_SCENE_DELAY)
+
+    with its.device.ItsSession() as cam:
+        props = cam.get_camera_properties()
+        cam.do_3a()
+        req = its.objects.fastest_auto_capture_request(props)
+        print "Capture an image to validate the light level"
+        cap = cam.do_capture(req)
+        img = its.image.convert_capture_to_rgb_image(cap)
+        its.image.write_image(
+            img, os.path.join(out_path, camera_id, scene, "validate_lighting.jpg"))
+        # Check if ITS is being run in WFoV or RFoV ITS rigs, and DUT's FoV.
+        if (np.isclose(chart_distance, its.cv2image.CHART_DISTANCE_RFOV, rtol=0.1) and
+            its.cv2image.FOV_THRESH_TELE <= camera_fov and
+            camera_fov <= its.cv2image.FOV_THRESH_WFOV):
+                its.image.validate_lighting(img)
+        elif (np.isclose(chart_distance, its.cv2image.CHART_DISTANCE_WFOV, rtol=0.1) and
+            camera_fov > its.cv2image.FOV_THRESH_WFOV):
+                its.image.validate_lighting(img)
 
 if __name__ == '__main__':
     main()
diff --git a/apps/CameraITS/tools/run_all_tests.py b/apps/CameraITS/tools/run_all_tests.py
index 95eac99..ca3e9f0 100644
--- a/apps/CameraITS/tools/run_all_tests.py
+++ b/apps/CameraITS/tools/run_all_tests.py
@@ -523,7 +523,7 @@
             id_combo_string += ItsSession.CAMERA_ID_TOKENIZER + id_combo.sub_id
             scenes = [scene for scene in scenes if HIDDEN_PHYSICAL_CAMERA_TESTS[scene]]
         # Loop capturing images until user confirm test scene is correct
-        camera_id_arg = "camera=" + id_combo.id
+        camera_id_arg = "camera=" + id_combo_string
         print "Preparing to run ITS on camera", id_combo_string, "for scenes ", scenes
 
         os.mkdir(os.path.join(topdir, id_combo_string))
@@ -566,7 +566,8 @@
                         fov_arg = 'fov=' + camera_fov
                         cmd = ['python',
                                os.path.join(os.getcwd(), 'tools/load_scene.py'),
-                               scene_arg, chart_dist_arg, fov_arg, screen_id_arg]
+                               scene_arg, chart_dist_arg, fov_arg, screen_id_arg,
+                               device_id_arg, camera_id_arg]
                     else:
                         time.sleep(CHART_DELAY)
                 else:
diff --git a/apps/CameraITS/tools/validate_scene.py b/apps/CameraITS/tools/validate_scene.py
index 1c0f0fd..890cf12 100644
--- a/apps/CameraITS/tools/validate_scene.py
+++ b/apps/CameraITS/tools/validate_scene.py
@@ -61,6 +61,7 @@
             print "Capture an image to check the test scene"
             cap = cam.do_capture(req)
             img = its.image.convert_capture_to_rgb_image(cap)
+            its.image.validate_lighting(img)
             if out_path != "":
                 its.image.write_image(img, out_path)
             print "Please check scene setup in", out_path
diff --git a/apps/CrossProfileTestApp/Android.bp b/apps/CrossProfileTestApp/Android.bp
index 628f8b6..71e0acc 100644
--- a/apps/CrossProfileTestApp/Android.bp
+++ b/apps/CrossProfileTestApp/Android.bp
@@ -22,7 +22,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/apps/CtsVerifier/Android.mk b/apps/CtsVerifier/Android.mk
index a7651b6..8e10b97 100644
--- a/apps/CtsVerifier/Android.mk
+++ b/apps/CtsVerifier/Android.mk
@@ -47,7 +47,8 @@
                                platform-test-annotations \
                                cts-security-test-support-library \
                                cts-midi-lib \
-                               cbor-java
+                               cbor-java \
+                               CtsCameraUtils
 
 LOCAL_STATIC_ANDROID_LIBRARIES := \
     androidx.legacy_legacy-support-v4
@@ -172,7 +173,7 @@
 #	$(hide) $(ACP) -fp cts/apps/CtsVerifier/assets/scripts/execute_power_tests.py $@
 
 cts : $(verifier-zip)
-$(verifier-zip) : $(HOST_OUT)/CameraITS
+$(verifier-zip) : $(HOST_OUT)/CameraITS/build_stamp
 $(verifier-zip) : $(foreach app,$(apps-to-include),$(call apk-location-for,$(app)))
 $(verifier-zip) : $(call intermediates-dir-for,APPS,CtsVerifier)/package.apk | $(ACP)
 		$(hide) mkdir -p $(verifier-dir)
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index 936bb72..3c23d3c 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -89,6 +89,7 @@
             android:debuggable="true"
             android:largeHeap="true"
             android:requestLegacyExternalStorage="true"
+            android:allowBackup="false"
             android:theme="@android:style/Theme.DeviceDefault">
 
         <meta-data android:name="SuiteName" android:value="CTS_VERIFIER" />
@@ -120,6 +121,8 @@
                        android:value="android.software.lockscreen_disabled" />
             <meta-data android:name="test_required_features"
                     android:value="android.software.device_admin" />
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".admin.DeviceAdminUninstallTestActivity"
@@ -132,6 +135,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_device_admin" />
             <meta-data android:name="test_required_features"
                        android:value="android.software.device_admin" />
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".admin.tapjacking.DeviceAdminTapjackingTestActivity"
@@ -144,6 +149,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_device_admin" />
             <meta-data android:name="test_required_features"
                        android:value="android.software.device_admin" />
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <receiver android:name=".admin.tapjacking.EmptyDeviceAdminReceiver"
@@ -158,7 +165,10 @@
         <activity
             android:name=".admin.tapjacking.OverlayingActivity"
             android:theme="@style/OverlayTheme"
-            android:label="Overlaying Activity"/>
+            android:label="Overlaying Activity">
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity
             android:name=".battery.BatterySaverTestActivity"
@@ -170,6 +180,8 @@
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_other" />
             <meta-data android:name="test_excluded_features" android:value="android.hardware.type.automotive" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".forcestop.RecentTaskRemovalTestActivity"
@@ -181,6 +193,8 @@
             </intent-filter>
             <meta-data android:name="test_required_configs" android:value="config_has_recents"/>
             <meta-data android:name="test_excluded_features" android:value="android.hardware.type.automotive" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".companion.CompanionDeviceTestActivity"
@@ -193,6 +207,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_features" />
             <meta-data android:name="test_required_features"
                        android:value="android.software.companion_device_setup" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!-- A generic activity for intent based tests.
@@ -214,6 +230,8 @@
             <meta-data android:name="test_excluded_features" android:value="android.hardware.type.automotive:android.hardware.type.television:android.software.lockscreen_disabled" />
             <meta-data android:name="test_required_features"
                     android:value="android.software.device_admin" />
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
 <!--            CTS Verifier Bluetooth Test Top Screen -->
@@ -233,6 +251,8 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.bluetooth" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -259,6 +279,8 @@
             <meta-data
                 android:name="test_excluded_features"
                 android:value="android.software.leanback" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -282,6 +304,8 @@
             <meta-data
                 android:name="test_parent"
                 android:value="com.android.cts.verifier.bluetooth.BluetoothTestActivity" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!-- Support service to ensure HID Device Test succeeds on
@@ -309,6 +333,8 @@
             <meta-data
                 android:name="test_parent"
                 android:value="com.android.cts.verifier.bluetooth.BluetoothTestActivity" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -334,6 +360,8 @@
                 android:value="com.android.cts.verifier.bluetooth.BluetoothTestActivity" />
             <meta-data android:name="test_excluded_features"
                 android:value="android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -359,6 +387,8 @@
                 android:value="com.android.cts.verifier.bluetooth.BluetoothTestActivity" />
             <meta-data android:name="test_excluded_features"
                 android:value="android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -384,6 +414,8 @@
                 android:value="com.android.cts.verifier.bluetooth.BluetoothTestActivity" />
             <meta-data android:name="test_excluded_features"
                 android:value="android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -409,6 +441,8 @@
                 android:value="com.android.cts.verifier.bluetooth.BluetoothTestActivity" />
             <meta-data android:name="test_excluded_features"
                 android:value="android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -431,6 +465,8 @@
             <meta-data
                 android:name="test_parent"
                 android:value="com.android.cts.verifier.bluetooth.BluetoothTestActivity" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -453,11 +489,16 @@
             <meta-data
                 android:name="test_parent"
                 android:value="com.android.cts.verifier.bluetooth.BluetoothTestActivity" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
         <activity
             android:name=".bluetooth.DevicePickerActivity"
             android:configChanges="keyboardHidden|orientation|screenSize"
-            android:label="@string/bt_device_picker" />
+            android:label="@string/bt_device_picker" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
 <!--
      *****************************************************************************************
@@ -519,6 +560,8 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.bluetooth_le" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
 
@@ -546,6 +589,8 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.bluetooth_le" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -576,6 +621,8 @@
             <meta-data
                 android:name="test_excluded_features"
                 android:value="android.hardware.type.watch"  />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -636,6 +683,8 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.bluetooth_le" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -662,6 +711,8 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.bluetooth_le" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -691,6 +742,8 @@
             <meta-data
                 android:name="test_excluded_features"
                 android:value="android.hardware.type.watch"  />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -751,6 +804,8 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.bluetooth_le" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -777,6 +832,8 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.bluetooth_le" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -807,6 +864,8 @@
             <meta-data
                 android:name="test_excluded_features"
                 android:value="android.hardware.type.watch"  />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -834,6 +893,8 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.bluetooth_le" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -865,6 +926,8 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.bluetooth_le" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -891,6 +954,8 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.bluetooth_le" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -920,6 +985,8 @@
             <meta-data
                 android:name="test_excluded_features"
                 android:value="android.hardware.type.watch"  />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -947,6 +1014,8 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.bluetooth_le" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -978,6 +1047,8 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.bluetooth_le" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -1004,6 +1075,8 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.bluetooth_le" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -1035,6 +1108,8 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.bluetooth_le" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -1061,6 +1136,8 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.bluetooth_le" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -1092,6 +1169,8 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.bluetooth_le" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -1118,6 +1197,8 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.bluetooth_le" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -1149,6 +1230,8 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.bluetooth_le" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -1175,6 +1258,8 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.bluetooth_le" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -1206,6 +1291,8 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.bluetooth_le" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -1229,6 +1316,8 @@
             <meta-data
                 android:name="test_parent"
                 android:value="com.android.cts.verifier.bluetooth.BleScannerTestActivity" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
 
@@ -1261,6 +1350,8 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.bluetooth_le" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!--
@@ -1284,6 +1375,8 @@
             <meta-data
                 android:name="test_parent"
                 android:value="com.android.cts.verifier.bluetooth.BleAdvertiserTestActivity" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".biometrics.BiometricTestList"
@@ -1297,7 +1390,9 @@
             <meta-data android:name="test_category" android:value="@string/test_category_security" />
             <meta-data android:name="test_required_features" android:value="android.software.secure_lock_screen" />
             <meta-data android:name="test_excluded_features"
-                android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch" />
+                android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch:android.hardware.type.automotive" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity
@@ -1316,6 +1411,8 @@
             <meta-data android:name="test_required_features" android:value="android.software.secure_lock_screen" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity
@@ -1334,6 +1431,8 @@
             <meta-data android:name="test_required_features" android:value="android.software.secure_lock_screen" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity
@@ -1352,6 +1451,8 @@
             <meta-data android:name="test_required_features" android:value="android.software.secure_lock_screen" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity
@@ -1370,6 +1471,8 @@
             <meta-data android:name="test_required_features" android:value="android.software.secure_lock_screen" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity
@@ -1388,6 +1491,8 @@
             <meta-data android:name="test_required_features" android:value="android.software.secure_lock_screen" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity
@@ -1406,6 +1511,8 @@
             <meta-data android:name="test_required_features" android:value="android.software.secure_lock_screen" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity
@@ -1424,6 +1531,8 @@
             <meta-data android:name="test_required_features" android:value="android.software.secure_lock_screen" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity
@@ -1442,6 +1551,8 @@
             <meta-data android:name="test_required_features" android:value="android.software.secure_lock_screen" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity
@@ -1460,6 +1571,8 @@
             <meta-data android:name="test_required_features" android:value="android.software.secure_lock_screen" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity
@@ -1478,6 +1591,8 @@
             <meta-data android:name="test_required_features" android:value="android.software.secure_lock_screen" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity
@@ -1496,6 +1611,8 @@
             <meta-data android:name="test_required_features" android:value="android.software.secure_lock_screen" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity
@@ -1514,6 +1631,8 @@
             <meta-data android:name="test_required_features" android:value="android.software.secure_lock_screen" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity
@@ -1532,6 +1651,8 @@
             <meta-data android:name="test_required_features" android:value="android.software.secure_lock_screen" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity
@@ -1550,6 +1671,8 @@
             <meta-data android:name="test_required_features" android:value="android.software.secure_lock_screen" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity
@@ -1568,6 +1691,8 @@
             <meta-data android:name="test_required_features" android:value="android.software.secure_lock_screen" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".security.IdentityCredentialAuthentication"
@@ -1582,6 +1707,8 @@
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch" />
             <meta-data android:name="test_required_features"
                        android:value="android.software.secure_lock_screen" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".security.FingerprintBoundKeysTest"
@@ -1596,6 +1723,8 @@
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch" />
             <meta-data android:name="test_required_features"
                        android:value="android.hardware.fingerprint:android.software.secure_lock_screen" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".security.ProtectedConfirmationTest"
@@ -1606,6 +1735,8 @@
                 <category android:name="android.cts.intent.category.MANUAL_TEST" />
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_security" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".security.ScreenLockBoundKeysTest"
@@ -1620,6 +1751,8 @@
                        android:value="android.software.lockscreen_disabled" />
             <meta-data android:name="test_required_features"
                     android:value="android.software.device_admin:android.software.secure_lock_screen" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".security.LockConfirmBypassTest"
@@ -1634,6 +1767,8 @@
                        android:value="android.software.lockscreen_disabled" />
             <meta-data android:name="test_required_features"
                        android:value="android.software.device_admin:android.software.secure_lock_screen" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".security.SetNewPasswordComplexityTest"
@@ -1648,6 +1783,8 @@
                        android:value="android.software.secure_lock_screen" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.automotive:android.software.lockscreen_disabled" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".streamquality.StreamingVideoActivity"
@@ -1660,12 +1797,16 @@
             <meta-data android:name="test_category" android:value="@string/test_category_streaming" />
             <meta-data android:name="test_excluded_features"
                     android:value="android.hardware.type.watch" />
+            <meta-data android:name="display_mode" android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".streamquality.PlayVideoActivity"
                 android:label="@string/streaming_video"
                 android:configChanges="keyboardHidden|orientation|screenSize"
-                android:screenOrientation="nosensor" />
+                android:screenOrientation="nosensor" >
+                <meta-data android:name="display_mode"
+                           android:value="multi_display_mode" />
+        </activity>
 
         <!-- FeatureSummaryActivity is replaced by CTS SystemFeaturesTest
         <activity android:name=".features.FeatureSummaryActivity" android:label="@string/feature_summary">
@@ -1684,6 +1825,8 @@
                 <action android:name="com.android.cts.verifier.location.SET_LOCATION_AND_CHECK" />
                 <category android:name="android.intent.category.DEFAULT"></category>
                 </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".net.ConnectivityBackgroundTestActivity"
@@ -1694,6 +1837,8 @@
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_networking" />
             <meta-data android:name="test_required_features" android:value="android.hardware.wifi" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".net.MultiNetworkConnectivityTestActivity"
@@ -1707,6 +1852,8 @@
                        android:value="android.hardware.wifi:android.hardware.telephony" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".nfc.NfcTestActivity"
@@ -1718,165 +1865,275 @@
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_hardware" />
             <meta-data android:name="test_required_features" android:value="android.hardware.nfc" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name="com.android.cts.verifier.nfc.hce.HceReaderTestActivity"
                 android:label="@string/nfc_hce_reader_tests"
                 android:configChanges="keyboardHidden|orientation|screenSize">
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name="com.android.cts.verifier.nfc.hce.HceEmulatorTestActivity"
                 android:label="@string/nfc_hce_emulator_tests"
                 android:configChanges="keyboardHidden|orientation|screenSize">
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name="com.android.cts.verifier.nfc.hcef.HceFReaderTestActivity"
                 android:label="@string/nfc_hce_f_reader_tests"
                 android:configChanges="keyboardHidden|orientation|screenSize">
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name="com.android.cts.verifier.nfc.hcef.HceFEmulatorTestActivity"
                 android:label="@string/nfc_hce_f_emulator_tests"
                 android:configChanges="keyboardHidden|orientation|screenSize">
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name="com.android.cts.verifier.nfc.offhost.OffhostUiccReaderTestActivity"
                 android:label="@string/nfc_offhost_uicc_reader_tests"
                 android:configChanges="keyboardHidden|orientation|screenSize">
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name="com.android.cts.verifier.nfc.offhost.OffhostUiccEmulatorTestActivity"
                 android:label="@string/nfc_offhost_uicc_emulator_tests"
                 android:configChanges="keyboardHidden|orientation|screenSize">
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".nfc.NdefPushSenderActivity"
                 android:label="@string/nfc_ndef_push_sender"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.NdefPushReceiverActivity"
                 android:label="@string/nfc_ndef_push_receiver"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.LlcpVersionActivity"
                 android:label="@string/nfc_llcp_version_check"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.TagVerifierActivity"
                 android:label="@string/nfc_tag_verifier"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hce.DefaultRouteEmulatorActivity"
                 android:label="@string/nfc_hce_default_route_emulator"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hce.ProtocolParamsEmulatorActivity"
                 android:label="@string/nfc_hce_protocol_params_emulator"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hce.SinglePaymentEmulatorActivity"
                 android:label="@string/nfc_hce_single_payment_emulator"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hce.SimpleReaderActivity"
                 android:label="@string/nfc_hce_single_payment_reader"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hce.ProtocolParamsReaderActivity"
                 android:label="@string/nfc_hce_protocol_params_reader"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hce.DualPaymentEmulatorActivity"
                 android:label="@string/nfc_hce_dual_payment_emulator"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hce.ChangeDefaultEmulatorActivity"
                 android:label="@string/nfc_hce_change_default_emulator"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hce.SingleNonPaymentEmulatorActivity"
                 android:label="@string/nfc_hce_single_non_payment_emulator"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hce.DualNonPaymentEmulatorActivity"
                 android:label="@string/nfc_hce_dual_non_payment_emulator"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hce.ConflictingNonPaymentEmulatorActivity"
                 android:label="@string/nfc_hce_conflicting_non_payment_emulator"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hce.ForegroundNonPaymentEmulatorActivity"
                 android:label="@string/nfc_hce_foreground_non_payment_emulator"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hce.ForegroundPaymentEmulatorActivity"
                 android:label="@string/nfc_hce_foreground_payment_emulator"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hce.OffHostEmulatorActivity"
                 android:label="@string/nfc_hce_offhost_service_emulator"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hce.OnAndOffHostEmulatorActivity"
                 android:label="@string/nfc_hce_on_and_offhost_service_emulator"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hce.ThroughputEmulatorActivity"
                 android:label="@string/nfc_hce_throughput_emulator"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hce.TapTestEmulatorActivity"
                 android:label="@string/nfc_hce_tap_test_emulator"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hce.DynamicAidEmulatorActivity"
                 android:label="@string/nfc_hce_payment_dynamic_aids_emulator"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hce.LargeNumAidsEmulatorActivity"
                   android:label="@string/nfc_hce_large_num_aids_emulator"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hce.PrefixPaymentEmulatorActivity"
                 android:label="@string/nfc_hce_payment_prefix_aids_emulator"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hce.PrefixPaymentEmulator2Activity"
                 android:label="@string/nfc_hce_payment_prefix_aids_emulator_2"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hce.DualNonPaymentPrefixEmulatorActivity"
                 android:label="@string/nfc_hce_other_prefix_aids_emulator"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hce.ConflictingNonPaymentPrefixEmulatorActivity"
                 android:label="@string/nfc_hce_other_conflicting_prefix_aids_emulator"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hcef.HceFEmulatorActivity"
                 android:label="@string/nfc_hce_f_emulator"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.hcef.HceFReaderActivity"
                 android:label="@string/nfc_hce_f_reader"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.offhost.UiccTransactionEvent1EmulatorActivity"
                 android:label="@string/nfc_offhost_uicc_transaction_event1_emulator"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.offhost.UiccTransactionEvent2EmulatorActivity"
                 android:label="@string/nfc_offhost_uicc_transaction_event2_emulator"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.offhost.UiccTransactionEvent3EmulatorActivity"
                 android:label="@string/nfc_offhost_uicc_transaction_event3_emulator"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".nfc.offhost.SimpleOffhostReaderActivity"
                 android:label="@string/nfc_offhost_uicc_transaction_event1_reader"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <!-- services used for testing NFC host-based card emulation -->
         <service android:name=".nfc.hce.PaymentService1" android:exported="true"
@@ -2079,6 +2336,8 @@
                        android:value="android.hardware.sensor.accelerometer"/>
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.automotive"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".sensors.GyroscopeMeasurementTestActivity"
@@ -2093,6 +2352,8 @@
                        android:value="android.hardware.sensor.gyroscope"/>
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.automotive"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".sensors.HeartRateMonitorTestActivity"
@@ -2105,6 +2366,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_sensors" />
             <meta-data android:name="test_required_features"
                        android:value="android.hardware.sensor.heartrate" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".sensors.MagneticFieldMeasurementTestActivity"
@@ -2117,6 +2380,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_sensors" />
             <meta-data android:name="test_required_features"
                        android:value="android.hardware.sensor.compass" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".sensors.OffBodySensorTestActivity"
@@ -2127,6 +2392,7 @@
                 <category android:name="android.cts.intent.category.MANUAL_TEST" />
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_sensors" />
+            <meta-data android:name="display_mode" android:value="single_display_mode" />
         </activity>
 
         <activity
@@ -2145,12 +2411,16 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.sensor.accelerometer:android.hardware.sensor.gyroscope:android.hardware.sensor.compass:android.hardware.camera" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
         <activity
             android:name=".sensors.RVCVRecordActivity"
             android:keepScreenOn="true"
             android:label="@string/snsr_rvcvxchk_test_rec"
             android:screenOrientation="locked" >
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
 
@@ -2177,6 +2447,7 @@
             <meta-data android:name="test_category" android:value="@string/test_category_sensors" />
             <meta-data android:name="test_applicable_features"
                        android:value="android.hardware.sensor.stepcounter:android.hardware.sensor.stepdetector:android.hardware.sensor.proximity:android.hardware.sensor.light" />
+            <meta-data android:name="display_mode" android:value="single_display_mode" />
         </activity>
 
         <!-- TODO: enable when a more reliable way to identify time synchronization is available -->
@@ -2202,6 +2473,7 @@
             <meta-data android:name="test_category" android:value="@string/test_category_sensors"/>
             <meta-data android:name="test_excluded_features"
                     android:value="android.software.leanback" />
+            <meta-data android:name="display_mode" android:value="single_display_mode" />
         </activity>
         <!-- End sensor tests definitions -->
 
@@ -2217,6 +2489,8 @@
             <meta-data android:name="test_required_features" android:value="android.hardware.camera.any"/>
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.automotive"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".camera.intents.CameraIntentsActivity"
@@ -2230,6 +2504,8 @@
             <meta-data android:name="test_required_features" android:value="android.hardware.camera.any"/>
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.automotive:android.hardware.type.television:android.software.leanback"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />n.)
         </activity>
 
         <service android:name=".camera.intents.CameraContentJobService"
@@ -2247,6 +2523,8 @@
             <meta-data android:name="test_required_features" android:value="android.hardware.camera.any"/>
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.automotive"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity
@@ -2262,6 +2540,8 @@
             <meta-data android:name="test_required_features" android:value="android.hardware.camera.any"/>
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.automotive"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
         <activity
             android:name=".camera.fov.DetermineFovActivity"
@@ -2270,12 +2550,16 @@
             android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" >
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.automotive"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
         <activity
             android:name=".camera.fov.CalibrationPreferenceActivity"
             android:label="@string/camera_fov_label_options" >
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.automotive"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
 
@@ -2291,6 +2575,8 @@
                     android:value="android.hardware.camera.any"/>
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.automotive"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".camera.its.ItsTestActivity"
@@ -2303,9 +2589,12 @@
                 <category android:name="android.cts.intent.category.MANUAL_TEST" />
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_camera" />
+            <meta-data android:name="test_required_configs" android:value="config_no_emulator"/>
             <meta-data android:name="test_required_features" android:value="android.hardware.camera.any" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.automotive"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".camera.flashlight.CameraFlashlightActivity"
@@ -2319,6 +2608,8 @@
             <meta-data android:name="test_required_features" android:value="android.hardware.camera.flash" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.automotive"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".camera.performance.CameraPerformanceActivity"
@@ -2332,6 +2623,8 @@
             <meta-data android:name="test_required_features" android:value="android.hardware.camera.any" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.automotive"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".camera.bokeh.CameraBokehActivity"
@@ -2346,6 +2639,8 @@
             <meta-data android:name="test_required_features" android:value="android.hardware.camera.any" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.automotive"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".usb.accessory.UsbAccessoryTestActivity"
@@ -2359,6 +2654,8 @@
             <meta-data android:name="test_required_features" android:value="android.hardware.usb.accessory" />
             <meta-data android:name="test_excluded_features"
                     android:value="android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".usb.accessory.AccessoryAttachmentHandler">
@@ -2368,6 +2665,8 @@
 
             <meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
                 android:resource="@xml/accessory_filter" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
 <!-- Temporary disabled b/c of incorrect assumptions in part of the test: b/160938927
@@ -2383,6 +2682,8 @@
             <meta-data android:name="test_required_features" android:value="android.hardware.usb.host" />
             <meta-data android:name="test_excluded_features"
                     android:value="android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
         -->
 
@@ -2395,6 +2696,8 @@
             <meta-data android:name="test_required_features" android:value="android.hardware.usb.host" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.automotive:android.hardware.type.television" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
 <!-- Turned off Sensor Power Test in initial L release
@@ -2419,10 +2722,14 @@
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_networking" />
             <meta-data android:name="test_required_features" android:value="android.hardware.wifi.direct" />
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.RecentsRedactionActivity"
                 android:label="@string/provisioning_byod_recents" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
         <activity android:name=".managedprovisioning.IntermediateRecentActivity"
                   android:label="@string/provisioning_byod_recents"
@@ -2431,6 +2738,8 @@
                 <action android:name="com.android.cts.verifier.managedprovisioning.RECENTS" />
                 <category android:name="android.intent.category.DEFAULT"></category>
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
         <activity android:name=".wifi.TestListActivity"
                   android:label="@string/wifi_test"
@@ -2441,6 +2750,8 @@
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_networking" />
             <meta-data android:name="test_required_features" android:value="android.hardware.wifi" />
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
         <activity android:name=".wifiaware.TestListActivity"
                   android:label="@string/aware_test"
@@ -2451,6 +2762,8 @@
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_networking" />
             <meta-data android:name="test_required_features" android:value="android.hardware.wifi.aware" />
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".notifications.NotificationListenerVerifierActivity"
@@ -2460,6 +2773,8 @@
                 <category android:name="android.cts.intent.category.MANUAL_TEST" />
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_notifications" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <receiver android:name=".notifications.BlockChangeReceiver">
@@ -2493,6 +2808,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_notifications" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.automotive:android.hardware.type.television:android.software.leanback:android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".notifications.AttentionManagementVerifierActivity"
@@ -2504,6 +2821,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_notifications" />
             <meta-data android:name="test_excluded_features"
                     android:value="android.hardware.type.watch:android.software.leanback" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".notifications.BubblesVerifierActivity"
@@ -2515,6 +2834,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_notifications" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.watch:android.software.leanback:android.hardware.type.automotive" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".notifications.BubbleActivity"
@@ -2529,6 +2850,8 @@
 
             <meta-data android:name="android.app.shortcuts"
                        android:resource="@xml/shortcuts" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".notifications.MediaPlayerVerifierActivity"
@@ -2542,6 +2865,8 @@
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.watch:android.software.leanback:android.hardware.type.automotive" />
             <meta-data android:name="test_required_configs" android:value="config_quick_settings_supported" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <service android:name=".notifications.MockListener"
@@ -2572,6 +2897,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_notifications" />
             <meta-data android:name="test_excluded_features"
                 android:value="android.hardware.type.watch:android.software.leanback:android.hardware.type.automotive" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".qstiles.TileServiceVerifierActivity"
@@ -2584,6 +2911,8 @@
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch:android.hardware.type.automotive" />
             <meta-data android:name="test_required_configs" android:value="config_quick_settings_supported" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <service android:name=".qstiles.MockTileService"
@@ -2606,6 +2935,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_vr" />
             <meta-data android:name="test_required_features"
                        android:value="android.hardware.vr.high_performance" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".vr.MockVrActivity"
@@ -2617,6 +2948,8 @@
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".vr.MockVrActivity2"
@@ -2628,6 +2961,8 @@
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <service android:name=".vr.MockVrListenerService"
@@ -2661,6 +2996,8 @@
             <meta-data android:name="test_excluded_features"
                     android:value="android.hardware.type.watch:android.hardware.type.television:android.software.leanback" />
             <meta-data android:name="test_required_features" android:value="android.software.device_admin" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
         <activity android:name=".security.CANotifyOnBootActivity"
                 android:label="@string/caboot_test">
@@ -2672,6 +3009,8 @@
             <meta-data android:name="test_excluded_features"
                     android:value="android.hardware.type.watch:android.hardware.type.television:android.software.leanback" />
             <meta-data android:name="test_required_features" android:value="android.software.device_admin" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".security.KeyChainTest"
@@ -2684,6 +3023,8 @@
             <!-- KeyChain is only installed on communication-oriented devices inheriting core.mk -->
             <meta-data android:name="test_excluded_features"
                     android:value="android.hardware.type.watch:android.hardware.type.television:android.software.leanback" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".security.CaCertInstallViaIntentTest"
@@ -2696,187 +3037,324 @@
             <!-- Skip certificate installation on devices that do not support KeyChain -->
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.watch:android.hardware.type.television:android.software.leanback" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".wifi.NetworkRequestSpecificNetworkSpecifierTestActivity"
                   android:label="@string/wifi_test_network_request_specific"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifi.NetworkRequestPatternNetworkSpecifierTestActivity"
                   android:label="@string/wifi_test_network_request_pattern"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifi.NetworkRequestUnavailableNetworkSpecifierTestActivity"
                   android:label="@string/wifi_test_network_request_unavailable"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifi.NetworkRequestInvalidCredentialNetworkSpecifierTestActivity"
                   android:label="@string/wifi_test_network_request_invalid_credential"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifi.NetworkSuggestionSsidTestActivity"
                   android:label="@string/wifi_test_network_suggestion_ssid"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifi.NetworkSuggestionSsidBssidTestActivity"
                   android:label="@string/wifi_test_network_suggestion_ssid_bssid"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifi.NetworkSuggestionSsidPostConnectTestActivity"
                   android:label="@string/wifi_test_network_suggestion_ssid_post_connect"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifi.NetworkSuggestionConnectionFailureTestActivity"
                   android:label="@string/wifi_test_network_suggestion_connection_failure"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifi.NetworkSuggestionModificationInPlaceTestActivity"
                   android:label="@string/wifi_test_network_suggestion_modification_in_place"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".p2p.GoNegRequesterTestListActivity"
                 android:label="@string/p2p_go_neg_requester"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".p2p.GoNegRequesterTestActivity"
                 android:label="@string/p2p_go_neg_requester"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".p2p.GoNegResponderTestActivity"
                 android:label="@string/p2p_go_neg_responder"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".p2p.P2pClientTestListActivity"
                 android:label="@string/p2p_join_go"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".p2p.P2pClientTestActivity"
                 android:label="@string/p2p_join_go"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".p2p.GoTestActivity"
                 android:label="@string/p2p_accept_client"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".p2p.P2pClientWithConfigTestListActivity"
                 android:label="@string/p2p_join_go"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".p2p.P2pClientWithConfig2gBandTestListActivity"
                 android:label="@string/p2p_join_go"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".p2p.P2pClientWithConfigFixedFrequencyTestListActivity"
                 android:label="@string/p2p_join_go"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".p2p.P2pClientWithConfigTestActivity"
                 android:label="@string/p2p_join_go"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".p2p.P2pClientWithConfig2gBandTestActivity"
                 android:label="@string/p2p_join_go"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".p2p.P2pClientWithConfigFixedFrequencyTestActivity"
                 android:label="@string/p2p_join_go"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".p2p.GoWithConfigTestActivity"
                 android:label="@string/p2p_accept_client"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".p2p.GoWithConfig2gBandTestActivity"
                 android:label="@string/p2p_accept_client"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".p2p.GoWithConfigFixedFrequencyTestActivity"
                 android:label="@string/p2p_accept_client"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".p2p.ServiceRequesterTestListActivity"
                 android:label="@string/p2p_service_discovery_requester"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".p2p.ServiceRequesterTestActivity"
                 android:label="@string/p2p_service_discovery_requester"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".p2p.ServiceResponderTestActivity"
                 android:label="@string/p2p_service_discovery_responder"
-                android:configChanges="keyboardHidden|orientation|screenSize" />
+                android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifiaware.DataPathOpenUnsolicitedPublishTestActivity"
                   android:label="@string/aware_data_path_open_unsolicited_publish"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifiaware.DataPathOpenPassiveSubscribeTestActivity"
                   android:label="@string/aware_data_path_open_passive_subscribe"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifiaware.DataPathPassphraseUnsolicitedPublishTestActivity"
                   android:label="@string/aware_data_path_passphrase_unsolicited_publish"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifiaware.DataPathPassphrasePassiveSubscribeTestActivity"
                   android:label="@string/aware_data_path_passphrase_passive_subscribe"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifiaware.DataPathPmkUnsolicitedPublishTestActivity"
                   android:label="@string/aware_data_path_pmk_unsolicited_publish"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifiaware.DataPathPmkPassiveSubscribeTestActivity"
                   android:label="@string/aware_data_path_pmk_passive_subscribe"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifiaware.DataPathOpenSolicitedPublishTestActivity"
                   android:label="@string/aware_data_path_open_solicited_publish"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifiaware.DataPathOpenActiveSubscribeTestActivity"
                   android:label="@string/aware_data_path_open_active_subscribe"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifiaware.DataPathPassphraseSolicitedPublishTestActivity"
                   android:label="@string/aware_data_path_passphrase_solicited_publish"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifiaware.DataPathPassphraseActiveSubscribeTestActivity"
                   android:label="@string/aware_data_path_passphrase_active_subscribe"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifiaware.DataPathPmkSolicitedPublishTestActivity"
                   android:label="@string/aware_data_path_pmk_solicited_publish"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifiaware.DataPathPmkActiveSubscribeTestActivity"
                   android:label="@string/aware_data_path_pmk_active_subscribe"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifiaware.DataPathOobOpenResponderTestActivity"
                   android:label="@string/aware_data_path_oob_open_responder"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifiaware.DataPathOobOpenInitiatorTestActivity"
                   android:label="@string/aware_data_path_oob_open_initiator"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifiaware.DataPathOobPassphraseResponderTestActivity"
                   android:label="@string/aware_data_path_oob_passphrase_responder"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifiaware.DataPathOobPassphraseInitiatorTestActivity"
                   android:label="@string/aware_data_path_oob_passphrase_initiator"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifiaware.DiscoveryRangingPublishTestActivity"
                   android:label="@string/aware_discovery_ranging_publish"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".wifiaware.DiscoveryRangingSubscribeTestActivity"
                   android:label="@string/aware_discovery_ranging_subscribe"
-                  android:configChanges="keyboardHidden|orientation|screenSize" />
+                  android:configChanges="keyboardHidden|orientation|screenSize" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity-alias android:name=".CtsVerifierActivity" android:label="@string/app_name"
                 android:targetActivity=".TestListActivity">
@@ -2908,6 +3386,8 @@
                     android:value="android.software.app_widgets" />
             <meta-data android:name="test_excluded_features"
                     android:value="android.hardware.type.automotive:android.hardware.ram.low" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".deskclock.DeskClockTestsActivity"
@@ -2919,6 +3399,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_deskclock" />
             <meta-data android:name="test_excluded_features"
                     android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.automotive" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
 <!-- TODO: enable when not requiring to tap the screen and timeouts are tuned -->
@@ -2953,6 +3435,7 @@
                 android:value="@string/test_category_sensors" />
             <meta-data android:name="test_required_features"
                        android:value="android.hardware.sensor.stepcounter:android.hardware.sensor.stepdetector" />
+            <meta-data android:name="display_mode" android:value="single_display_mode" />
         </activity>
 
         <activity
@@ -2966,6 +3449,7 @@
             <meta-data android:name="test_category" android:value="@string/test_category_sensors" />
             <meta-data android:name="test_excluded_features"
                     android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.automotive" />
+            <meta-data android:name="display_mode" android:value="single_display_mode" />
         </activity>
 
         <service
@@ -2997,6 +3481,7 @@
                 android:value="@string/test_category_sensors" />
             <meta-data android:name="test_required_features"
                        android:value="android.hardware.sensor.accelerometer" />
+            <meta-data android:name="display_mode" android:value="single_display_mode" />
         </activity>
 
         <activity
@@ -3019,12 +3504,17 @@
                 android:value="android.hardware.sensor.proximity:android.hardware.sensor.accelerometer">
             </meta-data>
 
+            <meta-data android:name="display_mode" android:value="single_display_mode" />
         </activity>
 
-       <activity
-            android:name="com.android.cts.verifier.sensors.HingeAngleTestActivity"
-            android:label="@string/snsr_hinge_angle_test"
-            android:screenOrientation="nosensor" >
+        <!-- Set the HingeAngleTestActivity as not resizeable and with a max aspect ratio to prevent
+             the activity from restarting when the device folds -->
+       <activity android:name="com.android.cts.verifier.sensors.HingeAngleTestActivity"
+                 android:label="@string/snsr_hinge_angle_test"
+                 android:exported="true"
+                 android:screenOrientation="nosensor"
+                 android:resizeableActivity="false"
+                 android:maxAspectRatio="2.4">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 
@@ -3036,6 +3526,7 @@
                 android:value="@string/test_category_sensors" />
             <meta-data android:name="test_required_features"
                        android:value="android.hardware.sensor.hinge_angle" />
+            <meta-data android:name="display_mode" android:value="single_display_mode" />
         </activity>
 
         <receiver android:name=".widget.WidgetCtsProvider">
@@ -3060,6 +3551,8 @@
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_projection" />
             <meta-data android:name="test_required_features" android:value="android.hardware.faketouch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".projection.widgets.ProjectionWidgetActivity"
@@ -3070,6 +3563,8 @@
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_projection" />
             <meta-data android:name="test_required_features" android:value="android.hardware.faketouch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".projection.list.ProjectionListActivity"
@@ -3081,6 +3576,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_projection" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".projection.video.ProjectionVideoActivity"
@@ -3092,6 +3589,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_projection" />
             <meta-data android:name="test_excluded_features"
                     android:value="android.hardware.type.watch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".projection.touch.ProjectionTouchActivity"
@@ -3103,6 +3602,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_projection" />
             <meta-data android:name="test_required_features"
                        android:value="android.hardware.faketouch:android.hardware.touchscreen.multitouch" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
 
@@ -3115,6 +3616,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_projection" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.automotive" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <service android:name=".projection.ProjectionService"
@@ -3131,9 +3634,14 @@
             <meta-data android:name="test_excluded_features"
                        android:value="android.software.lockscreen_disabled" />
             <meta-data android:name="test_required_features" android:value="android.software.device_admin" />
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
-        <activity android:name=".managedprovisioning.DeviceOwnerNegativeTestActivity$TrampolineActivity" />
+        <activity android:name=".managedprovisioning.DeviceOwnerNegativeTestActivity$TrampolineActivity" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".managedprovisioning.EnterprisePrivacyInfoOnlyTestActivity"
                 android:label="@string/enterprise_privacy_test">
@@ -3141,6 +3649,8 @@
                 <action android:name="com.android.cts.verifier.managedprovisioning.action.CHECK_ENTERPRISE_PRIVACY_INFO_ONLY" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.DeviceOwnerPositiveTestActivity"
@@ -3155,6 +3665,8 @@
             <meta-data android:name="test_excluded_features"
                        android:value="android.software.lockscreen_disabled" />
             <meta-data android:name="test_required_features" android:value="android.software.device_admin" />
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.ManagedUserPositiveTestActivity"
@@ -3164,6 +3676,8 @@
                 <action android:name="com.android.cts.verifier.managedprovisioning.action.CHECK_AFFILIATED_PROFILE_OWNER" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.DeviceOwnerRequestingBugreportTestActivity"
@@ -3176,14 +3690,20 @@
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_managed_provisioning" />
             <meta-data android:name="test_required_features" android:value="android.software.device_admin" />
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.NonMarketAppsActivity"
                   android:label="@string/provisioning_byod_non_market_apps">
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.KeyguardDisabledFeaturesActivity"
                 android:label="@string/provisioning_byod_keyguard_disabled_features">
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.CrossProfilePermissionControlActivity"
@@ -3192,10 +3712,14 @@
                 <action android:name="com.android.cts.verifier.managedprovisioning.action.CROSS_PROFILE_PERMISSION_CONTROL" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.DisallowAppsControlActivity"
                 android:label="@string/provisioning_byod_disallow_apps_control">
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.LockTaskUiTestActivity"
@@ -3204,10 +3728,14 @@
                 <action android:name="com.android.cts.verifier.managedprovisioning.action.STOP_LOCK_TASK" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.WifiLockdownTestActivity"
                 android:label="@string/device_owner_wifi_lockdown_test">
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.VpnTestActivity"
@@ -3216,6 +3744,8 @@
                 <action android:name="com.android.cts.verifier.managedprovisioning.VPN" />
                 <category android:name="android.intent.category.DEFAULT"></category>
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <service android:name=".managedprovisioning.VpnTestActivity$MyTestVpnService"
@@ -3231,6 +3761,8 @@
                 <action android:name="com.android.cts.verifier.managedprovisioning.action.ALWAYS_ON_VPN_SETTINGS_TEST" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.KeyChainTestActivity"
@@ -3239,6 +3771,8 @@
                 <action android:name="com.android.cts.verifier.managedprovisioning.KEYCHAIN" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.PermissionLockdownTestActivity"
@@ -3247,6 +3781,8 @@
                 <action android:name="com.android.cts.verifier.managedprovisioning.action.CHECK_PERMISSION_LOCKDOWN" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity-alias
@@ -3260,6 +3796,8 @@
 
         <activity android:name=".managedprovisioning.OrganizationInfoTestActivity"
                 android:label="@string/provisioning_byod_organization_info">
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.PolicyTransparencyTestListActivity"
@@ -3268,6 +3806,8 @@
                 <action android:name="com.android.cts.verifier.managedprovisioning.action.CHECK_POLICY_TRANSPARENCY" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.PolicyTransparencyTestActivity">
@@ -3275,6 +3815,8 @@
                 <action android:name="com.android.cts.verifier.managedprovisioning.action.SHOW_POLICY_TRANSPARENCY_TEST" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.EnterprisePrivacyTestListActivity"
@@ -3283,6 +3825,8 @@
                 <action android:name="com.android.cts.verifier.managedprovisioning.action.CHECK_ENTERPRISE_PRIVACY" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.EnterprisePrivacyTestDefaultAppActivity"
@@ -3325,6 +3869,8 @@
                 <action android:name="android.intent.action.CALL" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.CommandReceiverActivity"
@@ -3334,6 +3880,8 @@
                 <action android:name="com.android.cts.verifier.managedprovisioning.action.EXECUTE_COMMAND" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.SetSupportMessageActivity">
@@ -3341,19 +3889,21 @@
                 <action android:name="com.android.cts.verifier.managedprovisioning.action.SET_SUPPORT_MSG" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
-        <service android:name=".managedprovisioning.PolicyTransparencyTestActivity$DummyInputMethod"
-                android:label="@string/dummy_input_method_label"
+        <service android:name=".managedprovisioning.PolicyTransparencyTestActivity$TestInputMethod"
+                android:label="@string/test_input_method_label"
                 android:permission="android.permission.BIND_INPUT_METHOD">
             <intent-filter>
                 <action android:name="android.view.InputMethod" />
             </intent-filter>
-            <meta-data android:name="android.view.im" android:resource="@xml/dummy_method" />
+            <meta-data android:name="android.view.im" android:resource="@xml/test_method" />
         </service>
 
-        <service android:name=".managedprovisioning.PolicyTransparencyTestActivity$DummyAccessibilityService"
-                android:label="@string/dummy_accessibility_service_label"
+        <service android:name=".managedprovisioning.PolicyTransparencyTestActivity$TestAccessibilityService"
+                android:label="@string/test_accessibility_service_label"
                 android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
             <intent-filter>
                 <action android:name="android.accessibilityservice.AccessibilityService" />
@@ -3366,6 +3916,8 @@
                 <action android:name="com.android.cts.verifier.managedprovisioning.action.AUTH_BOUND_KEY_TEST" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.ByodFlowTestActivity"
@@ -3389,6 +3941,8 @@
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_managed_provisioning" />
             <meta-data android:name="test_required_features" android:value="android.software.managed_users:android.software.device_admin" />
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <receiver
@@ -3406,9 +3960,14 @@
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_managed_provisioning" />
             <meta-data android:name="test_required_features" android:value="android.software.managed_users:android.software.device_admin" />
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
-        <activity android:name=".managedprovisioning.ByodProvisioningTestActivity$ProvisioningStartingActivity" />
+        <activity android:name=".managedprovisioning.ByodProvisioningTestActivity$ProvisioningStartingActivity" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <activity android:name=".managedprovisioning.ByodHelperActivity">
             <intent-filter>
@@ -3441,6 +4000,8 @@
                 <action android:name="com.android.cts.verifier.managedprovisioning.TEST_PARENT_PROFILE_PASSWORD" />
                 <category android:name="android.intent.category.DEFAULT"></category>
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.ByodPrimaryHelperActivity">
@@ -3448,10 +4009,14 @@
                 <action android:name="com.android.cts.verifier.managedprovisioning.BYOD_INSTALL_APK_IN_PRIMARY" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.NfcTestActivity">
             <meta-data android:name="test_required_features" android:value="android.hardware.nfc" />
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <provider
@@ -3469,6 +4034,8 @@
                 <action android:name="com.android.cts.verifier.managedprovisioning.BYOD_SAMPLE_ICON" />
                 <category android:name="android.intent.category.DEFAULT"></category>
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.HandleIntentActivity"
@@ -3541,6 +4108,8 @@
                 <data android:scheme="geo" />
                 <data android:scheme="market" />
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.CrossProfileTestActivity">
@@ -3561,6 +4130,8 @@
                 <data android:mimeType="*/*" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.WorkStatusTestActivity">
@@ -3569,10 +4140,14 @@
                 <action android:name="com.android.cts.verifier.managedprovisioning.WORK_STATUS_TOAST" />
                 <category android:name="android.intent.category.DEFAULT"></category>
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.TurnOffWorkActivity"
                   android:label="@string/provisioning_byod_turn_off_work">
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.WorkProfileWidgetActivity"
@@ -3581,6 +4156,8 @@
                 <action android:name="com.android.cts.verifier.byod.test_work_profile_widget"/>
                 <category android:name="android.intent.category.DEFAULT"/>
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
 
         <receiver android:name=".managedprovisioning.DeviceAdminTestReceiver"
@@ -3599,7 +4176,10 @@
         </service>
 
         <!-- Used by the SensorTestScreenManipulator to reset the screen timeout after turn off. -->
-        <activity android:name=".os.TimeoutResetActivity"/>
+        <activity android:name=".os.TimeoutResetActivity">
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
 
         <activity android:name=".tv.TvInputDiscoveryTestActivity"
                 android:label="@string/tv_input_discover_test">
@@ -3610,6 +4190,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_tv" />
             <meta-data android:name="test_required_features"
                     android:value="android.software.live_tv" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".tv.ParentalControlTestActivity"
@@ -3621,6 +4203,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_tv" />
             <meta-data android:name="test_required_features"
                     android:value="android.software.live_tv" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".tv.MultipleTracksTestActivity"
@@ -3632,6 +4216,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_tv" />
             <meta-data android:name="test_required_features"
                     android:value="android.software.live_tv" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".tv.TimeShiftTestActivity"
@@ -3643,6 +4229,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_tv" />
             <meta-data android:name="test_required_features"
                     android:value="android.software.live_tv" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".tv.AppLinkTestActivity"
@@ -3655,6 +4243,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_tv" />
             <meta-data android:name="test_required_features"
                 android:value="android.software.live_tv" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".tv.MicrophoneDeviceTestActivity"
@@ -3666,6 +4256,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_tv" />
             <meta-data android:name="test_required_features"
                        android:value="android.software.leanback" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".tv.audio.AudioCapabilitiesTestActivity"
@@ -3678,6 +4270,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_tv" />
             <meta-data android:name="test_required_features"
                        android:value="android.software.leanback" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
         <activity android:name=".tv.display.DisplayHdrCapabilitiesTestActivity"
                   android:label="@string/tv_hdr_capabilities_test"
@@ -3691,6 +4285,8 @@
                        android:value="android.software.leanback" />
             <meta-data android:name="test_required_configs"
                        android:value="config_tv_panel"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
 
@@ -3703,12 +4299,16 @@
             <meta-data android:name="test_category" android:value="@string/test_category_other" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch:android.hardware.type.automotive" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".tv.MockTvInputSetupActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".audio.RingerModeActivity"
@@ -3720,6 +4320,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_audio" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.software.leanback" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".audio.HifiUltrasoundTestActivity"
@@ -3731,6 +4333,8 @@
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_audio" />
             <meta-data android:name="test_required_features" android:value="android.hardware.microphone" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".audio.HifiUltrasoundSpeakerTestActivity"
@@ -3742,6 +4346,8 @@
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_audio" />
             <meta-data android:name="test_required_features" android:value="android.hardware.audio.output" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".audio.AudioOutputDeviceNotificationsActivity"
@@ -3753,6 +4359,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_audio" />
             <meta-data android:name="test_required_features" android:value="android.hardware.audio.output" />
             <meta-data android:name="test_excluded_features" android:value="android.software.leanback" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".audio.AudioInputDeviceNotificationsActivity"
@@ -3764,6 +4372,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_audio" />
             <meta-data android:name="test_required_features" android:value="android.hardware.microphone" />
             <meta-data android:name="test_excluded_features" android:value="android.software.leanback" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".audio.AudioOutputRoutingNotificationsActivity"
@@ -3775,6 +4385,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_audio" />
             <meta-data android:name="test_required_features" android:value="android.hardware.audio.output" />
             <meta-data android:name="test_excluded_features" android:value="android.software.leanback" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".audio.AudioInputRoutingNotificationsActivity"
@@ -3786,6 +4398,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_audio" />
             <meta-data android:name="test_required_features" android:value="android.hardware.microphone" />
             <meta-data android:name="test_excluded_features" android:value="android.software.leanback" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".audio.USBAudioPeripheralAttributesActivity"
@@ -3798,6 +4412,8 @@
             <meta-data android:name="test_required_features" android:value="android.hardware.usb.host" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch:android.hardware.type.automotive" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".audio.USBAudioPeripheralNotificationsTest"
@@ -3810,6 +4426,8 @@
             <meta-data android:name="test_required_features" android:value="android.hardware.usb.host" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch:android.hardware.type.automotive" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".audio.USBAudioPeripheralPlayActivity"
@@ -3822,6 +4440,8 @@
             <meta-data android:name="test_required_features" android:value="android.hardware.usb.host" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch:android.hardware.type.automotive" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".audio.USBAudioPeripheralRecordActivity"
@@ -3834,6 +4454,8 @@
             <meta-data android:name="test_required_features" android:value="android.hardware.usb.host" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch:android.hardware.type.automotive" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".audio.USBAudioPeripheralButtonsActivity"
@@ -3846,6 +4468,8 @@
             <meta-data android:name="test_required_features" android:value="android.hardware.usb.host" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch:android.hardware.type.automotive" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".audio.USBRestrictRecordAActivity"
@@ -3858,6 +4482,8 @@
             <meta-data android:name="test_required_features" android:value="android.hardware.usb.host" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch:android.hardware.type.automotive" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".audio.ProAudioActivity"
@@ -3868,6 +4494,8 @@
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_audio" />
             <meta-data android:name="test_required_features" android:value="android.hardware.usb.host:android.hardware.audio.pro" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!-- ProAudio test invokes the "Loopback" App -->
@@ -3883,6 +4511,8 @@
             <meta-data android:name="test_required_features" android:value="android.hardware.microphone:android.hardware.audio.output" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.watch:android.hardware.type.television" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".audio.MidiActivity"
@@ -3894,6 +4524,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_audio" />
             <meta-data android:name="test_required_features"
                 android:value="android.hardware.usb.host:android.software.midi" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".audio.NDKMidiActivity"
@@ -3905,6 +4537,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_audio" />
             <meta-data android:name="test_required_features"
                 android:value="android.hardware.usb.host:android.software.midi" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <service android:name="com.android.midi.MidiEchoTestService"
@@ -3924,6 +4558,8 @@
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_audio" />
             <meta-data android:name="test_required_features" android:value="android.hardware.microphone:android.hardware.audio.output" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".audio.AudioFrequencySpeakerActivity"
@@ -3934,6 +4570,8 @@
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_audio" />
             <meta-data android:name="test_required_features" android:value="android.hardware.audio.output:android.hardware.usb.host" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".audio.AudioFrequencyMicActivity"
@@ -3944,6 +4582,8 @@
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_audio" />
             <meta-data android:name="test_required_features" android:value="android.hardware.microphone:android.hardware.audio.output:android.hardware.usb.host" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".audio.AudioFrequencyUnprocessedActivity"
@@ -3954,6 +4594,8 @@
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_audio" />
             <meta-data android:name="test_required_features" android:value="android.hardware.microphone:android.hardware.usb.host" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".audio.AudioFrequencyVoiceRecognitionActivity"
@@ -3964,6 +4606,8 @@
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_audio" />
             <meta-data android:name="test_required_features" android:value="android.hardware.microphone:android.hardware.usb.host" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".audio.AudioAEC"
@@ -3974,6 +4618,8 @@
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_audio" />
             <meta-data android:name="test_required_features" android:value="android.hardware.microphone:android.hardware.audio.output" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <service android:name=".tv.MockTvInputService"
@@ -3994,6 +4640,7 @@
         </receiver>
 
         <activity android:name=".car.CarDockTestActivity"
+                android:exported="true"
                 android:label="@string/car_dock_test">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -4002,7 +4649,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_car" />
             <meta-data android:name="test_excluded_features"
                        android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.watch:android.hardware.type.automotive" />
-
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".car.CarDockActivity"
@@ -4013,10 +4661,13 @@
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!-- See explaination in CarDockTestActivity.java -->
         <activity-alias android:name=".car.CarDockActivity1"
+                android:exported="true"
             android:targetActivity=".car.CarDockActivity" >
             <meta-data
                 android:name="android.dock_home"
@@ -4030,6 +4681,7 @@
 
         <activity-alias android:name=".car.CarDockActivity2"
             android:targetActivity=".car.CarDockActivity"
+                android:exported="true"
             android:enabled="false" >
             <meta-data
                 android:name="android.dock_home"
@@ -4042,6 +4694,7 @@
         </activity-alias>
 
         <activity android:name=".car.GearSelectionTestActivity"
+                android:exported="true"
                 android:label="@string/gear_selection_test">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -4051,9 +4704,12 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.type.automotive"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".car.NightModeTestActivity"
+                android:exported="true"
                 android:label="@string/night_mode_test">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -4063,9 +4719,12 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.type.automotive"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".car.ParkingBrakeOnTestActivity"
+                android:exported="true"
                 android:label="@string/parking_brake_on_test">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -4075,6 +4734,8 @@
             <meta-data
                 android:name="test_required_features"
                 android:value="android.hardware.type.automotive"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <!-- 6DoF sensor test -->
@@ -4086,10 +4747,14 @@
                 <category android:name="android.cts.intent.category.MANUAL_TEST"/>
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_sensors"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
         <activity
                 android:name="com.android.cts.verifier.sensors.sixdof.Activities.TestActivity"
                 android:label="@string/title_activity_cts">
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".voicemail.VoicemailBroadcastActivity"
@@ -4114,6 +4779,8 @@
             <meta-data
                 android:name="test_required_configs"
                 android:value="config_voice_capable"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <receiver android:name=".voicemail.VoicemailBroadcastReceiver">
@@ -4139,6 +4806,8 @@
             <meta-data
                 android:name="test_required_configs"
                 android:value="config_voice_capable"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity
@@ -4158,6 +4827,8 @@
             <meta-data
                 android:name="test_required_configs"
                 android:value="config_voice_capable"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <service android:name=".dialer.DialerCallTestService"
@@ -4185,6 +4856,8 @@
             <meta-data
                 android:name="test_required_configs"
                 android:value="config_voice_capable"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity
@@ -4204,6 +4877,8 @@
             <meta-data
                 android:name="test_required_configs"
                 android:value="config_voice_capable"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity
@@ -4223,6 +4898,8 @@
             <meta-data
                 android:name="test_required_configs"
                 android:value="config_voice_capable"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity
@@ -4242,6 +4919,8 @@
             <meta-data
                 android:name="test_required_configs"
                 android:value="config_voice_capable"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <service
@@ -4270,6 +4949,8 @@
             <meta-data
                 android:name="test_required_configs"
                 android:value="config_voice_capable"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity
@@ -4289,6 +4970,8 @@
             <meta-data
                 android:name="test_required_configs"
                 android:value="config_voice_capable"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
             </activity>
 
         <activity
@@ -4308,6 +4991,8 @@
             <meta-data
                 android:name="test_required_configs"
                 android:value="config_voice_capable"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity
@@ -4327,10 +5012,45 @@
             <meta-data
                 android:name="test_required_configs"
                 android:value="config_voice_capable"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
+
+        <activity android:name=".telecom.TelecomDefaultDialerTestActivity"
+                  android:label="@string/telecom_default_dialer_test_title">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+
+            <meta-data
+                android:name="test_category"
+                android:value="@string/test_category_telecom"/>
+            <meta-data
+                android:name="test_required_features"
+                android:value="android.hardware.telephony"/>
+            <meta-data
+                android:name="test_required_configs"
+                android:value="config_voice_capable"/>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
+        </activity>
+
+        <activity android:name=".telecom.CtsVerifierInCallUi"
+                  android:label="@string/telecom_in_call_ui_label">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".managedprovisioning.LockscreenMessageTestActivity"
-            android:label="@string/device_owner_customize_lockscreen_message" />
+            android:label="@string/device_owner_customize_lockscreen_message" >
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
+        </activity>
 
         <service android:name="com.android.cts.verifier.telecom.CtsConnectionService"
             android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE" >
@@ -4353,6 +5073,8 @@
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_instant_apps" />
             <meta-data android:name="test_excluded_features" android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.automotive" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
         <activity android:name=".instantapps.RecentAppsTestActivity"
                  android:label="@string/ia_recents">
@@ -4362,6 +5084,8 @@
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_instant_apps" />
             <meta-data android:name="test_excluded_features" android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.automotive" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
         <activity android:name=".instantapps.AppInfoTestActivity"
                  android:label="@string/ia_app_info">
@@ -4372,6 +5096,8 @@
             <meta-data android:name="test_category" android:value="@string/test_category_instant_apps" />
             <meta-data android:name="test_excluded_features"
                 android:value="android.hardware.type.television:android.software.leanback:android.hardware.type.automotive" />
+            <meta-data android:name="display_mode"
+                       android:value="multi_display_mode" />
         </activity>
 
         <activity android:name=".displaycutout.DisplayCutoutTestActivity"
@@ -4381,6 +5107,8 @@
                 <category android:name="android.cts.intent.category.MANUAL_TEST" />
             </intent-filter>
             <meta-data android:name="test_category" android:value="@string/test_category_display_cutout" />
+            <meta-data android:name="display_mode"
+                       android:value="single_display_mode" />
         </activity>
     </application>
 
diff --git a/apps/CtsVerifier/jni/audio_loopback/Android.bp b/apps/CtsVerifier/jni/audio_loopback/Android.bp
index 29b7e13..ad09fb5 100644
--- a/apps/CtsVerifier/jni/audio_loopback/Android.bp
+++ b/apps/CtsVerifier/jni/audio_loopback/Android.bp
@@ -8,6 +8,7 @@
         "frameworks/av/media/ndk/include",
         "system/core/include/cutils",
     ],
+    header_libs: ["jni_headers"],
     shared_libs: [
         "libaaudio",
         "liblog",
@@ -17,6 +18,8 @@
     cflags: [
         "-Werror",
         "-Wall",
+        // For slCreateEngine
+        "-Wno-deprecated",
     ],
     sdk_version: "current",
 }
diff --git a/apps/CtsVerifier/jni/midi/Android.bp b/apps/CtsVerifier/jni/midi/Android.bp
index f437360..0928406 100644
--- a/apps/CtsVerifier/jni/midi/Android.bp
+++ b/apps/CtsVerifier/jni/midi/Android.bp
@@ -25,6 +25,7 @@
         "frameworks/av/media/ndk/include",
         "system/core/include/cutils",
     ],
+    header_libs: ["jni_headers"],
     sdk_version: "current",
     stl: "libc++_static",
     shared_libs: [
diff --git a/apps/CtsVerifier/jni/verifier/Android.bp b/apps/CtsVerifier/jni/verifier/Android.bp
index e34e86f..b5665a9 100644
--- a/apps/CtsVerifier/jni/verifier/Android.bp
+++ b/apps/CtsVerifier/jni/verifier/Android.bp
@@ -22,6 +22,7 @@
     ],
     sdk_version: "current",
     stl: "libc++_static",
+    header_libs: ["jni_headers"],
     shared_libs: ["liblog"],
     cflags: [
         "-Wall",
diff --git a/apps/CtsVerifier/res/layout/display_mode_switch.xml b/apps/CtsVerifier/res/layout/display_mode_switch.xml
new file mode 100644
index 0000000..6116989
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/display_mode_switch.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2020 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.
+-->
+
+<!-- Switch button of the display modes, including unfolded(OFF) and folded(ON)
+     mode, for foldable test plan.
+-->
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="match_parent"
+    android:orientation="horizontal" >
+  <Switch
+      android:id="@+id/switch_button"
+      android:text="Folded"
+      android:textOn="ON"
+      android:textOff="OFF"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:layout_centerHorizontal="true"
+      android:layout_centerVertical="true" />
+</RelativeLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/incall_screen.xml b/apps/CtsVerifier/res/layout/incall_screen.xml
new file mode 100644
index 0000000..1f5fba6
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/incall_screen.xml
@@ -0,0 +1,41 @@
+<!--
+  ~ Copyright (C) 2020 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.
+  -->
+
+<ScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <LinearLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+        <TextView
+            android:id="@+id/incoming_call_number"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content">
+        </TextView>
+
+        <Button
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerInParent="true"
+            android:id="@+id/telecom_default_dialer_end_button"
+            android:text="@string/telecom_default_dialer_end_button">
+        </Button>
+    </LinearLayout>
+</ScrollView>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/telecom_default_dialer.xml b/apps/CtsVerifier/res/layout/telecom_default_dialer.xml
new file mode 100644
index 0000000..8fb53d0
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/telecom_default_dialer.xml
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2020 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.
+  -->
+
+<ScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+    <LinearLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/telecom_default_dialer_test_info"/>
+
+        <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/js_padding"
+            android:layout_marginBottom="@dimen/js_padding">
+
+            <ImageView
+                android:id="@+id/step_1_status"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:src="@drawable/fs_indeterminate"
+                android:layout_marginRight="@dimen/js_padding"
+                android:layout_alignParentStart="true"
+                android:layout_alignParentTop="true" />
+            <TextView
+                android:id="@+id/step_1_instructions"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/telecom_default_dialer_step_1"
+                android:textSize="16dp"
+                android:layout_alignParentRight="true"
+                android:layout_alignParentTop="true"
+                android:layout_toRightOf="@id/step_1_status" />
+            <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentRight="true"
+                android:layout_below="@id/step_1_instructions"
+                android:layout_marginLeft="20dip"
+                android:layout_marginRight="20dip"
+                android:layout_toRightOf="@id/step_1_status"
+                android:id="@+id/telecom_default_dialer_set_third_party_dialer_button"
+                android:text="@string/telecom_default_dialer_set_third_party_dialer_button"/>
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/js_padding"
+            android:layout_marginBottom="@dimen/js_padding">
+
+            <ImageView
+                android:id="@+id/step_2_status"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:src="@drawable/fs_indeterminate"
+                android:layout_marginRight="@dimen/js_padding"
+                android:layout_alignParentStart="true"
+                android:layout_alignParentTop="true" />
+            <TextView
+                android:id="@+id/step_2_instructions"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/telecom_default_dialer_step_2"
+                android:textSize="16dp"
+                android:layout_alignParentRight="true"
+                android:layout_alignParentTop="true"
+                android:layout_toRightOf="@id/step_2_status" />
+            <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentRight="true"
+                android:layout_below="@id/step_2_instructions"
+                android:layout_marginLeft="20dip"
+                android:layout_marginRight="20dip"
+                android:layout_toRightOf="@id/step_2_status"
+                android:id="@+id/telecom_confirm_lock_screen"
+                android:text="@string/telecom_confirm_lock_screen"/>
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/js_padding"
+            android:layout_marginBottom="@dimen/js_padding">
+
+            <ImageView
+                android:id="@+id/step_3_status"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:src="@drawable/fs_indeterminate"
+                android:layout_marginRight="@dimen/js_padding"
+                android:layout_alignParentStart="true"
+                android:layout_alignParentTop="true" />
+            <TextView
+                android:id="@+id/step_3_instructions"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/telecom_default_dialer_step_3"
+                android:textSize="16dp"
+                android:layout_alignParentRight="true"
+                android:layout_alignParentTop="true"
+                android:layout_toRightOf="@id/step_3_status" />
+            <Button
+                android:id="@+id/telecom_default_dialer_lock_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_below="@id/step_3_instructions"
+                android:layout_marginLeft="20dip"
+                android:layout_marginRight="20dip"
+                android:layout_toRightOf="@id/step_3_status"
+                android:text="@string/telecom_default_dialer_lock_button"/>
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/js_padding"
+            android:layout_marginBottom="@dimen/js_padding">
+
+            <ImageView
+                android:id="@+id/step_4_status"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:src="@drawable/fs_indeterminate"
+                android:layout_marginRight="@dimen/js_padding"
+                android:layout_alignParentStart="true"
+                android:layout_alignParentTop="true" />
+            <TextView
+                android:id="@+id/step_4_instructions"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/telecom_default_dialer_step_4"
+                android:textSize="16dp"
+                android:layout_alignParentRight="true"
+                android:layout_alignParentTop="true"
+                android:layout_toRightOf="@id/step_4_status" />
+            <Button
+                android:id="@+id/telecom_default_dialer_confirm_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentRight="true"
+                android:layout_below="@id/step_4_instructions"
+                android:layout_marginLeft="20dip"
+                android:layout_marginRight="20dip"
+                android:layout_toRightOf="@id/step_4_status"
+                android:text="@string/telecom_default_dialer_confirm_button"/>
+        </RelativeLayout>
+
+        <include layout="@layout/pass_fail_buttons" />
+    </LinearLayout>
+</ScrollView>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/menu/test_list_menu.xml b/apps/CtsVerifier/res/menu/test_list_menu.xml
index 20e3cc9..2c104a0 100644
--- a/apps/CtsVerifier/res/menu/test_list_menu.xml
+++ b/apps/CtsVerifier/res/menu/test_list_menu.xml
@@ -1,7 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:id="@+id/switch_item"
+        android:title="@string/view"
+        android:actionLayout="@layout/display_mode_switch"
+        android:showAsAction="ifRoom" />
     <item android:id="@+id/clear"
-          android:icon="@android:drawable/ic_menu_delete" 
+          android:icon="@android:drawable/ic_menu_delete"
           android:title="@string/clear"
           android:showAsAction="ifRoom" />
     <item android:id="@+id/export"
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index 899750a..a0377a1 100755
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -322,7 +322,7 @@
     <string name="biometric_test_set_user_authentication_biometric_or_credential_signature_label">4f: Signature, Biometric|Credential</string>
     <string name="biometric_test_set_user_authentication_credential_mac_label">4g: MAC, Credential</string>
     <string name="biometric_test_set_user_authentication_biometric_mac_label">4h: MAC, Biometric</string>
-    <string name="biometric_test_set_user_authentication_biometric_or_credential_mac_label">4h: MAC, Biometric|Credential</string>
+    <string name="biometric_test_set_user_authentication_biometric_or_credential_mac_label">4i: MAC, Biometric|Credential</string>
     <string name="biometric_test_set_user_authentication_credential_instructions">This test checks the correctness of the KeyGenParameterSpec.Builder#setUserAuthenticationParameters(int, int) API for AUTH_DEVICE_CREDENTIAL.
         Buttons for completed tasks will become invisible. It\'s normal for buttons to be disabled for a few seconds during this test.</string>
     <string name="biometric_test_set_user_authentication_biometric_instructions">This test checks the correctness of the KeyGenParameterSpec.Builder#setUserAuthenticationParameters(int, int) API for AUTH_BIOMETRIC_STRONG.
@@ -2590,10 +2590,12 @@
     </string>
     <string name="provisioning_byod_pattern_work_challenge">Confirm pattern lock test</string>
     <string name="provisioning_byod_pattern_work_challenge_description">
-        This test verifies that when a work pattern lock is set, a work app can open correctly.
+        This test verifies that when a work pattern lock is set, a work app can open correctly.\n
 
         1. Verify that you get sent to the page for Choosing a new work lock.\n
         2. Set a pattern lock.\n
+        Some devices have the pattern lock option disabled and it will not show up in the list.\n
+        If that\'s the case then mark the test as passed.\n
         3. Press the power button to turn the screen off and then back on and swipe to unlock.\n
         4. Open a work app.\n
         5. Verify that a screen asking you for your work credentials is shown.\n
@@ -3923,8 +3925,8 @@
         Email: someone@example.com
     </string>
     <string name="policy_transparency_update_button_label">Update</string>
-    <string name="dummy_input_method_label">Dummy input method</string>
-    <string name="dummy_accessibility_service_label">Dummy accessibility service</string>
+    <string name="test_input_method_label">Test input method</string>
+    <string name="test_accessibility_service_label">Test accessibility service</string>
     <string name="policy_transparency_test_instructions">
         1. <xliff:g id="set_step" example="Set policy by turning the switch on">%1$s</xliff:g>\n
         2. Open Settings app by clicking the "Open settings" button below. Note that this will open the personal Settings app. If this device has the work settings in a different app or screen, then navigate there, ignoring the button if necessary.\n
@@ -4049,21 +4051,21 @@
     <string name="password_quality_complex">Complex</string>
     <string name="set_permitted_accessibility_services">Set permitted accessibility services</string>
     <string name="permitted_accessibility_services_set_step">
-        Check that \'Dummy Accessibility service\' is not enabled in Settings and disallow \'Dummy Accessibility service\' from permitted accessibility services by turning on
+        Check that \'Test Accessibility service\' is not enabled in Settings and disallow \'Test Accessibility service\' from permitted accessibility services by turning on
         the switch below.
     </string>
     <string name="set_permitted_accessibility_services_action">
-        Enabling \'Dummy Accessibility service\' in the list of accessibility services
+        Enabling \'Test Accessibility service\' in the list of accessibility services
     </string>
     <string name="set_permitted_accessibility_services_widget_label">
         Allow only system accessibility services:
     </string>
     <string name="set_permitted_input_methods">Set permitted input methods</string>
     <string name="permitted_input_methods_set_step">
-        Check that \'Dummy Input method\', along with all other non-system apps, are not enabled in Settings for the managed profile (they may be enabled for the primary profile). Then disallow \'Dummy Input method\' from permitted input methods by turning on the switch below.
+        Check that \'Test Input method\', along with all other non-system apps, are not enabled in Settings for the managed profile (they may be enabled for the primary profile). Then disallow \'Test Input method\' from permitted input methods by turning on the switch below.
     </string>
     <string name="set_permitted_input_methods_action">
-        Enabling \'Dummy Input method\' in the list of input methods (make sure you are enabling it for the managed profile, not primary profile)
+        Enabling \'Test Input method\' in the list of input methods (make sure you are enabling it for the managed profile, not primary profile)
     </string>
     <string name="set_permitted_input_methods_widget_label">
         Allow only system input methods:
@@ -5411,6 +5413,33 @@
         UI when prompted.
     </string>
     <string name="telecom_incoming_self_mgd_place_call_button">Start Self-Managed Call</string>
+    <string name="telecom_default_dialer_test_title">Default Dialer Test</string>
+    <string name="telecom_default_dialer_test_info">
+        This test verifies that a third party dialer can show an incoming call screen when the
+        device is locked.
+    </string>
+    <string name="telecom_default_dialer_step_1">
+        Click the button below to set CtsVerifier as the default dialer.
+    </string>
+    <string name="telecom_default_dialer_set_third_party_dialer_button">
+        Set third party dialer
+    </string>
+    <string name="telecom_default_dialer_step_2">
+        Click the button to make sure that this phone is secured with a lock screen.
+    </string>
+    <string name="telecom_confirm_lock_screen">Confirm lock screen</string>
+    <string name="telecom_default_dialer_step_3">
+        Click the button below to lock the phone and then call this device. Answer the incoming call
+        in the UI when prompted without unlock the phone.
+    </string>
+    <string name="telecom_default_dialer_lock_button">Lock phone and dail</string>
+    <string name="telecom_default_dialer_step_4">
+        Click the button below to confirm that the ongoing incoming call was answered when the
+        device is locked.
+    </string>
+    <string name="telecom_default_dialer_end_button">End call and confirm</string>
+    <string name="telecom_default_dialer_confirm_button">Confirm</string>
+    <string name="telecom_in_call_ui_label">CtsVerifierInCallUi</string>
     <!-- Strings for SetNewPasswordComplexityTest -->
     <string name="set_complexity_test_title">Set New Password Complexity Test</string>
     <string name="set_complexity_test_message">
diff --git a/apps/CtsVerifier/res/xml/dummy_method.xml b/apps/CtsVerifier/res/xml/test_method.xml
similarity index 100%
rename from apps/CtsVerifier/res/xml/dummy_method.xml
rename to apps/CtsVerifier/res/xml/test_method.xml
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/ArrayTestListAdapter.java b/apps/CtsVerifier/src/com/android/cts/verifier/ArrayTestListAdapter.java
index 29440f0..e9a6435 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/ArrayTestListAdapter.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/ArrayTestListAdapter.java
@@ -31,6 +31,9 @@
 
     public ArrayTestListAdapter(Context context) {
         super(context);
+        // To identify that the test list items are not from ManifestTestListAdapter, which provides
+        // test data for foldable tests.
+        adapterFromManifest = false;
     }
 
     public void add(TestListItem item) {
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/ManifestTestListAdapter.java b/apps/CtsVerifier/src/com/android/cts/verifier/ManifestTestListAdapter.java
index 069964a..f9601de 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/ManifestTestListAdapter.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/ManifestTestListAdapter.java
@@ -16,6 +16,9 @@
 
 package com.android.cts.verifier;
 
+import static com.android.cts.verifier.TestListActivity.sCurrentDisplayMode;
+import static com.android.cts.verifier.TestListActivity.sInitialLaunch;
+
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
@@ -27,6 +30,8 @@
 import android.util.Log;
 import android.widget.ListView;
 
+import com.android.cts.verifier.TestListActivity.DisplayMode;
+
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -55,6 +60,15 @@
  *             </intent-filter>
  *         </pre>
  *     </li>
+ *     <li>REQUIRED: Add a meta data attribute to indicate which display modes of tests the activity
+ *         should belong to. "single_display_mode" indicates a test is only needed to run on the
+ *         main display mode (i.e. unfolded), and "multi_display_mode" indicates a test is required
+ *         to run under both modes (i.e. both folded and unfolded).If you don't add this attribute,
+ *         your test will show up in both unfolded and folded modes.
+ *         <pre>
+ *             <meta-data android:name="display_mode" android:value="multi_display_mode" />
+ *         </pre>
+ *     </li>
  *     <li>OPTIONAL: Add a meta data attribute to indicate what category of tests the activity
  *         should belong to. If you don't add this attribute, your test will show up in the
  *         "Other" tests category.
@@ -107,6 +121,10 @@
 
     private static final String TEST_REQUIRED_CONFIG_META_DATA = "test_required_configs";
 
+    private static final String TEST_DISPLAY_MODE_META_DATA = "display_mode";
+
+    private static final String CONFIG_NO_EMULATOR = "config_no_emulator";
+
     private static final String CONFIG_VOICE_CAPABLE = "config_voice_capable";
 
     private static final String CONFIG_HAS_RECENTS = "config_has_recents";
@@ -117,6 +135,14 @@
 
     private static final String CONFIG_QUICK_SETTINGS_SUPPORTED = "config_quick_settings_supported";
 
+    /** The config to represent that a test is only needed to run in the main display mode
+     * (i.e. unfolded) */
+    private static final String SINGLE_DISPLAY_MODE = "single_display_mode";
+
+    /** The config to represent that a test is needed to run in the multiple display modes
+     * (i.e. both unfolded and folded) */
+    private static final String MULTIPLE_DISPLAY_MODE = "multi_display_mode";
+
     private final HashSet<String> mDisabledTests;
 
     private Context mContext;
@@ -131,6 +157,15 @@
         for (int i = 0; i < disabledTestArray.length; i++) {
             mDisabledTests.add(disabledTestArray[i]);
         }
+
+        // Configs to distinct that the adapter is for top-level tests or subtests.
+        if (testParent == null) {
+            // For top-level tests.
+            hasTestParentInManifestAdapter = false;
+        } else {
+            hasTestParentInManifestAdapter = true;
+        }
+        adapterFromManifest = true;
     }
 
     public ManifestTestListAdapter(Context context, String testParent) {
@@ -139,22 +174,40 @@
 
     @Override
     protected List<TestListItem> getRows() {
+        // When launching at the first time or after killing the process, needs to fetch the
+        // test items of all display modes as the bases for switching.
+        if (!sInitialLaunch) {
+            return getRowsWithDisplayMode(sCurrentDisplayMode);
+        }
 
+        List<TestListItem> allRows = new ArrayList<TestListItem>();
+        for (DisplayMode mode: DisplayMode.values()) {
+            allRows = getRowsWithDisplayMode(mode.toString());
+            mDisplayModesTests.put(mode.toString(), allRows);
+        }
+        return allRows;
+    }
+
+    /**
+     * Gets all rows based on the specific display mode.
+     *
+     * @param mode Given display mode.
+     * @return A list containing all test itmes in the given display mode.
+     */
+    private List<TestListItem> getRowsWithDisplayMode (String mode) {
         /*
          * 1. Get all the tests belonging to the test parent.
          * 2. Get all the tests keyed by their category.
          * 3. Flatten the tests and categories into one giant list for the list view.
          */
-
+        List<TestListItem> allRows = new ArrayList<TestListItem>();
         List<ResolveInfo> infos = getResolveInfosForParent();
         Map<String, List<TestListItem>> testsByCategory = getTestsByCategory(infos);
 
         List<String> testCategories = new ArrayList<String>(testsByCategory.keySet());
         Collections.sort(testCategories);
-
-        List<TestListItem> allRows = new ArrayList<TestListItem>();
         for (String testCategory : testCategories) {
-            List<TestListItem> tests = filterTests(testsByCategory.get(testCategory));
+            List<TestListItem> tests = filterTests(testsByCategory.get(testCategory), mode);
             if (!tests.isEmpty()) {
                 allRows.add(TestListItem.newCategory(testCategory));
                 Collections.sort(tests, Comparator.comparing(item -> item.title));
@@ -203,8 +256,9 @@
             String[] requiredConfigs = getRequiredConfigs(info.activityInfo.metaData);
             String[] excludedFeatures = getExcludedFeatures(info.activityInfo.metaData);
             String[] applicableFeatures = getApplicableFeatures(info.activityInfo.metaData);
+            String displayMode = getDisplayMode(info.activityInfo.metaData);
             TestListItem item = TestListItem.newTest(title, testName, intent, requiredFeatures,
-                     requiredConfigs, excludedFeatures, applicableFeatures);
+                     requiredConfigs, excludedFeatures, applicableFeatures, displayMode);
 
             String testCategory = getTestCategory(mContext, info.activityInfo.metaData);
             addTestToCategory(testsByCategory, testCategory, item);
@@ -281,6 +335,20 @@
         }
     }
 
+    /**
+     * Gets the configuration of the display mode per test. The default value is multi_display_mode.
+     *
+     * @param metaData Given metadata of the display mode.
+     * @return A string representing the display mode of the test.
+     */
+    static String getDisplayMode(Bundle metaData) {
+        if (metaData == null) {
+            return MULTIPLE_DISPLAY_MODE;
+        }
+        String displayMode = metaData.getString(TEST_DISPLAY_MODE_META_DATA);
+        return displayMode == null ? MULTIPLE_DISPLAY_MODE : displayMode;
+    }
+
     static String getTitle(Context context, ActivityInfo activityInfo) {
         if (activityInfo.labelRes != 0) {
             return context.getString(activityInfo.labelRes);
@@ -335,6 +403,20 @@
         if (configs != null) {
             for (String config : configs) {
                 switch (config) {
+                    case CONFIG_NO_EMULATOR:
+                        try {
+                            Method getStringMethod = ClassLoader.getSystemClassLoader()
+                                .loadClass("android.os.SystemProperties")
+                                .getMethod("get", String.class);
+                            String emulatorKernel = (String) getStringMethod.invoke("0",
+                                    "ro.kernel.qemu");
+                            if (emulatorKernel.equals("1")) {
+                                return false;
+                            }
+                        } catch (Exception e) {
+                            Log.e(LOG_TAG, "Exception while checking for emulator support.", e);
+                        }
+                        break;
                     case CONFIG_VOICE_CAPABLE:
                         TelephonyManager telephonyManager = mContext.getSystemService(
                                 TelephonyManager.class);
@@ -384,6 +466,28 @@
         }
         return true;
     }
+
+    /**
+     * Check if the test should be ran by the given display mode.
+     *
+     * @param mode Configs of the display mode.
+     * @param currentMode Given display mode.
+     * @return True if the given display mode matches the configs, otherwise, return false;
+     */
+    private boolean matchDisplayMode(String mode, String currentMode) {
+        if (mode == null) {
+            return false;
+        }
+        switch (mode) {
+            case SINGLE_DISPLAY_MODE:
+                return currentMode.equals(DisplayMode.UNFOLDED.toString());
+            case MULTIPLE_DISPLAY_MODE:
+                return true;
+            default:
+                return false;
+        }
+    }
+
     private boolean getSystemResourceFlag(String key) {
         final Resources systemRes = mContext.getResources().getSystem();
         final int id = systemRes.getIdentifier(key, "bool", "android");
@@ -411,12 +515,15 @@
                 .collect(Collectors.toList());
     }
 
-    List<TestListItem> filterTests(List<TestListItem> tests) {
+    List<TestListItem> filterTests(List<TestListItem> tests, String mode) {
         List<TestListItem> filteredTests = new ArrayList<>();
         for (TestListItem test : tests) {
             if (!hasAnyFeature(test.excludedFeatures) && hasAllFeatures(test.requiredFeatures)
-                    && matchAllConfigs(test.requiredConfigs)) {
+                && matchAllConfigs(test.requiredConfigs)
+                && matchDisplayMode(test.displayMode, mode)) {
                 if (test.applicableFeatures == null || hasAnyFeature(test.applicableFeatures)) {
+                    // Add suffix in test name if the test is in the folded mode.
+                    test.testName = setTestNameSuffix(mode, test.testName);
                     filteredTests.add(test);
                 }
             }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java b/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java
index c8a667b..fa240dd 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java
@@ -16,6 +16,9 @@
 
 package com.android.cts.verifier;
 
+import static com.android.cts.verifier.TestListActivity.sCurrentDisplayMode;
+import static com.android.cts.verifier.TestListAdapter.setTestNameSuffix;
+
 import com.android.compatibility.common.util.ReportLog;
 
 import android.app.AlertDialog;
@@ -162,7 +165,7 @@
 
         @Override
         public String getTestId() {
-            return getClass().getName();
+            return setTestNameSuffix(sCurrentDisplayMode, getClass().getName());
         }
 
         @Override
@@ -235,7 +238,7 @@
 
         @Override
         public String getTestId() {
-            return getClass().getName();
+            return setTestNameSuffix(sCurrentDisplayMode, getClass().getName());
         }
 
         @Override
@@ -307,7 +310,7 @@
 
         @Override
         public String getTestId() {
-            return getClass().getName();
+            return setTestNameSuffix(sCurrentDisplayMode, getClass().getName());
         }
 
         @Override
@@ -483,7 +486,8 @@
     protected static void markSeenInfoDialog(android.app.Activity activity) {
         ContentResolver resolver = activity.getContentResolver();
         ContentValues values = new ContentValues(2);
-        values.put(TestResultsProvider.COLUMN_TEST_NAME, activity.getClass().getName());
+        String activityName = setTestNameSuffix(sCurrentDisplayMode, activity.getClass().getName());
+        values.put(TestResultsProvider.COLUMN_TEST_NAME, activityName);
         values.put(TestResultsProvider.COLUMN_TEST_INFO_SEEN, 1);
         int numUpdated = resolver.update(
                 TestResultsProvider.getTestNameUri(activity), values, null, null);
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/TestListActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/TestListActivity.java
index 11bcf16..a53b8e3 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/TestListActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/TestListActivity.java
@@ -21,6 +21,7 @@
 import android.app.ListActivity;
 import android.content.DialogInterface;
 import android.content.Intent;
+import android.content.SharedPreferences;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
@@ -32,6 +33,8 @@
 import android.view.MenuItem;
 import android.view.View;
 import android.view.Window;
+import android.widget.CompoundButton;
+import android.widget.Switch;
 import android.widget.Toast;
 
 /** Top-level {@link ListActivity} for launching tests and managing results. */
@@ -39,6 +42,34 @@
     private static final int CTS_VERIFIER_PERMISSION_REQUEST = 1;
 
     private static final String TAG = TestListActivity.class.getSimpleName();
+    // Records the current display mode.
+    // Default is unfolded mode, and it will be changed when clicking the switch button.
+    protected static String sCurrentDisplayMode = DisplayMode.UNFOLDED.toString();
+    // Flag of launch app to fetch the unfolded/folded tests in main view from AndroidManifest.xml.
+    protected static boolean sInitialLaunch;
+
+    // Enumerates the display modes, including unfolded and folded.
+    protected enum DisplayMode {
+        UNFOLDED, FOLDED;
+
+        @Override
+        public String toString() {
+            return name().toLowerCase();
+        }
+
+        /**
+         * Coverts the mode as suffix with brackets for test name.
+         *
+         * @return A string containing mode with brackets for folded mode;
+         *         empty string for unfolded mode.
+         */
+        public String asSuffix() {
+            if (name().equals(FOLDED.name())) {
+                return String.format("[%s]", toString());
+            }
+            return "";
+        }
+    }
 
     @Override
     public void onClick (View v) {
@@ -86,6 +117,7 @@
         if (!isTaskRoot()) {
             finish();
         }
+        sInitialLaunch = true;
 
         setTitle(getString(R.string.title_version, Version.getVersionName(this)));
 
@@ -118,6 +150,34 @@
     public boolean onCreateOptionsMenu(Menu menu) {
         MenuInflater inflater = getMenuInflater();
         inflater.inflate(R.menu.test_list_menu, menu);
+
+        // Switch button for unfolded and folded tests.
+        MenuItem item = (MenuItem) menu.findItem(R.id.switch_item);
+        item.setActionView(R.layout.display_mode_switch);
+        Switch displayModeSwitch = item.getActionView().findViewById(R.id.switch_button);
+
+        // Restores the original display mode when launching the app after killing the process.
+        // Otherwise, gets the current display mode to show switch status.
+        boolean isFoldedMode;
+        if (sInitialLaunch) {
+            isFoldedMode = getCurrentDisplayMode().equals(DisplayMode.FOLDED.toString());
+        } else {
+            isFoldedMode = sCurrentDisplayMode.equals(DisplayMode.FOLDED.toString());
+        }
+        displayModeSwitch.setChecked(isFoldedMode);
+
+        displayModeSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(CompoundButton buttonView,
+                boolean isChecked) {
+                if (isChecked) {
+                    sCurrentDisplayMode = DisplayMode.FOLDED.toString();
+                } else {
+                    sCurrentDisplayMode = DisplayMode.UNFOLDED.toString();
+                }
+                handleSwitchItemSelected();
+            }
+        });
         return true;
     }
 
@@ -148,6 +208,12 @@
         new ReportExporter(this, mAdapter).execute();
     }
 
+    // Sets up the flags after switching display mode and reloads tests on UI.
+    private void handleSwitchItemSelected() {
+        setCurrentDisplayMode(sCurrentDisplayMode);
+        mAdapter.loadTestResults();
+    }
+
     private boolean handleMenuItemSelected(int id) {
         if (id == R.id.clear) {
             handleClearItemSelected();
@@ -159,4 +225,25 @@
 
         return true;
     }
-}
+
+    /**
+     * Sets current display mode to sharedpreferences.
+     *
+     * @param mode A string of current display mode.
+     */
+    private void setCurrentDisplayMode(String mode) {
+        SharedPreferences pref = getSharedPreferences(DisplayMode.class.getName(), MODE_PRIVATE);
+        pref.edit().putString(DisplayMode.class.getName(), mode).commit();
+    }
+
+    /**
+     * Gets current display mode from sharedpreferences.
+     *
+     * @return A string of current display mode.
+     */
+    private String getCurrentDisplayMode() {
+        String mode = getSharedPreferences(DisplayMode.class.getName(), MODE_PRIVATE)
+            .getString(DisplayMode.class.getName(), "");
+        return mode;
+    }
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/TestListAdapter.java b/apps/CtsVerifier/src/com/android/cts/verifier/TestListAdapter.java
index 17efb22..0ec8ff1 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/TestListAdapter.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/TestListAdapter.java
@@ -16,8 +16,12 @@
 
 package com.android.cts.verifier;
 
+import static com.android.cts.verifier.TestListActivity.sCurrentDisplayMode;
+import static com.android.cts.verifier.TestListActivity.sInitialLaunch;
+
 import com.android.compatibility.common.util.ReportLog;
 import com.android.compatibility.common.util.TestResultHistory;
+import com.android.cts.verifier.TestListActivity.DisplayMode;
 
 import android.content.ContentResolver;
 import android.content.Context;
@@ -75,11 +79,26 @@
     /** Map from test name to {@link ReportLog}. */
     private final Map<String, ReportLog> mReportLogs = new HashMap<String, ReportLog>();
 
-    /** Map from test name to {@link TestResultHistory}. */
+    /** Map from test name to {@link TestResultHistoryCollection}. */
     private final Map<String, TestResultHistoryCollection> mHistories = new HashMap<>();
 
     private final LayoutInflater mLayoutInflater;
 
+    /** Map from display mode to the list of {@link TestListItem}.
+     *  Records the TestListItem from main view only, including unfolded mode and folded mode
+     *  respectively. */
+    protected Map<String, List<TestListItem>> mDisplayModesTests = new HashMap<>();
+
+    /** Flag to identify the test data from {@link ManifestTestListAdapter}.
+     *  The source of data for the adapter is various, such as ManifestTestListAdapter and
+     *  ArrayTestListAdapter, and the data of foldable tests are from ManifestTestListAdapter. */
+    protected static boolean adapterFromManifest;
+
+    /** Flag to identify the test data in main view from {@link ManifestTestListAdapter}.
+     *  ManifestTestListAdapter provides test data for main view and subtests.
+     *  Getting foldable tests is from main view only. */
+    protected static boolean hasTestParentInManifestAdapter;
+
     /** {@link ListView} row that is either a test category header or a test. */
     public static class TestListItem {
 
@@ -87,7 +106,7 @@
         final String title;
 
         /** Test name with class and test ID to uniquely identify the test. Null for categories. */
-        final String testName;
+        String testName;
 
         /** Intent used to launch the activity from the list. Null for categories. */
         final Intent intent;
@@ -104,11 +123,14 @@
         /** If any of of the features are present the test is meaningful to run. */
         final String[] applicableFeatures;
 
+        /** Configs display mode to run this test. */
+        final String displayMode;
+
         public static TestListItem newTest(Context context, int titleResId, String testName,
-                Intent intent, String[] requiredFeatures, String[] excludedFeatures,
-                String[] applicableFeatures) {
+            Intent intent, String[] requiredFeatures, String[] excludedFeatures,
+            String[] applicableFeatures) {
             return newTest(context.getString(titleResId), testName, intent, requiredFeatures,
-                    excludedFeatures, applicableFeatures);
+                excludedFeatures, applicableFeatures);
         }
 
         public static TestListItem newTest(Context context, int titleResId, String testName,
@@ -125,26 +147,34 @@
 
         public static TestListItem newTest(String title, String testName, Intent intent,
                 String[] requiredFeatures, String[] requiredConfigs, String[] excludedFeatures,
-                String[] applicableFeatures) {
+                String[] applicableFeatures, String displayMode) {
             return new TestListItem(title, testName, intent, requiredFeatures, requiredConfigs,
-                    excludedFeatures, applicableFeatures);
+                    excludedFeatures, applicableFeatures, displayMode);
+        }
+
+        public static TestListItem newTest(String title, String testName, Intent intent,
+            String[] requiredFeatures, String[] requiredConfigs, String[] excludedFeatures,
+            String[] applicableFeatures) {
+            return new TestListItem(title, testName, intent, requiredFeatures, requiredConfigs,
+                excludedFeatures, applicableFeatures, null);
         }
 
         public static TestListItem newTest(String title, String testName, Intent intent,
                 String[] requiredFeatures, String[] excludedFeatures, String[] applicableFeatures) {
-            return new TestListItem(title, testName, intent, requiredFeatures, null, excludedFeatures,
-                    applicableFeatures);
+            return new TestListItem(title, testName, intent, requiredFeatures, null,
+                    excludedFeatures, applicableFeatures, null);
         }
 
         public static TestListItem newTest(String title, String testName, Intent intent,
                 String[] requiredFeatures, String[] excludedFeatures) {
-            return new TestListItem(title, testName, intent, requiredFeatures, null, excludedFeatures,
-                    null);
+            return new TestListItem(title, testName, intent, requiredFeatures, null,
+                    excludedFeatures, null, null);
         }
 
         public static TestListItem newTest(String title, String testName, Intent intent,
                 String[] requiredFeatures) {
-            return new TestListItem(title, testName, intent, requiredFeatures, null, null, null);
+            return new TestListItem(title, testName, intent, requiredFeatures, null, null, null,
+                    null);
         }
 
         public static TestListItem newCategory(Context context, int titleResId) {
@@ -152,24 +182,29 @@
         }
 
         public static TestListItem newCategory(String title) {
-            return new TestListItem(title, null, null, null, null, null, null);
+            return new TestListItem(title, null, null, null, null, null, null, null);
         }
 
         protected TestListItem(String title, String testName, Intent intent,
                 String[] requiredFeatures, String[] excludedFeatures, String[] applicableFeatures) {
-            this(title, testName, intent, requiredFeatures, null, excludedFeatures, applicableFeatures);
+            this(title, testName, intent, requiredFeatures, null, excludedFeatures,
+                    applicableFeatures, null);
         }
 
         protected TestListItem(String title, String testName, Intent intent,
                 String[] requiredFeatures, String[] requiredConfigs, String[] excludedFeatures,
-                String[] applicableFeatures) {
+                String[] applicableFeatures, String displayMode) {
             this.title = title;
+            if (!sInitialLaunch) {
+                testName = setTestNameSuffix(sCurrentDisplayMode, testName);
+            }
             this.testName = testName;
             this.intent = intent;
             this.requiredFeatures = requiredFeatures;
             this.requiredConfigs = requiredConfigs;
             this.excludedFeatures = excludedFeatures;
             this.applicableFeatures = applicableFeatures;
+            this.displayMode = displayMode;
         }
 
         boolean isTest() {
@@ -209,7 +244,19 @@
     class RefreshTestResultsTask extends AsyncTask<Void, Void, RefreshResult> {
         @Override
         protected RefreshResult doInBackground(Void... params) {
-            List<TestListItem> rows = getRows();
+            List<TestListItem> rows;
+            // When initial launch, needs to fetch tests in the unfolded/folded mode
+            // to be stored in mDisplayModesTests as the basis for the future switch.
+            if (sInitialLaunch) {
+                getRows();
+                sInitialLaunch = false;
+            }
+
+            if (checkTestsFromMainView()) {
+                rows = mDisplayModesTests.get(sCurrentDisplayMode);
+            }else {
+                rows = getRows();
+            }
             return getRefreshResults(rows);
         }
 
@@ -369,11 +416,17 @@
 
     @Override
     public int getCount() {
+        if (!sInitialLaunch && checkTestsFromMainView()) {
+            return mDisplayModesTests.get(sCurrentDisplayMode).size();
+        }
         return mRows.size();
     }
 
     @Override
     public TestListItem getItem(int position) {
+        if (checkTestsFromMainView()) {
+            return mDisplayModesTests.get(sCurrentDisplayMode).get(position);
+        }
         return mRows.get(position);
     }
 
@@ -416,6 +469,84 @@
             : null;
     }
 
+    /**
+     * Get test item by the given display mode and position.
+     *
+     * @param mode The display mode.
+     * @param position The position of test.
+     * @return A {@link TestListItem} object containing the test item.
+     */
+    public TestListItem getItem(String mode, int position) {
+        return mDisplayModesTests.get(mode).get(position);
+    }
+
+    /**
+     * Get test item count by the given display mode.
+     *
+     * @param mode The display mode.
+     * @return A count of test items.
+     */
+    public int getCount(String mode){
+        return mDisplayModesTests.get(mode).size();
+    }
+
+    /**
+     * Get test result by the given display mode and position.
+     *
+     * @param mode The display mode.
+     * @param position The position of test.
+     * @return The test item result.
+     */
+    public int getTestResult(String mode, int position) {
+        TestListItem item = mDisplayModesTests.get(mode).get(position);
+        return mTestResults.containsKey(item.testName)
+            ? mTestResults.get(item.testName)
+            : TestResult.TEST_RESULT_NOT_EXECUTED;
+    }
+
+    /**
+     * Get test details by the given display mode and position.
+     *
+     * @param mode The display mode.
+     * @param position The position of test.
+     * @return A string containing the test details.
+     */
+    public String getTestDetails(String mode, int position) {
+        TestListItem item = mDisplayModesTests.get(mode).get(position);
+        return mTestDetails.containsKey(item.testName)
+            ? mTestDetails.get(item.testName)
+            : null;
+    }
+
+    /**
+     * Get test report log by the given display mode and position.
+     *
+     * @param mode The display mode.
+     * @param position The position of test.
+     * @return A {@link ReportLog} object containing the test report log of the test item.
+     */
+    public ReportLog getReportLog(String mode, int position) {
+        TestListItem item = mDisplayModesTests.get(mode).get(position);
+        return mReportLogs.containsKey(item.testName)
+            ? mReportLogs.get(item.testName)
+            : null;
+    }
+
+    /**
+     * Get test result histories by the given display mode and position.
+     *
+     * @param mode The display mode.
+     * @param position The position of test.
+     * @return A {@link TestResultHistoryCollection} object containing the test result histories of
+     *         the test item.
+     */
+    public TestResultHistoryCollection getHistoryCollection(String mode, int position) {
+        TestListItem item = mDisplayModesTests.get(mode).get(position);
+        return mHistories.containsKey(item.testName)
+            ? mHistories.get(item.testName)
+            : null;
+    }
+
     public boolean allTestsPassed() {
         for (TestListItem item : mRows) {
             if (item.isTest() && (!mTestResults.containsKey(item.testName)
@@ -509,4 +640,30 @@
             }
         }
     }
+
+    /**
+     * Sets test name suffix. In the folded mode, the suffix is [folded]; otherwise, it is empty
+     * string.
+     *
+     * @param mode A string of current display mode.
+     * @param name A string of test name.
+     * @return A string of test name with suffix, [folded], in the folded mode.
+     *         A string of input test name in the unfolded mode.
+     */
+    public static String setTestNameSuffix(String mode, String name) {
+        if (name != null && mode.equals(DisplayMode.FOLDED.toString())
+            && !name.endsWith(DisplayMode.FOLDED.asSuffix())){
+            return name + DisplayMode.FOLDED.asSuffix();
+        }
+        return name;
+    }
+
+    /**
+     * Checks if the tests are from main view for foldable tests.
+     *
+     * @return True if the tests from main view, otherwise, return false.
+     */
+    private static boolean checkTestsFromMainView() {
+        return adapterFromManifest && !hasTestParentInManifestAdapter;
+    }
 }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/TestResult.java b/apps/CtsVerifier/src/com/android/cts/verifier/TestResult.java
index 9f867d5..350d58a 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/TestResult.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/TestResult.java
@@ -16,6 +16,9 @@
 
 package com.android.cts.verifier;
 
+import static com.android.cts.verifier.TestListActivity.sCurrentDisplayMode;
+import static com.android.cts.verifier.TestListAdapter.setTestNameSuffix;
+
 import com.android.compatibility.common.util.ReportLog;
 import com.android.compatibility.common.util.TestResultHistory;
 
@@ -94,6 +97,7 @@
 
     public static void addResultData(Intent intent, int testResult, String testName,
             String testDetails, ReportLog reportLog, TestResultHistoryCollection historyCollection) {
+        testName = setTestNameSuffix(sCurrentDisplayMode, testName);
         intent.putExtra(TEST_NAME, testName);
         intent.putExtra(TEST_RESULT, testResult);
         intent.putExtra(TEST_DETAILS, testDetails);
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsProvider.java b/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsProvider.java
index 4bbb12b..c8b1a86 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsProvider.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsProvider.java
@@ -16,6 +16,9 @@
 
 package com.android.cts.verifier;
 
+import static com.android.cts.verifier.TestListActivity.sCurrentDisplayMode;
+import static com.android.cts.verifier.TestListAdapter.setTestNameSuffix;
+
 import android.app.backup.BackupManager;
 import android.content.ContentProvider;
 import android.content.ContentResolver;
@@ -99,7 +102,9 @@
      * @return Uri
      */
     public static Uri getTestNameUri(Context context) {
-        final String testName = context.getClass().getName();
+        String name = context.getClass().getName();
+        name = setTestNameSuffix(sCurrentDisplayMode, name);
+        final String testName = name;
         return Uri.withAppendedPath(getResultContentUri(context), testName);
     }
 
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsReport.java b/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsReport.java
index 0fca13d..3c43953 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsReport.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/TestResultsReport.java
@@ -31,6 +31,7 @@
 import com.android.compatibility.common.util.ReportLog;
 import com.android.compatibility.common.util.TestResultHistory;
 import com.android.compatibility.common.util.TestStatus;
+import com.android.cts.verifier.TestListActivity.DisplayMode;
 import com.android.cts.verifier.TestListAdapter.TestListItem;
 
 import org.xmlpull.v1.XmlSerializer;
@@ -124,51 +125,8 @@
             }
         }
 
-        ICaseResult caseResult = moduleResult.getOrCreateResult(TEST_CASE_NAME);
-        int count = mAdapter.getCount();
-        int notExecutedCount = 0;
-        for (int i = 0; i < count; i++) {
-            TestListItem item = mAdapter.getItem(i);
-            if (item.isTest()) {
-                ITestResult currentTestResult = caseResult.getOrCreateResult(item.testName);
-                TestStatus resultStatus = getTestResultStatus(mAdapter.getTestResult(i));
-                if (resultStatus == null) {
-                    ++notExecutedCount;
-                }
-                currentTestResult.setResultStatus(resultStatus);
-                // TODO: report test details with Extended Device Info (EDI) or CTS metrics
-                String details = mAdapter.getTestDetails(i);
-                currentTestResult.setMessage(details);
-
-                ReportLog reportLog = mAdapter.getReportLog(i);
-                if (reportLog != null) {
-                    currentTestResult.setReportLog(reportLog);
-                }
-
-                TestResultHistoryCollection historyCollection = mAdapter.getHistoryCollection(i);
-                if (historyCollection != null) {
-                    // Get non-terminal prefixes.
-                    Set<String> prefixes = new HashSet<>();
-                    for (TestResultHistory history: historyCollection.asSet()) {
-                        Arrays.stream(history.getTestName().split(":")).reduce(
-                            (total, current) -> { prefixes.add(total);
-                            return total + ":" + current;
-                        });
-                    }
-
-                    // Filter out non-leaf test histories.
-                    List<TestResultHistory> leafTestHistories = new ArrayList<TestResultHistory>();
-                    for (TestResultHistory history: historyCollection.asSet()) {
-                        if (!prefixes.contains(history.getTestName())) {
-                            leafTestHistories.add(history);
-                        }
-                    }
-                    currentTestResult.setTestResultHistories(leafTestHistories);
-                }
-            }
-        }
-        moduleResult.setDone(true);
-        moduleResult.setNotExecuted(notExecutedCount);
+        // Get test result, including test name, result, report log, details and histories.
+        getCaseResult(moduleResult);
 
         return result;
     }
@@ -178,6 +136,50 @@
         return "Report viewing is deprecated. See contents on the SD Card.";
     }
 
+    /**
+     * Get case results per test, including result, report log, details and histories.
+     *
+     * @param IModuleResult The module result bound with {@link IInvocationResult}.
+     */
+    private void getCaseResult(IModuleResult moduleResult) {
+        ICaseResult caseResult = moduleResult.getOrCreateResult(TEST_CASE_NAME);
+        int notExecutedCount = 0;
+        for (DisplayMode mode: DisplayMode.values()) {
+            String displayMode = mode.toString();
+            int count = mAdapter.getCount(displayMode);
+            for (int i = 0; i < count; i++) {
+                TestListItem item = mAdapter.getItem(displayMode, i);
+                if (item.isTest()) {
+                    ITestResult currentTestResult = caseResult.getOrCreateResult(item.testName);
+                    TestStatus resultStatus =
+                        getTestResultStatus(mAdapter.getTestResult(displayMode, i));
+                    if (resultStatus == null) {
+                        ++notExecutedCount;
+                    }
+                    currentTestResult.setResultStatus(resultStatus);
+                    // TODO: report test details with Extended Device Info (EDI) or CTS metrics
+                    String details = mAdapter.getTestDetails(displayMode, i);
+                    currentTestResult.setMessage(details);
+
+                    ReportLog reportLog = mAdapter.getReportLog(displayMode, i);
+                    if (reportLog != null) {
+                        currentTestResult.setReportLog(reportLog);
+                    }
+
+                    TestResultHistoryCollection historyCollection = mAdapter
+                        .getHistoryCollection(displayMode, i);
+                    if (historyCollection != null) {
+                        List<TestResultHistory> leafTestHistories =
+                            getTestResultHistories(historyCollection);
+                        currentTestResult.setTestResultHistories(leafTestHistories);
+                    }
+                }
+            }
+        }
+        moduleResult.setDone(true);
+        moduleResult.setNotExecuted(notExecutedCount);
+    }
+
     private TestStatus getTestResultStatus(int testResult) {
         switch (testResult) {
             case TestResult.TEST_RESULT_PASSED:
@@ -193,4 +195,33 @@
                 throw new IllegalArgumentException("Unknown test result: " + testResult);
         }
     }
+
+    /**
+     * Get test histories per test by filtering out non-leaf histories.
+     *
+     * @param TestResultHistoryCollection The raw test history collection.
+     * @return A list containing test result histories per test.
+     */
+    private List<TestResultHistory> getTestResultHistories(
+        TestResultHistoryCollection historyCollection) {
+        // Get non-terminal prefixes.
+        Set<String> prefixes = new HashSet<>();
+        for (TestResultHistory history : historyCollection.asSet()) {
+            Arrays.stream(history.getTestName().split(":")).reduce(
+                (total, current) -> {
+                    prefixes.add(total);
+                    return total + ":" + current;
+                });
+        }
+
+        // Filter out non-leaf test histories.
+        List<TestResultHistory> leafTestHistories =
+            new ArrayList<TestResultHistory>();
+        for (TestResultHistory history : historyCollection.asSet()) {
+            if (!prefixes.contains(history.getTestName())) {
+                leafTestHistories.add(history);
+            }
+        }
+        return leafTestHistories;
+    }
 }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/admin/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/admin/OWNERS
new file mode 100644
index 0000000..f51c943
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/admin/OWNERS
@@ -0,0 +1,6 @@
+# Bug template url: https://b.corp.google.com/issues/new?component=100560&template=63204
+alexkershaw@google.com
+eranm@google.com
+rubinxu@google.com
+sandness@google.com
+pgrafov@google.com
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/admin/ScreenLockTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/admin/ScreenLockTestActivity.java
index 41217a6..adae240 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/admin/ScreenLockTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/admin/ScreenLockTestActivity.java
@@ -96,6 +96,11 @@
     @Override
     protected void onDestroy() {
         super.onDestroy();
+        if (mDevicePolicyManager.isAdminActive(
+                DeviceAdminTestReceiver.getReceiverComponentName())) {
+            mDevicePolicyManager.removeActiveAdmin(
+                DeviceAdminTestReceiver.getReceiverComponentName());
+        }
         unregisterReceiver(mReceiver);
     }
 
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/admin/tapjacking/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/admin/tapjacking/OWNERS
new file mode 100644
index 0000000..e303d2b
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/admin/tapjacking/OWNERS
@@ -0,0 +1,3 @@
+# Bug component: 142675
+set noparent
+suprabh@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/audio/OWNERS
new file mode 100644
index 0000000..eb8de3b
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/OWNERS
@@ -0,0 +1,5 @@
+# Bug component: 48436
+elaurent@google.com
+pmclean@google.com
+philburk@google.com
+per-file HifiUltrasound*.java = xlythe@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/biometrics/AbstractUserAuthenticationSignatureTest.java b/apps/CtsVerifier/src/com/android/cts/verifier/biometrics/AbstractUserAuthenticationSignatureTest.java
index 4708620..92e000c 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/biometrics/AbstractUserAuthenticationSignatureTest.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/biometrics/AbstractUserAuthenticationSignatureTest.java
@@ -33,7 +33,7 @@
             boolean useStrongBox) throws Exception {
         KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder(
                 keyName, KeyProperties.PURPOSE_SIGN);
-        builder.setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
+        builder.setDigests(KeyProperties.DIGEST_SHA256)
                 .setAlgorithmParameterSpec(new ECGenParameterSpec("secp256r1"))
                 .setUserAuthenticationRequired(true)
                 .setIsStrongBoxBacked(useStrongBox)
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/biometrics/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/biometrics/OWNERS
new file mode 100644
index 0000000..d791f40
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/biometrics/OWNERS
@@ -0,0 +1,6 @@
+# Bug component: 114777
+curtislb@google.com
+ilyamaty@google.com
+jaggies@google.com
+joshmccloskey@google.com
+kchyn@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/biometrics/SensorConfigurationTest.java b/apps/CtsVerifier/src/com/android/cts/verifier/biometrics/SensorConfigurationTest.java
index b40a1ac..f40d41d 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/biometrics/SensorConfigurationTest.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/biometrics/SensorConfigurationTest.java
@@ -16,6 +16,7 @@
 
 package com.android.cts.verifier.biometrics;
 
+import android.content.res.Resources;
 import android.hardware.biometrics.BiometricManager.Authenticators;
 import android.os.Bundle;
 import android.util.Log;
@@ -55,8 +56,9 @@
     }
 
     private boolean isSensorConfigurationValid() {
-        final String config[] = getResources()
-                .getStringArray(com.android.internal.R.array.config_biometric_sensors);
+        final Resources res = Resources.getSystem();
+        final int resId = res.getIdentifier("config_biometric_sensors", "array", "android");
+        final String config[] = res.getStringArray(resId);
 
         // Device configuration should be formatted as "ID:Modality:Strength", where
         // 1) IDs are unique, starting at 0 and increasing by 1 for each new authenticator.
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BluetoothTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BluetoothTestActivity.java
index 5c0c55e..7db6368 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BluetoothTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BluetoothTestActivity.java
@@ -73,6 +73,10 @@
                   "com.android.cts.verifier.bluetooth.BleInsecureServerTestListActivity");
             disabledTestArray.add(
                   "com.android.cts.verifier.bluetooth.BleSecureServerTestListActivity");
+            disabledTestArray.add(
+                  "com.android.cts.verifier.bluetooth.BleCocSecureServerTestListActivity");
+            disabledTestArray.add(
+                  "com.android.cts.verifier.bluetooth.BleCocInsecureServerTestListActivity");
         }
         setTestListAdapter(new ManifestTestListAdapter(this, getClass().getName(),
                 disabledTestArray.toArray(new String[disabledTestArray.size()])));
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/OWNERS
new file mode 100644
index 0000000..52531aa
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/OWNERS
@@ -0,0 +1,2 @@
+# Bug component: 27441
+zachoverflow@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/camera/OWNERS
new file mode 100644
index 0000000..8ebd7b8
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/OWNERS
@@ -0,0 +1,2 @@
+# Bug component: 41727
+include platform/frameworks/av:/camera/OWNER
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
index 83a6724..7ce97fe 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
@@ -1174,7 +1174,7 @@
                     CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE);
             boolean isFixedFocusLens = minFocusDistance != null && minFocusDistance == 0.0;
             if (doAF && isFixedFocusLens) {
-                // Send a dummy result back for the code that is waiting for this message to see
+                // Send a fake result back for the code that is waiting for this message to see
                 // that AF has converged.
                 Logt.i(TAG, "Ignoring request for AF on fixed-focus camera");
                 mSocketRunnableObj.sendResponse("afResult", "0.0");
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/video/CameraVideoActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/video/CameraVideoActivity.java
index 30df08b..f38ba85 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/video/CameraVideoActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/video/CameraVideoActivity.java
@@ -26,6 +26,7 @@
 import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CameraManager;
+import android.hardware.cts.helpers.CameraUtils;
 import android.media.CamcorderProfile;
 import android.media.MediaPlayer;
 import android.media.MediaRecorder;
@@ -87,6 +88,7 @@
     private int mCurrentCameraId = -1;
     private Camera mCamera;
     private boolean mIsExternalCamera;
+    private int mVideoFrameRate = -1;
 
     private MediaRecorder mMediaRecorder;
 
@@ -183,6 +185,14 @@
         return Math.max(BIT_RATE_MIN, Math.min(BIT_RATE_MAX, rate));
     }
 
+    private int getVideoFrameRate() {
+        return mVideoFrameRate;
+    }
+
+    private void setVideoFrameRate(int videoFrameRate) {
+        mVideoFrameRate = videoFrameRate;
+    }
+
     private boolean prepareVideoRecorder() {
 
         mMediaRecorder = new MediaRecorder();
@@ -226,6 +236,7 @@
             mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
             mMediaRecorder.setVideoEncodingBitRate(getVideoBitRate(recordSize));
             mMediaRecorder.setVideoSize(recordSize.width, recordSize.height);
+            mMediaRecorder.setVideoFrameRate(getVideoFrameRate());
         } else {
             mMediaRecorder.setProfile(CamcorderProfile.get(mCurrentCameraId, mCurrentVideoSizeId));
         }
@@ -769,6 +780,7 @@
         shutdownCamera();
 
         mCurrentCameraId = id;
+        mIsExternalCamera = isExternalCamera(id);
         try {
             mCamera = Camera.open(id);
         }
@@ -777,7 +789,6 @@
             failTest("camera not available" + e.getMessage());
             return;
         }
-        mIsExternalCamera = isExternalCamera(id);
 
         Camera.Parameters p = mCamera.getParameters();
         if (VERBOSE) {
@@ -798,6 +809,10 @@
             }
         };
 
+        if (mIsExternalCamera) {
+            setVideoFrameRate(p.getPreviewFrameRate());
+        }
+
         SizeCompare s = new SizeCompare();
         TreeSet<Size> sortedResolutions = new TreeSet<Size>(s);
         sortedResolutions.addAll(unsortedSizes);
@@ -958,18 +973,9 @@
     }
 
     private boolean isExternalCamera(int cameraId) {
-        CameraManager manager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);
         try {
-            String cameraIdStr = manager.getCameraIdList()[cameraId];
-            CameraCharacteristics characteristics =
-                    manager.getCameraCharacteristics(cameraIdStr);
-
-            if (characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) ==
-                            CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL) {
-                // External camera doesn't support FOV informations
-                return true;
-            }
-        } catch (CameraAccessException e) {
+            return CameraUtils.isExternal(this, cameraId);
+        } catch (Exception e) {
             Toast.makeText(this, "Could not access camera " + cameraId +
                     ": " + e.getMessage(), Toast.LENGTH_LONG).show();
         }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/car/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/car/OWNERS
new file mode 100644
index 0000000..c8d4c3b
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/car/OWNERS
@@ -0,0 +1,3 @@
+# Bug component: 608533
+keunyoung@google.com
+felipeal@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/companion/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/companion/OWNERS
new file mode 100644
index 0000000..8e3d9b9
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/companion/OWNERS
@@ -0,0 +1,2 @@
+# Bug component: 24950
+eugenesusla@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/deskclock/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/deskclock/OWNERS
new file mode 100644
index 0000000..78b6baa
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/deskclock/OWNERS
@@ -0,0 +1,2 @@
+# Bug component: 31568
+jplemieux@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/dialer/DialerCallTestService.java b/apps/CtsVerifier/src/com/android/cts/verifier/dialer/DialerCallTestService.java
index add6119..d608306 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/dialer/DialerCallTestService.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/dialer/DialerCallTestService.java
@@ -22,7 +22,11 @@
 import java.util.Observable;
 import android.telecom.Call;
 
+import com.android.cts.verifier.telecom.CtsIncomingCall;
+import com.android.cts.verifier.telecom.CtsVerifierInCallUi;
+
 public class DialerCallTestService extends InCallService {
+  public static final String EXTRA_CALL_NAME = "incoming_call_name";
 
   private static DialerCallTestServiceObservable sObservable =
       new DialerCallTestServiceObservable();
@@ -54,6 +58,14 @@
   public void onCallAdded(Call call) {
     if (call.getState() == Call.STATE_RINGING) {
       getObservable().setOnIncoming(true);
+      CtsIncomingCall.getInstance().setCall(call);
+      Intent intent = new Intent(Intent.ACTION_MAIN);
+      if (call.getDetails().getHandle() != null) {
+        intent.putExtra(EXTRA_CALL_NAME, call.getDetails().getHandle().getSchemeSpecificPart());
+      }
+      intent.setFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION | Intent.FLAG_ACTIVITY_NEW_TASK);
+      intent.setClass(this, CtsVerifierInCallUi.class);
+      startActivity(intent);
     }
   }
 }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/dialer/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/dialer/OWNERS
new file mode 100644
index 0000000..a7c1795
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/dialer/OWNERS
@@ -0,0 +1,5 @@
+# Bug component: 20868
+tgunn@google.com
+breadley@google.com
+hallliu@google.com
+xiaotonj@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/forcestop/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/forcestop/OWNERS
new file mode 100644
index 0000000..12c917b
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/forcestop/OWNERS
@@ -0,0 +1,2 @@
+# Bug component: 533114
+suprabh@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/instantapps/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/instantapps/OWNERS
new file mode 100644
index 0000000..869f601
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/instantapps/OWNERS
@@ -0,0 +1,3 @@
+# Bug component: 187788
+dimuthu@google.com
+leegao@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/location/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/location/OWNERS
new file mode 100644
index 0000000..b6377b0
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/location/OWNERS
@@ -0,0 +1,3 @@
+# Bug component: 32850
+wyattriley@google.com
+yuhany@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodHelperActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodHelperActivity.java
index 0f76f61..a240b83 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodHelperActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodHelperActivity.java
@@ -50,7 +50,7 @@
  * owner is setup correctly, removing the work profile upon request, and verifying the image and
  * video capture functionality.
  *
- * Note: We have to use a dummy activity because cross-profile intents only work for activities.
+ * Note: We have to use a test activity because cross-profile intents only work for activities.
  */
 public class ByodHelperActivity extends LocationListenerActivity
         implements DialogCallback {
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/CommandReceiverActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/CommandReceiverActivity.java
index 2c2c45a..8a7b624 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/CommandReceiverActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/CommandReceiverActivity.java
@@ -244,7 +244,7 @@
                     int flags = intent.getIntExtra(EXTRA_VALUE,
                             DevicePolicyManager.LOCK_TASK_FEATURE_NONE);
                     mDpm.setLockTaskFeatures(mAdmin, flags);
-                    // If feature HOME is used, we need to whitelist the current launcher
+                    // If feature HOME is used, we need to allow the current launcher
                     if ((flags & LOCK_TASK_FEATURE_HOME) != 0) {
                         mDpm.setLockTaskPackages(mAdmin,
                                 new String[] {getPackageName(), getCurrentLauncherPackage()});
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/CrossProfilePermissionControlActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/CrossProfilePermissionControlActivity.java
index ef7dd67..4fd4c26 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/CrossProfilePermissionControlActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/CrossProfilePermissionControlActivity.java
@@ -57,12 +57,12 @@
         mPrepareTestButton.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(View v) {
-                    whitelistTestApp();
+                    allowTestApp();
                 }
             });
     }
 
-    protected void whitelistTestApp() {
+    protected void allowTestApp() {
         mDpm.setCrossProfilePackages(getAdminComponent(), Set.of(TEST_APP_PACKAGE_NAME));
     }
 
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/IntentFiltersTestHelper.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/IntentFiltersTestHelper.java
index 7f4de46..83fe87c 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/IntentFiltersTestHelper.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/IntentFiltersTestHelper.java
@@ -160,7 +160,8 @@
     private void addIntentsThatDependOnDeviceFeatures() {
         PackageManager pm = mContext.getPackageManager();
 
-        if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+        if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
+                && pm.hasSystemFeature(PackageManager.FEATURE_CONNECTION_SERVICE)) {
             forwardedIntentsFromManaged.addAll(Arrays.asList(
                     new Intent("android.intent.action.CALL_EMERGENCY").setData(
                             Uri.parse("tel:123")),
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/OWNERS
new file mode 100644
index 0000000..f51c943
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/OWNERS
@@ -0,0 +1,6 @@
+# Bug template url: https://b.corp.google.com/issues/new?component=100560&template=63204
+alexkershaw@google.com
+eranm@google.com
+rubinxu@google.com
+sandness@google.com
+pgrafov@google.com
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/PolicyTransparencyTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/PolicyTransparencyTestActivity.java
index e3d6edb..6ed396f 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/PolicyTransparencyTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/PolicyTransparencyTestActivity.java
@@ -270,7 +270,7 @@
         return mTestId;
     }
 
-    public static class DummyAccessibilityService extends AccessibilityService {
+    public static class TestAccessibilityService extends AccessibilityService {
 
         @Override
         public void onAccessibilityEvent(AccessibilityEvent event) {
@@ -283,7 +283,7 @@
         }
     }
 
-    public static class DummyInputMethod extends InputMethodService {
+    public static class TestInputMethod extends InputMethodService {
         @Override
         public boolean onEvaluateFullscreenMode() {
             return false;
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/net/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/net/OWNERS
new file mode 100644
index 0000000..733502a
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/net/OWNERS
@@ -0,0 +1,3 @@
+# Bug component: 31808
+lorenzo@google.com
+satk@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/OWNERS
new file mode 100644
index 0000000..ea76354
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/OWNERS
@@ -0,0 +1,2 @@
+# Bug component: 48448
+alisher@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/offhost/SimpleOffhostReaderActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/offhost/SimpleOffhostReaderActivity.java
index 1856601..9beaa06 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/offhost/SimpleOffhostReaderActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/offhost/SimpleOffhostReaderActivity.java
@@ -140,6 +140,12 @@
                 boolean wildCard = "*".equals(mResponses[count]);
                 byte[] expectedResponse = HceUtils.hexStringToBytes(mResponses[count]);
                 Log.d(TAG, HceUtils.getHexBytes("APDU response: ", response));
+
+                if (response.length > expectedResponse.length) {
+                    response = Arrays.copyOfRange(response,
+                            response.length - expectedResponse.length, response.length);
+                }
+
                 if (!wildCard && !Arrays.equals(response, expectedResponse)) {
                     Log.d(TAG, "Unexpected APDU response: " + HceUtils.getHexBytes("", response));
                     success = false;
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/notifications/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/notifications/OWNERS
new file mode 100644
index 0000000..fec5943
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/notifications/OWNERS
@@ -0,0 +1,2 @@
+# Bug component: 34005
+juliacr@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/os/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/os/OWNERS
new file mode 100644
index 0000000..a72093f
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/os/OWNERS
@@ -0,0 +1,22 @@
+# This is a helper for sensor tests on Wear devices.
+# Bug component: 62965
+# Sensor team
+bduddie@google.com
+stange@google.com
+arthuri@google.com
+
+# WearOS team
+adsule@google.com
+abhijitnuk@google.com
+andriyn@google.com
+ehsaan@google.com
+haiping@google.com
+hdhabu@google.com
+igorinov@google.com
+yzj@google.com
+latkin@google.com
+shreerag@google.com
+surbhikadam@google.com
+ttarsenal@google.com
+yeabkal@google.com
+yfz@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/OWNERS
index 008649d..4eca63b 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/p2p/OWNERS
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/p2p/OWNERS
@@ -1,3 +1,5 @@
+# Bug component: 109606
+dysu@google.com
 etancohen@google.com
-mplass@google.com
+rpius@google.com
 satk@google.com
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/projection/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/projection/OWNERS
new file mode 100644
index 0000000..cc10b5f
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/projection/OWNERS
@@ -0,0 +1,3 @@
+# Bug component: 95365
+anthm@google.com
+tvsriram@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/qstiles/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/qstiles/OWNERS
new file mode 100644
index 0000000..cbc5f31
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/qstiles/OWNERS
@@ -0,0 +1,3 @@
+# Bug component: 78930
+juliacr@google.com
+kozynski@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/DeviceSuspendTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/DeviceSuspendTestActivity.java
index a233250..b1ce20e 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/DeviceSuspendTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/DeviceSuspendTestActivity.java
@@ -111,6 +111,9 @@
         @Override
         protected void onDestroy() {
             super.onDestroy();
+            if (mDeviceSuspendLock != null && mDeviceSuspendLock.isHeld()) {
+                mDeviceSuspendLock.release();
+            }
             if (mScreenManipulator != null) {
                 mScreenManipulator.releaseScreenOn();
                 mScreenManipulator.close();
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/OWNERS
new file mode 100644
index 0000000..e9e78a3
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/OWNERS
@@ -0,0 +1,4 @@
+# Bug component: 62965
+bduddie@google.com
+stange@google.com
+arthuri@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckAnalyzer.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckAnalyzer.java
index 8bc9deb..7912bd8 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckAnalyzer.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckAnalyzer.java
@@ -72,9 +72,12 @@
     private static final double DECIMATION_FPS_TARGET = 15.0;
     private static final double MIN_VIDEO_LENGTH_SEC = 10;
 
-    RVCVXCheckAnalyzer(String path)
+    private final boolean mHaveInvertedImu;
+
+    RVCVXCheckAnalyzer(String path, boolean haveInvertedImu)
     {
         mPath = path;
+        mHaveInvertedImu = haveInvertedImu;
     }
 
     /**
@@ -200,7 +203,7 @@
             }
             if (nvlog <= 0 || nframe <= 0) {
                 // invalid results
-                report.reason = "Unable to to load recorded video.";
+                report.reason = "Unable to load recorded video.";
                 return report;
             }
             if (nframe < MIN_VIDEO_LENGTH_SEC*VALID_FRAME_THRESHOLD) {
@@ -400,6 +403,7 @@
 
         double t0 = -1;
 
+        Log.i(TAG, "Converting sensor log; inverted IMU adjustment: " + mHaveInvertedImu);
         try {
             br = new BufferedReader(new FileReader(csvFile));
             while ((line = br.readLine()) != null) {
@@ -419,6 +423,19 @@
                 //
                 quat2rpy(quat, rpy);
 
+                if (mHaveInvertedImu) {
+                    // Compensate for front-facing camera rotated around hinge along
+                    // Y-axis with IMU on same panel (so IMU X & Z axes are inverted
+                    // compared to what we expect): offset roll by 180 degrees and
+                    // invert pitch and roll directions
+                    rpy[0] -= Math.PI;
+                    if (rpy[0] <= -Math.PI) {
+                      rpy[0] += 2 * Math.PI;
+                    }
+                    rpy[0] *= -1;
+                    rpy[1] *= -1;
+                }
+
                 if (t0 < 0) {
                     t0 = Long.parseLong(items[0])/1e9;
                 }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckTestActivity.java
index 58145e2..6913cc4 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckTestActivity.java
@@ -26,11 +26,14 @@
 import android.os.PowerManager;
 import android.text.method.LinkMovementMethod;
 import android.text.Html;
+import android.util.Log;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
 import android.view.ViewGroup.LayoutParams;
 import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
 import android.widget.TextView;
 
 import com.android.compatibility.common.util.ReportLog;
@@ -70,6 +73,7 @@
 
     private boolean mRecordSuccessful = false;
     private boolean mOpenCVLoadSuccessful = false;
+    private boolean mFlipAxes = false;
 
     private static class Criterion {
         public static final float roll_rms_error = 0.15f;
@@ -131,6 +135,7 @@
                    "at the same time.\n" +
                 "4. Wait patiently for the analysis to finish.");
 
+            showAxesToggle();
             waitForUserToContinue();
 
             // prepare sync signal
@@ -163,7 +168,7 @@
                             "its finished by sound and vibration. ");
 
             // Analysis of recorded video and sensor data using RVCXAnalyzer
-            RVCVXCheckAnalyzer analyzer = new RVCVXCheckAnalyzer(mRecPath);
+            RVCVXCheckAnalyzer analyzer = new RVCVXCheckAnalyzer(mRecPath, mFlipAxes);
 
             // acquire a partial wake lock just in case CPU fall asleep
             PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
@@ -413,6 +418,24 @@
         getTestLogger().logCustomView(btnLicense);
     }
 
+    private void showAxesToggle() {
+        CheckBox checkBox = new CheckBox(this);
+
+        checkBox.setText(Html.fromHtml(
+            "<b>Flip axes</b>: Only enable this setting if this device has a combination  "+
+            "front/rear camera, and the sensor's positive Z axis is aligned with the camera's " +
+            "field of view"));
+        checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(CompoundButton buttonView,
+                                         boolean isChecked) {
+                mFlipAxes = isChecked;
+            }
+        });
+
+        getTestLogger().logCustomView(checkBox);
+    }
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
 
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/streamquality/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/streamquality/OWNERS
new file mode 100644
index 0000000..239d32e
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/streamquality/OWNERS
@@ -0,0 +1,3 @@
+# Bug component: 610698
+andrewlewis@google.com
+lajos@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/streamquality/StreamingVideoActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/streamquality/StreamingVideoActivity.java
index df2bec0..30e665c 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/streamquality/StreamingVideoActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/streamquality/StreamingVideoActivity.java
@@ -116,6 +116,8 @@
             "&signature=%s";
 
     private static final Stream[] HTTP_STREAMS = {
+        // TODO(b/150835350): Re-enable H263 test once the clip is updated to profile 0
+        /*
         new Stream("H263 Video, AMR Audio", "http_h263_amr",
                 "http://redirector.gvt1.com/"
                 + "videoplayback?id=271de9756065677e"
@@ -125,6 +127,7 @@
                 + ".1DDA3F999541D2136E6755F16FC44CA972767169"
                 + "&source=youtube"
                 + "&key=ik0&user=android-device-test"),
+        */
         new Stream("MPEG4 SP Video, AAC Audio", "http_mpeg4_aac",
                 "http://redirector.gvt1.com/"
                 + "videoplayback?id=271de9756065677e"
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/telecom/CtsIncomingCall.java b/apps/CtsVerifier/src/com/android/cts/verifier/telecom/CtsIncomingCall.java
new file mode 100644
index 0000000..1e472a4
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/telecom/CtsIncomingCall.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.verifier.telecom;
+
+import android.telecom.Call;
+
+public class CtsIncomingCall {
+    private static final CtsIncomingCall INSTANCE = new CtsIncomingCall();
+    private Call mCall;
+    private boolean mAcceptWhenLocked;
+
+    public static CtsIncomingCall getInstance() {
+        return INSTANCE;
+    }
+
+    public void setCall(Call call) {
+        mCall = call;
+        mAcceptWhenLocked = false;
+    }
+
+    public void disconnectCall() {
+        if (mCall != null) {
+            mCall.disconnect();
+            mCall = null;
+        }
+    }
+
+    public void setAcceptWhenLocked(boolean acceptWhenLocked) {
+        if (mCall != null) {
+            mAcceptWhenLocked = acceptWhenLocked;
+        }
+    }
+
+    public boolean isAcceptWhenLocked() {
+        return mAcceptWhenLocked;
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/telecom/CtsVerifierInCallUi.java b/apps/CtsVerifier/src/com/android/cts/verifier/telecom/CtsVerifierInCallUi.java
new file mode 100644
index 0000000..298eae0
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/telecom/CtsVerifierInCallUi.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.verifier.telecom;
+
+import static com.android.cts.verifier.dialer.DialerCallTestService.EXTRA_CALL_NAME;
+
+import android.app.Activity;
+import android.app.KeyguardManager;
+import android.content.Context;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import com.android.cts.verifier.R;
+
+public class CtsVerifierInCallUi extends Activity {
+    TextView mCallNumber;
+    Button mButton;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        View view = getLayoutInflater().inflate(R.layout.incall_screen, null);
+        setContentView(view);
+        setTurnScreenOn(true);
+        setShowWhenLocked(true);
+        KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
+        km.requestDismissKeyguard(this, null);
+
+        mCallNumber = view.findViewById(R.id.incoming_call_number);
+        if (mCallNumber == null) {
+            finish();
+            return;
+        }
+
+        mButton = view.findViewById(R.id.telecom_default_dialer_end_button);
+        if (mButton == null) {
+            finish();
+            return;
+        }
+
+        mCallNumber.setText(getIntent().getStringExtra(EXTRA_CALL_NAME));
+        mButton.setOnClickListener(v -> {
+            boolean pass = false;
+            if (km.isDeviceLocked()) {
+                pass = true;
+            }
+            CtsIncomingCall.getInstance().setAcceptWhenLocked(pass);
+            CtsIncomingCall.getInstance().disconnectCall();
+            finish();
+        });
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/telecom/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/telecom/OWNERS
new file mode 100644
index 0000000..0cfd686
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/telecom/OWNERS
@@ -0,0 +1,2 @@
+# Bug component: 151185
+tgunn@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/telecom/TelecomDefaultDialerTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/telecom/TelecomDefaultDialerTestActivity.java
new file mode 100644
index 0000000..2e50d8a
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/telecom/TelecomDefaultDialerTestActivity.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.verifier.telecom;
+
+import android.app.KeyguardManager;
+import android.app.admin.DevicePolicyManager;
+import android.app.role.RoleManager;
+import android.content.Intent;
+import android.os.Bundle;
+import android.telecom.TelecomManager;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.Toast;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.managedprovisioning.DeviceAdminTestReceiver;
+
+public class TelecomDefaultDialerTestActivity extends PassFailButtons.Activity {
+    private Button mSetDefaultDialer;
+    private Button mConfirmLockScreen;
+    private Button mLockDevice;
+
+    private ImageView mStep1Status;
+    private ImageView mStep2Status;
+    private ImageView mStep3Status;
+    private ImageView mStep4Status;
+
+    private final String LOCK_SCREEN_ACTION = "com.android.settings.SETUP_LOCK_SCREEN";
+    private final int REQUEST_DIALER_ROLE = 1;
+    private final int REQUEST_LOCK_SCREEN = 2;
+    private final int REQUEST_ADD_ADMIN = 3;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        View view = getLayoutInflater().inflate(R.layout.telecom_default_dialer, null);
+        setContentView(view);
+        setInfoResources(R.string.telecom_default_dialer_test_title,
+                R.string.telecom_default_dialer_test_info, -1);
+        setPassFailButtonClickListeners();
+        getPassButton().setEnabled(false);
+
+        mSetDefaultDialer = view.findViewById(
+                R.id.telecom_default_dialer_set_third_party_dialer_button);
+        if (mSetDefaultDialer == null) {
+            finish();
+            return;
+        }
+
+        mConfirmLockScreen = view.findViewById(
+                R.id.telecom_confirm_lock_screen);
+        if (mConfirmLockScreen == null) {
+            finish();
+            return;
+        }
+
+        mLockDevice = view.findViewById(
+                R.id.telecom_default_dialer_lock_button);
+        if (mLockDevice == null) {
+            finish();
+            return;
+        }
+
+        mStep1Status = view.findViewById(R.id.step_1_status);
+        mStep2Status = view.findViewById(R.id.step_2_status);
+        mStep3Status = view.findViewById(R.id.step_3_status);
+        mStep4Status = view.findViewById(R.id.step_4_status);
+        mStep1Status.setImageResource(R.drawable.fs_indeterminate);
+        mStep2Status.setImageResource(R.drawable.fs_indeterminate);
+        mStep3Status.setImageResource(R.drawable.fs_indeterminate);
+        mStep3Status.setImageResource(R.drawable.fs_indeterminate);
+
+        mSetDefaultDialer.setOnClickListener(v -> {
+            RoleManager rm = (RoleManager) getSystemService(ROLE_SERVICE);
+            TelecomManager tm = (TelecomManager) getSystemService(TELECOM_SERVICE);
+            if (tm.getDefaultDialerPackage().equals(getPackageName())) {
+                Toast.makeText(this, R.string.voicemail_default_dialer_already_set,
+                        Toast.LENGTH_SHORT).show();
+                mStep1Status.setImageResource(R.drawable.fs_good);
+                return;
+            }
+            Intent intent = rm.createRequestRoleIntent(RoleManager.ROLE_DIALER);
+            startActivityForResult(intent, REQUEST_DIALER_ROLE);
+        });
+
+        mConfirmLockScreen.setOnClickListener(v -> {
+            KeyguardManager km = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
+            if (km.isKeyguardSecure()) {
+                mStep2Status.setImageResource(R.drawable.fs_good);
+                return;
+            }
+            Intent intent = new Intent(LOCK_SCREEN_ACTION);
+            startActivityForResult(intent, REQUEST_LOCK_SCREEN);
+        });
+
+        mLockDevice.setOnClickListener(v -> {
+            Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
+            intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
+                    DeviceAdminTestReceiver.getReceiverComponentName());
+            startActivityForResult(intent, REQUEST_ADD_ADMIN);
+        });
+    }
+
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (requestCode == REQUEST_DIALER_ROLE) {
+            if (resultCode == RESULT_OK) {
+                mStep1Status.setImageResource(R.drawable.fs_good);
+            } else {
+                mStep1Status.setImageResource(R.drawable.fs_error);
+            }
+        }
+        if (requestCode == REQUEST_LOCK_SCREEN) {
+            if (resultCode == RESULT_FIRST_USER) {
+                mStep2Status.setImageResource(R.drawable.fs_good);
+            } else {
+                mStep2Status.setImageResource(R.drawable.fs_error);
+            }
+        }
+        if (requestCode == REQUEST_ADD_ADMIN) {
+            if (resultCode == RESULT_OK) {
+                DevicePolicyManager dpm = (DevicePolicyManager)
+                        getSystemService(DEVICE_POLICY_SERVICE);
+                mStep3Status.setImageResource(R.drawable.fs_good);
+                dpm.lockNow();
+            } else {
+                mStep3Status.setImageResource(R.drawable.fs_error);
+            }
+        }
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        if (CtsIncomingCall.getInstance().isAcceptWhenLocked()) {
+            mStep4Status.setImageResource(R.drawable.fs_good);
+            getPassButton().setEnabled(true);
+        } else {
+            mStep4Status.setImageResource(R.drawable.fs_error);
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/tv/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/tv/OWNERS
new file mode 100644
index 0000000..f5d7374
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/tv/OWNERS
@@ -0,0 +1,3 @@
+# Bug component: 105760
+nchalko@google.com
+per-file MicrophoneDeviceTestActivity.java = hoshi@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/usb/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/usb/OWNERS
new file mode 100644
index 0000000..e176df9
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/usb/OWNERS
@@ -0,0 +1,2 @@
+# Bug component: 175220
+moltmann@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/usb/device/UsbDeviceTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/usb/device/UsbDeviceTestActivity.java
index 29f78e1..4bbcddc 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/usb/device/UsbDeviceTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/usb/device/UsbDeviceTestActivity.java
@@ -65,6 +65,8 @@
 import java.util.NoSuchElementException;
 import java.util.Random;
 import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -77,6 +79,8 @@
 
     private UsbManager mUsbManager;
     private BroadcastReceiver mUsbDeviceConnectionReceiver;
+    private BroadcastReceiver mUsbDeviceAttachedReceiver;
+    private BroadcastReceiver mUsbDevicePermissionReceiver;
     private Thread mTestThread;
     private TextView mStatus;
     private ProgressBar mProgress;
@@ -1534,6 +1538,140 @@
     }
 
     /**
+     * Run reconnecttest.
+     *
+     * @param device The device to run the test against. This device is running
+     *               com.android.cts.verifierusbcompanion.DeviceTestCompanion
+     *
+     * @throws Throwable
+     */
+    private void reconnectTest(@NonNull UsbDevice device) throws Throwable {
+        UsbDeviceConnection connection = mUsbManager.openDevice(device);
+        assertNotNull(connection);
+
+        assertFalse(connection.getFileDescriptor() == -1);
+        assertNotNull(connection.getRawDescriptors());
+        assertFalse(connection.getRawDescriptors().length == 0);
+        assertEquals(device.getSerialNumber(), connection.getSerial());
+        runAndAssertException(() -> connection.setConfiguration(null), NullPointerException.class);
+        connection.close();
+    }
+
+    /**
+     * <p> This attachedtask the requests and does not care about them anymore after the
+     * system took them. The {@link attachedTask} handles the test after the main test done.
+     * It should start after device reconnect success.</p>
+     */
+    private ArrayList<Throwable> attachedTask() {
+        final ArrayList<Throwable> mErrors = new ArrayList<>();
+
+        // Reconnect and give permission time should under 9 second
+        long mAttachedConfirmTime = 9 * 1000;
+
+        CompletableFuture<Void> mAttachedThreadFinished = new CompletableFuture<>();
+
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(ACTION_USB_PERMISSION);
+        filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
+
+        mUsbDeviceAttachedReceiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                synchronized (UsbDeviceTestActivity.this) {
+                    UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
+
+                    switch (intent.getAction()) {
+                        case UsbManager.ACTION_USB_DEVICE_ATTACHED:
+                            if (!AoapInterface.isDeviceInAoapMode(device)) {
+                                mStatus.setText(R.string.usb_device_test_step2);
+                            }
+
+                            mUsbManager.requestPermission(device,
+                                    PendingIntent.getBroadcast(UsbDeviceTestActivity.this, 0,
+                                         new Intent(ACTION_USB_PERMISSION), 0));
+                            break;
+                    }
+                }
+            }
+        };
+
+        mUsbDevicePermissionReceiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                synchronized (UsbDeviceTestActivity.this) {
+                    UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
+                    switch (intent.getAction()) {
+                        case ACTION_USB_PERMISSION:
+                            boolean granted = intent.getBooleanExtra(
+                                    UsbManager.EXTRA_PERMISSION_GRANTED, false);
+                            if (granted) {
+                                if (!AoapInterface.isDeviceInAoapMode(device)) {
+                                    mStatus.setText(R.string.usb_device_test_step3);
+
+                                    UsbDeviceConnection connection =
+                                            mUsbManager.openDevice(device);
+                                    try {
+                                        makeThisDeviceAnAccessory(connection);
+                                    } finally {
+                                        connection.close();
+                                    }
+                                } else {
+                                    mStatus.setText(R.string.usb_device_test_step4);
+                                    mProgress.setIndeterminate(true);
+                                    mProgress.setVisibility(View.VISIBLE);
+
+                                    UsbDeviceConnection connection =
+                                            mUsbManager.openDevice(device);
+                                    assertNotNull(connection);
+
+                                    try {
+                                        setConfigurationTests(device);
+                                    } catch (Throwable e) {
+                                        synchronized (mErrors) {
+                                            mErrors.add(e);
+                                        }
+                                    }
+                                    try {
+                                        reconnectTest(device);
+                                    } catch (Throwable e) {
+                                        synchronized (mErrors) {
+                                            mErrors.add(e);
+                                        }
+                                    }
+
+                                    mAttachedThreadFinished.complete(null);
+                                }
+                            } else {
+                                fail("Permission to connect to " + device.getProductName()
+                                        + " not granted", null);
+                            }
+                            break;
+                    }
+                }
+            }
+        };
+
+        registerReceiver(mUsbDeviceAttachedReceiver, filter);
+        registerReceiver(mUsbDevicePermissionReceiver, filter);
+
+        try {
+            mAttachedThreadFinished.get(mAttachedConfirmTime, TimeUnit.MILLISECONDS);
+        } catch (Throwable e) {
+            synchronized (mErrors) {
+                mErrors.add(e);
+            }
+        }
+
+        unregisterReceiver(mUsbDeviceAttachedReceiver);
+        mUsbDeviceAttachedReceiver = null;
+
+        unregisterReceiver(mUsbDevicePermissionReceiver);
+        mUsbDevicePermissionReceiver = null;
+
+        return mErrors;
+    }
+
+    /**
      * Tests parallel issuance and receiving of {@link UsbRequest usb requests}.
      *
      * @param connection The connection to use for testing
@@ -1901,21 +2039,32 @@
      * </ul></p>
      *
      * @param device the device under test
-     * @param connection The connection to use
-     * @param iface An interface of the device
      *
      * @throws Throwable
      */
-    private void setConfigurationTests(@NonNull UsbDevice device,
-            @NonNull UsbDeviceConnection connection, @NonNull UsbInterface iface) throws Throwable {
-        assertTrue(device.getConfigurationCount() == 1);
-        boolean wasSet = connection.setConfiguration(device.getConfiguration(0));
-        assertTrue(wasSet);
+    private void setConfigurationTests(@NonNull UsbDevice device) throws Throwable {
+        // Find the AOAP interface
+        ArrayList<String> allInterfaces = new ArrayList<>();
+
+        // After getConfiguration the original device already disconnect, after
+        // test check should use new device and connection
+        UsbDeviceConnection connection = mUsbManager.openDevice(device);
+        assertNotNull(connection);
+
+        UsbInterface iface = null;
+        for (int i = 0; i < device.getConfigurationCount(); i++) {
+            allInterfaces.add(device.getInterface(i).toString());
+
+            if (device.getInterface(i).getName().equals("Android Accessory Interface")) {
+                iface = device.getInterface(i);
+                break;
+            }
+        }
 
         // Cannot set configuration for a device with a claimed interface
         boolean claimed = connection.claimInterface(iface, false);
         assertTrue(claimed);
-        wasSet = connection.setConfiguration(device.getConfiguration(0));
+        boolean wasSet = connection.setConfiguration(device.getConfiguration(0));
         assertFalse(wasSet);
         boolean released = connection.releaseInterface(iface);
         assertTrue(released);
@@ -2061,6 +2210,13 @@
         try {
             // Find the AOAP interface
             ArrayList<String> allInterfaces = new ArrayList<>();
+
+            // Errors created in the threads
+            ArrayList<Throwable> errors = new ArrayList<>();
+
+            // Reconnect should get attached intent and pass test in 10 seconds
+            long attachedTime = 10 * 1000;
+
             UsbInterface iface = null;
             for (int i = 0; i < device.getConfigurationCount(); i++) {
                 allInterfaces.add(device.getInterface(i).toString());
@@ -2096,13 +2252,20 @@
             boolean released = connection.releaseInterface(iface);
             assertTrue(released);
 
-            setInterfaceTests(connection, iface);
-            setConfigurationTests(device, connection, iface);
+            CompletableFuture<ArrayList<Throwable>> attached =
+                    CompletableFuture.supplyAsync(() -> {
+                        return attachedTask();
+                    });
 
-            assertFalse(connection.getFileDescriptor() == -1);
-            assertNotNull(connection.getRawDescriptors());
-            assertFalse(connection.getRawDescriptors().length == 0);
-            assertEquals(device.getSerialNumber(), connection.getSerial());
+            setInterfaceTests(connection, iface);
+
+            assertTrue(device.getConfigurationCount() == 1);
+            assertTrue(connection.setConfiguration(device.getConfiguration(0)));
+
+            errors = attached.get(attachedTime, TimeUnit.MILLISECONDS);
+
+            // If reconnect timeout make the test fail
+            assertEquals(0, errors.size());
 
             connection.close();
 
@@ -2137,6 +2300,12 @@
         if (mUsbDeviceConnectionReceiver != null) {
             unregisterReceiver(mUsbDeviceConnectionReceiver);
         }
+        if (mUsbDeviceAttachedReceiver != null) {
+            unregisterReceiver(mUsbDeviceAttachedReceiver);
+        }
+        if (mUsbDevicePermissionReceiver != null) {
+            unregisterReceiver(mUsbDevicePermissionReceiver);
+        }
 
         super.onDestroy();
     }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/voicemail/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/voicemail/OWNERS
new file mode 100644
index 0000000..541e891
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/voicemail/OWNERS
@@ -0,0 +1,2 @@
+# Bug component: 31245
+twyen@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/vr/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/vr/OWNERS
new file mode 100644
index 0000000..094362e
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/vr/OWNERS
@@ -0,0 +1,3 @@
+# Bug component: 345010
+santoscordon@google.com
+michaelwr@google.com
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/wifi/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/wifi/OWNERS
index 1848dfd..28faebd 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/wifi/OWNERS
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/wifi/OWNERS
@@ -1,3 +1,5 @@
-rpius@google.com
+# Bug component: 33618
+dysu@google.com
 etancohen@google.com
+rpius@google.com
 satk@google.com
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/wifiaware/OWNERS b/apps/CtsVerifier/src/com/android/cts/verifier/wifiaware/OWNERS
index 4afc47f..5811537 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/wifiaware/OWNERS
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/wifiaware/OWNERS
@@ -1,2 +1,5 @@
+# Bug component: 109581
+dysu@google.com
 etancohen@google.com
-satk@google.com
\ No newline at end of file
+rpius@google.com
+satk@google.com
diff --git a/apps/CtsVerifierInstantApp/Android.bp b/apps/CtsVerifierInstantApp/Android.bp
index cc39927..045581d 100644
--- a/apps/CtsVerifierInstantApp/Android.bp
+++ b/apps/CtsVerifierInstantApp/Android.bp
@@ -21,6 +21,7 @@
     sdk_version: "current",
     test_suites: [
         "cts",
+        "general-tests",
         "sts",
     ],
 }
diff --git a/apps/EmptyDeviceAdmin/Android.bp b/apps/EmptyDeviceAdmin/Android.bp
index 0844a12..35d2343 100644
--- a/apps/EmptyDeviceAdmin/Android.bp
+++ b/apps/EmptyDeviceAdmin/Android.bp
@@ -21,7 +21,6 @@
     min_sdk_version: "12",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/apps/EmptyDeviceOwner/Android.bp b/apps/EmptyDeviceOwner/Android.bp
index 9bcf955..44ea769 100644
--- a/apps/EmptyDeviceOwner/Android.bp
+++ b/apps/EmptyDeviceOwner/Android.bp
@@ -22,7 +22,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/apps/ForceStopHelperApp/Android.bp b/apps/ForceStopHelperApp/Android.bp
index e843edc..f438b87 100644
--- a/apps/ForceStopHelperApp/Android.bp
+++ b/apps/ForceStopHelperApp/Android.bp
@@ -22,7 +22,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/apps/MainlineModuleDetector/Android.mk b/apps/MainlineModuleDetector/Android.mk
index 5b8e316..6202ac7 100644
--- a/apps/MainlineModuleDetector/Android.mk
+++ b/apps/MainlineModuleDetector/Android.mk
@@ -29,6 +29,6 @@
 
 LOCAL_SDK_VERSION := current
 
-LOCAL_COMPATIBILITY_SUITE := cts sts
+LOCAL_COMPATIBILITY_SUITE := cts general-tests sts
 
 include $(BUILD_CTS_PACKAGE)
diff --git a/apps/OomCatcher/Android.bp b/apps/OomCatcher/Android.bp
index a22df60..477d8f3 100644
--- a/apps/OomCatcher/Android.bp
+++ b/apps/OomCatcher/Android.bp
@@ -21,7 +21,7 @@
     sdk_version: "current",
     test_suites: [
         "cts",
+        "general-tests",
         "sts",
-        "vts10",
     ],
 }
diff --git a/apps/PermissionApp/Android.bp b/apps/PermissionApp/Android.bp
index e8f163c..53381d7 100644
--- a/apps/PermissionApp/Android.bp
+++ b/apps/PermissionApp/Android.bp
@@ -22,7 +22,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/apps/VpnApp/Android.bp b/apps/VpnApp/Android.bp
index 4b45b00..64e94fc 100644
--- a/apps/VpnApp/Android.bp
+++ b/apps/VpnApp/Android.bp
@@ -25,7 +25,6 @@
     manifest: "api23/AndroidManifest.xml",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -36,7 +35,6 @@
     manifest: "api24/AndroidManifest.xml",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -47,7 +45,6 @@
     manifest: "latest/AndroidManifest.xml",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -58,7 +55,6 @@
     manifest: "notalwayson/AndroidManifest.xml",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/apps/VpnApp/src/com/android/cts/vpnfirewall/ReflectorVpnService.java b/apps/VpnApp/src/com/android/cts/vpnfirewall/ReflectorVpnService.java
index e7c4ffc..244e106 100755
--- a/apps/VpnApp/src/com/android/cts/vpnfirewall/ReflectorVpnService.java
+++ b/apps/VpnApp/src/com/android/cts/vpnfirewall/ReflectorVpnService.java
@@ -203,7 +203,7 @@
             || SystemProperties.getInt("service.adb.tcp.port", -1) > -1)) {
             try {
                 // If adb TCP port opened the test may be running by adb over network.
-                // Add com.android.shell application into blacklist to exclude adb socket
+                // Add com.android.shell application into disallowed list to exclude adb socket
                 // for VPN tests.
                 builder.addDisallowedApplication("com.android.shell");
             } catch(NameNotFoundException e) {
diff --git a/apps/hotspot/Android.mk b/apps/hotspot/Android.mk
index 6730fcc..ce3b1ca1 100644
--- a/apps/hotspot/Android.mk
+++ b/apps/hotspot/Android.mk
@@ -13,6 +13,6 @@
 
 LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4
 
-LOCAL_COMPATIBILITY_SUITE := cts sts vts10
+LOCAL_COMPATIBILITY_SUITE := cts general-tests sts
 
 include $(BUILD_CTS_PACKAGE)
diff --git a/CtsCoverage.mk b/build/Android.mk
similarity index 100%
rename from CtsCoverage.mk
rename to build/Android.mk
diff --git a/build/compatibility_test_suite.mk b/build/compatibility_test_suite.mk
index 01a2fff..c980951 100644
--- a/build/compatibility_test_suite.mk
+++ b/build/compatibility_test_suite.mk
@@ -42,7 +42,7 @@
 LOCAL_JAVA_RESOURCE_FILES += $(suite_info_prop)
 
 # Add the base libraries
-LOCAL_JAVA_LIBRARIES += tradefed loganalysis hosttestlib compatibility-host-util
+LOCAL_JAVA_LIBRARIES += tradefed loganalysis compatibility-host-util
 
 LOCAL_MODULE_TAGS := optional
 
diff --git a/build/device_info_package.mk b/build/device_info_package.mk
index 09e062e..a79e848 100644
--- a/build/device_info_package.mk
+++ b/build/device_info_package.mk
@@ -19,6 +19,8 @@
 DEVICE_INFO_PACKAGE := com.android.compatibility.common.deviceinfo
 DEVICE_INFO_INSTRUMENT := androidx.test.runner.AndroidJUnitRunner
 DEVICE_INFO_USES_LIBRARY := android.test.runner
+DEVICE_INFO_USES_OPTIONAL_LIBRARIES := \
+  androidx.window.sidecar
 DEVICE_INFO_PERMISSIONS += \
   android.permission.READ_PHONE_STATE \
   android.permission.WRITE_EXTERNAL_STORAGE
@@ -39,7 +41,8 @@
   $(DEVICE_INFO_PACKAGE).ScreenDeviceInfo \
   $(DEVICE_INFO_PACKAGE).StorageDeviceInfo \
   $(DEVICE_INFO_PACKAGE).UserDeviceInfo \
-  $(DEVICE_INFO_PACKAGE).VintfDeviceInfo
+  $(DEVICE_INFO_PACKAGE).VintfDeviceInfo \
+  com.android.compatibility.common.util.DummyActivity
 
 ifeq ($(DEVICE_INFO_MIN_SDK),)
 DEVICE_INFO_MIN_SDK := 8
@@ -61,6 +64,7 @@
 $(manifest_xml): PRIVATE_INFO_PERMISSIONS := $(foreach permission, $(DEVICE_INFO_PERMISSIONS),-r $(permission))
 $(manifest_xml): PRIVATE_INFO_ACTIVITIES := $(foreach activity,$(DEVICE_INFO_ACTIVITIES),-a $(activity))
 $(manifest_xml): PRIVATE_USES_LIBRARY := $(DEVICE_INFO_USES_LIBRARY)
+$(manifest_xml): PRIVATE_USES_OPTIONAL_LIBRARIES := $(foreach library,$(DEVICE_INFO_USES_OPTIONAL_LIBRARIES),-lo $(library))
 $(manifest_xml): PRIVATE_PACKAGE := $(DEVICE_INFO_PACKAGE)
 $(manifest_xml): PRIVATE_INSTRUMENT := $(DEVICE_INFO_INSTRUMENT)
 $(manifest_xml): PRIVATE_MIN_SDK := $(DEVICE_INFO_MIN_SDK)
@@ -74,6 +78,7 @@
 						$(PRIVATE_INFO_PERMISSIONS) \
 						$(PRIVATE_INFO_ACTIVITIES) \
 						-l $(PRIVATE_USES_LIBRARY) \
+						$(PRIVATE_USES_OPTIONAL_LIBRARIES) \
 						-p $(PRIVATE_PACKAGE) \
 						-i $(PRIVATE_INSTRUMENT) \
 						-s $(PRIVATE_MIN_SDK) \
diff --git a/common/device-side/device-info/Android.bp b/common/device-side/device-info/Android.bp
index 294fe50..ad648c1 100644
--- a/common/device-side/device-info/Android.bp
+++ b/common/device-side/device-info/Android.bp
@@ -18,13 +18,14 @@
     srcs: ["src/**/*.java"],
 
     static_libs: [
-        "compatibility-device-util-axt",
         "androidx.test.rules",
+        "compatibility-device-util-axt",
+        "cts_window_jetpack_utils",
         "junit",
     ],
 
     libs: [
-        "android.test.base.stubs",
+        "android.test.base",
     ],
 
     sdk_version: "test_current",
diff --git a/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/DeviceInfo.java b/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/DeviceInfo.java
index 0268e86..597536d 100644
--- a/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/DeviceInfo.java
+++ b/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/DeviceInfo.java
@@ -57,6 +57,9 @@
 
     private static final String LOG_TAG = "ExtendedDeviceInfo";
 
+    // Keep in sync with SELinuxHostTest#DEVICE_INFO_SUFFIX.
+    private static final String DEVICE_INFO_SUFFIX = ".deviceinfo.json";
+
     private JsonWriter mJsonWriter = null;
     private String mResultFilePath = null;
     private String mErrorMessage = null;
@@ -85,7 +88,7 @@
         } else {
             File jsonFile;
             try {
-                jsonFile = new File(dir, getClass().getSimpleName() + ".deviceinfo.json");
+                jsonFile = new File(dir, getClass().getSimpleName() + DEVICE_INFO_SUFFIX);
                 jsonFile.createNewFile();
                 mResultFilePath = jsonFile.getAbsolutePath();
                 try (DeviceInfoStore store = new DeviceInfoStore(jsonFile)) {
diff --git a/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/ScreenDeviceInfo.java b/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/ScreenDeviceInfo.java
index dcd6f54..f77a164 100644
--- a/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/ScreenDeviceInfo.java
+++ b/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/ScreenDeviceInfo.java
@@ -15,13 +15,24 @@
  */
 package com.android.compatibility.common.deviceinfo;
 
+import android.app.Activity;
 import android.content.Context;
 import android.content.res.Configuration;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.server.wm.jetpack.utils.ExtensionUtils;
+import android.server.wm.jetpack.utils.wrapper.TestDisplayFeature;
+import android.server.wm.jetpack.utils.wrapper.TestInterfaceCompat;
+import android.server.wm.jetpack.utils.wrapper.TestWindowLayoutInfo;
+import android.text.TextUtils;
 import android.util.DisplayMetrics;
 import android.view.Display;
 import android.view.WindowManager;
 
 import com.android.compatibility.common.util.DeviceInfoStore;
+import com.android.compatibility.common.util.DummyActivity;
+
+import java.util.List;
 
 /**
  * Screen device info collector.
@@ -46,6 +57,38 @@
         Configuration configuration = getContext().getResources().getConfiguration();
         store.addResult("screen_size", getScreenSize(configuration));
         store.addResult("smallest_screen_width_dp", configuration.smallestScreenWidthDp);
+
+        // WindowManager Jetpack Library version and available display features.
+        String wmJetpackVersion = ExtensionUtils.getVersion();
+        if (!TextUtils.isEmpty(wmJetpackVersion)) {
+            int[] displayFeatures = getDisplayFeatures();
+            store.addResult("wm_jetpack_version", wmJetpackVersion);
+            store.addArrayResult("display_features", displayFeatures);
+        }
+    }
+
+    private int[] getDisplayFeatures() {
+        final Activity activity = ScreenDeviceInfo.this.launchActivity(
+                "com.android.compatibility.common.deviceinfo",
+                DummyActivity.class,
+                new Bundle());
+        final IBinder windowToken = activity.getWindow().getAttributes().token;
+        final TestInterfaceCompat extension = ExtensionUtils.getInterfaceCompat(activity);
+        if (extension == null) {
+            return new int[0];
+        }
+
+        final TestWindowLayoutInfo windowLayoutInfo = extension.getWindowLayoutInfo(windowToken);
+        if (windowLayoutInfo == null) {
+            return new int[0];
+        }
+
+        List<TestDisplayFeature> displayFeatureList = windowLayoutInfo.getDisplayFeatures();
+        final int[] displayFeatures = new int[displayFeatureList.size()];
+        for (int i = 0; i < displayFeatureList.size(); i++) {
+            displayFeatures[i] = displayFeatureList.get(i).getType();
+        }
+        return displayFeatures;
     }
 
     private static String getScreenSize(Configuration configuration) {
diff --git a/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/VintfDeviceInfo.java b/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/VintfDeviceInfo.java
index b9a9522..1fb9049 100644
--- a/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/VintfDeviceInfo.java
+++ b/common/device-side/device-info/src/com/android/compatibility/common/deviceinfo/VintfDeviceInfo.java
@@ -27,6 +27,7 @@
 
 /**
  * VINTF device info collector.
+ * Keep name in sync with SELinuxHostTest#VINTF_DEVICE_CLASS.
  */
 public final class VintfDeviceInfo extends DeviceInfo {
 
diff --git a/common/device-side/device-info/tests/Android.bp b/common/device-side/device-info/tests/Android.bp
index 10f42da..abd0bb0 100644
--- a/common/device-side/device-info/tests/Android.bp
+++ b/common/device-side/device-info/tests/Android.bp
@@ -23,8 +23,8 @@
     ],
 
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
 
     sdk_version: "test_current",
diff --git a/common/device-side/util-axt/Android.bp b/common/device-side/util-axt/Android.bp
index 169184a..ec36fe7 100644
--- a/common/device-side/util-axt/Android.bp
+++ b/common/device-side/util-axt/Android.bp
@@ -32,8 +32,8 @@
     ],
 
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
 
     jarjar_rules: "protobuf-jarjar-rules.txt",
diff --git a/common/device-side/util-axt/src/com/android/compatibility/common/util/BatteryUtils.java b/common/device-side/util-axt/src/com/android/compatibility/common/util/BatteryUtils.java
index 955321a..7d8feae 100644
--- a/common/device-side/util-axt/src/com/android/compatibility/common/util/BatteryUtils.java
+++ b/common/device-side/util-axt/src/com/android/compatibility/common/util/BatteryUtils.java
@@ -83,6 +83,15 @@
     }
 
     /**
+     * Turn off the Battery saver manually.
+     */
+    public static void runDumpsysBatterySaverOff() {
+        if (isBatterySaverSupported() && getPowerManager().isPowerSaveMode()) {
+            SystemUtil.runShellCommandForNoOutput("cmd power set-mode 0");
+        }
+    }
+
+    /**
      * Enable / disable battery saver. Note {@link #runDumpsysBatteryUnplug} must have been
      * executed before enabling BS.
      */
diff --git a/common/device-side/util-axt/src/com/android/compatibility/common/util/CpuFeatures.java b/common/device-side/util-axt/src/com/android/compatibility/common/util/CpuFeatures.java
index 43a6f00..687bab9 100644
--- a/common/device-side/util-axt/src/com/android/compatibility/common/util/CpuFeatures.java
+++ b/common/device-side/util-axt/src/com/android/compatibility/common/util/CpuFeatures.java
@@ -46,14 +46,10 @@
 
     public static native boolean isArmCpu();
 
-    public static native boolean isMipsCpu();
-
     public static native boolean isX86Cpu();
 
     public static native boolean isArm64Cpu();
 
-    public static native boolean isMips64Cpu();
-
     public static native boolean isX86_64Cpu();
 
     public static native int getHwCaps();
diff --git a/common/device-side/util-axt/src/com/android/compatibility/common/util/DropBoxReceiver.java b/common/device-side/util-axt/src/com/android/compatibility/common/util/DropBoxReceiver.java
new file mode 100644
index 0000000..6de6fe2
--- /dev/null
+++ b/common/device-side/util-axt/src/com/android/compatibility/common/util/DropBoxReceiver.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.compatibility.common.util;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.DropBoxManager;
+import android.util.Log;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+public class DropBoxReceiver {
+    private static final String TAG = "DropBoxReceiver";
+    private static final int TIMEOUT_SECS = 60 * 3;
+
+    private CountDownLatch mResultsReceivedSignal;
+    private long mStartMs;
+
+    public DropBoxReceiver(Context ctx, String wantTag, String... wantInStackTrace) {
+        mResultsReceivedSignal = new CountDownLatch(1);
+        mStartMs = System.currentTimeMillis();
+
+        DropBoxManager mDropbox = (DropBoxManager) ctx.getSystemService(Context.DROPBOX_SERVICE);
+
+        ctx.registerReceiver(
+                new BroadcastReceiver() {
+                    @Override
+                    public void onReceive(Context context, Intent intent) {
+                        // DropBox might receive other entries while we're waiting for the error
+                        // entry, so we need to check the tag and stack trace before continuing.
+                        while (true) {
+                            final DropBoxManager.Entry entry =
+                                    mDropbox.getNextEntry(wantTag, mStartMs);
+                            if (entry == null) {
+                                break;
+                            }
+                            Log.d(TAG, "ErrorsTest got message from drobpox: " + entry.getTag());
+                            mStartMs = entry.getTimeMillis();
+                            String stackTrace = entry.getText(64 * 1024);
+                            boolean allMatches = true;
+                            for (String line : wantInStackTrace) {
+                                boolean matched = stackTrace.contains(line);
+                                Log.d(TAG, "   matched=" + matched + " line: " + line);
+                                allMatches &= matched;
+                            }
+                            if (allMatches) {
+                                mResultsReceivedSignal.countDown();
+                            }
+                            entry.close();
+                        }
+                    }
+                },
+                new IntentFilter(DropBoxManager.ACTION_DROPBOX_ENTRY_ADDED));
+    }
+
+    public boolean await() throws InterruptedException {
+        return mResultsReceivedSignal.await(TIMEOUT_SECS, TimeUnit.SECONDS);
+    }
+}
diff --git a/common/device-side/util-axt/src/com/android/compatibility/common/util/FileCopyHelper.java b/common/device-side/util-axt/src/com/android/compatibility/common/util/FileCopyHelper.java
index f58dbd0..e802f69 100644
--- a/common/device-side/util-axt/src/com/android/compatibility/common/util/FileCopyHelper.java
+++ b/common/device-side/util-axt/src/com/android/compatibility/common/util/FileCopyHelper.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -67,6 +68,12 @@
         return mContext.getFileStreamPath(fileName).getAbsolutePath();
     }
 
+    public void copyToExternalStorage(final String res, File path) throws IOException {
+        InputStream source = new FileInputStream(res);
+        OutputStream target = new FileOutputStream(path);
+        copyFile(source, target);
+    }
+
     public void copyToExternalStorage(int resId, File path) throws IOException {
         InputStream source = mContext.getResources().openRawResource(resId);
         OutputStream target = new FileOutputStream(path);
diff --git a/common/device-side/util-axt/src/com/android/compatibility/common/util/MediaUtils.java b/common/device-side/util-axt/src/com/android/compatibility/common/util/MediaUtils.java
index d8d4357..3f44317 100644
--- a/common/device-side/util-axt/src/com/android/compatibility/common/util/MediaUtils.java
+++ b/common/device-side/util-axt/src/com/android/compatibility/common/util/MediaUtils.java
@@ -33,6 +33,7 @@
 import android.media.MediaFormat;
 import android.net.Uri;
 import android.os.Build;
+import android.os.ParcelFileDescriptor;
 import android.util.Log;
 import android.util.Range;
 
@@ -40,6 +41,7 @@
 import com.android.compatibility.common.util.ResultType;
 import com.android.compatibility.common.util.ResultUnit;
 
+import java.io.File;
 import java.lang.reflect.Method;
 import java.nio.ByteBuffer;
 import java.security.MessageDigest;
@@ -465,6 +467,35 @@
         return false;
     }
 
+    private static boolean hasCodecsForResourceCombo(final String resource, int track,
+            String mimePrefix) {
+        try {
+            AssetFileDescriptor afd = null;
+            MediaExtractor ex = null;
+            try {
+                ex = new MediaExtractor();
+                ex.setDataSource(resource);
+                if (mimePrefix != null) {
+                    return hasCodecForMediaAndDomain(ex, mimePrefix);
+                } else if (track == ALL_AV_TRACKS) {
+                    return hasCodecsForMedia(ex);
+                } else {
+                    return hasCodecForTrack(ex, track);
+                }
+            } finally {
+                if (ex != null) {
+                    ex.release();
+                }
+                if (afd != null) {
+                    afd.close();
+                }
+            }
+        } catch (IOException e) {
+            Log.i(TAG, "could not open resource");
+        }
+        return false;
+    }
+
     private static boolean hasCodecsForResourceCombo(
             Context context, int resourceId, int track, String mimePrefix) {
         try {
@@ -506,6 +537,14 @@
         return check(hasCodecsForResource(context, resourceId), "no decoder found");
     }
 
+    public static boolean hasCodecsForResource(final String resource) {
+        return hasCodecsForResourceCombo(resource, ALL_AV_TRACKS, null /* mimePrefix */);
+    }
+
+    public static boolean checkCodecsForResource(final String resource) {
+        return check(hasCodecsForResource(resource), "no decoder found");
+    }
+
     /**
      * return true iff track is supported.
      */
@@ -517,6 +556,14 @@
         return check(hasCodecForResource(context, resourceId, track), "no decoder found");
     }
 
+    public static boolean hasCodecForResource(final String resource, int track) {
+        return hasCodecsForResourceCombo(resource, track, null /* mimePrefix */);
+    }
+
+    public static boolean checkCodecForResource(final String resource, int track) {
+        return check(hasCodecForResource(resource, track), "no decoder found");
+    }
+
     /**
      * return true iff any track starting with mimePrefix is supported
      */
@@ -525,6 +572,10 @@
         return hasCodecsForResourceCombo(context, resourceId, ALL_AV_TRACKS, mimePrefix);
     }
 
+    public static boolean hasCodecForResourceAndDomain(String resource, String mimePrefix) {
+        return hasCodecsForResourceCombo(resource, ALL_AV_TRACKS, mimePrefix);
+    }
+
     /**
      * return true iff all audio and video tracks are supported
      */
@@ -715,6 +766,18 @@
         return getTrackFormatForExtractor(extractor, mimeTypePrefix);
     }
 
+    public static MediaFormat getTrackFormatForResource(
+            final String resource,
+            String mimeTypePrefix) throws IOException {
+        MediaExtractor extractor = new MediaExtractor();
+        try {
+            extractor.setDataSource(resource);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return getTrackFormatForExtractor(extractor, mimeTypePrefix);
+    }
+
     public static MediaFormat getTrackFormatForPath(
             Context context, String path, String mimeTypePrefix)
             throws IOException {
@@ -743,10 +806,13 @@
     }
 
     public static MediaExtractor createMediaExtractorForMimeType(
-            Context context, int resourceId, String mimeTypePrefix)
+            Context context, String resource, String mimeTypePrefix)
             throws IOException {
         MediaExtractor extractor = new MediaExtractor();
-        AssetFileDescriptor afd = context.getResources().openRawResourceFd(resourceId);
+        File inpFile = new File(resource);
+        ParcelFileDescriptor parcelFD =
+                ParcelFileDescriptor.open(inpFile, ParcelFileDescriptor.MODE_READ_ONLY);
+        AssetFileDescriptor afd = new AssetFileDescriptor(parcelFD, 0, parcelFD.getStatSize());
         try {
             extractor.setDataSource(
                     afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
diff --git a/common/device-side/util-axt/tests/src/com/android/compatibility/common/util/RetryRuleTest.java b/common/device-side/util-axt/tests/src/com/android/compatibility/common/util/RetryRuleTest.java
index 571a1b8..5a6a5ef 100644
--- a/common/device-side/util-axt/tests/src/com/android/compatibility/common/util/RetryRuleTest.java
+++ b/common/device-side/util-axt/tests/src/com/android/compatibility/common/util/RetryRuleTest.java
@@ -118,7 +118,7 @@
                         new RetryableStatement<RetryableException>(3, sRetryableException, cleaner),
                         mDescription).evaluate());
 
-        assertThat(actualException).isSameAs(sRetryableException);
+        assertThat(actualException).isSameInstanceAs(sRetryableException);
         verify(cleaner, times(2)).run();
     }
 
@@ -143,7 +143,7 @@
         final RetryableException actualException = expectThrows(RetryableException.class,
                 () -> rule.apply(mMockStatement, mDescription).evaluate());
 
-        assertThat(actualException).isSameAs(exception);
+        assertThat(actualException).isSameInstanceAs(exception);
         verify(mMockStatement, times(1)).evaluate();
         verify(cleaner, never()).run();
     }
@@ -169,7 +169,7 @@
                 () -> rule.apply(new RetryableStatement<RetryableException>(2, sRetryableException),
                         mDescription).evaluate());
 
-        assertThat(actualException).isSameAs(sRetryableException);
+        assertThat(actualException).isSameInstanceAs(sRetryableException);
     }
 
     @Test
@@ -190,7 +190,7 @@
         final RetryableException actualException = expectThrows(RetryableException.class,
                 () -> rule.apply(mMockStatement, mDescription).evaluate());
 
-        assertThat(actualException).isSameAs(exception);
+        assertThat(actualException).isSameInstanceAs(exception);
         verify(mMockStatement, times(1)).evaluate();
     }
 
@@ -203,7 +203,7 @@
         final RuntimeException actualException = expectThrows(RuntimeException.class,
                 () -> rule.apply(mMockStatement, mDescription).evaluate());
 
-        assertThat(actualException).isSameAs(exception);
+        assertThat(actualException).isSameInstanceAs(exception);
         verify(mMockStatement, times(1)).evaluate();
     }
 }
diff --git a/common/device-side/util-axt/tests/src/com/android/compatibility/common/util/SafeCleanerRuleTest.java b/common/device-side/util-axt/tests/src/com/android/compatibility/common/util/SafeCleanerRuleTest.java
index a56d7b2..9c82a1e 100644
--- a/common/device-side/util-axt/tests/src/com/android/compatibility/common/util/SafeCleanerRuleTest.java
+++ b/common/device-side/util-axt/tests/src/com/android/compatibility/common/util/SafeCleanerRuleTest.java
@@ -75,7 +75,7 @@
         final SafeCleanerRule rule = new SafeCleanerRule();
         final Throwable actualException = expectThrows(RuntimeException.class,
                 () -> rule.apply(new FailureStatement(mRuntimeException), mDescription).evaluate());
-        assertThat(actualException).isSameAs(mRuntimeException);
+        assertThat(actualException).isSameInstanceAs(mRuntimeException);
     }
 
     @Test
@@ -83,7 +83,7 @@
         final SafeCleanerRule rule = new SafeCleanerRule().setDumper(mDumper);
         final Throwable actualException = expectThrows(RuntimeException.class,
                 () -> rule.apply(new FailureStatement(mRuntimeException), mDescription).evaluate());
-        assertThat(actualException).isSameAs(mRuntimeException);
+        assertThat(actualException).isSameInstanceAs(mRuntimeException);
         verify(mDumper).dump("Whatever", actualException);
     }
 
@@ -94,7 +94,7 @@
                 .add(mGoodGuyExtraExceptions1);
         final Throwable actualException = expectThrows(RuntimeException.class,
                 () -> rule.apply(new FailureStatement(mRuntimeException), mDescription).evaluate());
-        assertThat(actualException).isSameAs(mRuntimeException);
+        assertThat(actualException).isSameInstanceAs(mRuntimeException);
         verify(mGoodGuyRunner1).run();
         verify(mGoodGuyExtraExceptions1).call();
     }
@@ -107,7 +107,7 @@
                 .add(mGoodGuyExtraExceptions1);
         final Throwable actualException = expectThrows(RuntimeException.class,
                 () -> rule.apply(new FailureStatement(mRuntimeException), mDescription).evaluate());
-        assertThat(actualException).isSameAs(mRuntimeException);
+        assertThat(actualException).isSameInstanceAs(mRuntimeException);
         verify(mGoodGuyRunner1).run();
         verify(mGoodGuyExtraExceptions1).call();
         verify(mDumper).dump("Whatever", actualException);
@@ -122,7 +122,7 @@
                 .add(mGoodGuyExtraExceptions1);
         final Throwable actualException = expectThrows(RuntimeException.class,
                 () -> rule.apply(mGoodGuyStatement, mDescription).evaluate());
-        assertThat(actualException).isSameAs(mRuntimeException);
+        assertThat(actualException).isSameInstanceAs(mRuntimeException);
         verify(mGoodGuyRunner1).run();
         verify(mGoodGuyRunner2).run();
         verify(mGoodGuyExtraExceptions1).call();
@@ -140,7 +140,7 @@
                 .add(mGoodGuyExtraExceptions1);
         final Throwable actualException = expectThrows(RuntimeException.class,
                 () -> rule.apply(mGoodGuyStatement, mDescription).evaluate());
-        assertThat(actualException).isSameAs(mRuntimeException);
+        assertThat(actualException).isSameInstanceAs(mRuntimeException);
         verify(mGoodGuyRunner1).run();
         verify(mGoodGuyRunner2).run();
         verify(mGoodGuyExtraExceptions1).call();
@@ -156,7 +156,7 @@
                 .run(mGoodGuyRunner2);
         final Throwable actualException = expectThrows(RuntimeException.class,
                 () -> rule.apply(mGoodGuyStatement, mDescription).evaluate());
-        assertThat(actualException).isSameAs(mRuntimeException);
+        assertThat(actualException).isSameInstanceAs(mRuntimeException);
         verify(mGoodGuyRunner1).run();
         verify(mGoodGuyRunner2).run();
         verify(mGoodGuyExtraExceptions1).call();
@@ -173,7 +173,7 @@
                 .run(mGoodGuyRunner2);
         final Throwable actualException = expectThrows(RuntimeException.class,
                 () -> rule.apply(mGoodGuyStatement, mDescription).evaluate());
-        assertThat(actualException).isSameAs(mRuntimeException);
+        assertThat(actualException).isSameInstanceAs(mRuntimeException);
         verify(mGoodGuyRunner1).run();
         verify(mGoodGuyRunner2).run();
         verify(mGoodGuyExtraExceptions1).call();
@@ -189,7 +189,7 @@
                 .run(mGoodGuyRunner2);
         final Throwable actualException = expectThrows(RuntimeException.class,
                 () -> rule.apply(mGoodGuyStatement, mDescription).evaluate());
-        assertThat(actualException).isSameAs(mRuntimeException);
+        assertThat(actualException).isSameInstanceAs(mRuntimeException);
         verify(mGoodGuyRunner1).run();
         verify(mGoodGuyRunner2).run();
         verify(mGoodGuyExtraExceptions1).call();
diff --git a/common/device-side/util-axt/tests/src/com/android/compatibility/common/util/StateChangerRuleTest.java b/common/device-side/util-axt/tests/src/com/android/compatibility/common/util/StateChangerRuleTest.java
index 9b1851e..7559ddc 100644
--- a/common/device-side/util-axt/tests/src/com/android/compatibility/common/util/StateChangerRuleTest.java
+++ b/common/device-side/util-axt/tests/src/com/android/compatibility/common/util/StateChangerRuleTest.java
@@ -117,7 +117,7 @@
 
         final RuntimeException actualException = expectThrows(RuntimeException.class,
                 () -> rule.apply(mStatement, mDescription).evaluate());
-        assertThat(actualException).isSameAs(mRuntimeException);
+        assertThat(actualException).isSameInstanceAs(mRuntimeException);
 
         verify(mStateManager, times(2)).get(); // Needed because of verifyNoMoreInteractions()
         verify(mStateManager, times(1)).set("newValue");
@@ -134,7 +134,7 @@
 
         final RuntimeException actualException = expectThrows(RuntimeException.class,
                 () -> rule.apply(mStatement, mDescription).evaluate());
-        assertThat(actualException).isSameAs(mRuntimeException);
+        assertThat(actualException).isSameInstanceAs(mRuntimeException);
 
         verify(mStateManager, never()).set(anyString());
     }
@@ -148,7 +148,7 @@
 
         final RuntimeException actualException = expectThrows(RuntimeException.class,
                 () -> rule.apply(mStatement, mDescription).evaluate());
-        assertThat(actualException).isSameAs(mRuntimeException);
+        assertThat(actualException).isSameInstanceAs(mRuntimeException);
 
         verify(mStateManager, times(2)).get(); // Needed because of verifyNoMoreInteractions()
         verify(mStateManager, times(1)).set("newValue");
@@ -164,7 +164,7 @@
 
         final RuntimeException actualException = expectThrows(RuntimeException.class,
                 () -> rule.apply(mStatement, mDescription).evaluate());
-        assertThat(actualException).isSameAs(mRuntimeException);
+        assertThat(actualException).isSameInstanceAs(mRuntimeException);
 
         verify(mStateManager, times(2)).get(); // Needed because of verifyNoMoreInteractions()
         verify(mStateManager, times(1)).set("sameValue");
diff --git a/common/device-side/util-axt/tests/src/com/android/compatibility/common/util/StateKeeperRuleTest.java b/common/device-side/util-axt/tests/src/com/android/compatibility/common/util/StateKeeperRuleTest.java
index 4599aca..becf079 100644
--- a/common/device-side/util-axt/tests/src/com/android/compatibility/common/util/StateKeeperRuleTest.java
+++ b/common/device-side/util-axt/tests/src/com/android/compatibility/common/util/StateKeeperRuleTest.java
@@ -74,7 +74,7 @@
         final RuntimeException actualException = expectThrows(RuntimeException.class,
                 () -> rule.apply(mStatement, mDescription).evaluate());
 
-        assertThat(actualException).isSameAs(mRuntimeException);
+        assertThat(actualException).isSameInstanceAs(mRuntimeException);
         verify(mStateManager, times(2)).get(); // Needed because of verifyNoMoreInteractions()
         verify(mStateManager, times(1)).set("before");
         verifyNoMoreInteractions(mStateManager); // Make sure set() was not called again
@@ -100,7 +100,7 @@
         final RuntimeException actualException = expectThrows(RuntimeException.class,
                 () -> rule.apply(mStatement, mDescription).evaluate());
 
-        assertThat(actualException).isSameAs(mRuntimeException);
+        assertThat(actualException).isSameInstanceAs(mRuntimeException);
 
         verify(mStateManager, never()).set(anyString());
     }
diff --git a/common/device-side/util-axt/tests/src/com/android/compatibility/common/util/TimeoutTest.java b/common/device-side/util-axt/tests/src/com/android/compatibility/common/util/TimeoutTest.java
index 8992d18..fdc4de6 100644
--- a/common/device-side/util-axt/tests/src/com/android/compatibility/common/util/TimeoutTest.java
+++ b/common/device-side/util-axt/tests/src/com/android/compatibility/common/util/TimeoutTest.java
@@ -105,7 +105,7 @@
         final Timeout timeout = new Timeout(mSleeper, NAME, 100, 2, 500);
         final Object result = new Object();
         when(mJob.call()).thenReturn(result);
-        assertThat(timeout.run(DESC, 1, mJob)).isSameAs(result);
+        assertThat(timeout.run(DESC, 1, mJob)).isSameInstanceAs(result);
         assertThat(mSleeper.totalSleepingTime).isEqualTo(0);
     }
 
@@ -114,7 +114,7 @@
         final Timeout timeout = new Timeout(mSleeper, NAME, 100, 2, 500);
         final Object result = new Object();
         when(mJob.call()).thenReturn((Object) null, result);
-        assertThat(timeout.run(DESC, 10, mJob)).isSameAs(result);
+        assertThat(timeout.run(DESC, 10, mJob)).isSameInstanceAs(result);
         assertThat(mSleeper.totalSleepingTime).isEqualTo(10);
     }
 
@@ -124,7 +124,7 @@
         final RetryableException e = expectThrows(RetryableException.class,
                 () -> timeout.run(DESC, 10, mJob));
         assertThat(e.getMessage()).contains(DESC);
-        assertThat(e.getTimeout()).isSameAs(timeout);
+        assertThat(e.getTimeout()).isSameInstanceAs(timeout);
         assertThat(mSleeper.totalSleepingTime).isEqualTo(100);
     }
 
diff --git a/common/device-side/util/jni/android_cts_CpuFeatures.cpp b/common/device-side/util/jni/android_cts_CpuFeatures.cpp
index 41fa5ab..9e3369b 100644
--- a/common/device-side/util/jni/android_cts_CpuFeatures.cpp
+++ b/common/device-side/util/jni/android_cts_CpuFeatures.cpp
@@ -28,12 +28,6 @@
     return cpuFamily == ANDROID_CPU_FAMILY_ARM;
 }
 
-jboolean android_cts_CpuFeatures_isMipsCpu(JNIEnv* env, jobject thiz)
-{
-    AndroidCpuFamily cpuFamily = android_getCpuFamily();
-    return cpuFamily == ANDROID_CPU_FAMILY_MIPS;
-}
-
 jboolean android_cts_CpuFeatures_isX86Cpu(JNIEnv* env, jobject thiz)
 {
     AndroidCpuFamily cpuFamily = android_getCpuFamily();
@@ -46,12 +40,6 @@
     return cpuFamily == ANDROID_CPU_FAMILY_ARM64;
 }
 
-jboolean android_cts_CpuFeatures_isMips64Cpu(JNIEnv* env, jobject thiz)
-{
-    AndroidCpuFamily cpuFamily = android_getCpuFamily();
-    return cpuFamily == ANDROID_CPU_FAMILY_MIPS64;
-}
-
 jboolean android_cts_CpuFeatures_isX86_64Cpu(JNIEnv* env, jobject thiz)
 {
     AndroidCpuFamily cpuFamily = android_getCpuFamily();
@@ -80,14 +68,10 @@
 static JNINativeMethod gMethods[] = {
     {  "isArmCpu", "()Z",
             (void *) android_cts_CpuFeatures_isArmCpu  },
-    {  "isMipsCpu", "()Z",
-            (void *) android_cts_CpuFeatures_isMipsCpu  },
     {  "isX86Cpu", "()Z",
             (void *) android_cts_CpuFeatures_isX86Cpu  },
     {  "isArm64Cpu", "()Z",
             (void *) android_cts_CpuFeatures_isArm64Cpu  },
-    {  "isMips64Cpu", "()Z",
-            (void *) android_cts_CpuFeatures_isMips64Cpu  },
     {  "isX86_64Cpu", "()Z",
             (void *) android_cts_CpuFeatures_isX86_64Cpu  },
     {  "getHwCaps", "()I",
diff --git a/helpers/default/src/com/android/cts/helpers/aosp/DefaultCtsPrintHelper.java b/helpers/default/src/com/android/cts/helpers/aosp/DefaultCtsPrintHelper.java
index e55e1f0..a6120b2 100644
--- a/helpers/default/src/com/android/cts/helpers/aosp/DefaultCtsPrintHelper.java
+++ b/helpers/default/src/com/android/cts/helpers/aosp/DefaultCtsPrintHelper.java
@@ -20,6 +20,7 @@
 import android.app.UiAutomation;
 import android.os.RemoteException;
 
+import android.os.SystemClock;
 import android.platform.helpers.exceptions.TestHelperException;
 import android.support.test.uiautomator.By;
 import android.support.test.uiautomator.UiDevice;
@@ -39,6 +40,7 @@
     private static final String LOG_TAG = DefaultCtsPrintHelper.class.getSimpleName();
 
     protected static final long OPERATION_TIMEOUT_MILLIS = 60000;
+    private static final long GET_UIAUTOMATION_TIMEOUT_MS = 60000;
 
     protected Instrumentation mInstrumentation;
     protected UiDevice mDevice;
@@ -47,7 +49,18 @@
     public DefaultCtsPrintHelper(Instrumentation instrumentation) {
         mInstrumentation = instrumentation;
         mDevice = UiDevice.getInstance(mInstrumentation);
-        mAutomation = mInstrumentation.getUiAutomation();
+
+        long start = SystemClock.uptimeMillis();
+        while (SystemClock.uptimeMillis() - start < GET_UIAUTOMATION_TIMEOUT_MS) {
+            UiAutomation ui = mInstrumentation.getUiAutomation();
+            if (ui != null) {
+                mAutomation = ui;
+                break;
+            }
+        }
+        if (mAutomation == null) {
+            throw new AssertionError("Failed to get UiAutomation");
+        }
     }
 
     protected void dumpWindowHierarchy() throws TestHelperException {
diff --git a/hostsidetests/abioverride/Android.bp b/hostsidetests/abioverride/Android.bp
index b287842..df1b040 100644
--- a/hostsidetests/abioverride/Android.bp
+++ b/hostsidetests/abioverride/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
diff --git a/hostsidetests/abioverride/app/Android.bp b/hostsidetests/abioverride/app/Android.bp
index 2b6dfe4..7d32534 100644
--- a/hostsidetests/abioverride/app/Android.bp
+++ b/hostsidetests/abioverride/app/Android.bp
@@ -25,7 +25,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/accounts/Android.bp b/hostsidetests/accounts/Android.bp
index 24c3591..12b0747 100644
--- a/hostsidetests/accounts/Android.bp
+++ b/hostsidetests/accounts/Android.bp
@@ -27,7 +27,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/accounts/test-apps/AccountManagerCrossUserApp/Android.bp b/hostsidetests/accounts/test-apps/AccountManagerCrossUserApp/Android.bp
index cc3ba95..95059f1 100644
--- a/hostsidetests/accounts/test-apps/AccountManagerCrossUserApp/Android.bp
+++ b/hostsidetests/accounts/test-apps/AccountManagerCrossUserApp/Android.bp
@@ -22,7 +22,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/accounts/test-apps/Android.mk b/hostsidetests/accounts/test-apps/Android.mk
index 985ff13..0d4c793 100644
--- a/hostsidetests/accounts/test-apps/Android.mk
+++ b/hostsidetests/accounts/test-apps/Android.mk
@@ -17,7 +17,7 @@
 include $(CLEAR_VARS)
 
 # tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 # Build the test APKs using their own makefiles
 include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/hostsidetests/adb/Android.mk b/hostsidetests/adb/Android.mk
index 292bc18..ea6eb03 100644
--- a/hostsidetests/adb/Android.mk
+++ b/hostsidetests/adb/Android.mk
@@ -1,7 +1,7 @@
 LOCAL_PATH := $(call my-dir)
 
 include $(CLEAR_VARS)
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 LOCAL_CTS_TEST_PACKAGE := android.host.adb
 LOCAL_MODULE := CtsAdbHostTestCases
 LOCAL_MODULE_CLASS := JAVA_LIBRARIES
diff --git a/hostsidetests/angle/Android.bp b/hostsidetests/angle/Android.bp
index dac193f..a0faa3b 100644
--- a/hostsidetests/angle/Android.bp
+++ b/hostsidetests/angle/Android.bp
@@ -20,7 +20,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
diff --git a/hostsidetests/angle/app/driverTest/Android.bp b/hostsidetests/angle/app/driverTest/Android.bp
index 9b2adb2..bd52d3a 100644
--- a/hostsidetests/angle/app/driverTest/Android.bp
+++ b/hostsidetests/angle/app/driverTest/Android.bp
@@ -21,7 +21,7 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
+        "general-tests",
     ],
     compile_multilib: "both",
     static_libs: [
diff --git a/hostsidetests/angle/app/driverTestSecondary/Android.bp b/hostsidetests/angle/app/driverTestSecondary/Android.bp
index fad514e..15e8e41 100644
--- a/hostsidetests/angle/app/driverTestSecondary/Android.bp
+++ b/hostsidetests/angle/app/driverTestSecondary/Android.bp
@@ -23,7 +23,7 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
+        "general-tests",
     ],
     compile_multilib: "both",
     static_libs: [
diff --git a/hostsidetests/angle/src/android/angle/cts/CtsAngleCommon.java b/hostsidetests/angle/src/android/angle/cts/CtsAngleCommon.java
index 7165728..9bb55fa 100644
--- a/hostsidetests/angle/src/android/angle/cts/CtsAngleCommon.java
+++ b/hostsidetests/angle/src/android/angle/cts/CtsAngleCommon.java
@@ -30,7 +30,7 @@
     static final String SETTINGS_GLOBAL_ALL_USE_ANGLE = "angle_gl_driver_all_angle";
     static final String SETTINGS_GLOBAL_DRIVER_PKGS = "angle_gl_driver_selection_pkgs";
     static final String SETTINGS_GLOBAL_DRIVER_VALUES = "angle_gl_driver_selection_values";
-    static final String SETTINGS_GLOBAL_WHITELIST = "angle_whitelist";
+    static final String SETTINGS_GLOBAL_ALLOWLIST = "angle_allowlist";
     static final String SETTINGS_GLOBAL_ANGLE_IN_USE_DIALOG_BOX = "show_angle_in_use_dialog_box";
 
     // System Properties
@@ -98,7 +98,7 @@
         setGlobalSetting(device, SETTINGS_GLOBAL_ANGLE_IN_USE_DIALOG_BOX, "0");
         setGlobalSetting(device, SETTINGS_GLOBAL_DRIVER_PKGS, "\"\"");
         setGlobalSetting(device, SETTINGS_GLOBAL_DRIVER_VALUES, "\"\"");
-        setGlobalSetting(device, SETTINGS_GLOBAL_WHITELIST, "\"\"");
+        setGlobalSetting(device, SETTINGS_GLOBAL_ALLOWLIST, "\"\"");
 
         // Properties
         setProperty(device, PROPERTY_TEMP_RULES_FILE, "\"\"");
diff --git a/hostsidetests/angle/src/android/angle/cts/CtsAngleRulesFileTest.java b/hostsidetests/angle/src/android/angle/cts/CtsAngleRulesFileTest.java
index 1f7f06e..326cb7a 100644
--- a/hostsidetests/angle/src/android/angle/cts/CtsAngleRulesFileTest.java
+++ b/hostsidetests/angle/src/android/angle/cts/CtsAngleRulesFileTest.java
@@ -42,7 +42,7 @@
     private final String TAG = this.getClass().getSimpleName();
 
     private File mRulesFile;
-    private String mWhiteList;
+    private String mAllowList;
 
     // Rules Files
     private static final String RULES_FILE_EMPTY = "emptyRules.json";
@@ -52,7 +52,7 @@
         byte[] rulesFileBytes =
                 ByteStreams.toByteArray(getClass().getResourceAsStream("/" + hostFilename));
 
-        Assert.assertTrue("Loaded empty rules file", rulesFileBytes.length > 0); // sanity check
+        Assert.assertTrue("Loaded empty rules file", rulesFileBytes.length > 0); // validity check
         mRulesFile = File.createTempFile("rulesFile", "tempRules.json");
         Files.write(rulesFileBytes, mRulesFile);
 
@@ -61,32 +61,32 @@
         setProperty(getDevice(), PROPERTY_TEMP_RULES_FILE, DEVICE_TEMP_RULES_FILE_PATH);
     }
 
-    private void setAndValidateAngleDevOptionWhitelist(String whiteList) throws Exception {
-        // SETTINGS_GLOBAL_WHITELIST
-        setGlobalSetting(getDevice(), SETTINGS_GLOBAL_WHITELIST, whiteList);
+    private void setAndValidateAngleDevOptionAllowlist(String allowList) throws Exception {
+        // SETTINGS_GLOBAL_ALLOWLIST
+        setGlobalSetting(getDevice(), SETTINGS_GLOBAL_ALLOWLIST, allowList);
 
-        String devOption = getGlobalSetting(getDevice(), SETTINGS_GLOBAL_WHITELIST);
+        String devOption = getGlobalSetting(getDevice(), SETTINGS_GLOBAL_ALLOWLIST);
         Assert.assertEquals(
-            "Developer option '" + SETTINGS_GLOBAL_WHITELIST +
+            "Developer option '" + SETTINGS_GLOBAL_ALLOWLIST +
                 "' was not set correctly: '" + devOption + "'",
-            whiteList, devOption);
+            allowList, devOption);
     }
 
     @Before
     public void setUp() throws Exception {
         clearSettings(getDevice());
 
-        mWhiteList = getGlobalSetting(getDevice(), SETTINGS_GLOBAL_WHITELIST);
+        mAllowList = getGlobalSetting(getDevice(), SETTINGS_GLOBAL_ALLOWLIST);
 
-        final String whitelist = ANGLE_DRIVER_TEST_PKG + "," + ANGLE_DRIVER_TEST_SEC_PKG;
-        setAndValidateAngleDevOptionWhitelist(whitelist);
+        final String allowlist = ANGLE_DRIVER_TEST_PKG + "," + ANGLE_DRIVER_TEST_SEC_PKG;
+        setAndValidateAngleDevOptionAllowlist(allowlist);
     }
 
     @After
     public void tearDown() throws Exception {
         clearSettings(getDevice());
 
-        setAndValidateAngleDevOptionWhitelist(mWhiteList);
+        setAndValidateAngleDevOptionAllowlist(mAllowList);
 
         FileUtil.deleteFile(mRulesFile);
     }
diff --git a/hostsidetests/apex/Android.bp b/hostsidetests/apex/Android.bp
index 33194a1..c1c9805 100644
--- a/hostsidetests/apex/Android.bp
+++ b/hostsidetests/apex/Android.bp
@@ -16,5 +16,5 @@
     name: "CtsApexTestCases",
     srcs: ["src/**/*.java"],
     test_suites: ["cts", "general-tests", "mts"],
-    libs: ["cts-tradefed", "tradefed"],
+    libs: ["cts-tradefed", "cts-shim-host-lib", "tradefed"],
 }
diff --git a/hostsidetests/apex/src/android/apex/cts/ApexTest.java b/hostsidetests/apex/src/android/apex/cts/ApexTest.java
index c2ca8bc..5ccdaf3 100644
--- a/hostsidetests/apex/src/android/apex/cts/ApexTest.java
+++ b/hostsidetests/apex/src/android/apex/cts/ApexTest.java
@@ -16,6 +16,8 @@
 
 package android.apex.cts;
 
+import static com.android.cts.shim.lib.ShimPackage.SHIM_APEX_PACKAGE_NAME;
+
 import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
 import com.android.tradefed.util.CommandResult;
@@ -90,19 +92,17 @@
 
   // CTS shim APEX can be non-flattened - even when ro.apex.updatable=false.
   // Don't count it.
-  private final static String CTS_SHIM_APEX_NAME = "com.android.apex.cts.shim";
-
   private int countFlattenedApexes(String dir) throws Exception {
     CommandResult result = getDevice().executeShellV2Command(
         "find " + dir + " -type f -name \"apex_manifest.pb\" ! -path \"*" +
-        CTS_SHIM_APEX_NAME + "*\" | wc -l");
+        SHIM_APEX_PACKAGE_NAME + "*\" | wc -l");
     return result.getExitCode() == 0 ? Integer.parseInt(result.getStdout().trim()) : 0;
   }
 
   private int countNonFlattenedApexes(String dir) throws Exception {
     CommandResult result = getDevice().executeShellV2Command(
         "find " + dir + " -type f -name \"*.apex\" ! -name \"" +
-        CTS_SHIM_APEX_NAME + ".apex\" | wc -l");
+        SHIM_APEX_PACKAGE_NAME + ".apex\" | wc -l");
     return result.getExitCode() == 0 ? Integer.parseInt(result.getStdout().trim()) : 0;
   }
 
diff --git a/hostsidetests/appbinding/app/Android.bp b/hostsidetests/appbinding/app/Android.bp
index c95ace4..fbb4b63 100644
--- a/hostsidetests/appbinding/app/Android.bp
+++ b/hostsidetests/appbinding/app/Android.bp
@@ -27,7 +27,7 @@
 
 java_defaults {
     name: "cts_hostside_appbinding_defaults",
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     sdk_version: "test_current",
     static_libs: [
         "ctstestrunner-axt",
@@ -47,7 +47,6 @@
     manifest: "app1/AndroidManifest.xml",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -62,7 +61,6 @@
     manifest: "app2/AndroidManifest.xml",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -77,7 +75,6 @@
     manifest: "app3/AndroidManifest.xml",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -92,7 +89,6 @@
     manifest: "app4/AndroidManifest.xml",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -106,7 +102,6 @@
     manifest: "app5/AndroidManifest.xml",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -121,7 +116,6 @@
     manifest: "app6/AndroidManifest.xml",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -137,7 +131,6 @@
     test_suites: [
         "cts",
         "vts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -153,7 +146,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/appbinding/app/src/com/android/cts/appbinding/app/MyEnabler.java b/hostsidetests/appbinding/app/src/com/android/cts/appbinding/app/MyEnabler.java
index 0a55b96..48bd9c1 100644
--- a/hostsidetests/appbinding/app/src/com/android/cts/appbinding/app/MyEnabler.java
+++ b/hostsidetests/appbinding/app/src/com/android/cts/appbinding/app/MyEnabler.java
@@ -40,7 +40,8 @@
         context.getPackageManager().setComponentEnabledSetting(cn,
                 PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
 
-        Log.w(TAG, "Enabled " + cn);
+
+        Log.w(TAG, "Enabled " + cn + " on user " + context.getUserId());
     }
 
     @Test
diff --git a/hostsidetests/appbinding/hostside/Android.bp b/hostsidetests/appbinding/hostside/Android.bp
index 294f73b..cb7ebbd 100644
--- a/hostsidetests/appbinding/hostside/Android.bp
+++ b/hostsidetests/appbinding/hostside/Android.bp
@@ -25,7 +25,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     target_required: [
diff --git a/hostsidetests/appbinding/hostside/src/com/android/cts/appbinding/AppBindingHostTest.java b/hostsidetests/appbinding/hostside/src/com/android/cts/appbinding/AppBindingHostTest.java
index 7d2705f..34dfd0e 100755
--- a/hostsidetests/appbinding/hostside/src/com/android/cts/appbinding/AppBindingHostTest.java
+++ b/hostsidetests/appbinding/hostside/src/com/android/cts/appbinding/AppBindingHostTest.java
@@ -27,6 +27,7 @@
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
 import com.android.tradefed.testtype.IBuildReceiver;
 import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
+import com.android.tradefed.testtype.junit4.DeviceTestRunOptions;
 
 import org.junit.After;
 import org.junit.Before;
@@ -61,8 +62,7 @@
     private static final String SERVICE_2 = "com.android.cts.appbinding.app.MyService2";
 
     private IBuildInfo mCtsBuild;
-
-    private static final int USER_SYSTEM = 0;
+    private int mCurrentUserId;
 
     private static final int DEFAULT_TIMEOUT_SEC = 30;
 
@@ -213,6 +213,8 @@
         updateConstants(",");
 
         uninstallTestApps(true);
+
+        mCurrentUserId = getDevice().getCurrentUser();
     }
 
     @After
@@ -345,7 +347,7 @@
             return;
         }
 
-        installAndCheckBound(APK_1, PACKAGE_A, SERVICE_1, USER_SYSTEM);
+        installAndCheckBound(APK_1, PACKAGE_A, SERVICE_1, mCurrentUserId);
     }
 
     /**
@@ -358,7 +360,7 @@
             return;
         }
 
-        installAndCheckBound(APK_2, PACKAGE_A, SERVICE_2, USER_SYSTEM);
+        installAndCheckBound(APK_2, PACKAGE_A, SERVICE_2, mCurrentUserId);
     }
 
     /**
@@ -371,7 +373,7 @@
             return;
         }
 
-        installAndCheckBound(APK_B, PACKAGE_B, SERVICE_1, USER_SYSTEM);
+        installAndCheckBound(APK_B, PACKAGE_B, SERVICE_1, mCurrentUserId);
     }
 
     /**
@@ -384,7 +386,7 @@
             return;
         }
 
-        installAndCheckNotBound(APK_3, PACKAGE_A, USER_SYSTEM,
+        installAndCheckNotBound(APK_3, PACKAGE_A, mCurrentUserId,
                 "must be protected with android.permission.BIND_CARRIER_MESSAGING_CLIENT_SERVICE");
     }
 
@@ -398,7 +400,7 @@
             return;
         }
 
-        installAndCheckNotBound(APK_4, PACKAGE_A, USER_SYSTEM, "More than one");
+        installAndCheckNotBound(APK_4, PACKAGE_A, mCurrentUserId, "More than one");
     }
 
     /**
@@ -411,7 +413,7 @@
             return;
         }
 
-        installAndCheckNotBound(APK_5, PACKAGE_A, USER_SYSTEM,
+        installAndCheckNotBound(APK_5, PACKAGE_A, mCurrentUserId,
                 "Service with android.telephony.action.CARRIER_MESSAGING_CLIENT_SERVICE not found");
     }
 
@@ -425,7 +427,7 @@
             return;
         }
 
-        installAndCheckNotBound(APK_6, PACKAGE_A, USER_SYSTEM,
+        installAndCheckNotBound(APK_6, PACKAGE_A, mCurrentUserId,
                 "Service must not run on the main process");
     }
 
@@ -440,17 +442,19 @@
         }
 
         // Replace existing package without uninstalling.
-        installAndCheckBound(APK_1, PACKAGE_A, SERVICE_1, USER_SYSTEM);
-        installAndCheckBound(APK_2, PACKAGE_A, SERVICE_2, USER_SYSTEM);
-        installAndCheckNotBound(APK_3, PACKAGE_A, USER_SYSTEM,
+        installAndCheckBound(APK_1, PACKAGE_A, SERVICE_1, mCurrentUserId);
+        installAndCheckBound(APK_2, PACKAGE_A, SERVICE_2, mCurrentUserId);
+        installAndCheckNotBound(APK_3, PACKAGE_A, mCurrentUserId,
                 "must be protected with android.permission.BIND_CARRIER_MESSAGING_CLIENT_SERVICE");
-        installAndCheckBound(APK_1, PACKAGE_A, SERVICE_1, USER_SYSTEM);
-        installAndCheckNotBound(APK_4, PACKAGE_A, USER_SYSTEM, "More than one");
+        installAndCheckBound(APK_1, PACKAGE_A, SERVICE_1, mCurrentUserId);
+        installAndCheckNotBound(APK_4, PACKAGE_A, mCurrentUserId, "More than one");
     }
 
     private void enableTargetService(boolean enable) throws DeviceNotAvailableException {
-        runDeviceTests(PACKAGE_A, "com.android.cts.appbinding.app.MyEnabler",
-                enable ? "enableService" : "disableService");
+        runDeviceTests(new DeviceTestRunOptions(PACKAGE_A)
+                .setTestClassName("com.android.cts.appbinding.app.MyEnabler")
+                .setTestMethodName(enable ? "enableService" : "disableService")
+                .setUserId(mCurrentUserId));
     }
 
     /**
@@ -463,7 +467,7 @@
             return;
         }
 
-        installAndCheckBound(APK_1, PACKAGE_A, SERVICE_1, USER_SYSTEM);
+        installAndCheckBound(APK_1, PACKAGE_A, SERVICE_1, mCurrentUserId);
 
         // Disable the component and now it should be unbound.
 
@@ -471,7 +475,7 @@
 
         Thread.sleep(2); // Technically not needed, but allow the system to handle the broadcast.
 
-        checkNotBoundWithError(PACKAGE_A, USER_SYSTEM,
+        checkNotBoundWithError(PACKAGE_A, mCurrentUserId,
                 "Service with android.telephony.action.CARRIER_MESSAGING_CLIENT_SERVICE not found");
 
         // Enable the component and now it should be bound.
@@ -479,7 +483,7 @@
 
         Thread.sleep(2); // Technically not needed, but allow the system to handle the broadcast.
 
-        checkBound(PACKAGE_A, SERVICE_1, USER_SYSTEM);
+        checkBound(PACKAGE_A, SERVICE_1, mCurrentUserId);
     }
 
     /**
@@ -493,7 +497,7 @@
         }
 
         // The service is disabled by default, so not bound.
-        installAndCheckNotBound(APK_7, PACKAGE_A, USER_SYSTEM,
+        installAndCheckNotBound(APK_7, PACKAGE_A, mCurrentUserId,
                 "Service with android.telephony.action.CARRIER_MESSAGING_CLIENT_SERVICE not found");
 
         // Enable the component and now it should be bound.
@@ -501,7 +505,7 @@
 
         Thread.sleep(2); // Technically not needed, but allow the system to handle the broadcast.
 
-        checkBound(PACKAGE_A, SERVICE_1, USER_SYSTEM);
+        checkBound(PACKAGE_A, SERVICE_1, mCurrentUserId);
 
         // Disable the component and now it should be unbound.
 
@@ -509,7 +513,7 @@
 
         Thread.sleep(2); // Technically not needed, but allow the system to handle the broadcast.
 
-        checkNotBoundWithError(PACKAGE_A, USER_SYSTEM,
+        checkNotBoundWithError(PACKAGE_A, mCurrentUserId,
                 "Service with android.telephony.action.CARRIER_MESSAGING_CLIENT_SERVICE not found");
     }
 
@@ -524,18 +528,18 @@
         }
 
         // Replace existing package without uninstalling.
-        installAndCheckBound(APK_1, PACKAGE_A, SERVICE_1, USER_SYSTEM);
+        installAndCheckBound(APK_1, PACKAGE_A, SERVICE_1, mCurrentUserId);
         getDevice().uninstallPackage(PACKAGE_A);
-        checkPackageNotBound(PACKAGE_A, USER_SYSTEM);
+        checkPackageNotBound(PACKAGE_A, mCurrentUserId);
 
         // Try with different APKs, just to make sure.
-        installAndCheckBound(APK_B, PACKAGE_B, SERVICE_1, USER_SYSTEM);
+        installAndCheckBound(APK_B, PACKAGE_B, SERVICE_1, mCurrentUserId);
         getDevice().uninstallPackage(PACKAGE_B);
-        checkPackageNotBound(PACKAGE_B, USER_SYSTEM);
+        checkPackageNotBound(PACKAGE_B, mCurrentUserId);
 
-        installAndCheckBound(APK_2, PACKAGE_A, SERVICE_2, USER_SYSTEM);
+        installAndCheckBound(APK_2, PACKAGE_A, SERVICE_2, mCurrentUserId);
         getDevice().uninstallPackage(PACKAGE_A);
-        checkPackageNotBound(PACKAGE_A, USER_SYSTEM);
+        checkPackageNotBound(PACKAGE_A, mCurrentUserId);
     }
 
     /**
@@ -548,9 +552,9 @@
             return;
         }
 
-        installAndCheckBound(APK_1, PACKAGE_A, SERVICE_1, USER_SYSTEM);
-        installAndCheckBound(APK_B, PACKAGE_B, SERVICE_1, USER_SYSTEM);
-        installAndCheckBound(APK_2, PACKAGE_A, SERVICE_2, USER_SYSTEM);
+        installAndCheckBound(APK_1, PACKAGE_A, SERVICE_1, mCurrentUserId);
+        installAndCheckBound(APK_B, PACKAGE_B, SERVICE_1, mCurrentUserId);
+        installAndCheckBound(APK_2, PACKAGE_A, SERVICE_2, mCurrentUserId);
     }
 
     private void assertUserHasNoConnection(int userId) throws Throwable {
@@ -579,7 +583,7 @@
             return;
         }
 
-        installAndCheckBound(APK_1, PACKAGE_A, SERVICE_1, USER_SYSTEM);
+        installAndCheckBound(APK_1, PACKAGE_A, SERVICE_1, mCurrentUserId);
 
         final int userId = getDevice().createUser("test-user");
         try {
@@ -589,10 +593,10 @@
             installAndCheckBound(APK_B, PACKAGE_B, SERVICE_1, userId);
 
             // Package A should still be bound on user-0.
-            checkBound(PACKAGE_A, SERVICE_1, USER_SYSTEM);
+            checkBound(PACKAGE_A, SERVICE_1, mCurrentUserId);
 
             // Replace the app on the primary user with an invalid one.
-            installAndCheckNotBound(APK_3, PACKAGE_A, USER_SYSTEM,
+            installAndCheckNotBound(APK_3, PACKAGE_A, mCurrentUserId,
                     "must be protected with android.permission.BIND_CARRIER_MESSAGING_CLIENT_SERVICE");
 
             // Secondary user should still have a valid connection.
@@ -636,12 +640,12 @@
                 + ",service_reconnect_max_backoff_sec=1000"
                 + ",service_stable_connection_threshold_sec=10");
 
-        installAndCheckBound(APK_1, PACKAGE_A, SERVICE_1, USER_SYSTEM);
+        installAndCheckBound(APK_1, PACKAGE_A, SERVICE_1, mCurrentUserId);
 
         // Ensure the expected status.
         runWithRetries(DEFAULT_TIMEOUT_SEC, () -> {
             runCommand("dumpsys app_binding -s",
-                    "^conn,\\[Default\\sSMS\\sapp\\],0,.*,bound,connected"
+                    "^conn,\\[Default\\sSMS\\sapp\\]," + mCurrentUserId + ",.*,bound,connected"
                     + ",\\#con=1,\\#dis=0,\\#died=0,backoff=5000");
         });
 
@@ -652,7 +656,7 @@
         // In this case, because binder-died isn't called, so backoff won't increase.
         runWithRetries(DEFAULT_TIMEOUT_SEC, () -> {
             runCommand("dumpsys app_binding -s",
-                    "^conn,\\[Default\\sSMS\\sapp\\],0,.*,bound,connected"
+                    "^conn,\\[Default\\sSMS\\sapp\\]," + mCurrentUserId + ",.*,bound,connected"
                     + ",\\#con=2,\\#dis=1,\\#died=0,backoff=5000");
         });
 
@@ -662,7 +666,7 @@
         // Force-stop causes a disconnect and a binder-died. Then it doubles the backoff.
         runWithRetries(DEFAULT_TIMEOUT_SEC, () -> {
             runCommand("dumpsys app_binding -s",
-                    "^conn,\\[Default\\sSMS\\sapp\\],0,.*,not-bound,not-connected"
+                    "^conn,\\[Default\\sSMS\\sapp\\]," + mCurrentUserId + ",.*,not-bound,not-connected"
                     + ",\\#con=2,\\#dis=2,\\#died=1,backoff=10000");
         });
 
@@ -671,7 +675,7 @@
         // It should re-bind.
         runWithRetries(10, () -> {
             runCommand("dumpsys app_binding -s",
-                    "^conn,\\[Default\\sSMS\\sapp\\],0,.*,bound,connected"
+                    "^conn,\\[Default\\sSMS\\sapp\\]," + mCurrentUserId + ",.*,bound,connected"
                             + ",\\#con=3,\\#dis=2,\\#died=1,backoff=10000");
         });
 
@@ -680,7 +684,7 @@
 
         runWithRetries(10, () -> {
             runCommand("dumpsys app_binding -s",
-                    "^conn,\\[Default\\sSMS\\sapp\\],0,.*,not-bound,not-connected"
+                    "^conn,\\[Default\\sSMS\\sapp\\]," + mCurrentUserId + ",.*,not-bound,not-connected"
                             + ",\\#con=3,\\#dis=3,\\#died=2,backoff=20000");
         });
 
@@ -688,7 +692,7 @@
 
         runWithRetries(10, () -> {
             runCommand("dumpsys app_binding -s",
-                    "^conn,\\[Default\\sSMS\\sapp\\],0,.*,bound,connected"
+                    "^conn,\\[Default\\sSMS\\sapp\\]," + mCurrentUserId + ",.*,bound,connected"
                             + ",\\#con=4,\\#dis=3,\\#died=2,backoff=20000");
         });
 
@@ -698,7 +702,7 @@
 
         runWithRetries(10, () -> {
             runCommand("dumpsys app_binding -s",
-                    "^conn,\\[Default\\sSMS\\sapp\\],0,.*,bound,connected"
+                    "^conn,\\[Default\\sSMS\\sapp\\]," + mCurrentUserId + ",.*,bound,connected"
                             + ",\\#con=4,\\#dis=3,\\#died=2,backoff=5000");
         });
     }
@@ -713,18 +717,18 @@
             return;
         }
 
-        installAndCheckBound(APK_1, PACKAGE_A, SERVICE_1, USER_SYSTEM);
+        installAndCheckBound(APK_1, PACKAGE_A, SERVICE_1, mCurrentUserId);
 
         updateConstants("sms_service_enabled=false");
 
         runWithRetries(DEFAULT_TIMEOUT_SEC, () -> {
-            checkNotBoundWithError("null", USER_SYSTEM, "feature disabled");
+            checkNotBoundWithError("null", mCurrentUserId, "feature disabled");
         });
 
         updateConstants("sms_service_enabled=true");
 
         runWithRetries(DEFAULT_TIMEOUT_SEC, () -> {
-            checkBound(PACKAGE_A, SERVICE_1, USER_SYSTEM);
+            checkBound(PACKAGE_A, SERVICE_1, mCurrentUserId);
         });
     }
 
@@ -735,7 +739,7 @@
             return;
         }
 
-        installAndCheckBound(APK_1, PACKAGE_A, SERVICE_1, USER_SYSTEM);
+        installAndCheckBound(APK_1, PACKAGE_A, SERVICE_1, mCurrentUserId);
         assertOomAdjustment(PACKAGE_A, PACKAGE_A_PROC, 200);
     }
 }
diff --git a/hostsidetests/appcompat/OWNERS b/hostsidetests/appcompat/OWNERS
index 4e3ec29..11a1173 100644
--- a/hostsidetests/appcompat/OWNERS
+++ b/hostsidetests/appcompat/OWNERS
@@ -4,6 +4,5 @@
 platform-compat-eng+reviews@google.com
 
 andreionea@google.com
-atrost@google.com
 mathewi@google.com
-satayev@google.com
\ No newline at end of file
+satayev@google.com
diff --git a/hostsidetests/appcompat/compatchanges/Android.bp b/hostsidetests/appcompat/compatchanges/Android.bp
index f6da38b..e0c389e 100644
--- a/hostsidetests/appcompat/compatchanges/Android.bp
+++ b/hostsidetests/appcompat/compatchanges/Android.bp
@@ -25,7 +25,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     java_resources: [":cts-global-compat-config"],
diff --git a/hostsidetests/appcompat/compatchanges/app/Android.bp b/hostsidetests/appcompat/compatchanges/app/Android.bp
index fdf069b..be40b28 100644
--- a/hostsidetests/appcompat/compatchanges/app/Android.bp
+++ b/hostsidetests/appcompat/compatchanges/app/Android.bp
@@ -30,7 +30,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/appcompat/compatchanges/src/com/android/cts/appcompat/CompatChangesValidConfigTest.java b/hostsidetests/appcompat/compatchanges/src/com/android/cts/appcompat/CompatChangesValidConfigTest.java
index c5e72b9..f8f4ccd 100644
--- a/hostsidetests/appcompat/compatchanges/src/com/android/cts/appcompat/CompatChangesValidConfigTest.java
+++ b/hostsidetests/appcompat/compatchanges/src/com/android/cts/appcompat/CompatChangesValidConfigTest.java
@@ -43,23 +43,23 @@
     private static class Change {
         private static final Pattern CHANGE_REGEX = Pattern.compile("^ChangeId\\((?<changeId>[0-9]+)"
                                                 + "(; name=(?<changeName>[^;]+))?"
-                                                + "(; enableAfterTargetSdk=(?<targetSdk>[0-9]+))?"
+                                                + "(; enableSinceTargetSdk=(?<sinceSdk>[0-9]+))?"
                                                 + "(; (?<disabled>disabled))?"
                                                 + "(; (?<loggingOnly>loggingOnly))?"
                                                 + "(; packageOverrides=(?<overrides>[^\\)]+))?"
                                                 + "\\)");
         long changeId;
         String changeName;
-        int targetSdk;
+        int sinceSdk;
         boolean disabled;
         boolean loggingOnly;
         boolean hasOverrides;
 
-        private Change(long changeId, String changeName, int targetSdk, boolean disabled,
-                boolean loggingOnly, boolean hasOverrides) {
+        private Change(long changeId, String changeName, int sinceSdk,
+                boolean disabled, boolean loggingOnly, boolean hasOverrides) {
             this.changeId = changeId;
             this.changeName = changeName;
-            this.targetSdk = targetSdk;
+            this.sinceSdk = sinceSdk;
             this.disabled = disabled;
             this.loggingOnly = loggingOnly;
             this.hasOverrides = hasOverrides;
@@ -68,7 +68,7 @@
         static Change fromString(String line) {
             long changeId = 0;
             String changeName;
-            int targetSdk = 0;
+            int sinceSdk = -1;
             boolean disabled = false;
             boolean loggingOnly = false;
             boolean hasOverrides = false;
@@ -84,12 +84,12 @@
                 throw new RuntimeException("No or invalid changeId!", e);
             }
             changeName = matcher.group("changeName");
-            String targetSdkAsString = matcher.group("targetSdk");
-            if (targetSdkAsString != null) {
+            String sinceSdkAsString = matcher.group("sinceSdk");
+            if (sinceSdkAsString != null) {
                 try {
-                    targetSdk = Integer.parseInt(targetSdkAsString);
+                    sinceSdk = Integer.parseInt(sinceSdkAsString);
                 } catch (NumberFormatException e) {
-                    throw new RuntimeException("Invalid targetSdk for change!", e);
+                    throw new RuntimeException("Invalid sinceSdk for change!", e);
                 }
             }
             if (matcher.group("disabled") != null) {
@@ -101,16 +101,24 @@
             if (matcher.group("overrides") != null) {
                 hasOverrides = true;
             }
-            return new Change(changeId, changeName, targetSdk, disabled, loggingOnly, hasOverrides);
+            return new Change(changeId, changeName, sinceSdk, disabled, loggingOnly, hasOverrides);
         }
 
         static Change fromNode(Node node) {
             Element element = (Element) node;
             long changeId = Long.parseLong(element.getAttribute("id"));
             String changeName = element.getAttribute("name");
-            int targetSdk = 0;
+            int sinceSdk = -1;
+            if (element.hasAttribute("enableAfterTargetSdk")
+                && element.hasAttribute("enableSinceTargetSdk")) {
+                    throw new IllegalArgumentException("Invalid change node!"
+                    + "Change contains both enableAfterTargetSdk and enableSinceTargetSdk");
+            }
             if (element.hasAttribute("enableAfterTargetSdk")) {
-                targetSdk = Integer.parseInt(element.getAttribute("enableAfterTargetSdk"));
+                sinceSdk = Integer.parseInt(element.getAttribute("enableAfterTargetSdk")) + 1;
+            }
+            if (element.hasAttribute("enableSinceTargetSdk")) {
+                sinceSdk = Integer.parseInt(element.getAttribute("enableSinceTargetSdk"));
             }
             boolean disabled = false;
             if (element.hasAttribute("disabled")) {
@@ -121,11 +129,11 @@
                 loggingOnly = true;
             }
             boolean hasOverrides = false;
-            return new Change(changeId, changeName, targetSdk, disabled, loggingOnly, hasOverrides);
+            return new Change(changeId, changeName, sinceSdk, disabled, loggingOnly, hasOverrides);
         }
         @Override
         public int hashCode() {
-            return Objects.hash(changeId, changeName, targetSdk, disabled, hasOverrides);
+            return Objects.hash(changeId, changeName, sinceSdk, disabled, hasOverrides);
         }
         @Override
         public boolean equals(Object other) {
@@ -138,7 +146,7 @@
             Change that = (Change) other;
             return this.changeId == that.changeId
                 && Objects.equals(this.changeName, that.changeName)
-                && this.targetSdk == that.targetSdk
+                && this.sinceSdk == that.sinceSdk
                 && this.disabled == that.disabled
                 && this.loggingOnly == that.loggingOnly
                 && this.hasOverrides == that.hasOverrides;
@@ -150,8 +158,8 @@
             if (changeName != null && !changeName.isEmpty()) {
                 sb.append("; name=" + changeName);
             }
-            if (targetSdk != 0) {
-                sb.append("; enableAfterTargetSdk=" + targetSdk);
+            if (sinceSdk != 0) {
+                sb.append("; enableSinceTargetSdk=" + sinceSdk);
             }
             if (disabled) {
                 sb.append("; disabled");
@@ -208,7 +216,7 @@
      * The device may contain extra changes, but none may be removed.
      */
     public void testDeviceContainsExpectedConfig() throws Exception {
-        assertThat(getOnDeviceCompatConfig()).containsAllIn(getExpectedCompatConfig());
+        assertThat(getOnDeviceCompatConfig()).containsAtLeastElementsIn(getExpectedCompatConfig());
     }
 
 }
diff --git a/hostsidetests/appcompat/host/lib/src/android/compat/cts/CompatChangeGatingTestCase.java b/hostsidetests/appcompat/host/lib/src/android/compat/cts/CompatChangeGatingTestCase.java
index d637ff0..6fa2f2b 100644
--- a/hostsidetests/appcompat/host/lib/src/android/compat/cts/CompatChangeGatingTestCase.java
+++ b/hostsidetests/appcompat/host/lib/src/android/compat/cts/CompatChangeGatingTestCase.java
@@ -322,7 +322,13 @@
                 .collect(Collectors.toMap(
                         atom -> atom.getChangeId(), // Key
                         atom -> atom.getState() ==  // Value
-                                AtomsProto.AppCompatibilityChangeReported.State.ENABLED));
+                                AtomsProto.AppCompatibilityChangeReported.State.ENABLED,
+                                (a, b) -> {
+                                  if (a != b) {
+                                    throw new IllegalStateException("inconsistent compatibility states");
+                                  }
+                                  return a;
+                                }));
     }
 
     /**
diff --git a/hostsidetests/appcompat/strictjavapackages/src/android/compat/sjp/cts/StrictJavaPackagesTest.java b/hostsidetests/appcompat/strictjavapackages/src/android/compat/sjp/cts/StrictJavaPackagesTest.java
index 9f984d6..20efacf 100644
--- a/hostsidetests/appcompat/strictjavapackages/src/android/compat/sjp/cts/StrictJavaPackagesTest.java
+++ b/hostsidetests/appcompat/strictjavapackages/src/android/compat/sjp/cts/StrictJavaPackagesTest.java
@@ -19,11 +19,13 @@
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 import static org.junit.Assume.assumeTrue;
+import static java.util.stream.Collectors.toSet;
 
 import com.android.compatibility.common.util.ApiLevelUtil;
 
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.log.LogUtil.CLog;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
 import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
@@ -43,7 +45,6 @@
 import java.util.Map.Entry;
 import java.util.Objects;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 import org.jf.dexlib2.DexFileFactory;
 import org.jf.dexlib2.Opcodes;
@@ -247,6 +248,9 @@
         }
         for (Entry<String, Collection<DeviceFile>> entry : allClasses.asMap().entrySet()) {
             if (entry.getValue().size() > 1) {
+                CLog.i("Class %s is duplicated in %s", entry.getKey(),
+                    entry.getValue().stream().map(x -> x.getJarName()).collect(toSet()));
+
                 duplicateClasses.putAll(entry.getKey(), entry.getValue());
             }
         }
@@ -259,8 +263,8 @@
     private void checkClassDuplicatesMatchWhitelist(Set<DeviceFile> jars, Set<String> whitelist)
             throws Exception {
         // Collect classes which appear in at least two distinct jar files.
-        Set<String> duplicateClasses = getDuplicateClasses(jars).keySet();
-        assertThat(duplicateClasses).isEqualTo(whitelist);
+        Multimap<String, DeviceFile> duplicateClasses = getDuplicateClasses(jars);
+        assertThat(duplicateClasses.keySet()).isEqualTo(whitelist);
     }
 
     /**
@@ -291,7 +295,7 @@
     private Set<DeviceFile> pullJarsFromEnvVariable(File tmpDir, String variable) {
         return Arrays.asList(getEnvVariable(variable).split(":")).stream()
             .map(fileName -> pullFromDevice(fileName, tmpDir))
-            .collect(Collectors.toSet());
+            .collect(toSet());
     }
 
     private void runWithTempDir(TempDirRunnable runnable) throws Exception {
@@ -320,6 +324,10 @@
             this.hostPath = hostPath;
         }
 
+        public String getJarName() {
+            return devicePath.substring(devicePath.lastIndexOf('/') + 1);
+        }
+
         @Override
         public boolean equals(Object other) {
             if (this == other) {
diff --git a/hostsidetests/appsecurity/Android.bp b/hostsidetests/appsecurity/Android.bp
index 3a569db..cffa133 100644
--- a/hostsidetests/appsecurity/Android.bp
+++ b/hostsidetests/appsecurity/Android.bp
@@ -38,7 +38,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "mts",
         "sts",
diff --git a/hostsidetests/appsecurity/OWNERS b/hostsidetests/appsecurity/OWNERS
index 6ad0c7a..cbfad62 100644
--- a/hostsidetests/appsecurity/OWNERS
+++ b/hostsidetests/appsecurity/OWNERS
@@ -26,9 +26,9 @@
 per-file ListeningPortsTest.java = cbrubaker@google.com
 per-file MajorVersionTest.java = toddke@google.com
 per-file OverlayHostTest.java = rtmitchell@google.com
-per-file PackageResolutionHostTest.java = toddke@google.com
-per-file PackageVisibilityTest.java = toddke@google.com
+per-file Package* = chiuwinson@google.com,patb@google.com,toddke@google.com
 per-file PermissionsHostTest.java = moltmann@google.com
+per-file Pkg* = chiuwinson@google.com,patb@google.com,toddke@google.com
 per-file PkgInstallSignatureVerificationTest.java = cbrubaker@google.com
 per-file PrivilegedUpdateTests.java = toddke@google.com
 per-file ReviewPermissionHelper = moltmann@google.com
diff --git a/hostsidetests/appsecurity/res/apexsigverify/README.md b/hostsidetests/appsecurity/res/apexsigverify/README.md
index 34d9ba6..9012a85 100644
--- a/hostsidetests/appsecurity/res/apexsigverify/README.md
+++ b/hostsidetests/appsecurity/res/apexsigverify/README.md
@@ -13,9 +13,9 @@
 frameworks/av/apex/com.android.media.swcodec.avbpubkey
 frameworks/av/apex/com.android.media.avbpubkey
 frameworks/base/packages/Tethering/apex/com.android.tethering.avbpubkey
-frameworks/base/apex/sdkextensions/com.android.sdkext.avbpubkey
 frameworks/ml/nn/apex/com.android.neuralnetworks.avbpubkey
 frameworks/opt/net/ike/apex/com.android.ipsec.avbpubkey
+packages/modules/SdkExtensions/com.android.sdkext.avbpubkey
 system/apex/apexd/apexd_testdata/com.android.apex.test_package_2.avbpubkey
 system/apex/apexd/apexd_testdata/com.android.apex.test_package.no_inst_key.avbpubkey
 system/apex/apexd/apexd_testdata/com.android.apex.test_package.prepostinstall.fail.avbpubkey
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/AdoptableHostTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/AdoptableHostTest.java
index dd47dd6..fb4d9d0 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/AdoptableHostTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/AdoptableHostTest.java
@@ -431,12 +431,24 @@
     private LocalVolumeInfo getAdoptionVolume() throws Exception {
         String[] lines = null;
         int attempt = 0;
+        int mounted_count = 0;
         while (attempt++ < 15) {
             lines = getDevice().executeShellCommand("sm list-volumes private").split("\n");
+            CLog.w("getAdoptionVolume(): " + Arrays.toString(lines));
             for (String line : lines) {
                 final LocalVolumeInfo info = new LocalVolumeInfo(line.trim());
-                if (!"private".equals(info.volId) && "mounted".equals(info.state)) {
-                    return waitForVolumeReady(info);
+                if (!"private".equals(info.volId)) {
+                    if ("mounted".equals(info.state)) {
+                        // make sure the storage is mounted and stable for a while
+                        mounted_count++;
+                        attempt--;
+                        if (mounted_count >= 3) {
+                            return waitForVolumeReady(info);
+                        }
+                    }
+                    else {
+                        mounted_count = 0;
+                    }
                 }
             }
             Thread.sleep(1000);
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/DocumentsTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/DocumentsTest.java
index fc97c75..cd43821 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/DocumentsTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/DocumentsTest.java
@@ -28,9 +28,9 @@
  */
 public class DocumentsTest extends DocumentsTestCase {
     private static final String PROVIDER_PKG = "com.android.cts.documentprovider";
-    private static final String DUMMYIME_PKG = "com.android.cts.dummyime";
+    private static final String STUBIME_PKG = "com.android.cts.stubime";
     private static final String PROVIDER_APK = "CtsDocumentProvider.apk";
-    private static final String DUMMYIME_APK = "CtsDummyIme.apk";
+    private static final String STUBIME_APK = "CtsStubIme.apk";
 
     private static final long RESTRICT_STORAGE_ACCESS_FRAMEWORK = 141600225L;
 
@@ -41,7 +41,7 @@
         getDevice().uninstallPackage(PROVIDER_PKG);
         CompatibilityBuildHelper buildHelper = new CompatibilityBuildHelper(mCtsBuild);
         assertNull(getDevice().installPackage(buildHelper.getTestFile(PROVIDER_APK), false));
-        assertNull(getDevice().installPackage(buildHelper.getTestFile(DUMMYIME_APK), false));
+        assertNull(getDevice().installPackage(buildHelper.getTestFile(STUBIME_APK), false));
     }
 
     @Override
@@ -49,7 +49,7 @@
         super.tearDown();
 
         getDevice().uninstallPackage(PROVIDER_PKG);
-        getDevice().uninstallPackage(DUMMYIME_PKG);
+        getDevice().uninstallPackage(STUBIME_PKG);
     }
 
     public void testOpenSimple() throws Exception {
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/InstantAppUserTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/InstantAppUserTest.java
index bfecfaf..dee0358 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/InstantAppUserTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/InstantAppUserTest.java
@@ -231,7 +231,7 @@
 
     private void uninstallTestPackages() throws Exception {
         getDevice().uninstallPackage(NORMAL_PKG);
-        getDevice().uninstallPackage(IMPLICIT_APK);
+        getDevice().uninstallPackage(IMPLICIT_PKG);
         getDevice().uninstallPackage(EPHEMERAL_1_PKG);
         getDevice().uninstallPackage(USER_TEST_PKG);
         getDevice().uninstallPackage(USER_PKG);
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/OverlayHostTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/OverlayHostTest.java
index 21f8585..28b7158 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/OverlayHostTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/OverlayHostTest.java
@@ -229,6 +229,7 @@
                     .contains(" " + OVERLAY_ALL_PACKAGE + "\n"));
         } finally {
             getDevice().uninstallPackage(OVERLAY_ALL_PACKAGE);
+            getDevice().uninstallPackage(TARGET_PACKAGE);
         }
     }
 
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/PackageSetInstallerTest.kt b/hostsidetests/appsecurity/src/android/appsecurity/cts/PackageSetInstallerTest.kt
index 923810c..ba62f2f 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/PackageSetInstallerTest.kt
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/PackageSetInstallerTest.kt
@@ -30,7 +30,6 @@
 import android.cts.host.utils.DeviceJUnit4ClassRunnerWithParameters
 import android.cts.host.utils.DeviceJUnit4Parameterized
 import com.google.common.truth.Truth.assertThat
-import com.google.common.truth.Truth.assertWithMessage
 import org.junit.After
 import org.junit.Before
 import org.junit.Test
@@ -198,8 +197,7 @@
     }
 
     private fun assertPermission(granted: Boolean, permission: String) {
-        assertThat(device.executeShellCommand("dumpsys package $TARGET_PKG | grep $permission"))
-                .contains("$permission: granted=$granted")
+        assertThat(getPermissionString(permission)).contains("granted=$granted")
     }
 
     private fun grantPermission(permission: String) {
@@ -211,11 +209,7 @@
     }
 
     private fun assertGrantState(state: GrantState, permission: String) {
-        val output = device.executeShellCommand(
-                "dumpsys package $TARGET_PKG | grep \"$permission: granted\"").trim()
-
-        // Make sure only the expected output line is returned
-        assertWithMessage(output).that(output.lines().size).isEqualTo(1)
+        val output = getPermissionString(permission)
 
         when (state) {
             GrantState.TRUE -> {
@@ -238,6 +232,18 @@
         }
     }
 
+    private fun getPermissionString(permission: String) =
+            device.executeShellCommand("dumpsys package $TARGET_PKG")
+                    .lineSequence()
+                    .dropWhile { !it.startsWith("Packages:") } // Wait for package header
+                    .drop(1) // Drop the package header itself
+                    .takeWhile { it.isEmpty() || it.first().isWhitespace() } // Until next header
+                    .dropWhile { !it.trim().startsWith("User $mPrimaryUserId:") } // Find user
+                    .drop(1) // Drop the user header itself
+                    .takeWhile { !it.trim().startsWith("User") } // Until next user
+                    .filter { it.contains("$permission: granted=") }
+                    .single()
+
     enum class GrantState {
         // Granted in full, unrestricted
         TRUE,
diff --git a/hostsidetests/appsecurity/src/android/appsecurity/cts/UseEmbeddedDexTest.java b/hostsidetests/appsecurity/src/android/appsecurity/cts/UseEmbeddedDexTest.java
index 42170cd..9db3ac2 100644
--- a/hostsidetests/appsecurity/src/android/appsecurity/cts/UseEmbeddedDexTest.java
+++ b/hostsidetests/appsecurity/src/android/appsecurity/cts/UseEmbeddedDexTest.java
@@ -19,6 +19,7 @@
 import android.platform.test.annotations.AppModeFull;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -35,6 +36,11 @@
     private static final String APK_SPLIT_COMPRESSED_DEX =
             "CtsUseEmbeddedDexAppSplit_CompressedDex.apk";
 
+    @After
+    public void tearDown() throws Exception {
+        getDevice().uninstallPackage(PACKAGE_NAME);
+    }
+
     @Test
     public void testCanonicalInstall() throws Exception {
         new InstallMultiple().addFile(APK_CANONICAL).run();
diff --git a/hostsidetests/appsecurity/test-apps/AccessSerialLegacy/Android.bp b/hostsidetests/appsecurity/test-apps/AccessSerialLegacy/Android.bp
index 191c586..d70f126 100644
--- a/hostsidetests/appsecurity/test-apps/AccessSerialLegacy/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/AccessSerialLegacy/Android.bp
@@ -23,7 +23,6 @@
     min_sdk_version: "27",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     optimize: {
diff --git a/hostsidetests/appsecurity/test-apps/AccessSerialModern/Android.bp b/hostsidetests/appsecurity/test-apps/AccessSerialModern/Android.bp
index 577bca5..30ca4ef 100644
--- a/hostsidetests/appsecurity/test-apps/AccessSerialModern/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/AccessSerialModern/Android.bp
@@ -26,7 +26,6 @@
     min_sdk_version: "27",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     optimize: {
diff --git a/hostsidetests/appsecurity/test-apps/Android.mk b/hostsidetests/appsecurity/test-apps/Android.mk
index 3982e2d..38b7505 100644
--- a/hostsidetests/appsecurity/test-apps/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/Android.mk
@@ -17,7 +17,7 @@
 include $(CLEAR_VARS)
 
 # tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests sts
+LOCAL_COMPATIBILITY_SUITE := cts general-tests sts
 
 # Build the test APKs using their own makefiles
 include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/hostsidetests/appsecurity/test-apps/AppAccessData/Android.bp b/hostsidetests/appsecurity/test-apps/AppAccessData/Android.bp
index 3e93b16..0c4702f 100644
--- a/hostsidetests/appsecurity/test-apps/AppAccessData/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/AppAccessData/Android.bp
@@ -18,11 +18,10 @@
     srcs: ["src/**/*.java"],
     sdk_version: "current",
     static_libs: ["androidx.test.rules"],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     // although not strictly necessary, sign this app with different cert than CtsAppWithData
diff --git a/hostsidetests/appsecurity/test-apps/AppDataIsolationTestApp/Android.bp b/hostsidetests/appsecurity/test-apps/AppDataIsolationTestApp/Android.bp
index 1dc84e3..b00dcc3 100644
--- a/hostsidetests/appsecurity/test-apps/AppDataIsolationTestApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/AppDataIsolationTestApp/Android.bp
@@ -18,11 +18,10 @@
     srcs: ["common/src/**/*.java", "AppA/src/**/*.java", "AppA/aidl/**/*.aidl"],
     sdk_version: "current",
     static_libs: ["androidx.test.rules", "truth-prebuilt", "testng", "ub-uiautomator"],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     certificate: ":cts-testkey1",
@@ -38,11 +37,10 @@
     srcs: ["common/src/**/*.java", "AppA/src/**/*.java", "AppA/aidl/**/*.aidl"],
     sdk_version: "current",
     static_libs: ["androidx.test.rules", "truth-prebuilt", "testng", "ub-uiautomator"],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     certificate: ":cts-testkey1",
@@ -58,11 +56,10 @@
     srcs: ["common/src/**/*.java", "AppA/src/**/*.java", "AppA/aidl/**/*.aidl"],
     sdk_version: "current",
     static_libs: ["androidx.test.rules", "truth-prebuilt", "testng", "ub-uiautomator"],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     certificate: ":cts-testkey1",
@@ -78,11 +75,10 @@
     srcs: ["common/src/**/*.java", "AppB/src/**/*.java"],
     sdk_version: "current",
     static_libs: ["androidx.test.rules", "truth-prebuilt", "testng"],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     certificate: ":cts-testkey1",
@@ -98,11 +94,10 @@
     srcs: ["common/src/**/*.java", "AppB/src/**/*.java"],
     sdk_version: "current",
     static_libs: ["androidx.test.rules", "truth-prebuilt", "testng"],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     certificate: ":cts-testkey1",
diff --git a/hostsidetests/appsecurity/test-apps/AppWithData/Android.bp b/hostsidetests/appsecurity/test-apps/AppWithData/Android.bp
index 65f7aa2..eb95cc3 100644
--- a/hostsidetests/appsecurity/test-apps/AppWithData/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/AppWithData/Android.bp
@@ -18,11 +18,10 @@
     srcs: ["src/**/*.java"],
     sdk_version: "current",
     static_libs: ["androidx.test.rules"],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     certificate: ":cts-testkey1",
diff --git a/hostsidetests/appsecurity/test-apps/ApplicationVisibilityCrossUserApp/Android.bp b/hostsidetests/appsecurity/test-apps/ApplicationVisibilityCrossUserApp/Android.bp
index 5f6381a..2848e19 100644
--- a/hostsidetests/appsecurity/test-apps/ApplicationVisibilityCrossUserApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/ApplicationVisibilityCrossUserApp/Android.bp
@@ -20,7 +20,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/appsecurity/test-apps/AuthBoundKeyApp/Android.bp b/hostsidetests/appsecurity/test-apps/AuthBoundKeyApp/Android.bp
index d4cda00..3b93cbb 100644
--- a/hostsidetests/appsecurity/test-apps/AuthBoundKeyApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/AuthBoundKeyApp/Android.bp
@@ -19,13 +19,12 @@
     sdk_version: "current",
     static_libs: ["androidx.test.rules"],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     // sign this app with a different cert than CtsUsePermissionDiffCert
diff --git a/hostsidetests/appsecurity/test-apps/CorruptApkTests/Android.bp b/hostsidetests/appsecurity/test-apps/CorruptApkTests/Android.bp
index fe9bc64..ae31730 100644
--- a/hostsidetests/appsecurity/test-apps/CorruptApkTests/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/CorruptApkTests/Android.bp
@@ -18,7 +18,6 @@
     presigned: true,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ]
 }
@@ -29,7 +28,6 @@
     presigned: true,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ]
 }
@@ -40,7 +38,6 @@
     presigned: true,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ]
 }
diff --git a/hostsidetests/appsecurity/test-apps/CorruptApkTests/compressed_arsc/Android.bp b/hostsidetests/appsecurity/test-apps/CorruptApkTests/compressed_arsc/Android.bp
index 0994422..6fe5191 100644
--- a/hostsidetests/appsecurity/test-apps/CorruptApkTests/compressed_arsc/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/CorruptApkTests/compressed_arsc/Android.bp
@@ -18,7 +18,6 @@
     presigned: true,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ]
 }
@@ -29,7 +28,6 @@
     presigned: true,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ]
 }
@@ -41,7 +39,6 @@
     preprocessed: true,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ]
 }
@@ -53,7 +50,6 @@
     preprocessed: true,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ]
 }
\ No newline at end of file
diff --git a/hostsidetests/appsecurity/test-apps/DeviceIdentifiers/Android.bp b/hostsidetests/appsecurity/test-apps/DeviceIdentifiers/Android.bp
index d208ebd..a7b5ec0 100644
--- a/hostsidetests/appsecurity/test-apps/DeviceIdentifiers/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/DeviceIdentifiers/Android.bp
@@ -21,11 +21,10 @@
         "androidx.test.rules",
         "compatibility-device-util-axt",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: ["src/**/*.java"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     optimize: {
diff --git a/hostsidetests/appsecurity/test-apps/DeviceIdentifiers/OWNERS b/hostsidetests/appsecurity/test-apps/DeviceIdentifiers/OWNERS
new file mode 100644
index 0000000..7b7768d
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/DeviceIdentifiers/OWNERS
@@ -0,0 +1,2 @@
+# Bug component: 36824
+cbrubaker@google.com
diff --git a/hostsidetests/appsecurity/test-apps/DocumentClient/Android.bp b/hostsidetests/appsecurity/test-apps/DocumentClient/Android.bp
index 0547aba..dcba2a6 100644
--- a/hostsidetests/appsecurity/test-apps/DocumentClient/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/DocumentClient/Android.bp
@@ -25,14 +25,13 @@
         "ub-uiautomator",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "mts",
     ],
diff --git a/hostsidetests/appsecurity/test-apps/DocumentClient/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/DocumentClient/AndroidManifest.xml
index e87cd6f..d0d3a70 100644
--- a/hostsidetests/appsecurity/test-apps/DocumentClient/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/DocumentClient/AndroidManifest.xml
@@ -18,7 +18,7 @@
         package="com.android.cts.documentclient">
     <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="29"/>
 
-    <application android:debuggable="true" android:forceQueryable="true">
+    <application android:debuggable="true">
         <uses-library android:name="android.test.runner" />
         <activity android:name=".MyActivity" />
     </application>
diff --git a/hostsidetests/appsecurity/test-apps/DocumentProvider/Android.bp b/hostsidetests/appsecurity/test-apps/DocumentProvider/Android.bp
index 26af01c..2e34b5e 100644
--- a/hostsidetests/appsecurity/test-apps/DocumentProvider/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/DocumentProvider/Android.bp
@@ -28,7 +28,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "mts",
     ],
diff --git a/hostsidetests/appsecurity/test-apps/DocumentProvider/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/DocumentProvider/AndroidManifest.xml
index 2f4d5fe..86b134c 100644
--- a/hostsidetests/appsecurity/test-apps/DocumentProvider/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/DocumentProvider/AndroidManifest.xml
@@ -19,8 +19,8 @@
 
     <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="29"/>
 
-    <application android:forceQueryable="true">
-        <uses-library android:name="android.test.runner" />
+    <application>
+        <uses-library android:name="android.test.runner"/>
 
         <provider android:name=".MyDocumentsProvider"
                 android:authorities="com.android.cts.documentprovider"
diff --git a/hostsidetests/appsecurity/test-apps/DuplicatePermissionDeclareApp/Android.bp b/hostsidetests/appsecurity/test-apps/DuplicatePermissionDeclareApp/Android.bp
index bb550fe..6e6d949 100644
--- a/hostsidetests/appsecurity/test-apps/DuplicatePermissionDeclareApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/DuplicatePermissionDeclareApp/Android.bp
@@ -23,7 +23,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/appsecurity/test-apps/EncryptionApp/Android.bp b/hostsidetests/appsecurity/test-apps/EncryptionApp/Android.bp
index f714db2..3826db1 100644
--- a/hostsidetests/appsecurity/test-apps/EncryptionApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/EncryptionApp/Android.bp
@@ -25,12 +25,11 @@
         "ub-uiautomator",
         "truth-prebuilt",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: ["src/**/*.java"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     certificate: ":cts-testkey1",
diff --git a/hostsidetests/appsecurity/test-apps/EncryptionApp/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/EncryptionApp/AndroidManifest.xml
index a6f7b1d..f7b5c7f 100644
--- a/hostsidetests/appsecurity/test-apps/EncryptionApp/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/EncryptionApp/AndroidManifest.xml
@@ -16,7 +16,11 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.android.cts.encryptionapp">
-    <application android:label="EncryptionApp" android:forceQueryable="true">
+    <queries>
+        <package android:name="com.android.cts.splitapp" />
+    </queries>
+
+    <application android:label="EncryptionApp">
         <activity android:name=".UnawareActivity"
                 android:exported="true">
             <intent-filter>
diff --git a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/EphemeralApp1/Android.bp b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/EphemeralApp1/Android.bp
index c632b47..066996c 100644
--- a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/EphemeralApp1/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/EphemeralApp1/Android.bp
@@ -18,8 +18,8 @@
     name: "CtsEphemeralTestsEphemeralApp1",
     defaults: ["cts_support_defaults"],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     static_libs: [
         "cts-aia-util",
@@ -32,7 +32,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "sts",
     ],
diff --git a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/EphemeralApp2/Android.bp b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/EphemeralApp2/Android.bp
index 313d4ac..a39573d 100644
--- a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/EphemeralApp2/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/EphemeralApp2/Android.bp
@@ -18,8 +18,8 @@
     name: "CtsEphemeralTestsEphemeralApp2",
     defaults: ["cts_support_defaults"],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     static_libs: [
         "cts-aia-util",
@@ -30,7 +30,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src/**/*.java"],
diff --git a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/ImplicitlyExposedApp/Android.bp b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/ImplicitlyExposedApp/Android.bp
index d92aeaa..5a2a252 100644
--- a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/ImplicitlyExposedApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/ImplicitlyExposedApp/Android.bp
@@ -24,7 +24,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "sts",
     ],
diff --git a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/NormalApp/Android.bp b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/NormalApp/Android.bp
index 55c52c0..65fd66f 100644
--- a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/NormalApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/NormalApp/Android.bp
@@ -21,11 +21,10 @@
         "cts-aia-util",
         "androidx.test.rules",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "sts",
     ],
diff --git a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/UnexposedApp/Android.bp b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/UnexposedApp/Android.bp
index 8c25748..51417fd 100644
--- a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/UnexposedApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/UnexposedApp/Android.bp
@@ -21,7 +21,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "sts",
     ],
diff --git a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/UserApp/Android.bp b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/UserApp/Android.bp
index 487d4ae..416204d 100644
--- a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/UserApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/UserApp/Android.bp
@@ -24,7 +24,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src/**/*.java"],
diff --git a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/UserAppTest/Android.bp b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/UserAppTest/Android.bp
index 0410cd5..10b8985 100644
--- a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/UserAppTest/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/UserAppTest/Android.bp
@@ -21,7 +21,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src/**/*.java"],
diff --git a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/UserAppTest/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/UserAppTest/AndroidManifest.xml
index d3c5dcc..1ab4bc5 100644
--- a/hostsidetests/appsecurity/test-apps/EphemeralTestApp/UserAppTest/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/EphemeralTestApp/UserAppTest/AndroidManifest.xml
@@ -26,7 +26,7 @@
     <application
         android:label="@string/app_name" >
         <uses-library android:name="android.test.runner" />
-    <!-- Dummy activity just to allow this to load in another user -->
+    <!-- Stub activity just to allow this to load in another user -->
     <activity
         android:name=".DirectBoot"
         android:directBootAware="true" />
diff --git a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/Android.bp b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/Android.bp
index c065c83..efe40a7 100644
--- a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/Android.bp
@@ -20,13 +20,12 @@
         "androidx.test.rules",
         "CtsExternalStorageTestLib",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: ["src/**/*.java"],
     exclude_srcs: ["src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java"],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     dex_preopt: {
@@ -39,5 +38,5 @@
     srcs: ["src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java"],
     defaults: ["cts_support_defaults"],
     sdk_version: "current",
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
 }
diff --git a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java
index 8fdf859..ffc3d20 100644
--- a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java
+++ b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java
@@ -407,14 +407,14 @@
         }
     }
 
-    private static boolean isWhiteList(File file) {
-        final String[] whiteLists = {
+    private static boolean isAllowList(File file) {
+        final String[] allowLists = {
                 "autorun.inf", ".android_secure", "android_secure"
         };
         if (file.getParentFile().getAbsolutePath().equals(
                 Environment.getExternalStorageDirectory().getAbsolutePath())) {
-            for (String whiteList : whiteLists) {
-                if (file.getName().equalsIgnoreCase(whiteList)) {
+            for (String allowList : allowLists) {
+                if (file.getName().equalsIgnoreCase(allowList)) {
                     return true;
                 }
             }
@@ -422,14 +422,14 @@
         return false;
     }
 
-    private static File[] removeWhiteList(File[] files) {
+    private static File[] removeAllowList(File[] files) {
         List<File> fileList = new ArrayList<File>();
         if (files == null) {
             return null;
         }
 
         for (File file : files) {
-            if (!isWhiteList(file)) {
+            if (!isAllowList(file)) {
                 fileList.add(file);
             }
         }
@@ -438,7 +438,7 @@
 
     public static void deleteContents(File dir) throws IOException {
         File[] files = dir.listFiles();
-        files = removeWhiteList(files);
+        files = removeAllowList(files);
         if (files != null) {
             for (File file : files) {
                 if (file.isDirectory()) {
@@ -447,7 +447,7 @@
                 assertTrue(file.delete());
             }
 
-            File[] dirs = removeWhiteList(dir.listFiles());
+            File[] dirs = removeAllowList(dir.listFiles());
             if (dirs.length != 0) {
                 fail("Expected wiped storage but found: " + Arrays.toString(dirs));
             }
diff --git a/hostsidetests/appsecurity/test-apps/InstantCookieApp/Android.bp b/hostsidetests/appsecurity/test-apps/InstantCookieApp/Android.bp
index 544a10b..3140efa 100644
--- a/hostsidetests/appsecurity/test-apps/InstantCookieApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/InstantCookieApp/Android.bp
@@ -22,7 +22,6 @@
     sdk_version: "current",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     certificate: ":cts-keyset-test-a",
diff --git a/hostsidetests/appsecurity/test-apps/InstantCookieApp2/Android.bp b/hostsidetests/appsecurity/test-apps/InstantCookieApp2/Android.bp
index 3e3cd50..33d63d1 100644
--- a/hostsidetests/appsecurity/test-apps/InstantCookieApp2/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/InstantCookieApp2/Android.bp
@@ -22,7 +22,6 @@
     sdk_version: "current",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     certificate: ":cts-keyset-test-b",
diff --git a/hostsidetests/appsecurity/test-apps/InstantUpgradeApp/Android.bp b/hostsidetests/appsecurity/test-apps/InstantUpgradeApp/Android.bp
index d74a98b..23a9a02 100644
--- a/hostsidetests/appsecurity/test-apps/InstantUpgradeApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/InstantUpgradeApp/Android.bp
@@ -18,8 +18,8 @@
     name: "CtsInstantUpgradeApp",
     defaults: ["cts_support_defaults"],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     static_libs: [
         "cts-aia-util",
@@ -30,7 +30,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src/**/*.java"],
diff --git a/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/Android.bp b/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/Android.bp
index 3837b82..ebc9394 100644
--- a/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/InstrumentationAppDiffCert/Android.bp
@@ -18,11 +18,10 @@
     srcs: ["src/**/*.java"],
     sdk_version: "current",
     static_libs: ["androidx.test.rules"],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     // sign this app with different cert than CtsTargetInstrumentationApp
diff --git a/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/Android.bp b/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/Android.bp
index cfaf22f..796b0b0 100644
--- a/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/Android.bp
@@ -19,7 +19,6 @@
     defaults: ["cts_support_defaults"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_a/Android.bp b/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_a/Android.bp
index d452c66..07d7fa6 100644
--- a/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_a/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_a/Android.bp
@@ -20,7 +20,6 @@
     sdk_version: "current",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     // Feature splits are dependent on this split, so it must be exported.
diff --git a/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_b/Android.bp b/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_b/Android.bp
index 35bc8d7..00aaef0 100644
--- a/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_b/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_b/Android.bp
@@ -20,7 +20,6 @@
     sdk_version: "current",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     // Make sure our test locale polish is not stripped.
diff --git a/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_c/Android.bp b/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_c/Android.bp
index c78c9d3..bf0adb4 100644
--- a/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_c/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/IsolatedSplitApp/feature_c/Android.bp
@@ -20,7 +20,6 @@
     sdk_version: "current",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     // Make sure our test locale polish is not stripped.
diff --git a/hostsidetests/appsecurity/test-apps/KeyRotationTest/Android.mk b/hostsidetests/appsecurity/test-apps/KeyRotationTest/Android.mk
index 746e224..2259463 100644
--- a/hostsidetests/appsecurity/test-apps/KeyRotationTest/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/KeyRotationTest/Android.mk
@@ -32,7 +32,7 @@
 LOCAL_PACKAGE_NAME := CtsSignatureQueryService
 LOCAL_SDK_VERSION := current
 LOCAL_STATIC_JAVA_LIBRARIES := cts_signature_query_service
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 LOCAL_CERTIFICATE := $(cert_dir)/ec-p256
 include $(BUILD_CTS_SUPPORT_PACKAGE)
 
@@ -44,7 +44,7 @@
 LOCAL_MANIFEST_FILE = AndroidManifest_v2.xml
 LOCAL_SDK_VERSION := current
 LOCAL_STATIC_JAVA_LIBRARIES := cts_signature_query_service
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 LOCAL_CERTIFICATE := $(cert_dir)/ec-p256_2
 LOCAL_ADDITIONAL_CERTIFICATES := $(cert_dir)/ec-p256
 LOCAL_CERTIFICATE_LINEAGE := $(cert_dir)/ec-p256-por_1_2-default-caps
@@ -58,7 +58,7 @@
 LOCAL_MANIFEST_FILE = AndroidManifest_v3.xml
 LOCAL_SDK_VERSION := current
 LOCAL_STATIC_JAVA_LIBRARIES := cts_signature_query_service
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 LOCAL_CERTIFICATE := $(cert_dir)/ec-p256_2
 LOCAL_ADDITIONAL_CERTIFICATES := $(cert_dir)/ec-p256
 LOCAL_CERTIFICATE_LINEAGE := $(cert_dir)/ec-p256-por_1_2-default-caps
diff --git a/hostsidetests/appsecurity/test-apps/KeyRotationTest/ServiceTest/Android.mk b/hostsidetests/appsecurity/test-apps/KeyRotationTest/ServiceTest/Android.mk
index 91af1b7..016687c 100644
--- a/hostsidetests/appsecurity/test-apps/KeyRotationTest/ServiceTest/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/KeyRotationTest/ServiceTest/Android.mk
@@ -28,7 +28,7 @@
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 LOCAL_STATIC_JAVA_LIBRARIES := cts_signature_query_service androidx.test.core androidx.test.rules
 LOCAL_JAVA_LIBRARIES := android.test.runner.stubs android.test.base.stubs
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 LOCAL_CERTIFICATE := $(cert_dir)/ec-p256
 include $(BUILD_CTS_SUPPORT_PACKAGE)
 
@@ -40,7 +40,7 @@
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 LOCAL_STATIC_JAVA_LIBRARIES := cts_signature_query_service androidx.test.core androidx.test.rules
 LOCAL_JAVA_LIBRARIES := android.test.runner.stubs android.test.base.stubs
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 LOCAL_CERTIFICATE := $(cert_dir)/ec-p256_2
 LOCAL_ADDITIONAL_CERTIFICATES := $(cert_dir)/ec-p256
 LOCAL_CERTIFICATE_LINEAGE := $(cert_dir)/ec-p256-por_1_2-default-caps
diff --git a/hostsidetests/appsecurity/test-apps/ListeningPortsApp/Android.bp b/hostsidetests/appsecurity/test-apps/ListeningPortsApp/Android.bp
index cf86b40..e010317 100644
--- a/hostsidetests/appsecurity/test-apps/ListeningPortsApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/ListeningPortsApp/Android.bp
@@ -18,11 +18,10 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src/**/*.java"],
     static_libs: ["androidx.test.rules"],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     platform_apis: true,
 }
diff --git a/hostsidetests/appsecurity/test-apps/LocationPolicyApp/Android.bp b/hostsidetests/appsecurity/test-apps/LocationPolicyApp/Android.bp
index b7174d2..83c6cb9 100644
--- a/hostsidetests/appsecurity/test-apps/LocationPolicyApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/LocationPolicyApp/Android.bp
@@ -16,8 +16,8 @@
     name: "CtsLocationPolicyApp",
     defaults: ["cts_defaults"],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     static_libs: [
         "androidx.test.rules",
@@ -27,7 +27,6 @@
     platform_apis: true,
     test_suites: [
         "cts",
-        "vts10",
         "sts",
         "general-tests",
     ],
diff --git a/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000000000ffff/Android.bp b/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000000000ffff/Android.bp
index 3ccf6b3..5584ba2 100644
--- a/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000000000ffff/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000000000ffff/Android.bp
@@ -24,7 +24,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     // sign this app with a different cert than CtsSimpleAppInstallDiffCert
diff --git a/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version00000000ffffffff/Android.bp b/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version00000000ffffffff/Android.bp
index 34788bc..97a1eda 100644
--- a/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version00000000ffffffff/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version00000000ffffffff/Android.bp
@@ -24,7 +24,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     // sign this app with a different cert than CtsSimpleAppInstallDiffCert
diff --git a/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000ff00000000/Android.bp b/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000ff00000000/Android.bp
index 8f2e0c3..98c4deb 100644
--- a/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000ff00000000/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000ff00000000/Android.bp
@@ -24,7 +24,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     // sign this app with a different cert than CtsSimpleAppInstallDiffCert
diff --git a/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000ffffffffff/Android.bp b/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000ffffffffff/Android.bp
index 7e2d7f9..cb9272c 100644
--- a/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000ffffffffff/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/MajorVersionApp/Version000000ffffffffff/Android.bp
@@ -24,7 +24,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     // sign this app with a different cert than CtsSimpleAppInstallDiffCert
diff --git a/hostsidetests/appsecurity/test-apps/MediaStorageApp/Android.bp b/hostsidetests/appsecurity/test-apps/MediaStorageApp/Android.bp
index e5e1c72..2cf6d92 100644
--- a/hostsidetests/appsecurity/test-apps/MediaStorageApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/MediaStorageApp/Android.bp
@@ -21,12 +21,11 @@
         "androidx.test.rules",
         "ub-uiautomator",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: ["src/**/*.java"],
     asset_dirs: ["assets"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -40,12 +39,11 @@
         "androidx.test.rules",
         "ub-uiautomator",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: ["src/**/*.java"],
     asset_dirs: ["assets"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "AndroidManifest28.xml",
@@ -60,12 +58,11 @@
         "androidx.test.rules",
         "ub-uiautomator",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: ["src/**/*.java"],
     asset_dirs: ["assets"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "AndroidManifest29.xml",
diff --git a/hostsidetests/appsecurity/test-apps/MediaStorageApp/src/com/android/cts/mediastorageapp/MediaStorageTest.java b/hostsidetests/appsecurity/test-apps/MediaStorageApp/src/com/android/cts/mediastorageapp/MediaStorageTest.java
index 3f32db4..0fb7678 100644
--- a/hostsidetests/appsecurity/test-apps/MediaStorageApp/src/com/android/cts/mediastorageapp/MediaStorageTest.java
+++ b/hostsidetests/appsecurity/test-apps/MediaStorageApp/src/com/android/cts/mediastorageapp/MediaStorageTest.java
@@ -64,6 +64,7 @@
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.concurrent.Callable;
+import java.util.concurrent.TimeoutException;
 
 @RunWith(AndroidJUnit4.class)
 public class MediaStorageTest {
@@ -549,6 +550,6 @@
                 Thread.sleep(500);
             }
         } 
-        return file;
+        throw new TimeoutException("File creation failed due to slow permission update");
     }
 }
diff --git a/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/Android.bp b/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/Android.bp
index e41d1d6..dd59913 100644
--- a/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/Android.bp
@@ -21,14 +21,13 @@
         "androidx.test.rules",
         "CtsExternalStorageTestLib",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: [
         "src/**/*.java",
     ],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     dex_preopt: {
diff --git a/hostsidetests/appsecurity/test-apps/NoRestartApp/Android.bp b/hostsidetests/appsecurity/test-apps/NoRestartApp/Android.bp
index 5bd1658..92fc9c3 100644
--- a/hostsidetests/appsecurity/test-apps/NoRestartApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/NoRestartApp/Android.bp
@@ -22,7 +22,6 @@
     sdk_version: "current",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     export_package_resources: true,
diff --git a/hostsidetests/appsecurity/test-apps/NoRestartApp/feature/Android.bp b/hostsidetests/appsecurity/test-apps/NoRestartApp/feature/Android.bp
index 6813412..22dc85c 100644
--- a/hostsidetests/appsecurity/test-apps/NoRestartApp/feature/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/NoRestartApp/feature/Android.bp
@@ -22,7 +22,6 @@
     sdk_version: "current",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: ["CtsNoRestartBase"],
diff --git a/hostsidetests/appsecurity/test-apps/OrderedActivityApp/Android.bp b/hostsidetests/appsecurity/test-apps/OrderedActivityApp/Android.bp
index 2aaf9e6..b843d42 100644
--- a/hostsidetests/appsecurity/test-apps/OrderedActivityApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/OrderedActivityApp/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src/**/*.java"],
diff --git a/hostsidetests/appsecurity/test-apps/PackageAccessApp/Android.bp b/hostsidetests/appsecurity/test-apps/PackageAccessApp/Android.bp
index c615c1c..02fe5bc 100644
--- a/hostsidetests/appsecurity/test-apps/PackageAccessApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/PackageAccessApp/Android.bp
@@ -23,7 +23,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/appsecurity/test-apps/PackageInstallerPermissionRequestApp/Android.bp b/hostsidetests/appsecurity/test-apps/PackageInstallerPermissionRequestApp/Android.bp
index ae9171c..2739866 100644
--- a/hostsidetests/appsecurity/test-apps/PackageInstallerPermissionRequestApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/PackageInstallerPermissionRequestApp/Android.bp
@@ -24,7 +24,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/appsecurity/test-apps/PackageInstallerWhitelistApp/Android.bp b/hostsidetests/appsecurity/test-apps/PackageInstallerWhitelistApp/Android.bp
index 94dc075..87d2610 100644
--- a/hostsidetests/appsecurity/test-apps/PackageInstallerWhitelistApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/PackageInstallerWhitelistApp/Android.bp
@@ -25,7 +25,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/Android.bp b/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/Android.bp
index 57bb99c..9b3cbdf 100644
--- a/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/Android.bp
@@ -24,7 +24,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "sts",
     ],
diff --git a/hostsidetests/appsecurity/test-apps/PermissionDeclareAppCompat/Android.bp b/hostsidetests/appsecurity/test-apps/PermissionDeclareAppCompat/Android.bp
index cf28a45..3414f95 100644
--- a/hostsidetests/appsecurity/test-apps/PermissionDeclareAppCompat/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/PermissionDeclareAppCompat/Android.bp
@@ -21,7 +21,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "sts",
     ],
diff --git a/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/Android.bp b/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/Android.bp
index 3cee496..91cb9bc 100644
--- a/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/Android.bp
@@ -10,11 +10,10 @@
         "compatibility-device-util-axt",
         "ctstestrunner-axt",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     optimize: {
diff --git a/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/Android.mk b/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/Android.mk
index 969aa2a..a99a78f 100644
--- a/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp/Android.mk
@@ -12,7 +12,7 @@
 LOCAL_BUILT_MODULE_STEM := package.apk
 # Make sure the build system doesn't try to resign the APK
 LOCAL_CERTIFICATE := PRESIGNED
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 # The 'arm' apk has both arm and arm64 so's. Same for x86/x86_64.
 my_apk_dir := $(subst arm64,arm,$(TARGET_ARCH))
@@ -32,7 +32,7 @@
 LOCAL_BUILT_MODULE_STEM := package.apk
 # Make sure the build system doesn't try to resign the APK
 LOCAL_CERTIFICATE := PRESIGNED
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_REPLACE_PREBUILT_APK_INSTALLED := $(LOCAL_PATH)/apk/$(my_apk_dir)/CtsShimPrivUpgradeWrongSHA.apk
 
diff --git a/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/Android.bp b/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/Android.bp
index fe7e54e..3b08af0 100644
--- a/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/Android.bp
@@ -21,8 +21,8 @@
         "CtsExternalStorageTestLib",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: [
         "src/**/*.java",
@@ -30,7 +30,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     dex_preopt: {
diff --git a/hostsidetests/appsecurity/test-apps/SessionInspector/Android.bp b/hostsidetests/appsecurity/test-apps/SessionInspector/Android.bp
index 879e087..4d46c79 100644
--- a/hostsidetests/appsecurity/test-apps/SessionInspector/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/SessionInspector/Android.bp
@@ -22,7 +22,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -36,7 +35,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/appsecurity/test-apps/SessionInspector/AndroidManifestA.xml b/hostsidetests/appsecurity/test-apps/SessionInspector/AndroidManifestA.xml
index c68bc67..95d49e7 100644
--- a/hostsidetests/appsecurity/test-apps/SessionInspector/AndroidManifestA.xml
+++ b/hostsidetests/appsecurity/test-apps/SessionInspector/AndroidManifestA.xml
@@ -20,8 +20,9 @@
                      android:targetPackage="com.android.cts.sessioninspector.a" />
 
     <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
+    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
 
-    <application android:forceQueryable="true">
+    <application>
         <uses-library android:name="android.test.runner" />
         <activity android:name="com.android.cts.sessioninspector.SessionInspectorActivity"
                   android:exported="true"/>
diff --git a/hostsidetests/appsecurity/test-apps/SessionInspector/AndroidManifestB.xml b/hostsidetests/appsecurity/test-apps/SessionInspector/AndroidManifestB.xml
index 7db8db6..15285ef 100644
--- a/hostsidetests/appsecurity/test-apps/SessionInspector/AndroidManifestB.xml
+++ b/hostsidetests/appsecurity/test-apps/SessionInspector/AndroidManifestB.xml
@@ -20,8 +20,9 @@
                      android:targetPackage="com.android.cts.sessioninspector.b" />
 
     <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
+    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
 
-    <application android:forceQueryable="true">
+    <application>
         <uses-library android:name="android.test.runner" />
         <activity android:name="com.android.cts.sessioninspector.SessionInspectorActivity"
                   android:exported="true"/>
diff --git a/hostsidetests/appsecurity/test-apps/SharedUidInstall/Android.bp b/hostsidetests/appsecurity/test-apps/SharedUidInstall/Android.bp
index 909f029..f547599 100644
--- a/hostsidetests/appsecurity/test-apps/SharedUidInstall/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/SharedUidInstall/Android.bp
@@ -17,11 +17,11 @@
     defaults: ["cts_support_defaults"],
     srcs: ["src/**/*.java"],
     sdk_version: "current",
-    static_libs: ["androidx.test.rules", "android.test.base.stubs"],
+    static_libs: ["androidx.test.rules"],
+    libs: ["android.test.base"],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     // sign this app with a different cert than CtsSharedUidInstallDiffCert
diff --git a/hostsidetests/appsecurity/test-apps/SharedUidInstallDiffCert/Android.bp b/hostsidetests/appsecurity/test-apps/SharedUidInstallDiffCert/Android.bp
index 6cc0dcd..0fb005f 100644
--- a/hostsidetests/appsecurity/test-apps/SharedUidInstallDiffCert/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/SharedUidInstallDiffCert/Android.bp
@@ -21,7 +21,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     // sign this app with a different cert than CtsSharedUidInstall
diff --git a/hostsidetests/appsecurity/test-apps/SimpleAppInstall/Android.bp b/hostsidetests/appsecurity/test-apps/SimpleAppInstall/Android.bp
index 28d8f2d..76c8a2a 100644
--- a/hostsidetests/appsecurity/test-apps/SimpleAppInstall/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/SimpleAppInstall/Android.bp
@@ -21,7 +21,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     // sign this app with a different cert than CtsSimpleAppInstallDiffCert
diff --git a/hostsidetests/appsecurity/test-apps/SimpleAppInstallDiffCert/Android.bp b/hostsidetests/appsecurity/test-apps/SimpleAppInstallDiffCert/Android.bp
index 55894f9..279f2de 100644
--- a/hostsidetests/appsecurity/test-apps/SimpleAppInstallDiffCert/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/SimpleAppInstallDiffCert/Android.bp
@@ -21,7 +21,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     // sign this app with a different cert than CtsSimpleAppInstall
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/Android.mk
index 791f18b..08a94b5 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/Android.mk
@@ -31,7 +31,7 @@
 LOCAL_PACKAGE_SPLITS := mdpi-v4 hdpi-v4 xhdpi-v4 xxhdpi-v4 v7 fr de
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_ASSET_DIR := $(LOCAL_PATH)/assets
 
@@ -64,7 +64,7 @@
 LOCAL_PACKAGE_SPLITS := v7
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_MANIFEST_FILE := revision/AndroidManifest.xml
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
@@ -94,7 +94,7 @@
 LOCAL_PACKAGE_SPLITS := v7
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
 LOCAL_AAPT_FLAGS := --version-code 101 --version-name OneHundredOne --replace-version
@@ -123,7 +123,7 @@
 LOCAL_PACKAGE_SPLITS := v7
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey2
 LOCAL_AAPT_FLAGS := --version-code 100 --version-name OneHundred --replace-version
@@ -150,7 +150,7 @@
 LOCAL_MIN_SDK_VERSION := 4
 LOCAL_PACKAGE_SPLITS := xxhdpi-v4
 
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_ASSET_DIR := $(LOCAL_PATH)/assets
 
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/SplitApp/AndroidManifest.xml
index 04ed8f4..6c4a335 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/AndroidManifest.xml
@@ -20,10 +20,11 @@
 
     <uses-sdk android:minSdkVersion="4" />
 
-    <uses-permission android:name="android.permission.CAMERA" />
-    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
+    <uses-permission android:name="android.permission.CAMERA"/>
+    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
+    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
 
-    <application android:label="SplitApp" android:multiArch="true" android:forceQueryable="true">
+    <application android:label="SplitApp" android:multiArch="true">
         <activity android:name=".MyActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/feature/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/feature/Android.mk
index 00fe41a..22d0a1a 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/feature/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/feature/Android.mk
@@ -31,7 +31,7 @@
 LOCAL_MODULE_TAGS := tests
 
 # tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_USE_AAPT2 := true
 LOCAL_APK_LIBRARIES := CtsSplitApp
@@ -56,7 +56,7 @@
 LOCAL_SDK_VERSION := current
 LOCAL_MIN_SDK_VERSION := 4
 
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_ASSET_DIR := $(LOCAL_PATH)/assets
 
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/jni/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/jni/Android.mk
index a01e18a..e495ad3 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/jni/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/jni/Android.mk
@@ -24,6 +24,6 @@
 LOCAL_LDLIBS += -llog
 
 # tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 include $(BUILD_SHARED_LIBRARY)
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/libs/arm64-v8a/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/libs/arm64-v8a/Android.mk
index c7c423c..8eede6c 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/libs/arm64-v8a/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/libs/arm64-v8a/Android.mk
@@ -24,7 +24,7 @@
 LOCAL_JAVA_RESOURCE_DIRS := raw
 
 # tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
 LOCAL_AAPT_FLAGS := --version-code 100 --replace-version
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi-v7a/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi-v7a/Android.mk
index 6c8716a..234a7d8 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi-v7a/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi-v7a/Android.mk
@@ -24,7 +24,7 @@
 LOCAL_JAVA_RESOURCE_DIRS := raw
 
 # tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
 LOCAL_AAPT_FLAGS := --version-code 100 --replace-version
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi/Android.mk
index 4d12652..0322dcd 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/libs/armeabi/Android.mk
@@ -24,7 +24,7 @@
 LOCAL_JAVA_RESOURCE_DIRS := raw
 
 # tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
 LOCAL_AAPT_FLAGS := --version-code 100 --replace-version
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips/Android.mk
index 8f4bfb2..4ee13ba 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips/Android.mk
@@ -24,7 +24,7 @@
 LOCAL_JAVA_RESOURCE_DIRS := raw
 
 # tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
 LOCAL_AAPT_FLAGS := --version-code 100 --replace-version
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips64/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips64/Android.mk
index 5f92ea6..03c4305 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips64/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/libs/mips64/Android.mk
@@ -24,7 +24,7 @@
 LOCAL_JAVA_RESOURCE_DIRS := raw
 
 # tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
 LOCAL_AAPT_FLAGS := --version-code 100 --replace-version
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86/Android.mk
index a4c276d..14144a6 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86/Android.mk
@@ -24,7 +24,7 @@
 LOCAL_JAVA_RESOURCE_DIRS := raw
 
 # tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
 LOCAL_AAPT_FLAGS := --version-code 100 --replace-version
diff --git a/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86_64/Android.mk b/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86_64/Android.mk
index fe4fe48..462c1cc 100644
--- a/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86_64/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/SplitApp/libs/x86_64/Android.mk
@@ -24,7 +24,7 @@
 LOCAL_JAVA_RESOURCE_DIRS := raw
 
 # tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_CERTIFICATE := cts/hostsidetests/appsecurity/certs/cts-testkey1
 LOCAL_AAPT_FLAGS := --version-code 100 --replace-version
diff --git a/hostsidetests/appsecurity/test-apps/StorageApp/Android.bp b/hostsidetests/appsecurity/test-apps/StorageApp/Android.bp
index 8cc0e03..3719805 100644
--- a/hostsidetests/appsecurity/test-apps/StorageApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/StorageApp/Android.bp
@@ -4,7 +4,7 @@
     defaults: ["cts_support_defaults"],
     sdk_version: "test_current",
     libs: [
-        "android.test.base.stubs",
+        "android.test.base",
         "ub-uiautomator",
     ],
 }
@@ -17,11 +17,10 @@
         "androidx.test.rules",
         "ub-uiautomator",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: ["src/**/*.java"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "AndroidManifestA.xml",
@@ -35,11 +34,10 @@
         "androidx.test.rules",
         "ub-uiautomator",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: ["src/**/*.java"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "AndroidManifestB.xml",
diff --git a/hostsidetests/appsecurity/test-apps/StorageStatsApp/Android.bp b/hostsidetests/appsecurity/test-apps/StorageStatsApp/Android.bp
index 3c11016..d7c9fd8 100644
--- a/hostsidetests/appsecurity/test-apps/StorageStatsApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/StorageStatsApp/Android.bp
@@ -21,13 +21,12 @@
         "ub-uiautomator",
         "CtsStorageAppLib",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: [
         "src/**/*.java",
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     dex_preopt: {
diff --git a/hostsidetests/appsecurity/test-apps/TargetInstrumentationApp/Android.bp b/hostsidetests/appsecurity/test-apps/TargetInstrumentationApp/Android.bp
index 6008199..03282b3 100644
--- a/hostsidetests/appsecurity/test-apps/TargetInstrumentationApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/TargetInstrumentationApp/Android.bp
@@ -21,7 +21,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     // sign this app with different cert than CtsInstrumentationAppDiffCert
diff --git a/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/Android.bp b/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/Android.bp
index 030cd76..ce44a1c 100644
--- a/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/Android.bp
@@ -23,7 +23,6 @@
     min_sdk_version: "27",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -37,7 +36,6 @@
     min_sdk_version: "28",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -51,7 +49,6 @@
     min_sdk_version: "28",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -69,7 +66,6 @@
     min_sdk_version: "27",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -83,7 +79,6 @@
     min_sdk_version: "27",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/AndroidManifest.xml
index ad1300f..9797cea 100644
--- a/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/AndroidManifest.xml
@@ -20,7 +20,7 @@
     <uses-sdk android:minSdkVersion="27" android:targetSdkVersion="27" />
 
     <application android:useEmbeddedDex="true">
-        <activity android:name=".DummyActivity"/>
+        <activity android:name=".EmptyActivity"/>
     </application>
 
 </manifest>
diff --git a/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/AndroidManifest_use_extracted_dex.xml b/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/AndroidManifest_use_extracted_dex.xml
index 73c15a3..b324974 100644
--- a/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/AndroidManifest_use_extracted_dex.xml
+++ b/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/AndroidManifest_use_extracted_dex.xml
@@ -20,7 +20,7 @@
     <uses-sdk android:minSdkVersion="27" android:targetSdkVersion="27" />
 
     <application android:useEmbeddedDex="false">
-        <activity android:name=".DummyActivity"/>
+        <activity android:name=".EmptyActivity"/>
     </application>
 
 </manifest>
diff --git a/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/feature_split/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/feature_split/AndroidManifest.xml
index 3ab0452..1987238 100644
--- a/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/feature_split/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/feature_split/AndroidManifest.xml
@@ -20,6 +20,6 @@
     android:isFeatureSplit="true"
     split="feature_x">
     <application>
-        <activity android:name=".feature_x.DummyActivity"/>
+        <activity android:name=".feature_x.EmptyActivity"/>
     </application>
 </manifest>
diff --git a/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/feature_split/src/com/android/cts/useembeddeddex/feature_x/DummyActivity.java b/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/feature_split/src/com/android/cts/useembeddeddex/feature_x/DummyActivity.java
deleted file mode 100644
index 6cd8004..0000000
--- a/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/feature_split/src/com/android/cts/useembeddeddex/feature_x/DummyActivity.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.apkintergrity.feature_x;
-
-import android.app.Activity;
-
-/** Dummy class just to generate some dex */
-public class DummyActivity extends Activity {}
diff --git a/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/feature_split/src/com/android/cts/useembeddeddex/feature_x/EmptyActivity.java b/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/feature_split/src/com/android/cts/useembeddeddex/feature_x/EmptyActivity.java
new file mode 100644
index 0000000..adcfc24
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/feature_split/src/com/android/cts/useembeddeddex/feature_x/EmptyActivity.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.apkintergrity.feature_x;
+
+import android.app.Activity;
+
+/** Empty class just to generate some dex */
+public class EmptyActivity extends Activity {}
diff --git a/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/src/com/android/cts/useembeddeddex/DummyActivity.java b/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/src/com/android/cts/useembeddeddex/DummyActivity.java
deleted file mode 100644
index 974c541..0000000
--- a/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/src/com/android/cts/useembeddeddex/DummyActivity.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.useembeddeddex;
-
-import android.app.Activity;
-
-/** Dummy class just to generate some dex */
-public class DummyActivity extends Activity {}
diff --git a/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/src/com/android/cts/useembeddeddex/EmptyActivity.java b/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/src/com/android/cts/useembeddeddex/EmptyActivity.java
new file mode 100644
index 0000000..c25f89a
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/UseEmbeddedDexApp/src/com/android/cts/useembeddeddex/EmptyActivity.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.useembeddeddex;
+
+import android.app.Activity;
+
+/** Empty class just to generate some dex */
+public class EmptyActivity extends Activity {}
diff --git a/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/Android.bp b/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/Android.bp
index f8bde12..c3ab6bf 100644
--- a/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/Android.bp
@@ -26,11 +26,10 @@
         "testng",
         "truth-prebuilt",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "sts",
     ],
diff --git a/hostsidetests/appsecurity/test-apps/UseProcessFailActivity/Android.bp b/hostsidetests/appsecurity/test-apps/UseProcessFailActivity/Android.bp
index f1cbf61..38ccc7f 100644
--- a/hostsidetests/appsecurity/test-apps/UseProcessFailActivity/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/UseProcessFailActivity/Android.bp
@@ -20,11 +20,10 @@
     srcs: ["src/**/*.java"],
     sdk_version: "current",
     static_libs: ["androidx.test.rules"],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     certificate: ":cts-testkey1",
diff --git a/hostsidetests/appsecurity/test-apps/UseProcessFailApplication/Android.bp b/hostsidetests/appsecurity/test-apps/UseProcessFailApplication/Android.bp
index 929542a..94fbf5f 100644
--- a/hostsidetests/appsecurity/test-apps/UseProcessFailApplication/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/UseProcessFailApplication/Android.bp
@@ -20,11 +20,10 @@
     srcs: ["src/**/*.java"],
     sdk_version: "current",
     static_libs: ["androidx.test.rules"],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     certificate: ":cts-testkey1",
diff --git a/hostsidetests/appsecurity/test-apps/UseProcessFailProvider/Android.bp b/hostsidetests/appsecurity/test-apps/UseProcessFailProvider/Android.bp
index df27253..bf94a46 100644
--- a/hostsidetests/appsecurity/test-apps/UseProcessFailProvider/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/UseProcessFailProvider/Android.bp
@@ -20,11 +20,10 @@
     srcs: ["src/**/*.java"],
     sdk_version: "current",
     static_libs: ["androidx.test.rules"],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     certificate: ":cts-testkey1",
diff --git a/hostsidetests/appsecurity/test-apps/UseProcessFailReceiver/Android.bp b/hostsidetests/appsecurity/test-apps/UseProcessFailReceiver/Android.bp
index 4fdc2a1..8a0fa9b 100644
--- a/hostsidetests/appsecurity/test-apps/UseProcessFailReceiver/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/UseProcessFailReceiver/Android.bp
@@ -20,11 +20,10 @@
     srcs: ["src/**/*.java"],
     sdk_version: "current",
     static_libs: ["androidx.test.rules"],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     certificate: ":cts-testkey1",
diff --git a/hostsidetests/appsecurity/test-apps/UseProcessFailService/Android.bp b/hostsidetests/appsecurity/test-apps/UseProcessFailService/Android.bp
index fe89cea..44ad956 100644
--- a/hostsidetests/appsecurity/test-apps/UseProcessFailService/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/UseProcessFailService/Android.bp
@@ -20,11 +20,10 @@
     srcs: ["src/**/*.java"],
     sdk_version: "current",
     static_libs: ["androidx.test.rules"],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     certificate: ":cts-testkey1",
diff --git a/hostsidetests/appsecurity/test-apps/UseProcessSuccess/Android.bp b/hostsidetests/appsecurity/test-apps/UseProcessSuccess/Android.bp
index b4a9123..8887a88 100644
--- a/hostsidetests/appsecurity/test-apps/UseProcessSuccess/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/UseProcessSuccess/Android.bp
@@ -20,11 +20,10 @@
     srcs: ["src/**/*.java"],
     sdk_version: "current",
     static_libs: ["androidx.test.rules"],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     certificate: ":cts-testkey1",
diff --git a/hostsidetests/appsecurity/test-apps/V3SigningSchemeRotation/Android.bp b/hostsidetests/appsecurity/test-apps/V3SigningSchemeRotation/Android.bp
index 56e0eab..5b13a8b 100644
--- a/hostsidetests/appsecurity/test-apps/V3SigningSchemeRotation/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/V3SigningSchemeRotation/Android.bp
@@ -18,14 +18,13 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "sts",
     ],
     srcs: ["src/**/*.java"],
     sdk_version: "current",
     static_libs: ["androidx.test.rules"],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     dex_preopt: {
         enabled: false,
     },
diff --git a/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/Android.bp b/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/Android.bp
index ab167f8..cf2cb34 100644
--- a/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/Android.bp
@@ -22,15 +22,14 @@
         "compatibility-device-util-axt",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     exclude_srcs: ["src/com/android/cts/writeexternalstorageapp/WriteGiftTest.java"],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -40,7 +39,7 @@
     srcs: ["src/com/android/cts/writeexternalstorageapp/WriteGiftTest.java"],
     static_libs: ["CtsExternalStorageTestLib"],
     libs: [
-        "android.test.base.stubs",
-        "android.test.runner.stubs",
+        "android.test.base",
+        "android.test.runner",
     ],
 }
diff --git a/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp2/Android.bp b/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp2/Android.bp
index 22ee598..65784ce 100644
--- a/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp2/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp2/Android.bp
@@ -22,13 +22,12 @@
         "compatibility-device-util-axt",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/appsecurity/test-apps/dummyime/Android.bp b/hostsidetests/appsecurity/test-apps/dummyime/Android.bp
deleted file mode 100644
index fd0bb2a..0000000
--- a/hostsidetests/appsecurity/test-apps/dummyime/Android.bp
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-// Copyright (C) 2019 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.
-//
-
-android_test_helper_app {
-    name: "CtsDummyIme",
-    defaults: ["cts_support_defaults"],
-    sdk_version: "test_current",
-    srcs: ["src/**/*.java"],
-    // tag this module as a cts test artifact
-    test_suites: [
-        "cts",
-        "vts10",
-        "general-tests",
-        "mts",
-    ],
-    certificate: ":cts-testkey1",
-    optimize: {
-        enabled: false,
-    },
-    dex_preopt: {
-        enabled: false,
-    },
-    min_sdk_version: "29",
-    target_sdk_version: "29",
-}
diff --git a/hostsidetests/appsecurity/test-apps/dummyime/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/dummyime/AndroidManifest.xml
deleted file mode 100644
index 2f71a4b..0000000
--- a/hostsidetests/appsecurity/test-apps/dummyime/AndroidManifest.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<!--
-/*
- * Copyright 2019, 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="com.android.cts.dummyime">
-    <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="29" />
-    <application android:label="Dummy IME">
-        <service android:name=".CtsDummyIme"
-                android:permission="android.permission.BIND_INPUT_METHOD">
-            <intent-filter>
-                <action android:name="android.view.InputMethod" />
-            </intent-filter>
-            <meta-data android:name="android.view.im" android:resource="@xml/method" />
-        </service>
-    </application>
-</manifest>
diff --git a/hostsidetests/appsecurity/test-apps/dummyime/src/com/android/cts/dummyime/CtsDummyIme.java b/hostsidetests/appsecurity/test-apps/dummyime/src/com/android/cts/dummyime/CtsDummyIme.java
deleted file mode 100644
index a3d3457..0000000
--- a/hostsidetests/appsecurity/test-apps/dummyime/src/com/android/cts/dummyime/CtsDummyIme.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.dummyime;
-
-import android.inputmethodservice.InputMethodService;
-
-/**
- * Dummy IME implementation that basically does nothing
- */
-public class CtsDummyIme extends InputMethodService {
-
-    @Override
-    public boolean onEvaluateFullscreenMode() {
-        return false;
-    }
-
-    @Override
-    public boolean onEvaluateInputViewShown() {
-        return false;
-    }
-}
diff --git a/hostsidetests/appsecurity/test-apps/keysets/malBadKey/Android.bp b/hostsidetests/appsecurity/test-apps/keysets/malBadKey/Android.bp
index 776b54b..a7d7ee8 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/malBadKey/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/keysets/malBadKey/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/appsecurity/test-apps/keysets/malNoDef/Android.bp b/hostsidetests/appsecurity/test-apps/keysets/malNoDef/Android.bp
index ec01e2a..9763629 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/malNoDef/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/keysets/malNoDef/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/appsecurity/test-apps/keysets/malOneDef/Android.bp b/hostsidetests/appsecurity/test-apps/keysets/malOneDef/Android.bp
index d2a9b2f..f52826a 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/malOneDef/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/keysets/malOneDef/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/appsecurity/test-apps/keysets/permDef/Android.bp b/hostsidetests/appsecurity/test-apps/keysets/permDef/Android.bp
index 87c46af..8b29b2b 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/permDef/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/keysets/permDef/Android.bp
@@ -25,7 +25,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -43,7 +42,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/appsecurity/test-apps/keysets/permDef/res/values/strings.xml b/hostsidetests/appsecurity/test-apps/keysets/permDef/res/values/strings.xml
index 4e5e870..c1282d2 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/permDef/res/values/strings.xml
+++ b/hostsidetests/appsecurity/test-apps/keysets/permDef/res/values/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 
-<!-- Just need this dummy file to have something to build. -->
+<!-- Just need this stub file to have something to build. -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
   <string name="keysets_perm_desc">keysets_perm_description</string>
   <string name="keysets_perm_label">keysets_perm_label</string>
diff --git a/hostsidetests/appsecurity/test-apps/keysets/permUse/Android.bp b/hostsidetests/appsecurity/test-apps/keysets/permUse/Android.bp
index 24a6401..3e17886 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/permUse/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/keysets/permUse/Android.bp
@@ -25,7 +25,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -43,7 +42,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/appsecurity/test-apps/keysets/permUse/res/values/strings.xml b/hostsidetests/appsecurity/test-apps/keysets/permUse/res/values/strings.xml
index 4e5e870..c1282d2 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/permUse/res/values/strings.xml
+++ b/hostsidetests/appsecurity/test-apps/keysets/permUse/res/values/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 
-<!-- Just need this dummy file to have something to build. -->
+<!-- Just need this stub file to have something to build. -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
   <string name="keysets_perm_desc">keysets_perm_description</string>
   <string name="keysets_perm_label">keysets_perm_label</string>
diff --git a/hostsidetests/appsecurity/test-apps/keysets/testApp/Android.bp b/hostsidetests/appsecurity/test-apps/keysets/testApp/Android.bp
index f0d3359..5a58116 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/testApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/keysets/testApp/Android.bp
@@ -18,13 +18,12 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src/**/*.java"],
     sdk_version: "current",
     static_libs: ["androidx.test.rules"],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     dex_preopt: {
         enabled: false,
     },
diff --git a/hostsidetests/appsecurity/test-apps/keysets/uA/Android.bp b/hostsidetests/appsecurity/test-apps/keysets/uA/Android.bp
index 9812114..769ad16 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/uA/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/keysets/uA/Android.bp
@@ -25,7 +25,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -43,7 +42,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -61,7 +59,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -80,7 +77,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/appsecurity/test-apps/keysets/uAB/Android.bp b/hostsidetests/appsecurity/test-apps/keysets/uAB/Android.bp
index aeec195..1c82153 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/uAB/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/keysets/uAB/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/appsecurity/test-apps/keysets/uAuB/Android.bp b/hostsidetests/appsecurity/test-apps/keysets/uAuB/Android.bp
index e814047..ed35679 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/uAuB/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/keysets/uAuB/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/appsecurity/test-apps/keysets/uB/Android.bp b/hostsidetests/appsecurity/test-apps/keysets/uB/Android.bp
index f2d12b1..a075bf7 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/uB/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/keysets/uB/Android.bp
@@ -25,7 +25,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -43,7 +42,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -62,7 +60,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/appsecurity/test-apps/keysets/uBsharedUser/Android.bp b/hostsidetests/appsecurity/test-apps/keysets/uBsharedUser/Android.bp
index bdfce81..786b47d 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/uBsharedUser/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/keysets/uBsharedUser/Android.bp
@@ -25,7 +25,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -43,7 +42,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/appsecurity/test-apps/keysets/uEcA/Android.bp b/hostsidetests/appsecurity/test-apps/keysets/uEcA/Android.bp
index bf93e15..b2ea20e 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/uEcA/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/keysets/uEcA/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/appsecurity/test-apps/keysets/uNone/Android.bp b/hostsidetests/appsecurity/test-apps/keysets/uNone/Android.bp
index 2662dc0..1919495 100644
--- a/hostsidetests/appsecurity/test-apps/keysets/uNone/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/keysets/uNone/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/appsecurity/test-apps/rro/OverlayAll/Android.bp b/hostsidetests/appsecurity/test-apps/rro/OverlayAll/Android.bp
index 1f5eb12..b35ffb5 100644
--- a/hostsidetests/appsecurity/test-apps/rro/OverlayAll/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/rro/OverlayAll/Android.bp
@@ -22,7 +22,6 @@
     certificate: ":cts-testkey1",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -35,7 +34,6 @@
     certificate: ":cts-testkey1",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -48,7 +46,6 @@
     certificate: ":cts-testkey1",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -61,7 +58,6 @@
     certificate: ":cts-testkey2",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/appsecurity/test-apps/rro/OverlayAndroid/Android.bp b/hostsidetests/appsecurity/test-apps/rro/OverlayAndroid/Android.bp
index c5870c3..35d54ea 100644
--- a/hostsidetests/appsecurity/test-apps/rro/OverlayAndroid/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/rro/OverlayAndroid/Android.bp
@@ -21,7 +21,6 @@
     certificate: ":cts-testkey1",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/appsecurity/test-apps/rro/OverlayApp/Android.bp b/hostsidetests/appsecurity/test-apps/rro/OverlayApp/Android.bp
index 2e83578..01d4937 100644
--- a/hostsidetests/appsecurity/test-apps/rro/OverlayApp/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/rro/OverlayApp/Android.bp
@@ -19,13 +19,12 @@
     defaults: ["cts_support_defaults"],
     sdk_version: "test_current",
     static_libs: ["androidx.test.rules"],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: [
         "src/**/*.java",
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/appsecurity/test-apps/rro/OverlayApp/src/com/android/cts/overlay/app/OverlayableTest.java b/hostsidetests/appsecurity/test-apps/rro/OverlayApp/src/com/android/cts/overlay/app/OverlayableTest.java
index 2b8bad6..dbe7c0a 100644
--- a/hostsidetests/appsecurity/test-apps/rro/OverlayApp/src/com/android/cts/overlay/app/OverlayableTest.java
+++ b/hostsidetests/appsecurity/test-apps/rro/OverlayApp/src/com/android/cts/overlay/app/OverlayableTest.java
@@ -67,10 +67,11 @@
         return InstrumentationRegistry.getTargetContext().createPackageContext(TARGET_PACKAGE, 0);
     }
 
-    private void assertOverlayEnabled(Context context, String overlayPackage) throws Exception {
+    private void assertOverlayEnabled(String overlayPackage) throws Exception {
         // Wait for the overlay changes to propagate
         FutureTask<Boolean> task = new FutureTask<>(() -> {
             while (true) {
+                Context context = getTargetContext();
                 for (String path : context.getAssets().getApkPaths()) {
                     if (path.contains(overlayPackage)) {
                         return true;
@@ -85,8 +86,8 @@
 
     @Test
     public void testOverlayPolicyAll() throws Exception {
+        assertOverlayEnabled(POLICY_ALL_PACKAGE);
         Context context = getTargetContext();
-        assertOverlayEnabled(context, POLICY_ALL_PACKAGE);
 
         String result = context.getResources().getString(R.string.not_overlayable);
         assertEquals(NOT_OVERLAID, result);
@@ -112,8 +113,8 @@
 
     @Test
     public void testSameSignatureNoOverlayableSucceeds() throws Exception {
+        assertOverlayEnabled(POLICY_ALL_PACKAGE);
         Context context = getTargetContext();
-        assertOverlayEnabled(context, POLICY_ALL_PACKAGE);
 
         String result = context.getResources().getString(R.string.not_overlayable);
         assertEquals(OVERLAID, result);
diff --git a/hostsidetests/appsecurity/test-apps/rro/OverlayPolicyProduct/Android.bp b/hostsidetests/appsecurity/test-apps/rro/OverlayPolicyProduct/Android.bp
index 6f6798c..8674627 100644
--- a/hostsidetests/appsecurity/test-apps/rro/OverlayPolicyProduct/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/rro/OverlayPolicyProduct/Android.bp
@@ -21,7 +21,6 @@
     certificate: ":cts-testkey1",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/appsecurity/test-apps/rro/OverlayPolicySignatureDifferent/Android.bp b/hostsidetests/appsecurity/test-apps/rro/OverlayPolicySignatureDifferent/Android.bp
index e1b7f99..dbcb1fe 100644
--- a/hostsidetests/appsecurity/test-apps/rro/OverlayPolicySignatureDifferent/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/rro/OverlayPolicySignatureDifferent/Android.bp
@@ -21,7 +21,6 @@
     certificate: ":cts-testkey2",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/appsecurity/test-apps/rro/OverlayPolicySystem/Android.bp b/hostsidetests/appsecurity/test-apps/rro/OverlayPolicySystem/Android.bp
index 42a618e..28f6aae 100644
--- a/hostsidetests/appsecurity/test-apps/rro/OverlayPolicySystem/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/rro/OverlayPolicySystem/Android.bp
@@ -21,7 +21,6 @@
     certificate: ":cts-testkey1",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/appsecurity/test-apps/rro/OverlayPolicyVendor/Android.bp b/hostsidetests/appsecurity/test-apps/rro/OverlayPolicyVendor/Android.bp
index c9967f8..983821c 100644
--- a/hostsidetests/appsecurity/test-apps/rro/OverlayPolicyVendor/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/rro/OverlayPolicyVendor/Android.bp
@@ -21,7 +21,6 @@
     certificate: ":cts-testkey1",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/appsecurity/test-apps/rro/OverlayTarget/Android.bp b/hostsidetests/appsecurity/test-apps/rro/OverlayTarget/Android.bp
index 7dc1187..e02bcd3 100644
--- a/hostsidetests/appsecurity/test-apps/rro/OverlayTarget/Android.bp
+++ b/hostsidetests/appsecurity/test-apps/rro/OverlayTarget/Android.bp
@@ -25,7 +25,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -40,7 +39,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/appsecurity/test-apps/stubime/Android.bp b/hostsidetests/appsecurity/test-apps/stubime/Android.bp
new file mode 100644
index 0000000..0038c05
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/stubime/Android.bp
@@ -0,0 +1,37 @@
+//
+// Copyright (C) 2019 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.
+//
+
+android_test_helper_app {
+    name: "CtsStubIme",
+    defaults: ["cts_support_defaults"],
+    sdk_version: "test_current",
+    srcs: ["src/**/*.java"],
+    // tag this module as a cts test artifact
+    test_suites: [
+        "cts",
+        "general-tests",
+        "mts",
+    ],
+    certificate: ":cts-testkey1",
+    optimize: {
+        enabled: false,
+    },
+    dex_preopt: {
+        enabled: false,
+    },
+    min_sdk_version: "29",
+    target_sdk_version: "29",
+}
diff --git a/hostsidetests/appsecurity/test-apps/stubime/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/stubime/AndroidManifest.xml
new file mode 100644
index 0000000..a091762
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/stubime/AndroidManifest.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright 2019, 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="com.android.cts.stubime">
+    <uses-sdk android:minSdkVersion="29"
+         android:targetSdkVersion="29"/>
+    <application android:label="Stub IME">
+        <service android:name=".CtsStubIme"
+            android:permission="android.permission.BIND_INPUT_METHOD"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="android.view.InputMethod"/>
+            </intent-filter>
+            <meta-data android:name="android.view.im"
+                 android:resource="@xml/method"/>
+        </service>
+    </application>
+</manifest>
diff --git a/hostsidetests/appsecurity/test-apps/dummyime/res/xml/method.xml b/hostsidetests/appsecurity/test-apps/stubime/res/xml/method.xml
similarity index 100%
rename from hostsidetests/appsecurity/test-apps/dummyime/res/xml/method.xml
rename to hostsidetests/appsecurity/test-apps/stubime/res/xml/method.xml
diff --git a/hostsidetests/appsecurity/test-apps/stubime/src/com/android/cts/stubime/CtsStubIme.java b/hostsidetests/appsecurity/test-apps/stubime/src/com/android/cts/stubime/CtsStubIme.java
new file mode 100644
index 0000000..5b28d69
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/stubime/src/com/android/cts/stubime/CtsStubIme.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.stubime;
+
+import android.inputmethodservice.InputMethodService;
+
+/**
+ * Stub IME implementation that basically does nothing
+ */
+public class CtsStubIme extends InputMethodService {
+
+    @Override
+    public boolean onEvaluateFullscreenMode() {
+        return false;
+    }
+
+    @Override
+    public boolean onEvaluateInputViewShown() {
+        return false;
+    }
+}
diff --git a/hostsidetests/appsecurity/test-apps/tinyapp/base.mk b/hostsidetests/appsecurity/test-apps/tinyapp/base.mk
index 8244aad..cc6b91e 100644
--- a/hostsidetests/appsecurity/test-apps/tinyapp/base.mk
+++ b/hostsidetests/appsecurity/test-apps/tinyapp/base.mk
@@ -16,7 +16,7 @@
 
 # Base setup that can be included by all builds of this package.
 include $(CLEAR_VARS)
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/res
 LOCAL_SDK_VERSION := current
diff --git a/hostsidetests/atrace/Android.bp b/hostsidetests/atrace/Android.bp
index cb4ed28..380e55b 100644
--- a/hostsidetests/atrace/Android.bp
+++ b/hostsidetests/atrace/Android.bp
@@ -25,7 +25,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/atrace/AtraceTestApp/Android.bp b/hostsidetests/atrace/AtraceTestApp/Android.bp
index fb0c233..88ef404 100644
--- a/hostsidetests/atrace/AtraceTestApp/Android.bp
+++ b/hostsidetests/atrace/AtraceTestApp/Android.bp
@@ -26,7 +26,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/atrace/AtraceTestApp/jni/Android.bp b/hostsidetests/atrace/AtraceTestApp/jni/Android.bp
index a782ef6..70b47a7 100644
--- a/hostsidetests/atrace/AtraceTestApp/jni/Android.bp
+++ b/hostsidetests/atrace/AtraceTestApp/jni/Android.bp
@@ -20,6 +20,7 @@
         "-Wall",
         "-Werror",
     ],
+    header_libs: ["jni_headers"],
     shared_libs: ["libandroid"],
     sdk_version: "current",
 
diff --git a/hostsidetests/backup/AllowBackup/BackupAllowedApp/Android.bp b/hostsidetests/backup/AllowBackup/BackupAllowedApp/Android.bp
index d077c54..9d6254c 100644
--- a/hostsidetests/backup/AllowBackup/BackupAllowedApp/Android.bp
+++ b/hostsidetests/backup/AllowBackup/BackupAllowedApp/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/backup/AllowBackup/BackupNotAllowedApp/Android.bp b/hostsidetests/backup/AllowBackup/BackupNotAllowedApp/Android.bp
index 9c05746..100718d 100644
--- a/hostsidetests/backup/AllowBackup/BackupNotAllowedApp/Android.bp
+++ b/hostsidetests/backup/AllowBackup/BackupNotAllowedApp/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/backup/Android.bp b/hostsidetests/backup/Android.bp
index 598c357..594ebf9 100644
--- a/hostsidetests/backup/Android.bp
+++ b/hostsidetests/backup/Android.bp
@@ -19,7 +19,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
diff --git a/hostsidetests/backup/AutoRestoreApp/Android.bp b/hostsidetests/backup/AutoRestoreApp/Android.bp
index 7c842bf..0d769d5 100644
--- a/hostsidetests/backup/AutoRestoreApp/Android.bp
+++ b/hostsidetests/backup/AutoRestoreApp/Android.bp
@@ -27,7 +27,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
     platform_apis: true,
diff --git a/hostsidetests/backup/BackupTransportApp/Android.bp b/hostsidetests/backup/BackupTransportApp/Android.bp
index 2c5d133..1a80869 100644
--- a/hostsidetests/backup/BackupTransportApp/Android.bp
+++ b/hostsidetests/backup/BackupTransportApp/Android.bp
@@ -26,7 +26,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "system_current",
diff --git a/hostsidetests/backup/FullBackupOnly/FullBackupOnlyFalseNoAgentApp/Android.bp b/hostsidetests/backup/FullBackupOnly/FullBackupOnlyFalseNoAgentApp/Android.bp
index 2bb3a19..e6835f3 100644
--- a/hostsidetests/backup/FullBackupOnly/FullBackupOnlyFalseNoAgentApp/Android.bp
+++ b/hostsidetests/backup/FullBackupOnly/FullBackupOnlyFalseNoAgentApp/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/backup/FullBackupOnly/FullBackupOnlyFalseWithAgentApp/Android.bp b/hostsidetests/backup/FullBackupOnly/FullBackupOnlyFalseWithAgentApp/Android.bp
index 12fb76a..ba34842 100644
--- a/hostsidetests/backup/FullBackupOnly/FullBackupOnlyFalseWithAgentApp/Android.bp
+++ b/hostsidetests/backup/FullBackupOnly/FullBackupOnlyFalseWithAgentApp/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/backup/FullBackupOnly/FullBackupOnlyTrueWithAgentApp/Android.bp b/hostsidetests/backup/FullBackupOnly/FullBackupOnlyTrueWithAgentApp/Android.bp
index 20a1845..f959d73 100644
--- a/hostsidetests/backup/FullBackupOnly/FullBackupOnlyTrueWithAgentApp/Android.bp
+++ b/hostsidetests/backup/FullBackupOnly/FullBackupOnlyTrueWithAgentApp/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/backup/KeyValueApp/Android.bp b/hostsidetests/backup/KeyValueApp/Android.bp
index ceeaa52..7b7cea2 100644
--- a/hostsidetests/backup/KeyValueApp/Android.bp
+++ b/hostsidetests/backup/KeyValueApp/Android.bp
@@ -24,7 +24,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     platform_apis: true,
diff --git a/hostsidetests/backup/OWNERS b/hostsidetests/backup/OWNERS
index e0e5e22..0f88811 100644
--- a/hostsidetests/backup/OWNERS
+++ b/hostsidetests/backup/OWNERS
@@ -1,9 +1,4 @@
-# Bug component: 41666
-# Use this reviewer by default.
-br-framework-team+reviews@google.com
+# Bug component: 656484
 
-alsutton@google.com
-anniemeng@google.com
-brufino@google.com
-nathch@google.com
-rthakohov@google.com
+include platform/frameworks/base:/services/backup/OWNERS
+
diff --git a/hostsidetests/backup/OtherSoundsSettingsApp/Android.bp b/hostsidetests/backup/OtherSoundsSettingsApp/Android.bp
index 75e5882..12b9a4a 100644
--- a/hostsidetests/backup/OtherSoundsSettingsApp/Android.bp
+++ b/hostsidetests/backup/OtherSoundsSettingsApp/Android.bp
@@ -24,7 +24,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     // Uncomment when b/78787392 is fixed
diff --git a/hostsidetests/backup/PreservedSettingsApp/Android.bp b/hostsidetests/backup/PreservedSettingsApp/Android.bp
index 4b536f3..404abc4 100644
--- a/hostsidetests/backup/PreservedSettingsApp/Android.bp
+++ b/hostsidetests/backup/PreservedSettingsApp/Android.bp
@@ -25,7 +25,7 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
+        "general-tests",
     ],
     // Uncomment when b/78787392 is fixed
     // sdk_version: "system_test_current",
diff --git a/hostsidetests/backup/ProfileFullBackupApp/Android.bp b/hostsidetests/backup/ProfileFullBackupApp/Android.bp
index cfbbefc..1cb5a3d 100644
--- a/hostsidetests/backup/ProfileFullBackupApp/Android.bp
+++ b/hostsidetests/backup/ProfileFullBackupApp/Android.bp
@@ -24,7 +24,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/backup/ProfileKeyValueApp/Android.bp b/hostsidetests/backup/ProfileKeyValueApp/Android.bp
index ed37157..154ba22 100644
--- a/hostsidetests/backup/ProfileKeyValueApp/Android.bp
+++ b/hostsidetests/backup/ProfileKeyValueApp/Android.bp
@@ -24,7 +24,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/backup/ProfileSerialNumberApp/Android.bp b/hostsidetests/backup/ProfileSerialNumberApp/Android.bp
index 1ac3e7d..fc322da 100644
--- a/hostsidetests/backup/ProfileSerialNumberApp/Android.bp
+++ b/hostsidetests/backup/ProfileSerialNumberApp/Android.bp
@@ -24,7 +24,7 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
+        "general-tests",
     ],
     // Uncomment when b/78787392 is fixed
     // sdk_version: "system_test_current",
diff --git a/hostsidetests/backup/RestoreAnyVersion/NewVersionApp/Android.bp b/hostsidetests/backup/RestoreAnyVersion/NewVersionApp/Android.bp
index f304856..f3c36d0 100644
--- a/hostsidetests/backup/RestoreAnyVersion/NewVersionApp/Android.bp
+++ b/hostsidetests/backup/RestoreAnyVersion/NewVersionApp/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/backup/RestoreAnyVersion/NoRestoreAnyVersionApp/Android.bp b/hostsidetests/backup/RestoreAnyVersion/NoRestoreAnyVersionApp/Android.bp
index a138d03..8d88636 100644
--- a/hostsidetests/backup/RestoreAnyVersion/NoRestoreAnyVersionApp/Android.bp
+++ b/hostsidetests/backup/RestoreAnyVersion/NoRestoreAnyVersionApp/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/backup/RestoreAnyVersion/RestoreAnyVersionApp/Android.bp b/hostsidetests/backup/RestoreAnyVersion/RestoreAnyVersionApp/Android.bp
index 585b204..17582e0 100644
--- a/hostsidetests/backup/RestoreAnyVersion/RestoreAnyVersionApp/Android.bp
+++ b/hostsidetests/backup/RestoreAnyVersion/RestoreAnyVersionApp/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/backup/RestoreSessionTest/Android.bp b/hostsidetests/backup/RestoreSessionTest/Android.bp
index efb2fbd..fb474be 100644
--- a/hostsidetests/backup/RestoreSessionTest/Android.bp
+++ b/hostsidetests/backup/RestoreSessionTest/Android.bp
@@ -26,7 +26,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "system_current",
diff --git a/hostsidetests/backup/SharedPreferencesRestoreApp/Android.bp b/hostsidetests/backup/SharedPreferencesRestoreApp/Android.bp
index 6503864..0034db5 100644
--- a/hostsidetests/backup/SharedPreferencesRestoreApp/Android.bp
+++ b/hostsidetests/backup/SharedPreferencesRestoreApp/Android.bp
@@ -23,7 +23,7 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
+        "general-tests",
     ],
     sdk_version: "current",
 }
diff --git a/hostsidetests/backup/SuccessNotificationApp/Android.bp b/hostsidetests/backup/SuccessNotificationApp/Android.bp
index c27dd68..d1f75f0 100644
--- a/hostsidetests/backup/SuccessNotificationApp/Android.bp
+++ b/hostsidetests/backup/SuccessNotificationApp/Android.bp
@@ -23,7 +23,7 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
+        "general-tests",
     ],
     sdk_version: "current",
 }
diff --git a/hostsidetests/backup/SyncAdapterSettingsApp/Android.bp b/hostsidetests/backup/SyncAdapterSettingsApp/Android.bp
index a9ff743..6a3139f 100644
--- a/hostsidetests/backup/SyncAdapterSettingsApp/Android.bp
+++ b/hostsidetests/backup/SyncAdapterSettingsApp/Android.bp
@@ -24,7 +24,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/backup/fullbackupapp/Android.bp b/hostsidetests/backup/fullbackupapp/Android.bp
index 1969b63..edc288c 100644
--- a/hostsidetests/backup/fullbackupapp/Android.bp
+++ b/hostsidetests/backup/fullbackupapp/Android.bp
@@ -24,7 +24,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/backup/includeexcludeapp/Android.bp b/hostsidetests/backup/includeexcludeapp/Android.bp
index 6b6a6a4..0b37374 100644
--- a/hostsidetests/backup/includeexcludeapp/Android.bp
+++ b/hostsidetests/backup/includeexcludeapp/Android.bp
@@ -24,7 +24,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/backup/restoresessionapp1/Android.bp b/hostsidetests/backup/restoresessionapp1/Android.bp
index 82d12c8..3f27294 100644
--- a/hostsidetests/backup/restoresessionapp1/Android.bp
+++ b/hostsidetests/backup/restoresessionapp1/Android.bp
@@ -26,7 +26,7 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
+        "general-tests",
     ],
     sdk_version: "system_current",
 }
diff --git a/hostsidetests/backup/restoresessionapp2/Android.bp b/hostsidetests/backup/restoresessionapp2/Android.bp
index 6a6d594..cb3e987 100644
--- a/hostsidetests/backup/restoresessionapp2/Android.bp
+++ b/hostsidetests/backup/restoresessionapp2/Android.bp
@@ -26,7 +26,7 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
+        "general-tests",
     ],
     sdk_version: "system_current",
 }
diff --git a/hostsidetests/backup/restoresessionapp3/Android.bp b/hostsidetests/backup/restoresessionapp3/Android.bp
index eb6a720..6c9494e 100644
--- a/hostsidetests/backup/restoresessionapp3/Android.bp
+++ b/hostsidetests/backup/restoresessionapp3/Android.bp
@@ -26,7 +26,7 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
+        "general-tests",
     ],
     sdk_version: "system_current",
 }
diff --git a/hostsidetests/backup/src/android/cts/backup/AllowBackupHostSideTest.java b/hostsidetests/backup/src/android/cts/backup/AllowBackupHostSideTest.java
index 1a8bb22..d8ceb0f 100644
--- a/hostsidetests/backup/src/android/cts/backup/AllowBackupHostSideTest.java
+++ b/hostsidetests/backup/src/android/cts/backup/AllowBackupHostSideTest.java
@@ -65,14 +65,7 @@
     private static final String ALLOWBACKUP_APP_APK = "BackupAllowedApp.apk";
 
     @After
-    @Override
     public void tearDown() throws Exception {
-        super.tearDown();
-
-        if (!mIsBackupSupported) {
-            return;
-        }
-
         // Clear backup data and uninstall the package (in that order!)
         clearBackupDataInLocalTransport(ALLOWBACKUP_APP_NAME);
         assertNull(uninstallPackage(ALLOWBACKUP_APP_NAME));
@@ -80,11 +73,6 @@
 
     @Test
     public void testAllowBackup_False() throws Exception {
-        if (!mIsBackupSupported) {
-            CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         installPackage(ALLOWBACKUP_FALSE_APP_APK, "-d", "-r");
 
         // Generate the files that are going to be backed up.
@@ -101,11 +89,6 @@
 
     @Test
     public void testAllowBackup_True() throws Exception {
-        if (!mIsBackupSupported) {
-            CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         installPackage(ALLOWBACKUP_APP_APK, "-d", "-r");
 
         // Generate the files that are going to be backed up.
diff --git a/hostsidetests/backup/src/android/cts/backup/AutoRestoreHostSideTest.java b/hostsidetests/backup/src/android/cts/backup/AutoRestoreHostSideTest.java
index 99d147c..224ee7c 100644
--- a/hostsidetests/backup/src/android/cts/backup/AutoRestoreHostSideTest.java
+++ b/hostsidetests/backup/src/android/cts/backup/AutoRestoreHostSideTest.java
@@ -55,10 +55,7 @@
     }
 
     @After
-    @Override
     public void tearDown() throws Exception {
-        super.tearDown();
-
         if (mWasAutoRestoreEnabled.isPresent()) {
             mBackupUtils.executeShellCommandSync(
                     "bmgr autorestore " + (mWasAutoRestoreEnabled.get() ? "true" : "false"));
diff --git a/hostsidetests/backup/src/android/cts/backup/BackupWakelockHostSideTest.java b/hostsidetests/backup/src/android/cts/backup/BackupWakelockHostSideTest.java
index 1617be3..7f1c340 100644
--- a/hostsidetests/backup/src/android/cts/backup/BackupWakelockHostSideTest.java
+++ b/hostsidetests/backup/src/android/cts/backup/BackupWakelockHostSideTest.java
@@ -27,6 +27,7 @@
 import android.platform.test.annotations.AppModeFull;
 
 import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.log.LogUtil.CLog;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
 
 import org.junit.After;
@@ -58,18 +59,12 @@
     @Override
     public void setUp() throws Exception {
         super.setUp();
-
-        assumeTrue("Backup feature not supported", mIsBackupSupported);
-
         installPackage(KEY_VALUE_RESTORE_APP_APK);
         clearPackageData(KEY_VALUE_RESTORE_APP_PACKAGE);
     }
 
     @After
-    @Override
     public void tearDown() throws Exception {
-        super.tearDown();
-
         clearBackupDataInLocalTransport(KEY_VALUE_RESTORE_APP_PACKAGE);
         assertNull(uninstallPackage(KEY_VALUE_RESTORE_APP_PACKAGE));
     }
diff --git a/hostsidetests/backup/src/android/cts/backup/BaseBackupHostSideTest.java b/hostsidetests/backup/src/android/cts/backup/BaseBackupHostSideTest.java
index 4958111..51190e2c 100644
--- a/hostsidetests/backup/src/android/cts/backup/BaseBackupHostSideTest.java
+++ b/hostsidetests/backup/src/android/cts/backup/BaseBackupHostSideTest.java
@@ -18,6 +18,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
 
 import android.platform.test.annotations.AppModeFull;
 
@@ -27,11 +28,17 @@
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.log.LogUtil.CLog;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
+import com.android.tradefed.testtype.ITestInformationReceiver;
 import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
 import org.junit.After;
+import org.junit.AssumptionViolatedException;
 import org.junit.Before;
+import org.junit.Rule;
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
 import org.junit.runner.RunWith;
+import org.junit.runners.model.Statement;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -46,14 +53,16 @@
 @RunWith(DeviceJUnit4ClassRunner.class)
 @AppModeFull
 public abstract class BaseBackupHostSideTest extends BaseHostJUnit4Test {
-    protected boolean mIsBackupSupported;
-
     /** Value of PackageManager.FEATURE_BACKUP */
     private static final String FEATURE_BACKUP = "android.software.backup";
 
     protected static final String LOCAL_TRANSPORT =
             "com.android.localtransport/.LocalTransport";
 
+    @Rule
+    public final RequiredFeatureRule mBackupRequiredRule = new RequiredFeatureRule(this,
+            FEATURE_BACKUP);
+
     private BackupUtils mBackupUtils = new BackupUtils() {
         @Override
         protected InputStream executeShellCommand(String command) throws IOException {
@@ -70,12 +79,6 @@
 
     @Before
     public void setUp() throws Exception {
-        mIsBackupSupported = getDevice().hasFeature("feature:" + FEATURE_BACKUP);
-        if (!mIsBackupSupported) {
-            CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         // Check that the backup wasn't disabled and the transport wasn't switched unexpectedly.
         assertTrue("Backup was unexpectedly disabled during the module test run",
                 getBackupUtils().isBackupEnabled());
@@ -83,11 +86,6 @@
                 getCurrentTransport());
     }
 
-    @After
-    public void tearDown() throws Exception {
-        // Not deleting to avoid breaking the tests calling super.tearDown()
-    }
-
     protected BackupUtils getBackupUtils() {
         return mBackupUtils;
     }
@@ -168,4 +166,48 @@
             throw new IOException(e);
         }
     }
+
+    // TODO(b/169341308): move to common infra code
+    private static final class RequiredFeatureRule implements TestRule {
+
+        private final ITestInformationReceiver mReceiver;
+        private final String mFeature;
+
+        RequiredFeatureRule(ITestInformationReceiver receiver, String feature) {
+            mReceiver = receiver;
+            mFeature = feature;
+        }
+
+        @Override
+        public Statement apply(Statement base, Description description) {
+            return new Statement() {
+
+                @Override
+                public void evaluate() throws Throwable {
+                    boolean hasFeature = false;
+                    try {
+                        hasFeature = mReceiver.getTestInformation().getDevice()
+                                .hasFeature(mFeature);
+                    } catch (DeviceNotAvailableException e) {
+                        CLog.e("Could not check if device has feature %s: %e", mFeature, e);
+                        return;
+                    }
+
+                    if (!hasFeature) {
+                        CLog.d("skipping %s#%s"
+                                + " because device does not have feature '%s'",
+                                description.getClassName(), description.getMethodName(), mFeature);
+                        throw new AssumptionViolatedException("Device does not have feature '"
+                                + mFeature + "'");
+                    }
+                    base.evaluate();
+                }
+            };
+        }
+
+        @Override
+        public String toString() {
+            return "RequiredFeatureRule[" + mFeature + "]";
+        }
+    }
 }
diff --git a/hostsidetests/backup/src/android/cts/backup/BaseMultiUserBackupHostSideTest.java b/hostsidetests/backup/src/android/cts/backup/BaseMultiUserBackupHostSideTest.java
index 26c6345..a688034 100644
--- a/hostsidetests/backup/src/android/cts/backup/BaseMultiUserBackupHostSideTest.java
+++ b/hostsidetests/backup/src/android/cts/backup/BaseMultiUserBackupHostSideTest.java
@@ -71,7 +71,6 @@
         super.setUp();
 
         // Check that backup and multi-user features are both supported.
-        assumeTrue("Backup feature not supported", mIsBackupSupported);
         assumeTrue("Multi-user feature not supported", mDevice.isMultiUserSupported());
 
         // Keep track of initial user state to restore in tearDown.
diff --git a/hostsidetests/backup/src/android/cts/backup/FullBackupOnlyHostSideTest.java b/hostsidetests/backup/src/android/cts/backup/FullBackupOnlyHostSideTest.java
index 9ca68a0..11702e2 100644
--- a/hostsidetests/backup/src/android/cts/backup/FullBackupOnlyHostSideTest.java
+++ b/hostsidetests/backup/src/android/cts/backup/FullBackupOnlyHostSideTest.java
@@ -77,16 +77,8 @@
     private static final String FULLBACKUPONLY_TRUE_WITH_AGENT_APP_APK =
             "FullBackupOnlyTrueWithAgentApp.apk";
 
-
     @After
-    @Override
     public void tearDown() throws Exception {
-        super.tearDown();
-
-        if (!mIsBackupSupported) {
-            return;
-        }
-
         // Clear backup data and uninstall the package (in that order!)
         clearBackupDataInLocalTransport(FULLBACKUPONLY_APP_PACKAGE);
         assertNull(uninstallPackage(FULLBACKUPONLY_APP_PACKAGE));
@@ -99,11 +91,6 @@
      */
     @Test
     public void testFullBackupOnlyFalse_WithAgent() throws Exception {
-        if (!mIsBackupSupported) {
-            CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         installPackage(FULLBACKUPONLY_FALSE_WITH_AGENT_APP_APK, "-d", "-r");
 
         checkFullBackupOnlyDeviceTest("createFiles");
@@ -125,11 +112,6 @@
      */
     @Test
     public void testFullBackupOnlyFalse_NoAgent() throws Exception {
-        if (!mIsBackupSupported) {
-            CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         installPackage(FULLBACKUPONLY_FALSE_NO_AGENT_APP_APK, "-d", "-r");
 
         checkFullBackupOnlyDeviceTest("createFiles");
@@ -151,11 +133,6 @@
      */
     @Test
     public void testFullBackupOnlyTrue_WithAgent() throws Exception {
-        if (!mIsBackupSupported) {
-            CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         installPackage(FULLBACKUPONLY_TRUE_WITH_AGENT_APP_APK, "-d", "-r");
 
         checkFullBackupOnlyDeviceTest("createFiles");
diff --git a/hostsidetests/backup/src/android/cts/backup/FullbackupRulesHostSideTest.java b/hostsidetests/backup/src/android/cts/backup/FullbackupRulesHostSideTest.java
index a7cd5a0..5416fe6 100644
--- a/hostsidetests/backup/src/android/cts/backup/FullbackupRulesHostSideTest.java
+++ b/hostsidetests/backup/src/android/cts/backup/FullbackupRulesHostSideTest.java
@@ -57,11 +57,6 @@
 
     @Test
     public void testNoBackupFolder() throws Exception {
-        if (!mIsBackupSupported) {
-            CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         // Generate the files that are going to be backed up.
         checkDeviceTest(FULLBACKUP_TESTS_APP_NAME, FULLBACKUP_DEVICE_TEST_CLASS_NAME,
                 "createFiles");
@@ -83,11 +78,6 @@
 
     @Test
     public void testIncludeExcludeRules() throws Exception {
-        if (!mIsBackupSupported) {
-            CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         // Generate the files that are going to be backed up.
         checkDeviceTest(INCLUDE_EXCLUDE_TESTS_APP_NAME, INCLUDE_EXCLUDE_DEVICE_TEST_CLASS_NAME,
                 "createFiles");
@@ -111,11 +101,6 @@
     @Test
     public void testRequireFakeEncryptionFlag_includesFileIfFakeEncryptionEnabled()
             throws Exception {
-        if (!mIsBackupSupported) {
-            CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         enableFakeEncryptionOnTransport();
 
         // Generate the files that are going to be backed up.
@@ -141,11 +126,6 @@
     @Test
     public void testRequireFakeEncryptionFlag_excludesFileIfFakeEncryptionDisabled()
             throws Exception {
-        if (!mIsBackupSupported) {
-            CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         disableFakeEncryptionOnTransport();
 
         // Generate the files that are going to be backed up.
diff --git a/hostsidetests/backup/src/android/cts/backup/KeyValueBackupRestoreHostSideTest.java b/hostsidetests/backup/src/android/cts/backup/KeyValueBackupRestoreHostSideTest.java
index 7f0e439..78b704f 100644
--- a/hostsidetests/backup/src/android/cts/backup/KeyValueBackupRestoreHostSideTest.java
+++ b/hostsidetests/backup/src/android/cts/backup/KeyValueBackupRestoreHostSideTest.java
@@ -74,10 +74,7 @@
     }
 
     @After
-    @Override
     public void tearDown() throws Exception {
-        super.tearDown();
-
         // Clear backup data and uninstall the package (in that order!)
         clearBackupDataInLocalTransport(KEY_VALUE_RESTORE_APP_PACKAGE);
         assertNull(uninstallPackage(KEY_VALUE_RESTORE_APP_PACKAGE));
@@ -99,11 +96,6 @@
      */
     @Test
     public void testKeyValueBackupAndRestore() throws Exception {
-        if (!mIsBackupSupported) {
-            CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         checkDeviceTest("checkSharedPrefIsEmpty");
 
         checkDeviceTest("saveSharedPreferencesAndNotifyBackupManager");
@@ -143,11 +135,6 @@
      */
     @Test
     public void testSharedPreferencesRestore() throws Exception {
-        if (!mIsBackupSupported) {
-            CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         checkDeviceTest("launchSharedPrefActivity");
 
         getBackupUtils().backupNowAndAssertSuccess(SHARED_PREFERENCES_RESTORE_APP_PACKAGE);
diff --git a/hostsidetests/backup/src/android/cts/backup/OtherSoundsSettingsHostSideTest.java b/hostsidetests/backup/src/android/cts/backup/OtherSoundsSettingsHostSideTest.java
index 6d5b731..6c90f52 100644
--- a/hostsidetests/backup/src/android/cts/backup/OtherSoundsSettingsHostSideTest.java
+++ b/hostsidetests/backup/src/android/cts/backup/OtherSoundsSettingsHostSideTest.java
@@ -53,23 +53,11 @@
     @Override
     public void setUp() throws Exception {
         super.setUp();
-
-        if (!mIsBackupSupported) {
-            return;
-        }
-
         installPackage(APP_APK);
     }
 
     @After
-    @Override
     public void tearDown() throws Exception {
-        super.tearDown();
-
-        if (!mIsBackupSupported) {
-            return;
-        }
-
         // Clear backup data and uninstall the package (in that order!)
         clearBackupDataInLocalTransport(APP_PACKAGE);
         assertNull(uninstallPackage(APP_PACKAGE));
@@ -80,11 +68,6 @@
      */
     @Test
     public void testOtherSoundsSettings_dialPadTones() throws Exception {
-        if (!mIsBackupSupported) {
-            LogUtil.CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         checkDeviceTest("testOtherSoundsSettings_dialPadTones");
     }
 
@@ -93,11 +76,6 @@
      */
     @Test
     public void testOtherSoundsSettings_touchSounds() throws Exception {
-        if (!mIsBackupSupported) {
-            LogUtil.CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         checkDeviceTest("testOtherSoundsSettings_touchSounds");
     }
 
@@ -106,11 +84,6 @@
      */
     @Test
     public void testOtherSoundsSettings_touchVibration() throws Exception {
-        if (!mIsBackupSupported) {
-            LogUtil.CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         checkDeviceTest("testOtherSoundsSettings_touchVibration");
     }
 
diff --git a/hostsidetests/backup/src/android/cts/backup/RestoreAnyVersionHostSideTest.java b/hostsidetests/backup/src/android/cts/backup/RestoreAnyVersionHostSideTest.java
index 3dca567..27b23cd 100644
--- a/hostsidetests/backup/src/android/cts/backup/RestoreAnyVersionHostSideTest.java
+++ b/hostsidetests/backup/src/android/cts/backup/RestoreAnyVersionHostSideTest.java
@@ -59,14 +59,7 @@
             "CtsBackupRestoreAnyVersionNoRestoreApp.apk";
 
     @After
-    @Override
     public void tearDown() throws Exception {
-        super.tearDown();
-
-        if (!mIsBackupSupported) {
-            return;
-        }
-
         // Clear backup data and uninstall the package (in that order!)
         clearBackupDataInLocalTransport(RESTORE_ANY_VERSION_APP_PACKAGE);
         assertNull(uninstallPackage(RESTORE_ANY_VERSION_APP_PACKAGE));
@@ -78,11 +71,6 @@
      */
     @Test
     public void testRestoreAnyVersion_False() throws Exception {
-        if (!mIsBackupSupported) {
-            CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         installNewVersionApp();
 
         saveSharedPreferenceValue();
@@ -104,11 +92,6 @@
      */
     @Test
     public void testRestoreAnyVersion_True() throws Exception {
-        if (!mIsBackupSupported) {
-            CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         installNewVersionApp();
 
         saveSharedPreferenceValue();
@@ -130,11 +113,6 @@
      */
     @Test
     public void testRestoreAnyVersion_OldBackupToNewApp() throws Exception {
-        if (!mIsBackupSupported) {
-            CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         installNoRestoreAnyVersionApp();
 
         saveSharedPreferenceValue();
diff --git a/hostsidetests/backup/src/android/cts/backup/SuccessNotificationHostSideTest.java b/hostsidetests/backup/src/android/cts/backup/SuccessNotificationHostSideTest.java
index c833b40..8a0063d 100644
--- a/hostsidetests/backup/src/android/cts/backup/SuccessNotificationHostSideTest.java
+++ b/hostsidetests/backup/src/android/cts/backup/SuccessNotificationHostSideTest.java
@@ -90,12 +90,6 @@
     @Override
     public void setUp() throws Exception {
         super.setUp();
-
-        if (!mIsBackupSupported) {
-            CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         installPackage(KEY_VALUE_BACKUP_APP_APK);
         installPackage(FULL_BACKUP_APP_APK);
 
@@ -105,14 +99,7 @@
     }
 
     @After
-    @Override
     public void tearDown() throws Exception {
-        super.tearDown();
-
-        if (!mIsBackupSupported) {
-            return;
-        }
-
         restoreBackupFinishedNotificationReceivers();
         assertNull(uninstallPackage(SUCCESS_NOTIFICATION_APP_PACKAGE));
 
@@ -133,10 +120,6 @@
      */
     @Test
     public void testSuccessNotificationForKeyValueBackup() throws Exception {
-        if (!mIsBackupSupported) {
-            return;
-        }
-
         checkDeviceTest(KEY_VALUE_BACKUP_APP_PACKAGE, KEY_VALUE_BACKUP_DEVICE_TEST_NAME,
                 "saveSharedPreferencesAndNotifyBackupManager");
         getBackupUtils().backupNowAndAssertSuccess(KEY_VALUE_BACKUP_APP_PACKAGE);
@@ -153,10 +136,6 @@
      */
     @Test
     public void testSuccessNotificationForFullBackup() throws Exception {
-        if (!mIsBackupSupported) {
-            return;
-        }
-
         checkDeviceTest(FULL_BACKUP_APP_PACKAGE, FULL_BACKUP_DEVICE_TEST_CLASS_NAME, "createFiles");
         getBackupUtils().backupNowAndAssertSuccess(FULL_BACKUP_APP_PACKAGE);
 
diff --git a/hostsidetests/backup/src/android/cts/backup/SyncAdapterSettingsHostSideTest.java b/hostsidetests/backup/src/android/cts/backup/SyncAdapterSettingsHostSideTest.java
index 1d4030d..f22ee0d 100644
--- a/hostsidetests/backup/src/android/cts/backup/SyncAdapterSettingsHostSideTest.java
+++ b/hostsidetests/backup/src/android/cts/backup/SyncAdapterSettingsHostSideTest.java
@@ -56,24 +56,11 @@
     @Before
     @Override
     public void setUp() throws Exception {
-        super.setUp();
-
-        if (!mIsBackupSupported) {
-            return;
-        }
-
         installPackage(APP_APK);
     }
 
     @After
-    @Override
     public void tearDown() throws Exception {
-        super.tearDown();
-
-        if (!mIsBackupSupported) {
-            return;
-        }
-
         // Clear backup data and uninstall the package (in that order!)
         // BackupManagerService won't let us wipe the data if package is uninstalled
         clearBackupDataInLocalTransport(ANDROID_PACKAGE);
@@ -85,11 +72,6 @@
      */
     @Test
     public void testMasterSyncAutomatically_whenOn_isRestored() throws Exception {
-        if (!mIsBackupSupported) {
-            CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         checkDeviceTest("testMasterSyncAutomatically_whenOn_isRestored");
     }
 
@@ -98,11 +80,6 @@
      */
     @Test
     public void testMasterSyncAutomatically_whenOff_isRestored() throws Exception {
-        if (!mIsBackupSupported) {
-            CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         checkDeviceTest("testMasterSyncAutomatically_whenOff_isRestored");
     }
 
@@ -112,11 +89,6 @@
      */
     @Test
     public void testIsSyncableChanged_ifTurnOnSyncEnabled() throws Exception {
-        if (!mIsBackupSupported) {
-            CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         checkDeviceTest("testIsSyncableChanged_ifTurnOnSyncEnabled");
     }
 
@@ -126,11 +98,6 @@
      */
     @Test
     public void testIsSyncableIsZero_ifTurnOffSyncEnabled() throws Exception {
-        if (!mIsBackupSupported) {
-            CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         checkDeviceTest("testIsSyncableIsZero_ifTurnOffSyncEnabled");
     }
 
@@ -140,11 +107,6 @@
      */
     @Test
     public void testIsSyncableIsOne_ifTurnOffSyncEnabled() throws Exception {
-        if (!mIsBackupSupported) {
-            CLog.i("android.software.backup feature is not supported on this device");
-            return;
-        }
-
         checkDeviceTest("testIsSyncableIsOne_ifTurnOffSyncEnabled");
     }
 
diff --git a/hostsidetests/blobstore/Android.bp b/hostsidetests/blobstore/Android.bp
index 34502b7..d699def 100644
--- a/hostsidetests/blobstore/Android.bp
+++ b/hostsidetests/blobstore/Android.bp
@@ -25,7 +25,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests"
     ]
 }
@@ -46,7 +45,6 @@
   // Tag this module as a cts test artifact
   test_suites: [
     "cts",
-        "vts10",
     "general-tests"
   ]
 }
diff --git a/hostsidetests/bootstats/Android.bp b/hostsidetests/bootstats/Android.bp
index 3681c59..b894fcf 100644
--- a/hostsidetests/bootstats/Android.bp
+++ b/hostsidetests/bootstats/Android.bp
@@ -28,7 +28,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/bootstats/OWNERS b/hostsidetests/bootstats/OWNERS
index 1f99e96..e1a4f0c 100644
--- a/hostsidetests/bootstats/OWNERS
+++ b/hostsidetests/bootstats/OWNERS
@@ -1,2 +1,2 @@
-# Bug component: 183496
-keunyoung@google.com
+# Bug component: 184033
+keunyoung@google.com
\ No newline at end of file
diff --git a/hostsidetests/classloaders/splits/Android.bp b/hostsidetests/classloaders/splits/Android.bp
index 507987f..f19b5da 100644
--- a/hostsidetests/classloaders/splits/Android.bp
+++ b/hostsidetests/classloaders/splits/Android.bp
@@ -23,7 +23,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     required: [
diff --git a/hostsidetests/classloaders/useslibrary/Android.bp b/hostsidetests/classloaders/useslibrary/Android.bp
index 9215513..10c1986 100644
--- a/hostsidetests/classloaders/useslibrary/Android.bp
+++ b/hostsidetests/classloaders/useslibrary/Android.bp
@@ -23,7 +23,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     required: [ "CtsUsesLibraryApp" ],
diff --git a/hostsidetests/classloaders/useslibrary/app/Android.bp b/hostsidetests/classloaders/useslibrary/app/Android.bp
index e69db51..eedde6f 100644
--- a/hostsidetests/classloaders/useslibrary/app/Android.bp
+++ b/hostsidetests/classloaders/useslibrary/app/Android.bp
@@ -18,7 +18,7 @@
     sdk_version: "current",
     srcs: ["src/**/*.java"],
     libs: [
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     static_libs: [
         "androidx.test.rules",
diff --git a/hostsidetests/classloaders/useslibrary/app/src/com/android/cts/useslibrary/UsesLibraryTest.java b/hostsidetests/classloaders/useslibrary/app/src/com/android/cts/useslibrary/UsesLibraryTest.java
index 7fa8b20..7f8f53e 100644
--- a/hostsidetests/classloaders/useslibrary/app/src/com/android/cts/useslibrary/UsesLibraryTest.java
+++ b/hostsidetests/classloaders/useslibrary/app/src/com/android/cts/useslibrary/UsesLibraryTest.java
@@ -47,8 +47,7 @@
     }
 
     /**
-     * Verify that the test apk is backed by an oat file when the shared libraries are missing
-     * from the class path.
+     * Verify that we punt to run from apk when the shared libraries are missing.
      */
     public void testMissingLibrary() throws Exception {
         ClassLoader loader = getClass().getClassLoader();
@@ -60,7 +59,7 @@
             assertTrue(testDexElements != null && testDexElements.length == 1);
 
             DexFile testDexFile = getDexFileFromDexElement(testDexElements[0]);
-            assertTrue(isDexFileBackedByOatFile(testDexFile));
+            assertFalse(isDexFileBackedByOatFile(testDexFile));
         }
     }
 
diff --git a/hostsidetests/compilation/Android.bp b/hostsidetests/compilation/Android.bp
index e6a982c..636dfc8 100644
--- a/hostsidetests/compilation/Android.bp
+++ b/hostsidetests/compilation/Android.bp
@@ -20,7 +20,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
diff --git a/hostsidetests/compilation/app/Android.bp b/hostsidetests/compilation/app/Android.bp
index 0eeabfb..d41b5bc 100644
--- a/hostsidetests/compilation/app/Android.bp
+++ b/hostsidetests/compilation/app/Android.bp
@@ -20,7 +20,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/compilation/src/android/compilation/cts/AdbRootDependentCompilationTest.java b/hostsidetests/compilation/src/android/compilation/cts/AdbRootDependentCompilationTest.java
index 4813312..56a50ca 100644
--- a/hostsidetests/compilation/src/android/compilation/cts/AdbRootDependentCompilationTest.java
+++ b/hostsidetests/compilation/src/android/compilation/cts/AdbRootDependentCompilationTest.java
@@ -104,7 +104,7 @@
         // real profile.
         byte[] profileBytes = ByteStreams.toByteArray(
                 getClass().getResourceAsStream("/primary.prof.txt"));
-        assertTrue("empty profile", profileBytes.length > 0); // sanity check
+        assertTrue("empty profile", profileBytes.length > 0); // validity check
         textProfileFile = File.createTempFile("compilationtest", "prof.txt");
         Files.write(profileBytes, textProfileFile);
 
@@ -216,7 +216,7 @@
         executeCompile("-m", "speed-profile", "-f");
         String odexFilePath = getOdexFilePath();
         byte[] initialOdexFileContents = readFileOnClient(odexFilePath);
-        assertTrue("empty odex file", initialOdexFileContents.length > 0); // sanity check
+        assertTrue("empty odex file", initialOdexFileContents.length > 0); // validity check
 
         for (ProfileLocation profileLocation : profileLocations) {
             writeProfile(profileLocation);
diff --git a/hostsidetests/content/Android.bp b/hostsidetests/content/Android.bp
index 0f0e03e..3cd3688 100644
--- a/hostsidetests/content/Android.bp
+++ b/hostsidetests/content/Android.bp
@@ -27,7 +27,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/content/test-apps/ContextCrossProfileApps/ContextCrossProfileApp/Android.bp b/hostsidetests/content/test-apps/ContextCrossProfileApps/ContextCrossProfileApp/Android.bp
index 77c5456..dac2663 100644
--- a/hostsidetests/content/test-apps/ContextCrossProfileApps/ContextCrossProfileApp/Android.bp
+++ b/hostsidetests/content/test-apps/ContextCrossProfileApps/ContextCrossProfileApp/Android.bp
@@ -23,7 +23,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/content/test-apps/ContextCrossProfileApps/ContextCrossProfileTestServiceApp/Android.bp b/hostsidetests/content/test-apps/ContextCrossProfileApps/ContextCrossProfileTestServiceApp/Android.bp
index d74d620..d63f6cd 100644
--- a/hostsidetests/content/test-apps/ContextCrossProfileApps/ContextCrossProfileTestServiceApp/Android.bp
+++ b/hostsidetests/content/test-apps/ContextCrossProfileApps/ContextCrossProfileTestServiceApp/Android.bp
@@ -20,7 +20,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/content/test-apps/CtsSyncInvalidAccountAuthorityTestCases/Android.bp b/hostsidetests/content/test-apps/CtsSyncInvalidAccountAuthorityTestCases/Android.bp
index 71304f7..82c3696 100644
--- a/hostsidetests/content/test-apps/CtsSyncInvalidAccountAuthorityTestCases/Android.bp
+++ b/hostsidetests/content/test-apps/CtsSyncInvalidAccountAuthorityTestCases/Android.bp
@@ -26,7 +26,6 @@
     sdk_version: "current",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     optimize: {
diff --git a/hostsidetests/cpptools/Android.bp b/hostsidetests/cpptools/Android.bp
index 6f895c8..23887e2 100644
--- a/hostsidetests/cpptools/Android.bp
+++ b/hostsidetests/cpptools/Android.bp
@@ -23,7 +23,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/cpptools/test-apps/BasicApp/Android.bp b/hostsidetests/cpptools/test-apps/BasicApp/Android.bp
index 66b25bb..8562d3a 100644
--- a/hostsidetests/cpptools/test-apps/BasicApp/Android.bp
+++ b/hostsidetests/cpptools/test-apps/BasicApp/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/cpptools/test-apps/ConnectorNativeProgram/Android.bp b/hostsidetests/cpptools/test-apps/ConnectorNativeProgram/Android.bp
index 96b0554..8938068 100644
--- a/hostsidetests/cpptools/test-apps/ConnectorNativeProgram/Android.bp
+++ b/hostsidetests/cpptools/test-apps/ConnectorNativeProgram/Android.bp
@@ -31,7 +31,6 @@
     },
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/cpptools/test-apps/DomainSocketApp/Android.bp b/hostsidetests/cpptools/test-apps/DomainSocketApp/Android.bp
index 545f1a4..d4399f9 100644
--- a/hostsidetests/cpptools/test-apps/DomainSocketApp/Android.bp
+++ b/hostsidetests/cpptools/test-apps/DomainSocketApp/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/deviceidle/Android.bp b/hostsidetests/deviceidle/Android.bp
index faaaaaf..d22db35 100644
--- a/hostsidetests/deviceidle/Android.bp
+++ b/hostsidetests/deviceidle/Android.bp
@@ -24,7 +24,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/Android.bp b/hostsidetests/devicepolicy/Android.bp
index 0e89a22..537151f 100644
--- a/hostsidetests/devicepolicy/Android.bp
+++ b/hostsidetests/devicepolicy/Android.bp
@@ -30,7 +30,6 @@
         "arcts",
         "cts",
         "general-tests",
-        "vts10",
     ],
     java_resource_dirs: ["res"],
     data: [":current-api-xml"],
diff --git a/hostsidetests/devicepolicy/OWNERS b/hostsidetests/devicepolicy/OWNERS
index f88e5d9..f51c943 100644
--- a/hostsidetests/devicepolicy/OWNERS
+++ b/hostsidetests/devicepolicy/OWNERS
@@ -3,3 +3,4 @@
 eranm@google.com
 rubinxu@google.com
 sandness@google.com
+pgrafov@google.com
diff --git a/hostsidetests/devicepolicy/app/AccountCheck/Android.bp b/hostsidetests/devicepolicy/app/AccountCheck/Android.bp
index 45d374f..ef03e37 100644
--- a/hostsidetests/devicepolicy/app/AccountCheck/Android.bp
+++ b/hostsidetests/devicepolicy/app/AccountCheck/Android.bp
@@ -18,7 +18,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src-owner/**/*.java"],
@@ -39,7 +38,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src-owner/**/*.java"],
@@ -60,7 +58,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src-owner/**/*.java"],
diff --git a/hostsidetests/devicepolicy/app/AccountCheck/Auth/Android.bp b/hostsidetests/devicepolicy/app/AccountCheck/Auth/Android.bp
index b31afea..e499709 100644
--- a/hostsidetests/devicepolicy/app/AccountCheck/Auth/Android.bp
+++ b/hostsidetests/devicepolicy/app/AccountCheck/Auth/Android.bp
@@ -18,7 +18,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src/**/*.java"],
@@ -28,7 +27,7 @@
         "ub-uiautomator",
         "androidx.test.rules",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     sdk_version: "test_current",
     min_sdk_version: "25",
 }
diff --git a/hostsidetests/devicepolicy/app/AccountCheck/Tester/Android.bp b/hostsidetests/devicepolicy/app/AccountCheck/Tester/Android.bp
index d40d04c..2e8697d 100644
--- a/hostsidetests/devicepolicy/app/AccountCheck/Tester/Android.bp
+++ b/hostsidetests/devicepolicy/app/AccountCheck/Tester/Android.bp
@@ -18,7 +18,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src/**/*.java"],
diff --git a/hostsidetests/devicepolicy/app/AccountManagement/Android.bp b/hostsidetests/devicepolicy/app/AccountManagement/Android.bp
index 69dcbb5..25fb39c 100644
--- a/hostsidetests/devicepolicy/app/AccountManagement/Android.bp
+++ b/hostsidetests/devicepolicy/app/AccountManagement/Android.bp
@@ -19,7 +19,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src/**/*.java"],
@@ -29,6 +28,6 @@
         "ub-uiautomator",
         "androidx.test.rules",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     sdk_version: "current",
 }
diff --git a/hostsidetests/devicepolicy/app/AppRestrictionsTargetApp/Android.bp b/hostsidetests/devicepolicy/app/AppRestrictionsTargetApp/Android.bp
index 9b35a75..98146ff 100644
--- a/hostsidetests/devicepolicy/app/AppRestrictionsTargetApp/Android.bp
+++ b/hostsidetests/devicepolicy/app/AppRestrictionsTargetApp/Android.bp
@@ -22,7 +22,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/Assistant/Android.bp b/hostsidetests/devicepolicy/app/Assistant/Android.bp
index 5e1bb88..0de1b25 100644
--- a/hostsidetests/devicepolicy/app/Assistant/Android.bp
+++ b/hostsidetests/devicepolicy/app/Assistant/Android.bp
@@ -19,10 +19,8 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: [
diff --git a/hostsidetests/devicepolicy/app/AutofillApp/Android.bp b/hostsidetests/devicepolicy/app/AutofillApp/Android.bp
index c79c0a5..27b4bb2 100644
--- a/hostsidetests/devicepolicy/app/AutofillApp/Android.bp
+++ b/hostsidetests/devicepolicy/app/AutofillApp/Android.bp
@@ -20,7 +20,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/devicepolicy/app/CertInstaller/Android.bp b/hostsidetests/devicepolicy/app/CertInstaller/Android.bp
index bee8617..c124684 100644
--- a/hostsidetests/devicepolicy/app/CertInstaller/Android.bp
+++ b/hostsidetests/devicepolicy/app/CertInstaller/Android.bp
@@ -17,8 +17,8 @@
     defaults: ["cts_defaults"],
     srcs: ["src/**/*.java"],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     platform_apis: true,
     min_sdk_version: "22",
@@ -33,7 +33,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/ContactDirectoryProvider/Android.bp b/hostsidetests/devicepolicy/app/ContactDirectoryProvider/Android.bp
index ca9d9dd..dc652cb 100644
--- a/hostsidetests/devicepolicy/app/ContactDirectoryProvider/Android.bp
+++ b/hostsidetests/devicepolicy/app/ContactDirectoryProvider/Android.bp
@@ -19,7 +19,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/devicepolicy/app/ContentCaptureApp/Android.bp b/hostsidetests/devicepolicy/app/ContentCaptureApp/Android.bp
index 3ed0a7f..e347131 100644
--- a/hostsidetests/devicepolicy/app/ContentCaptureApp/Android.bp
+++ b/hostsidetests/devicepolicy/app/ContentCaptureApp/Android.bp
@@ -20,7 +20,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "system_current",
diff --git a/hostsidetests/devicepolicy/app/ContentCaptureService/Android.bp b/hostsidetests/devicepolicy/app/ContentCaptureService/Android.bp
index c50418d..9636e4b 100644
--- a/hostsidetests/devicepolicy/app/ContentCaptureService/Android.bp
+++ b/hostsidetests/devicepolicy/app/ContentCaptureService/Android.bp
@@ -20,7 +20,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "system_current",
diff --git a/hostsidetests/devicepolicy/app/ContentSuggestionsApp/Android.bp b/hostsidetests/devicepolicy/app/ContentSuggestionsApp/Android.bp
index 590a7d1..ebdf983 100644
--- a/hostsidetests/devicepolicy/app/ContentSuggestionsApp/Android.bp
+++ b/hostsidetests/devicepolicy/app/ContentSuggestionsApp/Android.bp
@@ -20,7 +20,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "system_current",
diff --git a/hostsidetests/devicepolicy/app/CorpOwnedManagedProfile/Android.bp b/hostsidetests/devicepolicy/app/CorpOwnedManagedProfile/Android.bp
index d447937..6e8803d 100644
--- a/hostsidetests/devicepolicy/app/CorpOwnedManagedProfile/Android.bp
+++ b/hostsidetests/devicepolicy/app/CorpOwnedManagedProfile/Android.bp
@@ -29,9 +29,9 @@
         local_include_dirs: ["src"],
     },
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "junit",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     static_libs: [
         "ctstestrunner-axt",
@@ -41,7 +41,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -58,9 +57,9 @@
         local_include_dirs: ["src"],
     },
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "junit",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     static_libs: [
         "ctstestrunner-axt",
@@ -70,7 +69,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     aaptflags: [
diff --git a/hostsidetests/devicepolicy/app/CorpOwnedManagedProfile/src/com/android/cts/comp/UnprotectedCrossUserService.java b/hostsidetests/devicepolicy/app/CorpOwnedManagedProfile/src/com/android/cts/comp/UnprotectedCrossUserService.java
index 8540737..46b43fe 100644
--- a/hostsidetests/devicepolicy/app/CorpOwnedManagedProfile/src/com/android/cts/comp/UnprotectedCrossUserService.java
+++ b/hostsidetests/devicepolicy/app/CorpOwnedManagedProfile/src/com/android/cts/comp/UnprotectedCrossUserService.java
@@ -21,7 +21,7 @@
 import android.os.IBinder;
 
 /**
- * Dummy service that is exported.
+ * Test service that is exported.
  */
 public class UnprotectedCrossUserService extends Service {
     @Override
diff --git a/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileAppsTest/Android.bp b/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileAppsTest/Android.bp
index 2d74684..c3d1d5d 100644
--- a/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileAppsTest/Android.bp
+++ b/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileAppsTest/Android.bp
@@ -29,7 +29,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileAppsTest/src/com/android/cts/crossprofileappstest/MainActivity.java b/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileAppsTest/src/com/android/cts/crossprofileappstest/MainActivity.java
index 9c385dc..6baf14d 100644
--- a/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileAppsTest/src/com/android/cts/crossprofileappstest/MainActivity.java
+++ b/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileAppsTest/src/com/android/cts/crossprofileappstest/MainActivity.java
@@ -27,7 +27,7 @@
 import java.lang.Override;
 
 /**
- * An dummy activity that displays the serial number of the user that it is running into.
+ * A test activity that displays the serial number of the user that it is running into.
  */
 public class MainActivity extends Activity {
 
diff --git a/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileAppsWithNoPermissionTest/Android.bp b/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileAppsWithNoPermissionTest/Android.bp
index 24aafd4..6f2d457 100644
--- a/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileAppsWithNoPermissionTest/Android.bp
+++ b/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileAppsWithNoPermissionTest/Android.bp
@@ -29,7 +29,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileEnabledApp/Android.bp b/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileEnabledApp/Android.bp
index 8643aa6..4d56254 100644
--- a/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileEnabledApp/Android.bp
+++ b/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileEnabledApp/Android.bp
@@ -29,7 +29,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileEnabledNoPermsApp/Android.bp b/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileEnabledNoPermsApp/Android.bp
index 89476ed..8510ab8 100644
--- a/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileEnabledNoPermsApp/Android.bp
+++ b/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileEnabledNoPermsApp/Android.bp
@@ -29,7 +29,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileNotEnabledApp/Android.bp b/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileNotEnabledApp/Android.bp
index c27b134..380ddc1 100644
--- a/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileNotEnabledApp/Android.bp
+++ b/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileNotEnabledApp/Android.bp
@@ -29,7 +29,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileUserEnabledApp/Android.bp b/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileUserEnabledApp/Android.bp
index ec9ae62..2a11871 100644
--- a/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileUserEnabledApp/Android.bp
+++ b/hostsidetests/devicepolicy/app/CrossProfileTestApps/CrossProfileUserEnabledApp/Android.bp
@@ -29,7 +29,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/CrossProfileTestApps/ModifyQuietModeEnabledApp/Android.bp b/hostsidetests/devicepolicy/app/CrossProfileTestApps/ModifyQuietModeEnabledApp/Android.bp
index a33eec5..7a3fb81 100644
--- a/hostsidetests/devicepolicy/app/CrossProfileTestApps/ModifyQuietModeEnabledApp/Android.bp
+++ b/hostsidetests/devicepolicy/app/CrossProfileTestApps/ModifyQuietModeEnabledApp/Android.bp
@@ -29,7 +29,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/CustomizationApp/Android.bp b/hostsidetests/devicepolicy/app/CustomizationApp/Android.bp
index 1a57839..96e959c 100644
--- a/hostsidetests/devicepolicy/app/CustomizationApp/Android.bp
+++ b/hostsidetests/devicepolicy/app/CustomizationApp/Android.bp
@@ -18,7 +18,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src/**/*.java"],
@@ -26,7 +25,7 @@
         "androidx.test.rules",
         "compatibility-device-util-axt",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     sdk_version: "test_current",
     min_sdk_version: "24",
 }
diff --git a/hostsidetests/devicepolicy/app/DelegateApp/Android.bp b/hostsidetests/devicepolicy/app/DelegateApp/Android.bp
index fe7eaf7..b10477e 100644
--- a/hostsidetests/devicepolicy/app/DelegateApp/Android.bp
+++ b/hostsidetests/devicepolicy/app/DelegateApp/Android.bp
@@ -17,9 +17,9 @@
     defaults: ["cts_defaults"],
     srcs: ["src/**/*.java"],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "junit",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     static_libs: [
         "androidx.legacy_legacy-support-v4",
@@ -33,7 +33,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/DelegateApp/src/com/android/cts/delegate/AppRestrictionsDelegateTest.java b/hostsidetests/devicepolicy/app/DelegateApp/src/com/android/cts/delegate/AppRestrictionsDelegateTest.java
index 55fc792..a00f7b5 100644
--- a/hostsidetests/devicepolicy/app/DelegateApp/src/com/android/cts/delegate/AppRestrictionsDelegateTest.java
+++ b/hostsidetests/devicepolicy/app/DelegateApp/src/com/android/cts/delegate/AppRestrictionsDelegateTest.java
@@ -122,27 +122,27 @@
     // Should be consistent with assertBundle0
     private static Bundle createBundle0() {
         Bundle result = new Bundle();
-        result.putString("dummyString", "value");
+        result.putString("placeholderString", "value");
         return result;
     }
 
     // Should be consistent with createBundle0
     private void assertBundle0(Bundle bundle) {
         assertEquals(1, bundle.size());
-        assertEquals("value", bundle.getString("dummyString"));
+        assertEquals("value", bundle.getString("placeholderString"));
     }
 
     // Should be consistent with assertBundle1
     private static Bundle createBundle1() {
         Bundle result = new Bundle();
-        result.putInt("dummyInt", 1);
+        result.putInt("placeholderInt", 1);
         return result;
     }
 
     // Should be consistent with createBundle1
     private void assertBundle1(Bundle bundle) {
         assertEquals(1, bundle.size());
-        assertEquals(1, bundle.getInt("dummyInt"));
+        assertEquals(1, bundle.getInt("placeholderInt"));
     }
 
     private void startTestActivity() {
diff --git a/hostsidetests/devicepolicy/app/DeviceAdmin/Android.bp b/hostsidetests/devicepolicy/app/DeviceAdmin/Android.bp
index 49be1dc..668880c 100644
--- a/hostsidetests/devicepolicy/app/DeviceAdmin/Android.bp
+++ b/hostsidetests/devicepolicy/app/DeviceAdmin/Android.bp
@@ -22,15 +22,14 @@
         "compatibility-device-util-axt",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     sdk_version: "test_current",
     min_sdk_version: "23",
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "api23/AndroidManifest.xml",
@@ -46,8 +45,8 @@
         "compatibility-device-util-axt",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     sdk_version: "test_current",
     // TODO: should it be "24":
@@ -56,7 +55,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "api24/AndroidManifest.xml",
@@ -72,15 +70,14 @@
         "compatibility-device-util-axt",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     sdk_version: "test_current",
     // tag this module as a cts test artifact
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "api29/AndroidManifest.xml",
diff --git a/hostsidetests/devicepolicy/app/DeviceAdminService/Android.bp b/hostsidetests/devicepolicy/app/DeviceAdminService/Android.bp
index 79d091d..6f4503b 100644
--- a/hostsidetests/devicepolicy/app/DeviceAdminService/Android.bp
+++ b/hostsidetests/devicepolicy/app/DeviceAdminService/Android.bp
@@ -21,12 +21,11 @@
         "ctstestrunner-axt",
         "compatibility-device-util-axt",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     sdk_version: "test_current",
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "package1/AndroidManifest.xml",
@@ -41,12 +40,11 @@
         "ctstestrunner-axt",
         "compatibility-device-util-axt",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     sdk_version: "test_current",
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "package2/AndroidManifest.xml",
@@ -61,12 +59,11 @@
         "ctstestrunner-axt",
         "compatibility-device-util-axt",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     sdk_version: "test_current",
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "package3/AndroidManifest.xml",
@@ -81,12 +78,11 @@
         "ctstestrunner-axt",
         "compatibility-device-util-axt",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     sdk_version: "test_current",
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "package4/AndroidManifest.xml",
@@ -101,12 +97,11 @@
         "ctstestrunner-axt",
         "compatibility-device-util-axt",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     sdk_version: "test_current",
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "packageb/AndroidManifest.xml",
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/Android.bp b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/Android.bp
index a61153d..3abd12d 100644
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/Android.bp
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/Android.bp
@@ -18,8 +18,8 @@
     platform_apis: true,
     srcs: ["src/**/*.java"],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     static_libs: [
         "compatibility-device-util-axt",
@@ -34,7 +34,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "api23/AndroidManifest.xml",
@@ -46,8 +45,8 @@
     platform_apis: true,
     srcs: ["src/**/*.java"],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     static_libs: [
         "compatibility-device-util-axt",
@@ -63,7 +62,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "api25/AndroidManifest.xml",
@@ -75,8 +73,8 @@
     platform_apis: true,
     srcs: ["src/**/*.java"],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     static_libs: [
         "compatibility-device-util-axt",
@@ -92,7 +90,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "latest/AndroidManifest.xml",
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/latest/AndroidManifest.xml b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/latest/AndroidManifest.xml
index 9f7660a..cb0bc92 100644
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/latest/AndroidManifest.xml
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/latest/AndroidManifest.xml
@@ -91,7 +91,7 @@
         <activity
             android:name="com.android.cts.deviceandprofileowner.LockTaskUtilityActivity"/>
         <activity
-            android:name="com.android.cts.deviceandprofileowner.LockTaskUtilityActivityIfWhitelisted"
+            android:name="com.android.cts.deviceandprofileowner.LockTaskUtilityActivityIfAllowed"
             android:launchMode="singleInstance"
             android:lockTaskMode="if_whitelisted">
             <intent-filter>
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/AllowedAccountManagementTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/AllowedAccountManagementTest.java
index 971e711..612794b 100644
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/AllowedAccountManagementTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/AllowedAccountManagementTest.java
@@ -41,7 +41,7 @@
     // Account type for MockAccountAuthenticator
     private final static String ACCOUNT_TYPE_1 =
             "com.android.cts.devicepolicy.accountmanagement.account.type";
-    private final static String ACCOUNT_TYPE_2 = "com.dummy.account";
+    private final static String ACCOUNT_TYPE_2 = "com.placeholder.account";
     private final static Account ACCOUNT = new Account("user0", ACCOUNT_TYPE_1);
 
     private AccountManager mAccountManager;
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/AlwaysOnVpnMultiStageTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/AlwaysOnVpnMultiStageTest.java
index eebe18d..5e3e697 100644
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/AlwaysOnVpnMultiStageTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/AlwaysOnVpnMultiStageTest.java
@@ -39,30 +39,30 @@
     public void testAlwaysOnSet() throws Exception {
         // Setup always-on vpn
         VpnTestHelper.waitForVpn(mContext, VPN_PACKAGE,
-                /* usable */ true, /* lockdown */ true, /* whitelist */ false);
+                /* usable */ true, /* lockdown */ true, /* allowlist */ false);
         assertTrue(VpnTestHelper.isNetworkVpn(mContext));
         VpnTestHelper.checkPing(TEST_ADDRESS);
     }
 
-    public void testAlwaysOnSetWithWhitelist() throws Exception {
+    public void testAlwaysOnSetWithAllowlist() throws Exception {
         VpnTestHelper.waitForVpn(mContext, VPN_PACKAGE,
-                /* usable */ true, /* lockdown */ true, /* whitelist */ true);
+                /* usable */ true, /* lockdown */ true, /* allowlist */ true);
         assertTrue(VpnTestHelper.isNetworkVpn(mContext));
         VpnTestHelper.checkPing(TEST_ADDRESS);
     }
 
-    // Should be run after running testAlwaysOnSetWithWhitelist and rebooting.
+    // Should be run after running testAlwaysOnSetWithAllowlist and rebooting.
     public void testAlwaysOnSetAfterReboot() throws Exception {
         VpnTestHelper.waitForVpn(mContext, null,
-                /* usable */ true, /* lockdown */ true, /* whitelist */ true);
+                /* usable */ true, /* lockdown */ true, /* allowlist */ true);
         VpnTestHelper.checkPing(TEST_ADDRESS);
-        final Set<String> whitelist =
+        final Set<String> allowlist =
                 mDevicePolicyManager.getAlwaysOnVpnLockdownWhitelist(ADMIN_RECEIVER_COMPONENT);
         assertTrue("Lockdown bit lost after reboot",
                 mDevicePolicyManager.isAlwaysOnVpnLockdownEnabled(ADMIN_RECEIVER_COMPONENT));
-        assertNotNull("whitelist is lost after reboot", whitelist);
-        assertEquals("whitelist changed after reboot",
-                Collections.singleton(mContext.getPackageName()), whitelist);
+        assertNotNull("allowlist is lost after reboot", allowlist);
+        assertEquals("allowlist changed after reboot",
+                Collections.singleton(mContext.getPackageName()), allowlist);
     }
 
     public void testNetworkBlocked() throws Exception {
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/AlwaysOnVpnTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/AlwaysOnVpnTest.java
index 4b5c8de..5bf6f20 100644
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/AlwaysOnVpnTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/AlwaysOnVpnTest.java
@@ -73,7 +73,7 @@
         assertNull(mDevicePolicyManager.getAlwaysOnVpnPackage(ADMIN_RECEIVER_COMPONENT));
 
         VpnTestHelper.waitForVpn(mContext, VPN_PACKAGE,
-                /* usable */ true, /* lockdown */ true, /* whitelist */ false);
+                /* usable */ true, /* lockdown */ true, /* allowlist */ false);
 
         VpnTestHelper.checkPing(TEST_ADDRESS);
     }
@@ -96,7 +96,7 @@
         mDevicePolicyManager.setApplicationRestrictions(ADMIN_RECEIVER_COMPONENT, VPN_PACKAGE,
                 restrictions);
         VpnTestHelper.waitForVpn(mContext, VPN_PACKAGE,
-                /* usable */ true,  /* lockdown */ true, /* whitelist */ false);
+                /* usable */ true,  /* lockdown */ true, /* allowlist */ false);
         assertTrue(VpnTestHelper.isNetworkVpn(mContext));
     }
 
@@ -106,12 +106,12 @@
         mDevicePolicyManager.setApplicationRestrictions(ADMIN_RECEIVER_COMPONENT, VPN_PACKAGE,
                 restrictions);
         VpnTestHelper.waitForVpn(mContext, VPN_PACKAGE,
-                /* usable */ false,  /* lockdown */ true, /* whitelist */ false);
+                /* usable */ false,  /* lockdown */ true, /* allowlist */ false);
         assertFalse(VpnTestHelper.isNetworkVpn(mContext));
     }
 
-    // Tests that changes to lockdown whitelist are applied correctly.
-    public void testVpnLockdownUpdateWhitelist() throws Exception {
+    // Tests that changes to lockdown allowlist are applied correctly.
+    public void testVpnLockdownUpdateAllowlist() throws Exception {
         assertConnectivity(true, "VPN is off");
 
         // VPN won't start.
@@ -125,30 +125,30 @@
         final BlockingBroadcastReceiver receiver = VpnTestHelper.registerOnStartReceiver(mContext);
 
         VpnTestHelper.setAlwaysOnVpn(
-                mContext, VPN_PACKAGE, /* lockdown */ false, /* whitelist */ false);
+                mContext, VPN_PACKAGE, /* lockdown */ false, /* allowlist */ false);
         assertConnectivity(true, "VPN service not started, no lockdown");
         assertNotNull(receiver.awaitForBroadcast(VPN_ON_START_TIMEOUT_MS));
 
         VpnTestHelper.setAlwaysOnVpn(
-                mContext, VPN_PACKAGE, /* lockdown */ true, /* whitelist */ false);
+                mContext, VPN_PACKAGE, /* lockdown */ true, /* allowlist */ false);
         assertConnectivity(false, "VPN in lockdown, service not started");
         assertNotNull(receiver.awaitForBroadcast(VPN_ON_START_TIMEOUT_MS));
 
         VpnTestHelper.setAlwaysOnVpn(
-                mContext, VPN_PACKAGE, /* lockdown */ true, /* whitelist */ true);
-        assertConnectivity(true, "VPN in lockdown, service not started, app whitelisted");
+                mContext, VPN_PACKAGE, /* lockdown */ true, /* allowlist */ true);
+        assertConnectivity(true, "VPN in lockdown, service not started, app allowlisted");
         assertNotNull(receiver.awaitForBroadcast(VPN_ON_START_TIMEOUT_MS));
 
         VpnTestHelper.setAlwaysOnVpn(
-                mContext, VPN_PACKAGE, /* lockdown */ true, /* whitelist */ false);
+                mContext, VPN_PACKAGE, /* lockdown */ true, /* allowlist */ false);
         assertConnectivity(false, "VPN in lockdown, service not started");
         assertNotNull(receiver.awaitForBroadcast(VPN_ON_START_TIMEOUT_MS));
 
         receiver.unregisterQuietly();
     }
 
-    // Tests that when VPN comes up, whitelisted app switches over to it.
-    public void testVpnLockdownWhitelistVpnComesUp() throws Exception {
+    // Tests that when VPN comes up, allowlisted app switches over to it.
+    public void testVpnLockdownAllowlistVpnComesUp() throws Exception {
         assertConnectivity(true, "VPN is off");
 
         // VPN won't start initially.
@@ -162,15 +162,15 @@
         final BlockingBroadcastReceiver receiver = VpnTestHelper.registerOnStartReceiver(mContext);
 
         VpnTestHelper.setAlwaysOnVpn(
-                mContext, VPN_PACKAGE,  /* lockdown */ true, /* whitelist */ true);
-        assertConnectivity(true, "VPN in lockdown, service not started, app whitelisted");
+                mContext, VPN_PACKAGE,  /* lockdown */ true, /* allowlist */ true);
+        assertConnectivity(true, "VPN in lockdown, service not started, app allowlisted");
         assertNotNull(receiver.awaitForBroadcast(VPN_ON_START_TIMEOUT_MS));
 
         // Make VPN workable again and restart.
         mDevicePolicyManager.setApplicationRestrictions(
                 ADMIN_RECEIVER_COMPONENT, VPN_PACKAGE, null);
         VpnTestHelper.waitForVpn(mContext, VPN_PACKAGE,
-                /* usable */ true,  /* lockdown */ true, /* whitelist */ true);
+                /* usable */ true,  /* lockdown */ true, /* allowlist */ true);
 
         // Now we should be on VPN.
         VpnTestHelper.checkPing(TEST_ADDRESS);
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ApplicationRestrictionsTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ApplicationRestrictionsTest.java
index 652c908..66cf8e8 100644
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ApplicationRestrictionsTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/ApplicationRestrictionsTest.java
@@ -47,7 +47,7 @@
     private static final String ACTION_RESTRICTIONS_VALUE =
             "com.android.cts.apprestrictions.targetapp.RESTRICTIONS_VALUE";
 
-    private static final String OTHER_PACKAGE = APP_RESTRICTIONS_TARGET_PKG + "dummy";
+    private static final String OTHER_PACKAGE = APP_RESTRICTIONS_TARGET_PKG + "placeholder";
 
     private static final String[] TEST_STRINGS = new String[] {
             "<bad/>",
@@ -291,14 +291,14 @@
     // Should be consistent with assertBundle1
     private static Bundle createBundle1() {
         Bundle result = new Bundle();
-        result.putInt("dummy", 1);
+        result.putInt("placeholder", 1);
         return result;
     }
 
     // Should be consistent with createBundle1
     private void assertBundle1(Bundle bundle) {
         assertEquals(1, bundle.size());
-        assertEquals(1, bundle.getInt("dummy"));
+        assertEquals(1, bundle.getInt("placeholder"));
     }
 
     private void startTestActivity() {
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/KeyManagementTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/KeyManagementTest.java
index f42db09..d18a9fa 100755
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/KeyManagementTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/KeyManagementTest.java
@@ -168,7 +168,7 @@
     private List<Certificate> loadCertificateChain(String assetName) throws Exception {
         final Collection<Certificate> certs = loadCertificatesFromAsset(assetName);
         final ArrayList<Certificate> certChain = new ArrayList(certs);
-        // Some sanity check on the cert chain
+        // Check the cert chain
         assertThat(certs.size()).isGreaterThan(1);
         for (int i = 1; i < certChain.size(); i++) {
             certChain.get(i - 1).verify(certChain.get(i).getPublicKey());
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/LockTaskHostDrivenTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/LockTaskHostDrivenTest.java
index 4321f38..e6abac7 100644
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/LockTaskHostDrivenTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/LockTaskHostDrivenTest.java
@@ -51,7 +51,7 @@
     private static final int LOCK_TASK_STATE_CHANGE_TIMEOUT_MILLIS = 10000;  // 10 seconds
     private static final String ACTION_EMERGENCY_DIAL = "com.android.phone.EmergencyDialer.DIAL";
     private static final String LOCK_TASK_ACTIVITY
-            = LockTaskUtilityActivityIfWhitelisted.class.getName();
+            = LockTaskUtilityActivityIfAllowed.class.getName();
 
     private UiDevice mUiDevice;
     private Context mContext;
@@ -88,6 +88,12 @@
         mUiDevice.pressHome();
     }
 
+    public void testLockTaskIsActive() throws Exception {
+        Log.d(TAG, "testLockTaskIsActive on host-driven test");
+        waitAndCheckLockedActivityIsResumed();
+        checkLockedActivityIsRunning();
+    }
+
     /**
      * On low-RAM devices, this test can take too long to finish, so the test runner can incorrectly
      * assume it's finished. Therefore, only use it once in a given test.
@@ -135,10 +141,10 @@
         }
     }
 
-    public void testLockTaskIsExitedIfNotWhitelisted() throws Exception {
-        Log.d(TAG, "testLockTaskIsExitedIfNotWhitelisted on host-driven test");
+    public void testLockTaskIsExitedIfNotAllowed() throws Exception {
+        Log.d(TAG, "testLockTaskIsExitedIfNotAllowed on host-driven test");
 
-        // Whitelist this package
+        // Allow this package
         setLockTaskPackages(mContext.getPackageName());
 
         // Launch lock task root activity
@@ -148,7 +154,7 @@
         assertEquals(
                 ActivityManager.LOCK_TASK_MODE_LOCKED, mActivityManager.getLockTaskModeState());
 
-        // Remove it from whitelist
+        // Remove it from allowlist
         setLockTaskPackages();
         waitForLockTaskModeStateNone();
         mUiDevice.waitForIdle();
@@ -170,7 +176,7 @@
 
         Log.d(TAG, "testLockTaskCanLaunchDefaultDialer on host-driven test");
 
-        // Whitelist dialer package
+        // Allow dialer package
         String dialerPackage = mTelcomManager.getSystemDialerPackage();
         assertNotNull(dialerPackage);
         setLockTaskPackages(mContext.getPackageName(), dialerPackage);
@@ -214,7 +220,7 @@
         Log.d(TAG, "testLockTaskCanLaunchEmergencyDialer on host-driven test");
 
         // Emergency dialer should be usable as long as keyguard feature is enabled
-        // regardless of the package whitelist
+        // regardless of the package allowlist
         mDevicePolicyManager.setLockTaskFeatures(
                 ADMIN_RECEIVER_COMPONENT, DevicePolicyManager.LOCK_TASK_FEATURE_KEYGUARD);
         setLockTaskPackages(mContext.getPackageName());
@@ -301,14 +307,14 @@
     }
 
     private void launchLockTaskActivity() {
-        Intent intent = new Intent(mContext, LockTaskUtilityActivityIfWhitelisted.class);
+        Intent intent = new Intent(mContext, LockTaskUtilityActivityIfAllowed.class);
         intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
         intent.putExtra(LockTaskUtilityActivity.START_LOCK_TASK, true);
         mContext.startActivity(intent);
     }
 
     private void launchLockTaskUtilityActivityWithoutStartingLockTask() {
-        final Intent intent = new Intent(mContext, LockTaskUtilityActivityIfWhitelisted.class);
+        final Intent intent = new Intent(mContext, LockTaskUtilityActivityIfAllowed.class);
         intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
         mContext.startActivity(intent);
     }
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/LockTaskTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/LockTaskTest.java
index e90e4af..5ab2307 100644
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/LockTaskTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/LockTaskTest.java
@@ -58,8 +58,8 @@
 
     private static final String UTILITY_ACTIVITY
             = "com.android.cts.deviceandprofileowner.LockTaskUtilityActivity";
-    private static final String UTILITY_ACTIVITY_IF_WHITELISTED
-            = "com.android.cts.deviceandprofileowner.LockTaskUtilityActivityIfWhitelisted";
+    private static final String UTILITY_ACTIVITY_IF_ALLOWED
+            = "com.android.cts.deviceandprofileowner.LockTaskUtilityActivityIfAllowed";
 
     private static final String RECEIVER_ACTIVITY_PACKAGE_NAME =
             "com.android.cts.intent.receiver";
@@ -241,8 +241,8 @@
         stopAndFinish(UTILITY_ACTIVITY);
     }
 
-    // Verifies that updating the whitelisting during lock task mode finishes the locked task.
-    public void testUpdateWhitelisting() throws Exception {
+    // Verifies that updating the allowlist during lock task mode finishes the locked task.
+    public void testUpdateAllowlist() throws Exception {
         mDevicePolicyManager.setLockTaskPackages(ADMIN_COMPONENT, new String[] { PACKAGE_NAME });
         startLockTask(UTILITY_ACTIVITY);
 
@@ -257,9 +257,9 @@
         assertFalse(mIsActivityResumed);
     }
 
-    // Verifies that removing the whitelist authorization immediately finishes the corresponding
+    // Verifies that removing the allowlist authorization immediately finishes the corresponding
     // locked task. The other locked task(s) should remain locked.
-    public void testUpdateWhitelisting_twoTasks() throws Exception {
+    public void testUpdateAllowlist_twoTasks() throws Exception {
         mDevicePolicyManager.setLockTaskPackages(ADMIN_COMPONENT, new String[] { PACKAGE_NAME,
                 RECEIVER_ACTIVITY_PACKAGE_NAME});
 
@@ -276,7 +276,7 @@
             assertTrue(mIsReceiverActivityRunning);
         }
 
-        // Remove whitelist authorization of the second task
+        // Remove allowlist authorization of the second task
         mDevicePolicyManager.setLockTaskPackages(ADMIN_COMPONENT, new String[] { PACKAGE_NAME });
         synchronized (mReceiverActivityRunningLock) {
             mReceiverActivityRunningLock.wait(ACTIVITY_DESTROYED_TIMEOUT_MILLIS);
@@ -314,7 +314,7 @@
         stopAndFinish(UTILITY_ACTIVITY);
     }
 
-    // When LOCK_TASK_FEATURE_BLOCK_ACTIVITY_START_IN_TASK is set, un-whitelisted apps cannot
+    // When LOCK_TASK_FEATURE_BLOCK_ACTIVITY_START_IN_TASK is set, un-allowed apps cannot
     // be launched in the same task.
     public void testStartActivity_withinTask_blockInTask() throws Exception {
         mDevicePolicyManager.setLockTaskPackages(ADMIN_COMPONENT, new String[] { PACKAGE_NAME });
@@ -352,7 +352,7 @@
     }
 
     // When LOCK_TASK_FEATURE_BLOCK_ACTIVITY_START_IN_TASK is set, the system dialog will also be
-    // shown when an un-whitelisted app is being launched in a new task.
+    // shown when an un-allowed app is being launched in a new task.
     public void testStartActivity_newTask_blockInTask() throws Exception {
         mDevicePolicyManager.setLockTaskPackages(ADMIN_COMPONENT, new String[] { PACKAGE_NAME });
         mDevicePolicyManager.setLockTaskFeatures(
@@ -388,9 +388,9 @@
         mDevicePolicyManager.setLockTaskFeatures(ADMIN_COMPONENT, 0);
     }
 
-    // This launches a whitelisted activity that is not part of the current task.
+    // This launches an allowed activity that is not part of the current task.
     // This should be permitted as a part of lock task.
-    public void testStartActivity_outsideTaskWhitelisted() throws Exception {
+    public void testStartActivity_outsideTaskAllowed() throws Exception {
         mDevicePolicyManager.setLockTaskPackages(ADMIN_COMPONENT, new String[] { PACKAGE_NAME,
                 RECEIVER_ACTIVITY_PACKAGE_NAME});
         startLockTask(UTILITY_ACTIVITY);
@@ -406,9 +406,9 @@
         stopAndFinish(UTILITY_ACTIVITY);
     }
 
-    // This launches a non-whitelisted activity that is not part of the current task.
+    // This launches a not-allowed activity that is not part of the current task.
     // This should be blocked.
-    public void testStartActivity_outsideTaskNonWhitelisted() throws Exception {
+    public void testStartActivity_outsideTaskNotAllowed() throws Exception {
         mDevicePolicyManager.setLockTaskPackages(ADMIN_COMPONENT, new String[] { PACKAGE_NAME });
         startLockTask(UTILITY_ACTIVITY);
         waitForResume();
@@ -423,52 +423,52 @@
     }
 
     // Test the lockTaskMode flag for an activity declaring if_whitelisted.
-    // Whitelist the activity and verify that lock task mode is started.
-    public void testManifestArgument_whitelisted() throws Exception {
+    // Allow the activity and verify that lock task mode is started.
+    public void testManifestArgument_allowed() throws Exception {
         mDevicePolicyManager.setLockTaskPackages(ADMIN_COMPONENT, new String[] { PACKAGE_NAME });
-        startAndWait(getLockTaskUtility(UTILITY_ACTIVITY_IF_WHITELISTED));
+        startAndWait(getLockTaskUtility(UTILITY_ACTIVITY_IF_ALLOWED));
         waitForResume();
 
         assertLockTaskModeActive();
         assertTrue(mIsActivityRunning);
         assertTrue(mIsActivityResumed);
 
-        stopAndFinish(UTILITY_ACTIVITY_IF_WHITELISTED);
+        stopAndFinish(UTILITY_ACTIVITY_IF_ALLOWED);
     }
 
     // Test the lockTaskMode flag for an activity declaring if_whitelisted.
-    // Don't whitelist the activity and verify that lock task mode is not started.
-    public void testManifestArgument_nonWhitelisted() throws Exception {
-        startAndWait(getLockTaskUtility(UTILITY_ACTIVITY_IF_WHITELISTED));
+    // Don't allow the activity and verify that lock task mode is not started.
+    public void testManifestArgument_notAllowed() throws Exception {
+        startAndWait(getLockTaskUtility(UTILITY_ACTIVITY_IF_ALLOWED));
         waitForResume();
 
         assertLockTaskModeInactive();
         assertTrue(mIsActivityRunning);
         assertTrue(mIsActivityResumed);
 
-        stopAndFinish(UTILITY_ACTIVITY_IF_WHITELISTED);
+        stopAndFinish(UTILITY_ACTIVITY_IF_ALLOWED);
     }
 
     // Test the lockTaskMode flag for an activity declaring if_whitelisted.
     // An activity locked via manifest argument cannot finish without calling stopLockTask.
     public void testManifestArgument_cannotFinish() throws Exception {
         mDevicePolicyManager.setLockTaskPackages(ADMIN_COMPONENT, new String[] { PACKAGE_NAME });
-        startAndWait(getLockTaskUtility(UTILITY_ACTIVITY_IF_WHITELISTED));
+        startAndWait(getLockTaskUtility(UTILITY_ACTIVITY_IF_ALLOWED));
         waitForResume();
 
         // If lock task has not exited then the activity shouldn't actually receive onDestroy.
-        finishAndWait(UTILITY_ACTIVITY_IF_WHITELISTED);
+        finishAndWait(UTILITY_ACTIVITY_IF_ALLOWED);
         assertLockTaskModeActive();
         assertTrue(mIsActivityRunning);
 
-        stopAndFinish(UTILITY_ACTIVITY_IF_WHITELISTED);
+        stopAndFinish(UTILITY_ACTIVITY_IF_ALLOWED);
     }
 
     // Test the lockTaskMode flag for an activity declaring if_whitelisted.
-    // Verifies that updating the whitelisting during lock task mode finishes the locked task.
-    public void testManifestArgument_updateWhitelisting() throws Exception {
+    // Verifies that updating the allowlist during lock task mode finishes the locked task.
+    public void testManifestArgument_updateAllowlist() throws Exception {
         mDevicePolicyManager.setLockTaskPackages(ADMIN_COMPONENT, new String[] { PACKAGE_NAME });
-        startAndWait(getLockTaskUtility(UTILITY_ACTIVITY_IF_WHITELISTED));
+        startAndWait(getLockTaskUtility(UTILITY_ACTIVITY_IF_ALLOWED));
         waitForResume();
 
         mDevicePolicyManager.setLockTaskPackages(ADMIN_COMPONENT, new String[0]);
@@ -483,7 +483,7 @@
     }
 
     // Start lock task with ActivityOptions
-    public void testActivityOptions_whitelisted() throws Exception {
+    public void testActivityOptions_allowed() throws Exception {
         mDevicePolicyManager.setLockTaskPackages(ADMIN_COMPONENT, new String[] { PACKAGE_NAME });
         startLockTaskWithOptions(UTILITY_ACTIVITY);
         waitForResume();
@@ -496,8 +496,8 @@
         stopAndFinish(UTILITY_ACTIVITY);
     }
 
-    // Starting a non-whitelisted activity with ActivityOptions is not allowed
-    public void testActivityOptions_nonWhitelisted() throws Exception {
+    // Starting a not-allowed activity with ActivityOptions is not allowed
+    public void testActivityOptions_notAllowed() throws Exception {
         try {
             startLockTaskWithOptions(UTILITY_ACTIVITY);
             fail();
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/LockTaskUtilityActivityIfAllowed.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/LockTaskUtilityActivityIfAllowed.java
new file mode 100644
index 0000000..0a9a5007
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/LockTaskUtilityActivityIfAllowed.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.deviceandprofileowner;
+
+public class LockTaskUtilityActivityIfAllowed extends LockTaskUtilityActivity {
+}
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/LockTaskUtilityActivityIfWhitelisted.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/LockTaskUtilityActivityIfWhitelisted.java
deleted file mode 100644
index d030fdd..0000000
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/LockTaskUtilityActivityIfWhitelisted.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.deviceandprofileowner;
-
-public class LockTaskUtilityActivityIfWhitelisted extends LockTaskUtilityActivity {
-}
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/MeteredDataRestrictionTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/MeteredDataRestrictionTest.java
index 3b493f4..ac053d0 100644
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/MeteredDataRestrictionTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/MeteredDataRestrictionTest.java
@@ -172,7 +172,6 @@
         if (!oldMeteredState) {
             waitForReconnection(oldNetId);
         }
-        // Sanity check.
         assertWifiMeteredStatus(ssid, true);
         assertActiveNetworkMetered(true);
     }
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/SecurityLoggingTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/SecurityLoggingTest.java
index 58a377e..aaa3e9b 100644
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/SecurityLoggingTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/SecurityLoggingTest.java
@@ -340,7 +340,7 @@
     }
 
     /**
-     * Fetches and sanity-checks the events.
+     * Fetches and checks the events.
      */
     private List<SecurityEvent> getEvents() throws Exception {
         List<SecurityEvent> events = null;
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/SetSystemSettingTest.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/SetSystemSettingTest.java
index 3030e35..cea247c 100644
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/SetSystemSettingTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/SetSystemSettingTest.java
@@ -56,7 +56,7 @@
     }
   }
 
-  public void testSetSystemSettingsFailsForNonWhitelistedSettings() throws Exception {
+  public void testSetSystemSettingsFailsForNotAllowedSettings() throws Exception {
     try {
       mDevicePolicyManager.setSystemSetting(ADMIN_RECEIVER_COMPONENT,
           Settings.System.TEXT_AUTO_REPLACE, "0");
diff --git a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/vpn/VpnTestHelper.java b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/vpn/VpnTestHelper.java
index bed0943..516e04f 100644
--- a/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/vpn/VpnTestHelper.java
+++ b/hostsidetests/devicepolicy/app/DeviceAndProfileOwner/src/com/android/cts/deviceandprofileowner/vpn/VpnTestHelper.java
@@ -102,10 +102,10 @@
      *         this package as the new always-on VPN app and wait for it to connect.
      * @param lockdown Disallow connectivity while VPN is down.
      * @param usable Whether the resulting VPN tunnel is expected to be usable.
-     * @param whitelist whether to whitelist current package from lockdown.
+     * @param excludeFromLockdown whether to exclude current package from lockdown.
      */
     public static void waitForVpn(Context context, String packageName, boolean usable,
-            boolean lockdown, boolean whitelist) {
+            boolean lockdown, boolean excludeFromLockdown) {
         final DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
         if (packageName == null) {
             assertNotNull(dpm.getAlwaysOnVpnPackage(ADMIN_RECEIVER_COMPONENT));
@@ -130,7 +130,7 @@
 
         try {
             if (packageName != null) {
-                setAlwaysOnVpn(context, packageName, lockdown, whitelist);
+                setAlwaysOnVpn(context, packageName, lockdown, excludeFromLockdown);
             }
             if (!vpnLatch.await(NETWORK_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
                 if (!isNetworkVpn(context)) {
@@ -154,21 +154,21 @@
     }
 
     public static void setAlwaysOnVpn(
-            Context context, String packageName, boolean lockdown, boolean whitelist)
+            Context context, String packageName, boolean lockdown, boolean excludeFromLockdown)
             throws PackageManager.NameNotFoundException {
         final DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
-        final Set<String> lockdownWhitelist;
+        final Set<String> lockdownAllowlist;
         if (lockdown) {
-            lockdownWhitelist = whitelist ?
+            lockdownAllowlist = excludeFromLockdown ?
                     Collections.singleton(context.getPackageName()) : Collections.emptySet();
         } else {
-            lockdownWhitelist = null;
+            lockdownAllowlist = null;
         }
         dpm.setAlwaysOnVpnPackage(
-                ADMIN_RECEIVER_COMPONENT, packageName, lockdown, lockdownWhitelist);
+                ADMIN_RECEIVER_COMPONENT, packageName, lockdown, lockdownAllowlist);
         assertEquals(packageName, dpm.getAlwaysOnVpnPackage(ADMIN_RECEIVER_COMPONENT));
         assertEquals(lockdown, dpm.isAlwaysOnVpnLockdownEnabled(ADMIN_RECEIVER_COMPONENT));
-        assertEquals(lockdownWhitelist,
+        assertEquals(lockdownAllowlist,
                 dpm.getAlwaysOnVpnLockdownWhitelist(ADMIN_RECEIVER_COMPONENT));
     }
 
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/Android.bp b/hostsidetests/devicepolicy/app/DeviceOwner/Android.bp
index cfd7e25..378e9af 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/Android.bp
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/Android.bp
@@ -24,9 +24,9 @@
         local_include_dirs: ["src"],
     },
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "junit",
-        "android.test.base.stubs",
+        "android.test.base",
         "bouncycastle-unbundled",
 	"org.apache.http.legacy",
     ],
@@ -43,7 +43,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/AdminActionBookkeepingTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/AdminActionBookkeepingTest.java
index b793408..b82305a 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/AdminActionBookkeepingTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/AdminActionBookkeepingTest.java
@@ -15,6 +15,7 @@
  */
 package com.android.cts.deviceowner;
 
+import android.app.ActivityManager;
 import android.app.PendingIntent;
 import android.content.ContentResolver;
 import android.os.Process;
@@ -107,9 +108,15 @@
      * Test: Requesting a bug report should update the corresponding timestamp.
      */
     public void testRequestBugreport() throws Exception {
+        ActivityManager activityManager = mContext.getSystemService(ActivityManager.class);
+
         // This test leaves a notification which will block future tests that request bug reports
         // to fix this - we dismiss the bug report before returning
-        CountDownLatch notificationDismissedLatch = initTestRequestBugreport();
+        CountDownLatch notificationDismissedLatch = null;
+        if (!activityManager.isLowRamDevice()) {
+            // On low ram devices we should reboot the phone after the test
+            notificationDismissedLatch = initTestRequestBugreport();
+        }
 
         Thread.sleep(1);
         final long previousTimestamp = mDevicePolicyManager.getLastBugReportRequestTime();
@@ -123,7 +130,10 @@
         assertTrue(newTimestamp >= timeBefore);
         assertTrue(newTimestamp <= timeAfter);
 
-        cleanupTestRequestBugreport(notificationDismissedLatch);
+        if (!activityManager.isLowRamDevice()) {
+            // On low ram devices we should reboot the phone after the test
+            cleanupTestRequestBugreport(notificationDismissedLatch);
+        }
     }
 
     private CountDownLatch initTestRequestBugreport() {
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 3c31a86..136da5d 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
@@ -52,7 +52,7 @@
 public class CreateAndManageUserTest extends BaseDeviceOwnerTest {
     private static final String TAG = "CreateAndManageUserTest";
 
-    private static final int BROADCAST_TIMEOUT = 60_000;
+    private static final int BROADCAST_TIMEOUT = 300_000;
 
     private static final String AFFILIATION_ID = "affiliation.id";
     private static final String EXTRA_AFFILIATION_ID = "affiliationIdExtra";
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/NetworkLoggingTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/NetworkLoggingTest.java
index 5ec1e71..e8f35f2 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/NetworkLoggingTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/NetworkLoggingTest.java
@@ -172,9 +172,9 @@
         }
 
         // generate enough traffic to fill the batches.
-        int dummyReqNo = 0;
+        int testReqNo = 0;
         for (int i = 0; i < mBatchesRequested; i++) {
-            dummyReqNo += generateDummyTraffic();
+            testReqNo += generateTestTraffic();
         }
 
         // if DeviceAdminReceiver#onNetworkLogsAvailable() hasn't been triggered yet, wait for up to
@@ -190,11 +190,11 @@
 
         // Verify network logs.
         assertEquals("First event has the wrong id.", 0L, mNetworkEvents.get(0).getId());
-        // For each of the real URLs we have two events: one DNS and one connect. Dummy requests
+        // For each of the real URLs we have two events: one DNS and one connect. Test requests
         // don't require DNS queries.
         final int eventsExpected =
                 Math.min(FULL_LOG_BATCH_SIZE * mBatchesRequested,
-                        2 * LOGGED_URLS_LIST.length + dummyReqNo);
+                        2 * LOGGED_URLS_LIST.length + testReqNo);
         verifyNetworkLogs(mNetworkEvents, eventsExpected);
     }
 
@@ -340,11 +340,11 @@
     }
 
     /** Quickly generate loads of events by repeatedly connecting to a local server. */
-    private int generateDummyTraffic() throws IOException, InterruptedException {
+    private int generateTestTraffic() throws IOException, InterruptedException {
         final ServerSocket serverSocket = new ServerSocket(0);
-        final Thread serverThread = startDummyServer(serverSocket);
+        final Thread serverThread = startTestServer(serverSocket);
 
-        final int reqNo = makeDummyRequests(serverSocket.getLocalPort());
+        final int reqNo = makeTestRequests(serverSocket.getLocalPort());
 
         serverSocket.close();
         serverThread.join();
@@ -352,11 +352,11 @@
         return reqNo;
     }
 
-    private int makeDummyRequests(int port) {
+    private int makeTestRequests(int port) {
         int reqNo;
-        final String DUMMY_SERVER = "127.0.0.1:" + port;
+        final String TEST_SERVER = "127.0.0.1:" + port;
         for (reqNo = 0; reqNo < FULL_LOG_BATCH_SIZE && mBatchCountDown.getCount() > 0; reqNo++) {
-            connectToWebsite(DUMMY_SERVER);
+            connectToWebsite(TEST_SERVER);
             try {
                 // Just to prevent choking the server.
                 Thread.sleep(10);
@@ -367,7 +367,7 @@
         return reqNo;
     }
 
-    private Thread startDummyServer(ServerSocket serverSocket) throws InterruptedException {
+    private Thread startTestServer(ServerSocket serverSocket) throws InterruptedException {
         final Thread serverThread = new Thread(() -> {
             while (!serverSocket.isClosed()) {
                 try {
diff --git a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/PrivateDnsPolicyTest.java b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/PrivateDnsPolicyTest.java
index a2dd041..27f4d46 100644
--- a/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/PrivateDnsPolicyTest.java
+++ b/hostsidetests/devicepolicy/app/DeviceOwner/src/com/android/cts/deviceowner/PrivateDnsPolicyTest.java
@@ -28,7 +28,7 @@
 import static org.testng.Assert.assertThrows;
 
 public class PrivateDnsPolicyTest extends BaseDeviceOwnerTest {
-    private static final String DUMMY_PRIVATE_DNS_HOST = "resolver.example.com";
+    private static final String TEST_PRIVATE_DNS_HOST = "resolver.example.com";
     private static final String VALID_PRIVATE_DNS_HOST = "dns.google";
 
     private UserManager mUserManager;
@@ -130,7 +130,7 @@
 
         // This host does not resolve, so would output an error.
         callSetGlobalPrivateDnsHostModeExpectingResult(
-                DUMMY_PRIVATE_DNS_HOST,
+                TEST_PRIVATE_DNS_HOST,
                 DevicePolicyManager.PRIVATE_DNS_SET_ERROR_HOST_NOT_SERVING);
     }
 
diff --git a/hostsidetests/devicepolicy/app/DummyApps/Android.bp b/hostsidetests/devicepolicy/app/DummyApps/Android.bp
deleted file mode 100644
index 14338fb..0000000
--- a/hostsidetests/devicepolicy/app/DummyApps/Android.bp
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright (C) 2020 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.
-
-android_test_helper_app {
-    name: "DummyApp1",
-    defaults: ["cts_defaults"],
-    platform_apis: true,
-    srcs: ["dummyapp1/src/**/*.java"],
-    libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
-    ],
-    static_libs: [
-        "compatibility-device-util-axt",
-        "ctstestrunner-axt",
-        "ub-uiautomator",
-        "cts-security-test-support-library",
-        "androidx.legacy_legacy-support-v4",
-    ],
-    min_sdk_version: "23",
-    // tag this module as a cts test artifact
-    test_suites: [
-        "cts",
-        "vts10",
-        "general-tests",
-    ],
-    manifest: "dummyapp1/AndroidManifest.xml",
-}
-
-android_test_helper_app {
-    name: "DummyApp2",
-    defaults: ["cts_defaults"],
-    platform_apis: true,
-    srcs: ["dummyapp2/src/**/*.java"],
-    libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
-    ],
-    static_libs: [
-        "compatibility-device-util-axt",
-        "ctstestrunner-axt",
-        "ub-uiautomator",
-        "cts-security-test-support-library",
-        "androidx.legacy_legacy-support-v4",
-    ],
-    min_sdk_version: "23",
-    // tag this module as a cts test artifact
-    test_suites: [
-        "cts",
-        "vts10",
-        "general-tests",
-    ],
-    manifest: "dummyapp2/AndroidManifest.xml",
-}
-
-android_test_helper_app {
-    name: "DummyApp3",
-    defaults: ["cts_defaults"],
-    platform_apis: true,
-    srcs: ["dummyapp3/src/**/*.java"],
-    libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
-    ],
-    static_libs: [
-        "compatibility-device-util-axt",
-        "ctstestrunner-axt",
-        "ub-uiautomator",
-        "cts-security-test-support-library",
-        "androidx.legacy_legacy-support-v4",
-    ],
-    min_sdk_version: "23",
-    // tag this module as a cts test artifact
-    test_suites: [
-        "cts",
-        "vts10",
-        "general-tests",
-    ],
-    manifest: "dummyapp3/AndroidManifest.xml",
-}
-
-android_test_helper_app {
-    name: "DummyApp4",
-    defaults: ["cts_defaults"],
-    platform_apis: true,
-    srcs: ["dummyapp4/src/**/*.java"],
-    libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
-    ],
-    static_libs: [
-        "compatibility-device-util-axt",
-        "ctstestrunner-axt",
-        "ub-uiautomator",
-        "cts-security-test-support-library",
-        "androidx.legacy_legacy-support-v4",
-    ],
-    min_sdk_version: "23",
-    // tag this module as a cts test artifact
-    test_suites: [
-        "cts",
-        "vts10",
-        "general-tests",
-    ],
-    manifest: "dummyapp4/AndroidManifest.xml",
-}
diff --git a/hostsidetests/devicepolicy/app/DummyApps/dummyapp1/AndroidManifest.xml b/hostsidetests/devicepolicy/app/DummyApps/dummyapp1/AndroidManifest.xml
deleted file mode 100644
index 3bec42a..0000000
--- a/hostsidetests/devicepolicy/app/DummyApps/dummyapp1/AndroidManifest.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 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.
-  -->
-
-<!--
-  ~ A dummy app used for when you need to install test packages that have a functioning package name
-  ~ and UID. For example, you could use it to set permissions or app-ops.
-  -->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-        package="com.android.cts.dummyapps.dummyapp1">
-    <uses-permission android:name="android.permission.INTERACT_ACROSS_PROFILES"/>
-    <application android:testOnly="true"
-            android:crossProfile="true">
-        <uses-library android:name="android.test.runner" />
-        <receiver android:name=".CanInteractAcrossProfilesChangedReceiver">
-            <intent-filter>
-                <action android:name="android.content.pm.action.CAN_INTERACT_ACROSS_PROFILES_CHANGED" />
-            </intent-filter>
-        </receiver>
-        <activity
-            android:name="android.app.Activity"
-            android:exported="true">
-        </activity>
-    </application>
-</manifest>
diff --git a/hostsidetests/devicepolicy/app/DummyApps/dummyapp1/src/CanInteractAcrossProfilesChangedReceiver.java b/hostsidetests/devicepolicy/app/DummyApps/dummyapp1/src/CanInteractAcrossProfilesChangedReceiver.java
deleted file mode 100644
index 8861c29..0000000
--- a/hostsidetests/devicepolicy/app/DummyApps/dummyapp1/src/CanInteractAcrossProfilesChangedReceiver.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.dummyapps.dummyapp1;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Process;
-import android.util.Log;
-
-public class CanInteractAcrossProfilesChangedReceiver extends BroadcastReceiver {
-    private static final String TAG = "Dummy1Receiver";
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        Log.w(TAG, context.getApplicationContext().getPackageName() + "#" + intent.getAction()
-                + "#" + Process.myUserHandle().getIdentifier());
-    }
-}
diff --git a/hostsidetests/devicepolicy/app/DummyApps/dummyapp2/AndroidManifest.xml b/hostsidetests/devicepolicy/app/DummyApps/dummyapp2/AndroidManifest.xml
deleted file mode 100644
index 1f1975f..0000000
--- a/hostsidetests/devicepolicy/app/DummyApps/dummyapp2/AndroidManifest.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 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.
-  -->
-
-<!--
-  ~ A dummy app used for when you need to install test packages that have a functioning package name
-  ~ and UID. For example, you could use it to set permissions or app-ops.
-  -->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="com.android.cts.dummyapps.dummyapp2">
-    <uses-permission android:name="android.permission.INTERACT_ACROSS_PROFILES"/>
-    <application android:testOnly="true"
-                 android:crossProfile="true">
-        <uses-library android:name="android.test.runner" />
-        <receiver android:name=".CanInteractAcrossProfilesChangedReceiver">
-            <intent-filter>
-                <action android:name="android.content.pm.action.CAN_INTERACT_ACROSS_PROFILES_CHANGED" />
-            </intent-filter>
-        </receiver>
-        <activity
-            android:name="android.app.Activity"
-            android:exported="true">
-        </activity>
-    </application>
-</manifest>
diff --git a/hostsidetests/devicepolicy/app/DummyApps/dummyapp2/src/CanInteractAcrossProfilesChangedReceiver.java b/hostsidetests/devicepolicy/app/DummyApps/dummyapp2/src/CanInteractAcrossProfilesChangedReceiver.java
deleted file mode 100644
index 26e3ee0..0000000
--- a/hostsidetests/devicepolicy/app/DummyApps/dummyapp2/src/CanInteractAcrossProfilesChangedReceiver.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.dummyapps.dummyapp2;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Process;
-import android.util.Log;
-
-public class CanInteractAcrossProfilesChangedReceiver extends BroadcastReceiver {
-    private static final String TAG = "Dummy2Receiver";
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        Log.w(TAG, context.getApplicationContext().getPackageName() + "#" + intent.getAction()
-                + "#" + Process.myUserHandle().getIdentifier());
-    }
-}
diff --git a/hostsidetests/devicepolicy/app/DummyApps/dummyapp3/AndroidManifest.xml b/hostsidetests/devicepolicy/app/DummyApps/dummyapp3/AndroidManifest.xml
deleted file mode 100644
index 446c3a1..0000000
--- a/hostsidetests/devicepolicy/app/DummyApps/dummyapp3/AndroidManifest.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 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.
-  -->
-
-<!--
-  ~ A dummy app used for when you need to install test packages that have a functioning package name
-  ~ and UID. For example, you could use it to set permissions or app-ops.
-  -->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="com.android.cts.dummyapps.dummyapp3">
-    <uses-permission android:name="android.permission.INTERACT_ACROSS_PROFILES"/>
-    <application android:testOnly="true"
-                 android:crossProfile="true">
-        <uses-library android:name="android.test.runner" />
-        <receiver android:name=".CanInteractAcrossProfilesChangedReceiver">
-            <intent-filter>
-                <action android:name="android.content.pm.action.CAN_INTERACT_ACROSS_PROFILES_CHANGED" />
-            </intent-filter>
-        </receiver>
-        <activity
-            android:name="android.app.Activity"
-            android:exported="true">
-        </activity>
-    </application>
-</manifest>
diff --git a/hostsidetests/devicepolicy/app/DummyApps/dummyapp3/src/CanInteractAcrossProfilesChangedReceiver.java b/hostsidetests/devicepolicy/app/DummyApps/dummyapp3/src/CanInteractAcrossProfilesChangedReceiver.java
deleted file mode 100644
index 3254fc3..0000000
--- a/hostsidetests/devicepolicy/app/DummyApps/dummyapp3/src/CanInteractAcrossProfilesChangedReceiver.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.dummyapps.dummyapp3;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Process;
-import android.util.Log;
-
-public class CanInteractAcrossProfilesChangedReceiver extends BroadcastReceiver {
-    private static final String TAG = "Dummy3Receiver";
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        Log.w(TAG, context.getApplicationContext().getPackageName() + "#" + intent.getAction()
-                + "#" + Process.myUserHandle().getIdentifier());
-    }
-}
diff --git a/hostsidetests/devicepolicy/app/DummyApps/dummyapp4/AndroidManifest.xml b/hostsidetests/devicepolicy/app/DummyApps/dummyapp4/AndroidManifest.xml
deleted file mode 100644
index 8c0356c..0000000
--- a/hostsidetests/devicepolicy/app/DummyApps/dummyapp4/AndroidManifest.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2020 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.
-  -->
-
-<!--
-  ~ A dummy app used for when you need to install test packages that have a functioning package name
-  ~ and UID. For example, you could use it to set permissions or app-ops.
-  -->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="com.android.cts.dummyapps.dummyapp4">
-    <uses-permission android:name="android.permission.INTERACT_ACROSS_PROFILES"/>
-    <application android:testOnly="true"
-                 android:crossProfile="true">
-        <uses-library android:name="android.test.runner" />
-        <receiver android:name=".CanInteractAcrossProfilesChangedReceiver">
-            <intent-filter>
-                <action android:name="android.content.pm.action.CAN_INTERACT_ACROSS_PROFILES_CHANGED" />
-            </intent-filter>
-        </receiver>
-        <activity
-            android:name="android.app.Activity"
-            android:exported="true">
-        </activity>
-    </application>
-</manifest>
diff --git a/hostsidetests/devicepolicy/app/DummyApps/dummyapp4/src/CanInteractAcrossProfilesChangedReceiver.java b/hostsidetests/devicepolicy/app/DummyApps/dummyapp4/src/CanInteractAcrossProfilesChangedReceiver.java
deleted file mode 100644
index 512e96b..0000000
--- a/hostsidetests/devicepolicy/app/DummyApps/dummyapp4/src/CanInteractAcrossProfilesChangedReceiver.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.dummyapps.dummyapp4;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Process;
-import android.util.Log;
-
-public class CanInteractAcrossProfilesChangedReceiver extends BroadcastReceiver {
-    private static final String TAG = "Dummy4Receiver";
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        Log.w(TAG, context.getApplicationContext().getPackageName() + "#" + intent.getAction()
-                + "#" + Process.myUserHandle().getIdentifier());
-    }
-}
diff --git a/hostsidetests/devicepolicy/app/DummyIme/Android.bp b/hostsidetests/devicepolicy/app/DummyIme/Android.bp
deleted file mode 100644
index 7f817cd..0000000
--- a/hostsidetests/devicepolicy/app/DummyIme/Android.bp
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (C) 2020 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.
-
-android_test_helper_app {
-    name: "DummyIme",
-    resource_dirs: ["res"],
-    defaults: ["cts_defaults"],
-    srcs: ["src/**/*.java"],
-    static_libs: [
-        "cts-devicepolicy-suspensionchecker",
-    ],
-    test_suites: [
-        "arcts",
-        "cts",
-        "vts10",
-        "general-tests",
-    ],
-}
diff --git a/hostsidetests/devicepolicy/app/DummyIme/AndroidManifest.xml b/hostsidetests/devicepolicy/app/DummyIme/AndroidManifest.xml
deleted file mode 100644
index aae922a..0000000
--- a/hostsidetests/devicepolicy/app/DummyIme/AndroidManifest.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<!--
-/*
- * Copyright 2020, 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="com.android.cts.dummyime">
-    <application android:label="Dummy IME">
-        <service android:name="DummyIme"
-                android:permission="android.permission.BIND_INPUT_METHOD">
-            <intent-filter>
-                <action android:name="android.view.InputMethod" />
-            </intent-filter>
-            <meta-data android:name="android.view.im" android:resource="@xml/method" />
-        </service>
-        <activity android:name=".ImePreferences" android:label="Dummy IME Settings">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-            </intent-filter>
-        </activity>
-    </application>
-
-    <instrumentation
-        android:name="androidx.test.runner.AndroidJUnitRunner"
-        android:targetPackage="com.android.cts.dummyime">
-        <meta-data
-            android:name="listener"
-            android:value="com.android.cts.runner.CtsTestRunListener"/>
-    </instrumentation>
-</manifest>
diff --git a/hostsidetests/devicepolicy/app/DummyIme/res/xml/method.xml b/hostsidetests/devicepolicy/app/DummyIme/res/xml/method.xml
deleted file mode 100644
index bb54bbd..0000000
--- a/hostsidetests/devicepolicy/app/DummyIme/res/xml/method.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/**
- * Copyright (c) 2020, 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.
- */
--->
-
-<!-- The attributes in this XML file provide configuration information -->
-<!-- for the Search Manager. -->
-
-<input-method xmlns:android="http://schemas.android.com/apk/res/android"
-        android:settingsActivity="com.android.testing.dummyime.ImePreferences">
-    <subtype
-        android:label="Generic"
-        android:imeSubtypeLocale="en_US"
-        android:imeSubtypeMode="keyboard" />
-</input-method>
diff --git a/hostsidetests/devicepolicy/app/DummyIme/src/com/android/cts/dummyime/DummyIme.java b/hostsidetests/devicepolicy/app/DummyIme/src/com/android/cts/dummyime/DummyIme.java
deleted file mode 100644
index b5ca96b..0000000
--- a/hostsidetests/devicepolicy/app/DummyIme/src/com/android/cts/dummyime/DummyIme.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.dummyime;
-
-import android.inputmethodservice.InputMethodService;
-
-/**
- * Dummy IME implementation that basically does nothing.
- */
-public class DummyIme extends InputMethodService {
-
-    @Override
-    public boolean onEvaluateFullscreenMode() {
-        return false;
-    }
-
-    @Override
-    public boolean onEvaluateInputViewShown() {
-        return false;
-    }
-}
diff --git a/hostsidetests/devicepolicy/app/DummyIme/src/com/android/cts/dummyime/ImePreferences.java b/hostsidetests/devicepolicy/app/DummyIme/src/com/android/cts/dummyime/ImePreferences.java
deleted file mode 100644
index f6c838e..0000000
--- a/hostsidetests/devicepolicy/app/DummyIme/src/com/android/cts/dummyime/ImePreferences.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.dummyime;
-
-import android.preference.PreferenceActivity;
-
-/**
- * Dummy IME preference activity
- */
-public class ImePreferences extends PreferenceActivity {
-}
diff --git a/hostsidetests/devicepolicy/app/DummyLauncher/Android.bp b/hostsidetests/devicepolicy/app/DummyLauncher/Android.bp
deleted file mode 100644
index 36e0971..0000000
--- a/hostsidetests/devicepolicy/app/DummyLauncher/Android.bp
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (C) 2020 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.
-
-android_test_helper_app {
-    name: "DummyLauncher",
-    defaults: ["cts_defaults"],
-    srcs: ["src/**/*.java"],
-    static_libs: [
-        "cts-devicepolicy-suspensionchecker",
-    ],
-    test_suites: [
-        "arcts",
-        "cts",
-        "vts10",
-        "general-tests",
-    ],
-}
diff --git a/hostsidetests/devicepolicy/app/DummyLauncher/AndroidManifest.xml b/hostsidetests/devicepolicy/app/DummyLauncher/AndroidManifest.xml
deleted file mode 100644
index a80e9b4..0000000
--- a/hostsidetests/devicepolicy/app/DummyLauncher/AndroidManifest.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<!--
-/*
- * Copyright 2020, 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="com.android.cts.dummylauncher">
-    <application android:label="Dummy Launcher">
-        <activity android:name="android.app.Activity">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="android.intent.category.HOME"/>
-                <category android:name="android.intent.category.DEFAULT"/>
-            </intent-filter>
-        </activity>
-        <activity android:name=".QuietModeToggleActivity"
-                  android:exported="true"/>
-    </application>
-
-    <instrumentation
-        android:name="androidx.test.runner.AndroidJUnitRunner"
-        android:targetPackage="com.android.cts.dummylauncher">
-        <meta-data
-            android:name="listener"
-            android:value="com.android.cts.runner.CtsTestRunListener"/>
-    </instrumentation>
-</manifest>
diff --git a/hostsidetests/devicepolicy/app/DummyLauncher/src/com/android/cts/dummylauncher/QuietModeToggleActivity.java b/hostsidetests/devicepolicy/app/DummyLauncher/src/com/android/cts/dummylauncher/QuietModeToggleActivity.java
deleted file mode 100644
index e659f15..0000000
--- a/hostsidetests/devicepolicy/app/DummyLauncher/src/com/android/cts/dummylauncher/QuietModeToggleActivity.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.dummylauncher;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.os.Process;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.util.Log;
-
-import java.util.List;
-
-public class QuietModeToggleActivity extends Activity {
-    private static final String TAG = "QuietModeToggleActivity";
-    private static final String EXTRA_QUIET_MODE_STATE =
-            "com.android.cts.dummyactivity.QUIET_MODE_STATE";
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        toggleQuietMode();
-        finish();
-    }
-
-    private void toggleQuietMode() {
-        final boolean quietModeState = getIntent().getBooleanExtra(EXTRA_QUIET_MODE_STATE, false);
-        final UserManager userManager = UserManager.get(this);
-
-        final List<UserHandle> users = userManager.getUserProfiles();
-        if (users.size() != 2) {
-            Log.e(TAG, "Unexpected number of profiles: " + users.size());
-            return;
-        }
-
-        final UserHandle profileHandle =
-                users.get(0).equals(Process.myUserHandle()) ? users.get(1) : users.get(0);
-
-        final String quietModeStateString = quietModeState ? "enabled" : "disabled";
-        if (userManager.isQuietModeEnabled(profileHandle) == quietModeState) {
-            Log.w(TAG, "Quiet mode is already " + quietModeStateString);
-            return;
-        }
-
-        userManager.requestQuietModeEnabled(quietModeState, profileHandle);
-        Log.i(TAG, "Quiet mode for user " + profileHandle + " was set to " + quietModeStateString);
-    }
-}
\ No newline at end of file
diff --git a/hostsidetests/devicepolicy/app/HasLauncherActivityApp/Android.bp b/hostsidetests/devicepolicy/app/HasLauncherActivityApp/Android.bp
index 6ffd45a..f00d03a 100644
--- a/hostsidetests/devicepolicy/app/HasLauncherActivityApp/Android.bp
+++ b/hostsidetests/devicepolicy/app/HasLauncherActivityApp/Android.bp
@@ -27,7 +27,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
@@ -47,7 +46,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "no_launcher_activity_AndroidManifest.xml",
@@ -68,7 +66,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "no_permission_AndroidManifest.xml",
diff --git a/hostsidetests/devicepolicy/app/IntentReceiver/Android.bp b/hostsidetests/devicepolicy/app/IntentReceiver/Android.bp
index b809bd1..c3654ec 100644
--- a/hostsidetests/devicepolicy/app/IntentReceiver/Android.bp
+++ b/hostsidetests/devicepolicy/app/IntentReceiver/Android.bp
@@ -17,8 +17,8 @@
     defaults: ["cts_defaults"],
     srcs: ["src/**/*.java"],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     static_libs: [
         "androidx.legacy_legacy-support-v4",
@@ -30,7 +30,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/IntentSender/Android.bp b/hostsidetests/devicepolicy/app/IntentSender/Android.bp
index eb92ff4..2a83c8e 100644
--- a/hostsidetests/devicepolicy/app/IntentSender/Android.bp
+++ b/hostsidetests/devicepolicy/app/IntentSender/Android.bp
@@ -17,8 +17,8 @@
     defaults: ["cts_defaults"],
     srcs: ["src/**/*.java"],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     static_libs: [
         "ctstestrunner-axt",
@@ -30,7 +30,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/LauncherTests/Android.bp b/hostsidetests/devicepolicy/app/LauncherTests/Android.bp
index ac11845..239eb84 100644
--- a/hostsidetests/devicepolicy/app/LauncherTests/Android.bp
+++ b/hostsidetests/devicepolicy/app/LauncherTests/Android.bp
@@ -18,7 +18,7 @@
     srcs: ["src/**/*.java"],
     libs: [
         "junit",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     static_libs: [
         "androidx.legacy_legacy-support-v4",
@@ -31,7 +31,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/LauncherTestsSupport/Android.bp b/hostsidetests/devicepolicy/app/LauncherTestsSupport/Android.bp
index 13bc061..642748e 100644
--- a/hostsidetests/devicepolicy/app/LauncherTestsSupport/Android.bp
+++ b/hostsidetests/devicepolicy/app/LauncherTestsSupport/Android.bp
@@ -23,7 +23,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/Android.bp b/hostsidetests/devicepolicy/app/ManagedProfile/Android.bp
index 372eac7..565c88c 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/Android.bp
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/Android.bp
@@ -17,9 +17,9 @@
     defaults: ["cts_defaults"],
     srcs: ["src/**/*.java"],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "junit",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     static_libs: [
         "ctstestrunner-axt",
@@ -36,7 +36,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
     platform_apis: true,
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/AndroidManifest.xml b/hostsidetests/devicepolicy/app/ManagedProfile/AndroidManifest.xml
index e5786f6..befdc0c 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/AndroidManifest.xml
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/AndroidManifest.xml
@@ -118,14 +118,14 @@
         </activity>
         <activity android:name=".TestActivity" />
 
-        <service android:name=".DummyConnectionService"
+        <service android:name=".TestConnectionService"
                  android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE" >
             <intent-filter>
                 <action android:name="android.telecom.ConnectionService" />
             </intent-filter>
         </service>
 
-        <activity android:name=".DummyDialerActivity">
+        <activity android:name=".TestDialerActivity">
             <intent-filter>
                 <action android:name="android.intent.action.DIAL" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -169,7 +169,7 @@
         <activity android:name=".TimeoutActivity" android:exported="true"/>
 
         <activity
-            android:name=".DummyCrossProfileViewEventActivity"
+            android:name=".TestCrossProfileViewEventActivity"
             android:exported="true">
             <intent-filter>
                 <action android:name="android.provider.calendar.action.VIEW_MANAGED_PROFILE_CALENDAR_EVENT"/>
@@ -192,9 +192,9 @@
             </intent-filter>
         </receiver>
 
-        <!-- Dummy receiver that's decleared direct boot aware. This is needed to make the test app
+        <!-- Test receiver that's decleared direct boot aware. This is needed to make the test app
              executable by instrumentation before device unlock -->
-        <receiver android:name=".ResetPasswordWithTokenTest$DummyReceiver"
+        <receiver android:name=".ResetPasswordWithTokenTest$TestReceiver"
           android:directBootAware="true" >
           <intent-filter>
             <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/BasicTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/BasicTest.java
new file mode 100644
index 0000000..7d78b91
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/BasicTest.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.cts.managedprofile;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNotNull;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.test.InstrumentationRegistry;
+
+import com.android.compatibility.common.util.BlockingBroadcastReceiver;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Basic test to ensure some basic functionalities of work profile are working.
+ */
+public class BasicTest {
+    private static final ComponentName SIMPLE_APP_ACTIVITY =
+            new ComponentName(
+                    "com.android.cts.launcherapps.simpleapp",
+                    "com.android.cts.launcherapps.simpleapp.SimpleActivity");
+    /**
+     * Broadcast sent from com.android.cts.launcherapps.simpleapp.SimpleActivity.
+     */
+    private static final String ACTIVITY_LAUNCHED_ACTION =
+            "com.android.cts.launchertests.LauncherAppsTests.LAUNCHED_ACTION";
+
+    private Context mContext;
+
+    @Before
+    public void setup() {
+        mContext = InstrumentationRegistry.getTargetContext();
+    }
+
+    /**
+     * Verify that we can launch an app that installed in work profile only.
+     */
+    @Test
+    public void testLaunchAppInstalledInProfileOnly() throws Exception {
+        BlockingBroadcastReceiver receiver =
+                new BlockingBroadcastReceiver(mContext, ACTIVITY_LAUNCHED_ACTION);
+        try {
+            receiver.register();
+            Intent intent = new Intent();
+            intent.setComponent(SIMPLE_APP_ACTIVITY);
+            // Finish the activity after that.
+            intent.putExtra("finish", true);
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            mContext.startActivity(intent);
+            Intent receivedBroadcast = receiver.awaitForBroadcast();
+            assertNotNull(receivedBroadcast);
+            assertEquals(ACTIVITY_LAUNCHED_ACTION, receivedBroadcast.getAction());
+        } finally {
+            receiver.unregisterQuietly();
+        }
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileCalendarTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileCalendarTest.java
index 0c1cd8f..8fa9ff7 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileCalendarTest.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileCalendarTest.java
@@ -46,22 +46,22 @@
     public void testCrossProfileCalendarPackage() {
         requireRunningOnManagedProfile();
 
-        Set<String> whitelist = mDevicePolicyManager.getCrossProfileCalendarPackages(
+        Set<String> allowlist = mDevicePolicyManager.getCrossProfileCalendarPackages(
                 ADMIN_RECEIVER_COMPONENT);
-        assertThat(whitelist).isEmpty();
+        assertThat(allowlist).isEmpty();
 
         mDevicePolicyManager.setCrossProfileCalendarPackages(
                 ADMIN_RECEIVER_COMPONENT, new ArraySet<String>(Arrays.asList(MANAGED_PROFILE_PKG)));
-        whitelist = mDevicePolicyManager.getCrossProfileCalendarPackages(
+        allowlist = mDevicePolicyManager.getCrossProfileCalendarPackages(
                 ADMIN_RECEIVER_COMPONENT);
-        assertThat(whitelist.size()).isEqualTo(1);
-        assertThat(whitelist.contains(MANAGED_PROFILE_PKG)).isTrue();
+        assertThat(allowlist.size()).isEqualTo(1);
+        assertThat(allowlist.contains(MANAGED_PROFILE_PKG)).isTrue();
 
         mDevicePolicyManager.setCrossProfileCalendarPackages(
                 ADMIN_RECEIVER_COMPONENT, Collections.emptySet());
-        whitelist = mDevicePolicyManager.getCrossProfileCalendarPackages(
+        allowlist = mDevicePolicyManager.getCrossProfileCalendarPackages(
                 ADMIN_RECEIVER_COMPONENT);
-        assertThat(whitelist).isEmpty();
+        assertThat(allowlist).isEmpty();
     }
 
     // This method is to guard that particular tests are supposed to run on managed profile.
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileTest.java
index 6f13834..e7eb682 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileTest.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileTest.java
@@ -57,18 +57,18 @@
             Collections.singleton("test.package.name");
 
     private static final Set<String> ALL_CROSS_PROFILE_PACKAGES = Sets.newHashSet(
-            "com.android.cts.dummyapps.dummyapp1",
-            "com.android.cts.dummyapps.dummyapp2",
-            "com.android.cts.dummyapps.dummyapp3",
-            "com.android.cts.dummyapps.dummyapp4");
+            "com.android.cts.testapps.testapp1",
+            "com.android.cts.testapps.testapp2",
+            "com.android.cts.testapps.testapp3",
+            "com.android.cts.testapps.testapp4");
     private static final Set<String> SUBLIST_CROSS_PROFILE_PACKAGES =
             Sets.newHashSet(
-                    "com.android.cts.dummyapps.dummyapp1",
-                    "com.android.cts.dummyapps.dummyapp2");
+                    "com.android.cts.testapps.testapp1",
+                    "com.android.cts.testapps.testapp2");
     private static final Set<String> DIFF_CROSS_PROFILE_PACKAGES =
             Sets.newHashSet(
-                    "com.android.cts.dummyapps.dummyapp3",
-                    "com.android.cts.dummyapps.dummyapp4");
+                    "com.android.cts.testapps.testapp3",
+                    "com.android.cts.testapps.testapp4");
 
     private static final UiAutomation sUiAutomation =
             InstrumentationRegistry.getInstrumentation().getUiAutomation();
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileWidgetTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileWidgetTest.java
index c122b07..1062114 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileWidgetTest.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/CrossProfileWidgetTest.java
@@ -49,7 +49,7 @@
     }
 
     /**
-     * This test checks that the widget provider was successfully whitelisted and verifies that
+     * This test checks that the widget provider was successfully allowlisted and verifies that
      * if was added successfully and can be found inside the profile.
      */
     public void testCrossProfileWidgetProviderAdded() {
@@ -62,7 +62,7 @@
     }
 
     /**
-     * This test verifies that the widget provider was successfully removed from the whitelist.
+     * This test verifies that the widget provider was successfully removed from the allowlist.
      */
     public void testCrossProfileWidgetProviderRemoved() {
         List<String> providers = mDevicePolicyManager.getCrossProfileWidgetProviders(
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/DummyConnectionService.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/DummyConnectionService.java
deleted file mode 100644
index 7579cf7..0000000
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/DummyConnectionService.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * 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 com.android.cts.managedprofile;
-
-import android.net.Uri;
-import android.telecom.Connection;
-import android.telecom.ConnectionRequest;
-import android.telecom.ConnectionService;
-import android.telecom.DisconnectCause;
-import android.telecom.PhoneAccountHandle;
-import android.telecom.RemoteConference;
-import android.telecom.RemoteConnection;
-import android.telecom.TelecomManager;
-
-/**
- * A simple connection service that hangs up automatically for incoming and outgoing call.
- */
-public class DummyConnectionService extends ConnectionService {
-
-    public static final String MISSED_PHONE_NUMBER = "520";
-    public static final String NORMAL_PHONE_NUMBER = "886";
-
-    @Override
-    public Connection onCreateOutgoingConnection(PhoneAccountHandle connectionManagerPhoneAccount,
-            ConnectionRequest request) {
-        final DummyConnection connection = new DummyConnection();
-        connection.setAddress(request.getAddress(), TelecomManager.PRESENTATION_ALLOWED);
-        connection.setVideoState(request.getVideoState());
-        hangUpAsync(connection);
-        return connection;
-    }
-
-    @Override
-    public Connection onCreateIncomingConnection(PhoneAccountHandle connectionManagerPhoneAccount,
-            ConnectionRequest request) {
-        final DummyConnection connection = new DummyConnection();
-        connection.setVideoState(request.getVideoState());
-        final Uri address =
-                request.getExtras().getParcelable(TelecomManager.EXTRA_INCOMING_CALL_ADDRESS);
-        connection.setAddress(address, TelecomManager.PRESENTATION_ALLOWED);
-        hangUpAsync(connection);
-        return connection;
-    }
-
-    @Override
-    public void onConference(Connection connection1, Connection connection2) {
-    }
-
-    @Override
-    public void onRemoteExistingConnectionAdded(RemoteConnection connection) {
-    }
-
-    @Override
-    public void onRemoteConferenceAdded(RemoteConference conference) {
-    }
-
-    public static class DummyConnection extends Connection {
-
-        @Override
-        public void onAnswer() {
-            super.onAnswer();
-        }
-
-        @Override
-        public void onAnswer(int videoState) {
-            super.onAnswer(videoState);
-            setActive();
-        }
-
-        @Override
-        public void onReject() {
-            super.onReject();
-            setDisconnected(new DisconnectCause(DisconnectCause.REJECTED));
-            destroy();
-        }
-
-        @Override
-        public void onHold() {
-            super.onHold();
-            setOnHold();
-        }
-
-        @Override
-        public void onUnhold() {
-            super.onUnhold();
-            setActive();
-        }
-
-        @Override
-        public void onDisconnect() {
-            super.onDisconnect();
-            setDisconnected(new DisconnectCause(DisconnectCause.LOCAL));
-            destroy();
-        }
-
-        @Override
-        public void onAbort() {
-            super.onAbort();
-            setDisconnected(new DisconnectCause(DisconnectCause.UNKNOWN));
-            destroy();
-        }
-    }
-
-    private static int convertNumberToCause(String number) {
-        switch (number) {
-            case NORMAL_PHONE_NUMBER:
-                return DisconnectCause.LOCAL;
-            case MISSED_PHONE_NUMBER:
-                return DisconnectCause.MISSED;
-        }
-        throw new IllegalArgumentException("Should not happen");
-    }
-
-    /**
-     * Hang up the call after 5 second in a background thread.
-     * TODO: It is better if we could have a callback to know when we can disconnect the call.
-     */
-    private static void hangUpAsync(final Connection connection) {
-        final int cause = convertNumberToCause(connection.getAddress().getSchemeSpecificPart());
-        new Thread(new Runnable() {
-            @Override
-            public void run() {
-                try {
-                    Thread.sleep(5000);
-                    connection.setDisconnected(new DisconnectCause(cause));
-                } catch (InterruptedException ex) {
-                    // let it be
-                }
-            }
-        }).start();
-    }
-}
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/DummyCrossProfileViewEventActivity.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/DummyCrossProfileViewEventActivity.java
deleted file mode 100644
index ae48084..0000000
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/DummyCrossProfileViewEventActivity.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.managedprofile;
-
-import static com.android.cts.managedprofile.BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT;
-
-import android.app.Activity;
-import android.app.admin.DevicePolicyManager;
-import android.content.Intent;
-import android.os.Bundle;
-import android.provider.CalendarContract;
-import android.widget.TextView;
-
-public class DummyCrossProfileViewEventActivity extends Activity {
-
-    private DevicePolicyManager mDevicePolicyManager;
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.view_event);
-        mDevicePolicyManager = getSystemService(DevicePolicyManager.class);
-    }
-
-    @Override
-    public void onStart() {
-        super.onStart();
-        // Only set the text when managed profile is getting the
-        // ACTION_VIEW_MANAGED_PROFILE_CALENDAR_EVENT intent.
-        final Intent intent = getIntent();
-        if (intent.getAction() == CalendarContract.ACTION_VIEW_MANAGED_PROFILE_CALENDAR_EVENT
-                && isManagedProfile()) {
-            TextView textView = findViewById(R.id.view_event_text);
-            final Bundle bundle = getIntent().getExtras();
-            final String textVeiwString = getViewEventCrossProfileString(
-                    (long)bundle.get(CalendarContract.EXTRA_EVENT_ID),
-                    (long)bundle.get(CalendarContract.EXTRA_EVENT_BEGIN_TIME),
-                    (long)bundle.get(CalendarContract.EXTRA_EVENT_END_TIME),
-                    (boolean)bundle.get(CalendarContract.EXTRA_EVENT_ALL_DAY),
-                    getIntent().getFlags()
-            );
-            textView.setText(textVeiwString);
-        }
-    }
-
-    private String getViewEventCrossProfileString(long eventId, long start, long end,
-            boolean allDay, int flags) {
-        return String.format("id:%d, start:%d, end:%d, allday:%b, flag:%d", eventId,
-                start, end, allDay, flags);
-    }
-
-    private boolean isManagedProfile() {
-        String adminPackage = ADMIN_RECEIVER_COMPONENT.getPackageName();
-        return mDevicePolicyManager.isProfileOwnerApp(adminPackage);
-    }
-}
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/DummyDialerActivity.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/DummyDialerActivity.java
deleted file mode 100644
index 58fc601..0000000
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/DummyDialerActivity.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * 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 com.android.cts.managedprofile;
-
-import android.app.Activity;
-
-/**
- * To run {@link PhoneAccountTest}, we need to have a dialer in managed profile.
- */
-public class DummyDialerActivity extends Activity {
-}
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/NotificationListenerTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/NotificationListenerTest.java
index d7b0d00..b53bd03 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/NotificationListenerTest.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/NotificationListenerTest.java
@@ -82,21 +82,21 @@
     }
 
     @Test
-    public void testSetEmptyWhitelist() throws Exception {
+    public void testSetEmptyAllowlist() throws Exception {
         mDpm.setPermittedCrossProfileNotificationListeners(
                 BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT,
                 Collections.<String>emptyList());
     }
 
     @Test
-    public void testAddListenerToWhitelist() throws Exception {
+    public void testAddListenerToAllowlist() throws Exception {
         mDpm.setPermittedCrossProfileNotificationListeners(
                 BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT,
                 Collections.singletonList(mContext.getPackageName()));
     }
 
     @Test
-    public void testSetNullWhitelist() throws Exception {
+    public void testSetNullAllowlist() throws Exception {
         mDpm.setPermittedCrossProfileNotificationListeners(
                 BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT, null);
     }
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ParentProfileTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ParentProfileTest.java
index 5bcf4be..ad534dd 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ParentProfileTest.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ParentProfileTest.java
@@ -40,7 +40,7 @@
 public class ParentProfileTest extends BaseManagedProfileTest {
 
     /**
-     * A whitelist of public API methods in {@link android.app.admin.DevicePolicyManager}
+     * An allowlist of public API methods in {@link android.app.admin.DevicePolicyManager}
      * that are supported on a parent profile.
      */
     private static final ImmutableSet<String> SUPPORTED_APIS = new ImmutableSet.Builder<String>()
@@ -106,7 +106,7 @@
 
     /**
      * Verify that all public API methods of {@link android.app.admin.DevicePolicyManager},
-     * except those explicitly whitelisted in {@link #SUPPORTED_APIS},
+     * except those explicitly allowed in {@link #SUPPORTED_APIS},
      * throw a {@link SecurityException} when called on a parent profile.
      *
      * <p><b>Note:</b> System API methods (i.e. those with the
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PhoneAccountTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PhoneAccountTest.java
index 7d108c8..9da0eba 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PhoneAccountTest.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/PhoneAccountTest.java
@@ -17,8 +17,8 @@
 
 package com.android.cts.managedprofile;
 
-import static com.android.cts.managedprofile.DummyConnectionService.MISSED_PHONE_NUMBER;
-import static com.android.cts.managedprofile.DummyConnectionService.NORMAL_PHONE_NUMBER;
+import static com.android.cts.managedprofile.TestConnectionService.MISSED_PHONE_NUMBER;
+import static com.android.cts.managedprofile.TestConnectionService.NORMAL_PHONE_NUMBER;
 
 import android.app.Instrumentation;
 import android.content.ComponentName;
@@ -70,7 +70,7 @@
 
     private static final PhoneAccountHandle PHONE_ACCOUNT_HANDLE = new PhoneAccountHandle(
             new ComponentName(MANAGED_PROFILE_PKG,
-                    DummyConnectionService.class.getName()), CALL_PROVIDER_ID,
+                    TestConnectionService.class.getName()), CALL_PROVIDER_ID,
             Process.myUserHandle());
 
     @Override
@@ -245,7 +245,7 @@
         Cursor cursor = null;
         try {
             final String connectionServiceComponentName = new ComponentName(mContext,
-                DummyConnectionService.class).flattenToString();
+                TestConnectionService.class).flattenToString();
             cursor = mContext.getContentResolver()
                 .query(Calls.CONTENT_URI, null,
                     QUERY_CALL_THROUGH_OUR_CONNECTION_SERVICE + " AND " +
@@ -266,7 +266,7 @@
 
     private void cleanupCall(String phoneNumber, boolean verifyDeletion) {
         final String connectionServiceComponentName = new ComponentName(mContext,
-                DummyConnectionService.class).flattenToString();
+                TestConnectionService.class).flattenToString();
         int numRowDeleted = mContext.getContentResolver()
                 .delete(Calls.CONTENT_URI, QUERY_CALL_THROUGH_OUR_CONNECTION_SERVICE,
                         new String[]{phoneNumber, connectionServiceComponentName});
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ResetPasswordWithTokenTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ResetPasswordWithTokenTest.java
index 54246a2..0f3e31c 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ResetPasswordWithTokenTest.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/ResetPasswordWithTokenTest.java
@@ -32,10 +32,10 @@
     private static final byte[] token = "abcdefghijklmnopqrstuvwxyz0123456789".getBytes();
 
     /**
-     * A dummy receiver marked as direct boot aware in manifest to make this test app
+     * A test receiver marked as direct boot aware in manifest to make this test app
      * runnable by instrumentation before FBE unlock.
      */
-    public static class DummyReceiver extends BroadcastReceiver {
+    public static class TestReceiver extends BroadcastReceiver {
         @Override
         public void onReceive(Context context, Intent intent) {
         }
@@ -94,4 +94,4 @@
         assertTrue(mDevicePolicyManager.setResetPasswordToken(ADMIN_RECEIVER_COMPONENT, token));
         assertTrue(mDevicePolicyManager.isResetPasswordTokenActive(ADMIN_RECEIVER_COMPONENT));
     }
-}
\ No newline at end of file
+}
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/SanityTest.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/SanityTest.java
deleted file mode 100644
index 6a8b87a..0000000
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/SanityTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.cts.managedprofile;
-
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertNotNull;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-
-import androidx.test.InstrumentationRegistry;
-
-import com.android.compatibility.common.util.BlockingBroadcastReceiver;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Basic sanity test to ensure some basic functionalities of work profile are working.
- */
-public class SanityTest {
-    private static final ComponentName SIMPLE_APP_ACTIVITY =
-            new ComponentName(
-                    "com.android.cts.launcherapps.simpleapp",
-                    "com.android.cts.launcherapps.simpleapp.SimpleActivity");
-    /**
-     * Broadcast sent from com.android.cts.launcherapps.simpleapp.SimpleActivity.
-     */
-    private static final String ACTIVITY_LAUNCHED_ACTION =
-            "com.android.cts.launchertests.LauncherAppsTests.LAUNCHED_ACTION";
-
-    private Context mContext;
-
-    @Before
-    public void setup() {
-        mContext = InstrumentationRegistry.getTargetContext();
-    }
-
-    /**
-     * Verify that we can launch an app that installed in work profile only.
-     */
-    @Test
-    public void testLaunchAppInstalledInProfileOnly() throws Exception {
-        BlockingBroadcastReceiver receiver =
-                new BlockingBroadcastReceiver(mContext, ACTIVITY_LAUNCHED_ACTION);
-        try {
-            receiver.register();
-            Intent intent = new Intent();
-            intent.setComponent(SIMPLE_APP_ACTIVITY);
-            // Finish the activity after that.
-            intent.putExtra("finish", true);
-            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-            mContext.startActivity(intent);
-            Intent receivedBroadcast = receiver.awaitForBroadcast();
-            assertNotNull(receivedBroadcast);
-            assertEquals(ACTIVITY_LAUNCHED_ACTION, receivedBroadcast.getAction());
-        } finally {
-            receiver.unregisterQuietly();
-        }
-    }
-}
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/TestActivity.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/TestActivity.java
index b0e22b6..25e56b1 100644
--- a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/TestActivity.java
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/TestActivity.java
@@ -23,7 +23,7 @@
 import java.util.concurrent.TimeUnit;
 
 /**
- * Dummy activity necessary for the tests.
+ * Test activity necessary for the tests.
  */
 public class TestActivity extends Activity {
     private static final String TAG = TestActivity.class.getName();
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/TestConnectionService.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/TestConnectionService.java
new file mode 100644
index 0000000..a8b0e10
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/TestConnectionService.java
@@ -0,0 +1,146 @@
+/*
+ * 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 com.android.cts.managedprofile;
+
+import android.net.Uri;
+import android.telecom.Connection;
+import android.telecom.ConnectionRequest;
+import android.telecom.ConnectionService;
+import android.telecom.DisconnectCause;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.RemoteConference;
+import android.telecom.RemoteConnection;
+import android.telecom.TelecomManager;
+
+/**
+ * A simple connection service that hangs up automatically for incoming and outgoing call.
+ */
+public class TestConnectionService extends ConnectionService {
+
+    public static final String MISSED_PHONE_NUMBER = "520";
+    public static final String NORMAL_PHONE_NUMBER = "886";
+
+    @Override
+    public Connection onCreateOutgoingConnection(PhoneAccountHandle connectionManagerPhoneAccount,
+            ConnectionRequest request) {
+        final TestConnection connection = new TestConnection();
+        connection.setAddress(request.getAddress(), TelecomManager.PRESENTATION_ALLOWED);
+        connection.setVideoState(request.getVideoState());
+        hangUpAsync(connection);
+        return connection;
+    }
+
+    @Override
+    public Connection onCreateIncomingConnection(PhoneAccountHandle connectionManagerPhoneAccount,
+            ConnectionRequest request) {
+        final TestConnection connection = new TestConnection();
+        connection.setVideoState(request.getVideoState());
+        final Uri address =
+                request.getExtras().getParcelable(TelecomManager.EXTRA_INCOMING_CALL_ADDRESS);
+        connection.setAddress(address, TelecomManager.PRESENTATION_ALLOWED);
+        hangUpAsync(connection);
+        return connection;
+    }
+
+    @Override
+    public void onConference(Connection connection1, Connection connection2) {
+    }
+
+    @Override
+    public void onRemoteExistingConnectionAdded(RemoteConnection connection) {
+    }
+
+    @Override
+    public void onRemoteConferenceAdded(RemoteConference conference) {
+    }
+
+    public static class TestConnection extends Connection {
+
+        @Override
+        public void onAnswer() {
+            super.onAnswer();
+        }
+
+        @Override
+        public void onAnswer(int videoState) {
+            super.onAnswer(videoState);
+            setActive();
+        }
+
+        @Override
+        public void onReject() {
+            super.onReject();
+            setDisconnected(new DisconnectCause(DisconnectCause.REJECTED));
+            destroy();
+        }
+
+        @Override
+        public void onHold() {
+            super.onHold();
+            setOnHold();
+        }
+
+        @Override
+        public void onUnhold() {
+            super.onUnhold();
+            setActive();
+        }
+
+        @Override
+        public void onDisconnect() {
+            super.onDisconnect();
+            setDisconnected(new DisconnectCause(DisconnectCause.LOCAL));
+            destroy();
+        }
+
+        @Override
+        public void onAbort() {
+            super.onAbort();
+            setDisconnected(new DisconnectCause(DisconnectCause.UNKNOWN));
+            destroy();
+        }
+    }
+
+    private static int convertNumberToCause(String number) {
+        switch (number) {
+            case NORMAL_PHONE_NUMBER:
+                return DisconnectCause.LOCAL;
+            case MISSED_PHONE_NUMBER:
+                return DisconnectCause.MISSED;
+        }
+        throw new IllegalArgumentException("Should not happen");
+    }
+
+    /**
+     * Hang up the call after 5 second in a background thread.
+     * TODO: It is better if we could have a callback to know when we can disconnect the call.
+     */
+    private static void hangUpAsync(final Connection connection) {
+        final int cause = convertNumberToCause(connection.getAddress().getSchemeSpecificPart());
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    Thread.sleep(5000);
+                    connection.setDisconnected(new DisconnectCause(cause));
+                } catch (InterruptedException ex) {
+                    // let it be
+                }
+            }
+        }).start();
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/TestCrossProfileViewEventActivity.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/TestCrossProfileViewEventActivity.java
new file mode 100644
index 0000000..04e6886
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/TestCrossProfileViewEventActivity.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.managedprofile;
+
+import static com.android.cts.managedprofile.BaseManagedProfileTest.ADMIN_RECEIVER_COMPONENT;
+
+import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
+import android.content.Intent;
+import android.os.Bundle;
+import android.provider.CalendarContract;
+import android.widget.TextView;
+
+public class TestCrossProfileViewEventActivity extends Activity {
+
+    private DevicePolicyManager mDevicePolicyManager;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.view_event);
+        mDevicePolicyManager = getSystemService(DevicePolicyManager.class);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        // Only set the text when managed profile is getting the
+        // ACTION_VIEW_MANAGED_PROFILE_CALENDAR_EVENT intent.
+        final Intent intent = getIntent();
+        if (intent.getAction() == CalendarContract.ACTION_VIEW_MANAGED_PROFILE_CALENDAR_EVENT
+                && isManagedProfile()) {
+            TextView textView = findViewById(R.id.view_event_text);
+            final Bundle bundle = getIntent().getExtras();
+            final String textVeiwString = getViewEventCrossProfileString(
+                    (long)bundle.get(CalendarContract.EXTRA_EVENT_ID),
+                    (long)bundle.get(CalendarContract.EXTRA_EVENT_BEGIN_TIME),
+                    (long)bundle.get(CalendarContract.EXTRA_EVENT_END_TIME),
+                    (boolean)bundle.get(CalendarContract.EXTRA_EVENT_ALL_DAY),
+                    getIntent().getFlags()
+            );
+            textView.setText(textVeiwString);
+        }
+    }
+
+    private String getViewEventCrossProfileString(long eventId, long start, long end,
+            boolean allDay, int flags) {
+        return String.format("id:%d, start:%d, end:%d, allday:%b, flag:%d", eventId,
+                start, end, allDay, flags);
+    }
+
+    private boolean isManagedProfile() {
+        String adminPackage = ADMIN_RECEIVER_COMPONENT.getPackageName();
+        return mDevicePolicyManager.isProfileOwnerApp(adminPackage);
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/TestDialerActivity.java b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/TestDialerActivity.java
new file mode 100644
index 0000000..2fd4b07
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/ManagedProfile/src/com/android/cts/managedprofile/TestDialerActivity.java
@@ -0,0 +1,26 @@
+/*
+ * 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 com.android.cts.managedprofile;
+
+import android.app.Activity;
+
+/**
+ * To run {@link PhoneAccountTest}, we need to have a dialer in managed profile.
+ */
+public class TestDialerActivity extends Activity {
+}
diff --git a/hostsidetests/devicepolicy/app/MeteredDataTestApp/Android.bp b/hostsidetests/devicepolicy/app/MeteredDataTestApp/Android.bp
index c3ae579..87dd24b 100644
--- a/hostsidetests/devicepolicy/app/MeteredDataTestApp/Android.bp
+++ b/hostsidetests/devicepolicy/app/MeteredDataTestApp/Android.bp
@@ -20,7 +20,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/devicepolicy/app/NotificationSender/Android.bp b/hostsidetests/devicepolicy/app/NotificationSender/Android.bp
index e8fe0e4..774f4ca 100644
--- a/hostsidetests/devicepolicy/app/NotificationSender/Android.bp
+++ b/hostsidetests/devicepolicy/app/NotificationSender/Android.bp
@@ -19,7 +19,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/devicepolicy/app/NotificationSender/src/com/android/cts/managedprofiletests/notificationsender/SendNotification.java b/hostsidetests/devicepolicy/app/NotificationSender/src/com/android/cts/managedprofiletests/notificationsender/SendNotification.java
index 80c4073..2730a8a 100644
--- a/hostsidetests/devicepolicy/app/NotificationSender/src/com/android/cts/managedprofiletests/notificationsender/SendNotification.java
+++ b/hostsidetests/devicepolicy/app/NotificationSender/src/com/android/cts/managedprofiletests/notificationsender/SendNotification.java
@@ -29,7 +29,7 @@
 
 /**
  * A simple activity to post notifications to test notification
- * listener whitelists.
+ * listener allowlists.
  */
 public class SendNotification extends Activity {
 
diff --git a/hostsidetests/devicepolicy/app/PackageInstaller/Android.bp b/hostsidetests/devicepolicy/app/PackageInstaller/Android.bp
index beb0c3a..8ffabca 100644
--- a/hostsidetests/devicepolicy/app/PackageInstaller/Android.bp
+++ b/hostsidetests/devicepolicy/app/PackageInstaller/Android.bp
@@ -17,8 +17,8 @@
     defaults: ["cts_defaults"],
     srcs: ["src/**/*.java"],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     static_libs: [
         "androidx.legacy_legacy-support-v4",
@@ -31,7 +31,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/PasswordComplexity/Android.bp b/hostsidetests/devicepolicy/app/PasswordComplexity/Android.bp
index f91677e..f2a77fb 100644
--- a/hostsidetests/devicepolicy/app/PasswordComplexity/Android.bp
+++ b/hostsidetests/devicepolicy/app/PasswordComplexity/Android.bp
@@ -21,15 +21,14 @@
         "compatibility-device-util-axt",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     sdk_version: "test_current",
     // tag this module as a cts test artifact
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/PrintingApp/Android.bp b/hostsidetests/devicepolicy/app/PrintingApp/Android.bp
index 7d30624..c304b08 100644
--- a/hostsidetests/devicepolicy/app/PrintingApp/Android.bp
+++ b/hostsidetests/devicepolicy/app/PrintingApp/Android.bp
@@ -21,7 +21,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/ProfileOwner/Android.bp b/hostsidetests/devicepolicy/app/ProfileOwner/Android.bp
index 5728315..80ac6cb 100644
--- a/hostsidetests/devicepolicy/app/ProfileOwner/Android.bp
+++ b/hostsidetests/devicepolicy/app/ProfileOwner/Android.bp
@@ -19,9 +19,9 @@
     min_sdk_version: "24",
     srcs: ["src/**/*.java"],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "junit",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     static_libs: [
         "ctstestrunner-axt",
@@ -31,7 +31,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/SharingApps/Android.bp b/hostsidetests/devicepolicy/app/SharingApps/Android.bp
index 460fe55..161a32c 100644
--- a/hostsidetests/devicepolicy/app/SharingApps/Android.bp
+++ b/hostsidetests/devicepolicy/app/SharingApps/Android.bp
@@ -18,8 +18,8 @@
     platform_apis: true,
     srcs: ["sharingapp1/src/**/*.java"],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     static_libs: [
         "compatibility-device-util-axt",
@@ -32,7 +32,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "sharingapp1/AndroidManifest.xml",
@@ -44,8 +43,8 @@
     platform_apis: true,
     srcs: ["sharingapp2/src/**/*.java"],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     static_libs: [
         "compatibility-device-util-axt",
@@ -58,7 +57,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "sharingapp2/AndroidManifest.xml",
diff --git a/hostsidetests/devicepolicy/app/SharingApps/sharingapp1/AndroidManifest.xml b/hostsidetests/devicepolicy/app/SharingApps/sharingapp1/AndroidManifest.xml
index e6c7f42..7edb265 100644
--- a/hostsidetests/devicepolicy/app/SharingApps/sharingapp1/AndroidManifest.xml
+++ b/hostsidetests/devicepolicy/app/SharingApps/sharingapp1/AndroidManifest.xml
@@ -16,7 +16,7 @@
   -->
 
 <!--
-  ~ A dummy app used for when you need to install test packages that have a functioning package name
+  ~ A test app used for when you need to install test packages that have a functioning package name
   ~ and UID. For example, you could use it to set permissions or app-ops.
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
diff --git a/hostsidetests/devicepolicy/app/SharingApps/sharingapp2/AndroidManifest.xml b/hostsidetests/devicepolicy/app/SharingApps/sharingapp2/AndroidManifest.xml
index dbd3be3..3bdecab 100644
--- a/hostsidetests/devicepolicy/app/SharingApps/sharingapp2/AndroidManifest.xml
+++ b/hostsidetests/devicepolicy/app/SharingApps/sharingapp2/AndroidManifest.xml
@@ -16,7 +16,7 @@
   -->
 
 <!--
-  ~ A dummy app used for when you need to install test packages that have a functioning package name
+  ~ A test app used for when you need to install test packages that have a functioning package name
   ~ and UID. For example, you could use it to set permissions or app-ops.
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
diff --git a/hostsidetests/devicepolicy/app/SimpleApp/Android.bp b/hostsidetests/devicepolicy/app/SimpleApp/Android.bp
index 1a6ebf8..3b80c07 100644
--- a/hostsidetests/devicepolicy/app/SimpleApp/Android.bp
+++ b/hostsidetests/devicepolicy/app/SimpleApp/Android.bp
@@ -20,7 +20,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/devicepolicy/app/SimplePreMApp/Android.bp b/hostsidetests/devicepolicy/app/SimplePreMApp/Android.bp
index b9b6f8d..132b724 100644
--- a/hostsidetests/devicepolicy/app/SimplePreMApp/Android.bp
+++ b/hostsidetests/devicepolicy/app/SimplePreMApp/Android.bp
@@ -23,7 +23,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/SimpleSmsApp/Android.bp b/hostsidetests/devicepolicy/app/SimpleSmsApp/Android.bp
index f6ad171..25c5b27 100644
--- a/hostsidetests/devicepolicy/app/SimpleSmsApp/Android.bp
+++ b/hostsidetests/devicepolicy/app/SimpleSmsApp/Android.bp
@@ -23,7 +23,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
\ No newline at end of file
diff --git a/hostsidetests/devicepolicy/app/SingleAdminApp/Android.bp b/hostsidetests/devicepolicy/app/SingleAdminApp/Android.bp
index 0f89feb..446ae6f 100644
--- a/hostsidetests/devicepolicy/app/SingleAdminApp/Android.bp
+++ b/hostsidetests/devicepolicy/app/SingleAdminApp/Android.bp
@@ -17,7 +17,7 @@
     defaults: ["cts_defaults"],
     srcs: ["src/**/*.java"],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "junit",
     ],
     static_libs: [
@@ -31,7 +31,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/TestApps/Android.bp b/hostsidetests/devicepolicy/app/TestApps/Android.bp
new file mode 100644
index 0000000..9abed34
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/TestApps/Android.bp
@@ -0,0 +1,113 @@
+// Copyright (C) 2020 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.
+
+android_test_helper_app {
+    name: "TestApp1",
+    defaults: ["cts_defaults"],
+    platform_apis: true,
+    srcs: ["testapp1/src/**/*.java"],
+    libs: [
+        "android.test.runner",
+        "android.test.base",
+    ],
+    static_libs: [
+        "compatibility-device-util-axt",
+        "ctstestrunner-axt",
+        "ub-uiautomator",
+        "cts-security-test-support-library",
+        "androidx.legacy_legacy-support-v4",
+    ],
+    min_sdk_version: "23",
+    // tag this module as a cts test artifact
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+    manifest: "testapp1/AndroidManifest.xml",
+}
+
+android_test_helper_app {
+    name: "TestApp2",
+    defaults: ["cts_defaults"],
+    platform_apis: true,
+    srcs: ["testapp2/src/**/*.java"],
+    libs: [
+        "android.test.runner",
+        "android.test.base",
+    ],
+    static_libs: [
+        "compatibility-device-util-axt",
+        "ctstestrunner-axt",
+        "ub-uiautomator",
+        "cts-security-test-support-library",
+        "androidx.legacy_legacy-support-v4",
+    ],
+    min_sdk_version: "23",
+    // tag this module as a cts test artifact
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+    manifest: "testapp2/AndroidManifest.xml",
+}
+
+android_test_helper_app {
+    name: "TestApp3",
+    defaults: ["cts_defaults"],
+    platform_apis: true,
+    srcs: ["testapp3/src/**/*.java"],
+    libs: [
+        "android.test.runner",
+        "android.test.base",
+    ],
+    static_libs: [
+        "compatibility-device-util-axt",
+        "ctstestrunner-axt",
+        "ub-uiautomator",
+        "cts-security-test-support-library",
+        "androidx.legacy_legacy-support-v4",
+    ],
+    min_sdk_version: "23",
+    // tag this module as a cts test artifact
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+    manifest: "testapp3/AndroidManifest.xml",
+}
+
+android_test_helper_app {
+    name: "TestApp4",
+    defaults: ["cts_defaults"],
+    platform_apis: true,
+    srcs: ["testapp4/src/**/*.java"],
+    libs: [
+        "android.test.runner",
+        "android.test.base",
+    ],
+    static_libs: [
+        "compatibility-device-util-axt",
+        "ctstestrunner-axt",
+        "ub-uiautomator",
+        "cts-security-test-support-library",
+        "androidx.legacy_legacy-support-v4",
+    ],
+    min_sdk_version: "23",
+    // tag this module as a cts test artifact
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+    manifest: "testapp4/AndroidManifest.xml",
+}
diff --git a/hostsidetests/devicepolicy/app/TestApps/testapp1/AndroidManifest.xml b/hostsidetests/devicepolicy/app/TestApps/testapp1/AndroidManifest.xml
new file mode 100644
index 0000000..ca2a8be
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/TestApps/testapp1/AndroidManifest.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2020 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.
+  -->
+
+<!--
+  ~ A test app used for when you need to install test packages that have a functioning package name
+  ~ and UID. For example, you could use it to set permissions or app-ops.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.testapps.testapp1">
+    <uses-permission android:name="android.permission.INTERACT_ACROSS_PROFILES"/>
+    <application android:testOnly="true"
+            android:crossProfile="true">
+        <uses-library android:name="android.test.runner" />
+        <receiver android:name=".CanInteractAcrossProfilesChangedReceiver">
+            <intent-filter>
+                <action android:name="android.content.pm.action.CAN_INTERACT_ACROSS_PROFILES_CHANGED" />
+            </intent-filter>
+        </receiver>
+        <activity
+            android:name="android.app.Activity"
+            android:exported="true">
+        </activity>
+    </application>
+</manifest>
diff --git a/hostsidetests/devicepolicy/app/TestApps/testapp1/src/CanInteractAcrossProfilesChangedReceiver.java b/hostsidetests/devicepolicy/app/TestApps/testapp1/src/CanInteractAcrossProfilesChangedReceiver.java
new file mode 100644
index 0000000..e73cc44
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/TestApps/testapp1/src/CanInteractAcrossProfilesChangedReceiver.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.testapps.testapp1;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Process;
+import android.util.Log;
+
+public class CanInteractAcrossProfilesChangedReceiver extends BroadcastReceiver {
+    private static final String TAG = "Test1Receiver";
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        Log.w(TAG, context.getApplicationContext().getPackageName() + "#" + intent.getAction()
+                + "#" + Process.myUserHandle().getIdentifier());
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/TestApps/testapp2/AndroidManifest.xml b/hostsidetests/devicepolicy/app/TestApps/testapp2/AndroidManifest.xml
new file mode 100644
index 0000000..b6f934c
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/TestApps/testapp2/AndroidManifest.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2020 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.
+  -->
+
+<!--
+  ~ A test app used for when you need to install test packages that have a functioning package name
+  ~ and UID. For example, you could use it to set permissions or app-ops.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="com.android.cts.testapps.testapp2">
+    <uses-permission android:name="android.permission.INTERACT_ACROSS_PROFILES"/>
+    <application android:testOnly="true"
+                 android:crossProfile="true">
+        <uses-library android:name="android.test.runner" />
+        <receiver android:name=".CanInteractAcrossProfilesChangedReceiver">
+            <intent-filter>
+                <action android:name="android.content.pm.action.CAN_INTERACT_ACROSS_PROFILES_CHANGED" />
+            </intent-filter>
+        </receiver>
+        <activity
+            android:name="android.app.Activity"
+            android:exported="true">
+        </activity>
+    </application>
+</manifest>
diff --git a/hostsidetests/devicepolicy/app/TestApps/testapp2/src/CanInteractAcrossProfilesChangedReceiver.java b/hostsidetests/devicepolicy/app/TestApps/testapp2/src/CanInteractAcrossProfilesChangedReceiver.java
new file mode 100644
index 0000000..db62418
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/TestApps/testapp2/src/CanInteractAcrossProfilesChangedReceiver.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.testapps.testapp2;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Process;
+import android.util.Log;
+
+public class CanInteractAcrossProfilesChangedReceiver extends BroadcastReceiver {
+    private static final String TAG = "Test2Receiver";
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        Log.w(TAG, context.getApplicationContext().getPackageName() + "#" + intent.getAction()
+                + "#" + Process.myUserHandle().getIdentifier());
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/TestApps/testapp3/AndroidManifest.xml b/hostsidetests/devicepolicy/app/TestApps/testapp3/AndroidManifest.xml
new file mode 100644
index 0000000..e9b824a
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/TestApps/testapp3/AndroidManifest.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2020 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.
+  -->
+
+<!--
+  ~ A test app used for when you need to install test packages that have a functioning package name
+  ~ and UID. For example, you could use it to set permissions or app-ops.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="com.android.cts.testapps.testapp3">
+    <uses-permission android:name="android.permission.INTERACT_ACROSS_PROFILES"/>
+    <application android:testOnly="true"
+                 android:crossProfile="true">
+        <uses-library android:name="android.test.runner" />
+        <receiver android:name=".CanInteractAcrossProfilesChangedReceiver">
+            <intent-filter>
+                <action android:name="android.content.pm.action.CAN_INTERACT_ACROSS_PROFILES_CHANGED" />
+            </intent-filter>
+        </receiver>
+        <activity
+            android:name="android.app.Activity"
+            android:exported="true">
+        </activity>
+    </application>
+</manifest>
diff --git a/hostsidetests/devicepolicy/app/TestApps/testapp3/src/CanInteractAcrossProfilesChangedReceiver.java b/hostsidetests/devicepolicy/app/TestApps/testapp3/src/CanInteractAcrossProfilesChangedReceiver.java
new file mode 100644
index 0000000..30f91f8
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/TestApps/testapp3/src/CanInteractAcrossProfilesChangedReceiver.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.testapps.testapp3;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Process;
+import android.util.Log;
+
+public class CanInteractAcrossProfilesChangedReceiver extends BroadcastReceiver {
+    private static final String TAG = "Test3Receiver";
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        Log.w(TAG, context.getApplicationContext().getPackageName() + "#" + intent.getAction()
+                + "#" + Process.myUserHandle().getIdentifier());
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/TestApps/testapp4/AndroidManifest.xml b/hostsidetests/devicepolicy/app/TestApps/testapp4/AndroidManifest.xml
new file mode 100644
index 0000000..ae8adec
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/TestApps/testapp4/AndroidManifest.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2020 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.
+  -->
+
+<!--
+  ~ A test app used for when you need to install test packages that have a functioning package name
+  ~ and UID. For example, you could use it to set permissions or app-ops.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="com.android.cts.testapps.testapp4">
+    <uses-permission android:name="android.permission.INTERACT_ACROSS_PROFILES"/>
+    <application android:testOnly="true"
+                 android:crossProfile="true">
+        <uses-library android:name="android.test.runner" />
+        <receiver android:name=".CanInteractAcrossProfilesChangedReceiver">
+            <intent-filter>
+                <action android:name="android.content.pm.action.CAN_INTERACT_ACROSS_PROFILES_CHANGED" />
+            </intent-filter>
+        </receiver>
+        <activity
+            android:name="android.app.Activity"
+            android:exported="true">
+        </activity>
+    </application>
+</manifest>
diff --git a/hostsidetests/devicepolicy/app/TestApps/testapp4/src/CanInteractAcrossProfilesChangedReceiver.java b/hostsidetests/devicepolicy/app/TestApps/testapp4/src/CanInteractAcrossProfilesChangedReceiver.java
new file mode 100644
index 0000000..25e4b1a
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/TestApps/testapp4/src/CanInteractAcrossProfilesChangedReceiver.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.testapps.testapp4;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Process;
+import android.util.Log;
+
+public class CanInteractAcrossProfilesChangedReceiver extends BroadcastReceiver {
+    private static final String TAG = "Test4Receiver";
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        Log.w(TAG, context.getApplicationContext().getPackageName() + "#" + intent.getAction()
+                + "#" + Process.myUserHandle().getIdentifier());
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/TestIme/Android.bp b/hostsidetests/devicepolicy/app/TestIme/Android.bp
new file mode 100644
index 0000000..92cae61
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/TestIme/Android.bp
@@ -0,0 +1,28 @@
+// Copyright (C) 2020 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.
+
+android_test_helper_app {
+    name: "TestIme",
+    resource_dirs: ["res"],
+    defaults: ["cts_defaults"],
+    srcs: ["src/**/*.java"],
+    static_libs: [
+        "cts-devicepolicy-suspensionchecker",
+    ],
+    test_suites: [
+        "arcts",
+        "cts",
+        "general-tests",
+    ],
+}
diff --git a/hostsidetests/devicepolicy/app/TestIme/AndroidManifest.xml b/hostsidetests/devicepolicy/app/TestIme/AndroidManifest.xml
new file mode 100644
index 0000000..28f4a52
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/TestIme/AndroidManifest.xml
@@ -0,0 +1,43 @@
+<!--
+/*
+ * Copyright 2020, 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="com.android.cts.testime">
+    <application android:label="Test IME">
+        <service android:name="TestIme"
+                android:permission="android.permission.BIND_INPUT_METHOD">
+            <intent-filter>
+                <action android:name="android.view.InputMethod" />
+            </intent-filter>
+            <meta-data android:name="android.view.im" android:resource="@xml/method" />
+        </service>
+        <activity android:name=".ImePreferences" android:label="Test IME Settings">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+            </intent-filter>
+        </activity>
+    </application>
+
+    <instrumentation
+        android:name="androidx.test.runner.AndroidJUnitRunner"
+        android:targetPackage="com.android.cts.testime">
+        <meta-data
+            android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener"/>
+    </instrumentation>
+</manifest>
diff --git a/hostsidetests/devicepolicy/app/TestIme/res/xml/method.xml b/hostsidetests/devicepolicy/app/TestIme/res/xml/method.xml
new file mode 100644
index 0000000..47a4c41
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/TestIme/res/xml/method.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2020, 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.
+ */
+-->
+
+<!-- The attributes in this XML file provide configuration information -->
+<!-- for the Search Manager. -->
+
+<input-method xmlns:android="http://schemas.android.com/apk/res/android"
+        android:settingsActivity="com.android.testing.testime.ImePreferences">
+    <subtype
+        android:label="Generic"
+        android:imeSubtypeLocale="en_US"
+        android:imeSubtypeMode="keyboard" />
+</input-method>
diff --git a/hostsidetests/devicepolicy/app/TestIme/src/com/android/cts/dummyime/ImePreferences.java b/hostsidetests/devicepolicy/app/TestIme/src/com/android/cts/dummyime/ImePreferences.java
new file mode 100644
index 0000000..ddcaa5a
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/TestIme/src/com/android/cts/dummyime/ImePreferences.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.testime;
+
+import android.preference.PreferenceActivity;
+
+/**
+ * Test IME preference activity
+ */
+public class ImePreferences extends PreferenceActivity {
+}
diff --git a/hostsidetests/devicepolicy/app/TestIme/src/com/android/cts/testime/TestIme.java b/hostsidetests/devicepolicy/app/TestIme/src/com/android/cts/testime/TestIme.java
new file mode 100644
index 0000000..dadd644
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/TestIme/src/com/android/cts/testime/TestIme.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.testime;
+
+import android.inputmethodservice.InputMethodService;
+
+/**
+ * Test IME implementation that basically does nothing.
+ */
+public class TestIme extends InputMethodService {
+
+    @Override
+    public boolean onEvaluateFullscreenMode() {
+        return false;
+    }
+
+    @Override
+    public boolean onEvaluateInputViewShown() {
+        return false;
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/TestLauncher/Android.bp b/hostsidetests/devicepolicy/app/TestLauncher/Android.bp
new file mode 100644
index 0000000..95a60fa
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/TestLauncher/Android.bp
@@ -0,0 +1,27 @@
+// Copyright (C) 2020 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.
+
+android_test_helper_app {
+    name: "TestLauncher",
+    defaults: ["cts_defaults"],
+    srcs: ["src/**/*.java"],
+    static_libs: [
+        "cts-devicepolicy-suspensionchecker",
+    ],
+    test_suites: [
+        "arcts",
+        "cts",
+        "general-tests",
+    ],
+}
diff --git a/hostsidetests/devicepolicy/app/TestLauncher/AndroidManifest.xml b/hostsidetests/devicepolicy/app/TestLauncher/AndroidManifest.xml
new file mode 100644
index 0000000..db9de7f
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/TestLauncher/AndroidManifest.xml
@@ -0,0 +1,40 @@
+<!--
+/*
+ * Copyright 2020, 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="com.android.cts.testlauncher">
+    <application android:label="Test Launcher">
+        <activity android:name="android.app.Activity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.HOME"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+            </intent-filter>
+        </activity>
+        <activity android:name=".QuietModeToggleActivity"
+                  android:exported="true"/>
+    </application>
+
+    <instrumentation
+        android:name="androidx.test.runner.AndroidJUnitRunner"
+        android:targetPackage="com.android.cts.testlauncher">
+        <meta-data
+            android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener"/>
+    </instrumentation>
+</manifest>
diff --git a/hostsidetests/devicepolicy/app/TestLauncher/src/com/android/cts/dummylauncher/QuietModeToggleActivity.java b/hostsidetests/devicepolicy/app/TestLauncher/src/com/android/cts/dummylauncher/QuietModeToggleActivity.java
new file mode 100644
index 0000000..fd2a280
--- /dev/null
+++ b/hostsidetests/devicepolicy/app/TestLauncher/src/com/android/cts/dummylauncher/QuietModeToggleActivity.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.testlauncher;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.Process;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.util.Log;
+
+import java.util.List;
+
+public class QuietModeToggleActivity extends Activity {
+    private static final String TAG = "QuietModeToggleActivity";
+    private static final String EXTRA_QUIET_MODE_STATE =
+            "com.android.cts.testactivity.QUIET_MODE_STATE";
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        toggleQuietMode();
+        finish();
+    }
+
+    private void toggleQuietMode() {
+        final boolean quietModeState = getIntent().getBooleanExtra(EXTRA_QUIET_MODE_STATE, false);
+        final UserManager userManager = UserManager.get(this);
+
+        final List<UserHandle> users = userManager.getUserProfiles();
+        if (users.size() != 2) {
+            Log.e(TAG, "Unexpected number of profiles: " + users.size());
+            return;
+        }
+
+        final UserHandle profileHandle =
+                users.get(0).equals(Process.myUserHandle()) ? users.get(1) : users.get(0);
+
+        final String quietModeStateString = quietModeState ? "enabled" : "disabled";
+        if (userManager.isQuietModeEnabled(profileHandle) == quietModeState) {
+            Log.w(TAG, "Quiet mode is already " + quietModeStateString);
+            return;
+        }
+
+        userManager.requestQuietModeEnabled(quietModeState, profileHandle);
+        Log.i(TAG, "Quiet mode for user " + profileHandle + " was set to " + quietModeStateString);
+    }
+}
diff --git a/hostsidetests/devicepolicy/app/TransferOwnerIncomingApp/Android.bp b/hostsidetests/devicepolicy/app/TransferOwnerIncomingApp/Android.bp
index 18c5f58..6a8fb52 100644
--- a/hostsidetests/devicepolicy/app/TransferOwnerIncomingApp/Android.bp
+++ b/hostsidetests/devicepolicy/app/TransferOwnerIncomingApp/Android.bp
@@ -17,7 +17,7 @@
     defaults: ["cts_defaults"],
     srcs: ["src/**/*.java"],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "junit",
     ],
     static_libs: [
@@ -33,7 +33,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/TransferOwnerOutgoingApp/Android.bp b/hostsidetests/devicepolicy/app/TransferOwnerOutgoingApp/Android.bp
index 38b4991..0012763 100644
--- a/hostsidetests/devicepolicy/app/TransferOwnerOutgoingApp/Android.bp
+++ b/hostsidetests/devicepolicy/app/TransferOwnerOutgoingApp/Android.bp
@@ -17,7 +17,7 @@
     defaults: ["cts_defaults"],
     srcs: ["src/**/*.java"],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "junit",
     ],
     static_libs: [
@@ -33,7 +33,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/WidgetProvider/Android.bp b/hostsidetests/devicepolicy/app/WidgetProvider/Android.bp
index 5066bc2..ddafb6d 100644
--- a/hostsidetests/devicepolicy/app/WidgetProvider/Android.bp
+++ b/hostsidetests/devicepolicy/app/WidgetProvider/Android.bp
@@ -20,7 +20,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/app/WifiConfigCreator/Android.bp b/hostsidetests/devicepolicy/app/WifiConfigCreator/Android.bp
index 4ce52a1..f894929 100644
--- a/hostsidetests/devicepolicy/app/WifiConfigCreator/Android.bp
+++ b/hostsidetests/devicepolicy/app/WifiConfigCreator/Android.bp
@@ -23,7 +23,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDevicePolicyTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDevicePolicyTest.java
index 5c76fb7..29a1ea9 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDevicePolicyTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseDevicePolicyTest.java
@@ -167,6 +167,7 @@
 
     /** Whether the device supports telephony. */
     protected boolean mHasTelephony;
+    protected boolean mHasConnectionService;
 
     /** Users we shouldn't delete in the tests */
     private ArrayList<Integer> mFixedUsers;
@@ -185,6 +186,7 @@
         mHasManagedUserFeature = hasDeviceFeature("android.software.managed_users");
         mSupportsFbe = hasDeviceFeature("android.software.file_based_encryption");
         mHasTelephony = hasDeviceFeature("android.hardware.telephony");
+        mHasConnectionService = hasDeviceFeature("android.software.connectionservice");
         mFixedPackages = getDevice().getInstalledPackageNames();
         mBuildHelper = new CompatibilityBuildHelper(getBuild());
 
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseManagedProfileTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseManagedProfileTest.java
old mode 100644
new mode 100755
index b59d82f..f9817ec
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseManagedProfileTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/BaseManagedProfileTest.java
@@ -25,19 +25,19 @@
     protected static final String MANAGED_PROFILE_PKG = "com.android.cts.managedprofile";
     protected static final String INTENT_SENDER_PKG = "com.android.cts.intent.sender";
     protected static final String INTENT_RECEIVER_PKG = "com.android.cts.intent.receiver";
-    protected static final String DUMMY_APP_1_PKG = "com.android.cts.dummyapps.dummyapp1";
-    protected static final String DUMMY_APP_2_PKG = "com.android.cts.dummyapps.dummyapp2";
-    protected static final String DUMMY_APP_3_PKG = "com.android.cts.dummyapps.dummyapp3";
-    protected static final String DUMMY_APP_4_PKG = "com.android.cts.dummyapps.dummyapp4";
+    protected static final String TEST_APP_1_PKG = "com.android.cts.testapps.testapp1";
+    protected static final String TEST_APP_2_PKG = "com.android.cts.testapps.testapp2";
+    protected static final String TEST_APP_3_PKG = "com.android.cts.testapps.testapp3";
+    protected static final String TEST_APP_4_PKG = "com.android.cts.testapps.testapp4";
     protected static final String ADMIN_RECEIVER_TEST_CLASS =
             MANAGED_PROFILE_PKG + ".BaseManagedProfileTest$BasicAdminReceiver";
     protected static final String INTENT_SENDER_APK = "CtsIntentSenderApp.apk";
     protected static final String INTENT_RECEIVER_APK = "CtsIntentReceiverApp.apk";
     protected static final String SIMPLE_APP_APK = "CtsSimpleApp.apk";
-    protected static final String DUMMY_APP_1_APK = "DummyApp1.apk";
-    protected static final String DUMMY_APP_2_APK = "DummyApp2.apk";
-    protected static final String DUMMY_APP_3_APK = "DummyApp3.apk";
-    protected static final String DUMMY_APP_4_APK = "DummyApp4.apk";
+    protected static final String TEST_APP_1_APK = "TestApp1.apk";
+    protected static final String TEST_APP_2_APK = "TestApp2.apk";
+    protected static final String TEST_APP_3_APK = "TestApp3.apk";
+    protected static final String TEST_APP_4_APK = "TestApp4.apk";
     protected static final String SHARING_APP_1_APK = "SharingApp1.apk";
     protected static final String SHARING_APP_2_APK = "SharingApp2.apk";
     private static final String MANAGED_PROFILE_APK = "CtsManagedProfileApp.apk";
@@ -61,7 +61,7 @@
             removeTestUsers();
             mParentUserId = mPrimaryUserId;
             mProfileUserId = createManagedProfile(mParentUserId);
-            startUser(mProfileUserId);
+            startUserAndWait(mProfileUserId);
 
             // Install the APK on both primary and profile user in one single transaction.
             // If they were installed separately, the second installation would become an app
@@ -81,10 +81,10 @@
             getDevice().uninstallPackage(INTENT_SENDER_PKG);
             getDevice().uninstallPackage(INTENT_RECEIVER_PKG);
             getDevice().uninstallPackage(NOTIFICATION_PKG);
-            getDevice().uninstallPackage(DUMMY_APP_1_APK);
-            getDevice().uninstallPackage(DUMMY_APP_2_APK);
-            getDevice().uninstallPackage(DUMMY_APP_3_APK);
-            getDevice().uninstallPackage(DUMMY_APP_4_APK);
+            getDevice().uninstallPackage(TEST_APP_1_APK);
+            getDevice().uninstallPackage(TEST_APP_2_APK);
+            getDevice().uninstallPackage(TEST_APP_3_APK);
+            getDevice().uninstallPackage(TEST_APP_4_APK);
             getDevice().uninstallPackage(SHARING_APP_1_APK);
             getDevice().uninstallPackage(SHARING_APP_2_APK);
         }
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/CrossProfileAppsPermissionHostSideTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/CrossProfileAppsPermissionHostSideTest.java
index 730f462..24127de 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/CrossProfileAppsPermissionHostSideTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/CrossProfileAppsPermissionHostSideTest.java
@@ -109,7 +109,7 @@
     }
 
     @Test
-    public void testCanRequestInteractAcrossProfiles_packageNotWhitelisted_returnsTrue()
+    public void testCanRequestInteractAcrossProfiles_packageNotAllowed_returnsTrue()
             throws Exception {
         installAppAsUser(TEST_WITH_REQUESTED_PERMISSION_APK, mPrimaryUserId);
         addManagedProfileAndInstallRequiredPackages(TEST_WITH_REQUESTED_PERMISSION_APK);
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceAndProfileOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceAndProfileOwnerTest.java
index d16f982..d38a86f 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceAndProfileOwnerTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceAndProfileOwnerTest.java
@@ -497,7 +497,7 @@
         try {
             installAppAsUser(VPN_APP_APK, mUserId);
             waitForBroadcastIdle();
-            executeDeviceTestMethod(".AlwaysOnVpnMultiStageTest", "testAlwaysOnSetWithWhitelist");
+            executeDeviceTestMethod(".AlwaysOnVpnMultiStageTest", "testAlwaysOnSetWithAllowlist");
             rebootAndWaitUntilReady();
             // Make sure profile user initialization is complete before proceeding.
             waitForBroadcastIdle();
@@ -1230,6 +1230,9 @@
             // Wait for the LockTask starting
             waitForBroadcastIdle();
 
+            // Make sure that the LockTaskUtilityActivityIfWhitelisted was started.
+            executeDeviceTestMethod(".LockTaskHostDrivenTest", "testLockTaskIsActive");
+
             // Try to open settings via adb
             executeShellCommand("am start -a android.settings.SETTINGS");
 
@@ -1243,7 +1246,7 @@
 
     @Test
     public void testLockTask_defaultDialer() throws Exception {
-        if (!mHasFeature || !mHasTelephony) {
+        if (!mHasFeature || !mHasTelephony || !mHasConnectionService) {
             return;
         }
         try {
@@ -1268,13 +1271,13 @@
     }
 
     @Test
-    public void testLockTask_exitIfNoLongerWhitelisted() throws Exception {
+    public void testLockTask_exitIfNoLongerAllowed() throws Exception {
         if (!mHasFeature) {
             return;
         }
         try {
             executeDeviceTestMethod(".LockTaskHostDrivenTest",
-                    "testLockTaskIsExitedIfNotWhitelisted");
+                    "testLockTaskIsExitedIfNotAllowed");
         } finally {
             executeDeviceTestMethod(".LockTaskHostDrivenTest", "testCleanupLockTask_noAsserts");
         }
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceOwnerTest.java
index d9fc9eb..7879553 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceOwnerTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/DeviceOwnerTest.java
@@ -661,11 +661,36 @@
                     EventId.RETRIEVE_PRE_REBOOT_SECURITY_LOGS_VALUE)
                     .setAdminPackageName(DEVICE_OWNER_PKG)
                     .build());
+
+            if (isLowRamDevice()) {
+                // Requesting a bug report (in AdminActionBookkeepingTest#testRequestBugreport)
+                // leaves a state where future bug report requests will fail - usually this is
+                // handled by a NotificationListenerService but on low ram devices this isn't
+                // available so we must reboot
+                rebootAndWaitUntilReady();
+            }
+
             assertMetricsLogged(getDevice(), () -> {
                 executeDeviceTestMethod(".AdminActionBookkeepingTest", "testRequestBugreport");
             }, new DevicePolicyEventWrapper.Builder(EventId.REQUEST_BUGREPORT_VALUE)
                     .setAdminPackageName(DEVICE_OWNER_PKG)
                     .build());
+
+            if (isLowRamDevice()) {
+                // Requesting a bug report (in AdminActionBookkeepingTest#testRequestBugreport)
+                // leaves a state where future bug report requests will fail - usually this is
+                // handled by a NotificationListenerService but on low ram devices this isn't
+                // available so we must reboot
+                rebootAndWaitUntilReady();
+            }
+        }
+    }
+
+    private boolean isLowRamDevice() {
+        try {
+            return getBooleanSystemProperty("ro.config.low_ram", false);
+        } catch (DeviceNotAvailableException e) {
+            return false;
         }
     }
 
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileCrossProfileTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileCrossProfileTest.java
index 9873fb2..fe80592 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileCrossProfileTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileCrossProfileTest.java
@@ -66,12 +66,12 @@
     // The apps whose app-ops are maintained and unset are defined by the device-side test.
     private static final Set<String> UNSET_CROSS_PROFILE_PACKAGES =
             Sets.newHashSet(
-                    DUMMY_APP_3_PKG,
-                    DUMMY_APP_4_PKG);
+                    TEST_APP_3_PKG,
+                    TEST_APP_4_PKG);
     private static final Set<String> MAINTAINED_CROSS_PROFILE_PACKAGES =
             Sets.newHashSet(
-                    DUMMY_APP_1_PKG,
-                    DUMMY_APP_2_PKG);
+                    TEST_APP_1_PKG,
+                    TEST_APP_2_PKG);
 
     @LargeTest
     @Test
@@ -139,16 +139,16 @@
 
     @FlakyTest
     @Test
-    public void testCrossProfileNotificationListeners_EmptyWhitelist() throws Exception {
+    public void testCrossProfileNotificationListeners_EmptyAllowlist() throws Exception {
         if (!mHasFeature) {
             return;
         }
 
         installAppAsUser(NOTIFICATION_APK, USER_ALL);
 
-        // Profile owner in the profile sets an empty whitelist
+        // Profile owner in the profile sets an empty allowlist
         runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".NotificationListenerTest",
-                "testSetEmptyWhitelist", mProfileUserId,
+                "testSetEmptyAllowlist", mProfileUserId,
                 Collections.singletonMap(PARAM_PROFILE_ID, Integer.toString(mProfileUserId)));
         // Listener outside the profile can only see personal notifications.
         runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".NotificationListenerTest",
@@ -157,16 +157,16 @@
     }
 
     @Test
-    public void testCrossProfileNotificationListeners_NullWhitelist() throws Exception {
+    public void testCrossProfileNotificationListeners_NullAllowlist() throws Exception {
         if (!mHasFeature) {
             return;
         }
 
         installAppAsUser(NOTIFICATION_APK, USER_ALL);
 
-        // Profile owner in the profile sets a null whitelist
+        // Profile owner in the profile sets a null allowlist
         runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".NotificationListenerTest",
-                "testSetNullWhitelist", mProfileUserId,
+                "testSetNullAllowlist", mProfileUserId,
                 Collections.singletonMap(PARAM_PROFILE_ID, Integer.toString(mProfileUserId)));
         // Listener outside the profile can see profile and personal notifications
         runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".NotificationListenerTest",
@@ -175,16 +175,16 @@
     }
 
     @Test
-    public void testCrossProfileNotificationListeners_InWhitelist() throws Exception {
+    public void testCrossProfileNotificationListeners_InAllowlist() throws Exception {
         if (!mHasFeature) {
             return;
         }
 
         installAppAsUser(NOTIFICATION_APK, USER_ALL);
 
-        // Profile owner in the profile adds listener to the whitelist
+        // Profile owner in the profile adds listener to the allowlist
         runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".NotificationListenerTest",
-                "testAddListenerToWhitelist", mProfileUserId,
+                "testAddListenerToAllowlist", mProfileUserId,
                 Collections.singletonMap(PARAM_PROFILE_ID, Integer.toString(mProfileUserId)));
         // Listener outside the profile can see profile and personal notifications
         runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".NotificationListenerTest",
@@ -257,7 +257,7 @@
             installAppAsUser(WIDGET_PROVIDER_APK, USER_ALL);
             getDevice().executeShellCommand("appwidget grantbind --user " + mParentUserId
                     + " --package " + WIDGET_PROVIDER_PKG);
-            setIdleWhitelist(WIDGET_PROVIDER_PKG, true);
+            setIdleAllowlist(WIDGET_PROVIDER_PKG, true);
             startWidgetHostService();
 
             String commandOutput = changeCrossProfileWidgetForUser(WIDGET_PROVIDER_PKG,
@@ -305,7 +305,7 @@
             installAppAsUser(WIDGET_PROVIDER_APK, USER_ALL);
             getDevice().executeShellCommand("appwidget grantbind --user " + mParentUserId
                     + " --package " + WIDGET_PROVIDER_PKG);
-            setIdleWhitelist(WIDGET_PROVIDER_PKG, true);
+            setIdleAllowlist(WIDGET_PROVIDER_PKG, true);
             startWidgetHostService();
 
             assertMetricsLogged(getDevice(), () -> {
@@ -412,7 +412,7 @@
         if (!mHasFeature) {
             return;
         }
-        installAllDummyApps();
+        installAllTestApps();
         assertMetricsLogged(
                 getDevice(),
                 () -> runWorkProfileDeviceTest(
@@ -420,7 +420,7 @@
                 new DevicePolicyEventWrapper.Builder(SET_CROSS_PROFILE_PACKAGES_VALUE)
                         .setAdminPackageName(MANAGED_PROFILE_PKG)
                         .setStrings(
-                                DUMMY_APP_1_PKG, DUMMY_APP_2_PKG, DUMMY_APP_3_PKG, DUMMY_APP_4_PKG)
+                                TEST_APP_1_PKG, TEST_APP_2_PKG, TEST_APP_3_PKG, TEST_APP_4_PKG)
                         .build());
     }
 
@@ -468,7 +468,7 @@
         if (!mHasFeature) {
             return;
         }
-        installAllDummyApps();
+        installAllTestApps();
         runWorkProfileDeviceTest(
                 ".CrossProfileTest",
                 "testSetCrossProfilePackages_firstTime_doesNotResetAnyAppOps");
@@ -494,7 +494,7 @@
         if (!mHasFeature) {
             return;
         }
-        installAllDummyApps();
+        installAllTestApps();
         setupLogcatForTest();
 
         runWorkProfileDeviceTest(
@@ -502,9 +502,9 @@
                 "testSetCrossProfilePackages_sendsBroadcastWhenResettingAppOps_noAsserts");
         waitForBroadcastIdle();
 
-        assertDummyAppsReceivedCanInteractAcrossProfilesChangedBroadcast(
+        assertTestAppsReceivedCanInteractAcrossProfilesChangedBroadcast(
                 UNSET_CROSS_PROFILE_PACKAGES);
-        assertDummyAppsDidNotReceiveCanInteractAcrossProfilesChangedBroadcast(
+        assertTestAppsDidNotReceiveCanInteractAcrossProfilesChangedBroadcast(
                 MAINTAINED_CROSS_PROFILE_PACKAGES);
     }
 
@@ -517,34 +517,34 @@
     }
 
     /** Assumes that logcat is clear before running the test. */
-    private void assertDummyAppsReceivedCanInteractAcrossProfilesChangedBroadcast(
+    private void assertTestAppsReceivedCanInteractAcrossProfilesChangedBroadcast(
             Set<String> packageNames)
             throws Exception {
         for (String packageName : packageNames) {
-            assertTrue(didDummyAppReceiveCanInteractAcrossProfilesChangedBroadcast(
+            assertTrue(didTestAppReceiveCanInteractAcrossProfilesChangedBroadcast(
                     packageName, mProfileUserId));
-            assertTrue(didDummyAppReceiveCanInteractAcrossProfilesChangedBroadcast(
+            assertTrue(didTestAppReceiveCanInteractAcrossProfilesChangedBroadcast(
                     packageName, mParentUserId));
         }
     }
 
     /** Assumes that logcat is clear before running the test. */
-    private void assertDummyAppsDidNotReceiveCanInteractAcrossProfilesChangedBroadcast(
+    private void assertTestAppsDidNotReceiveCanInteractAcrossProfilesChangedBroadcast(
             Set<String> packageNames)
             throws Exception {
         for (String packageName : packageNames) {
-            assertFalse(didDummyAppReceiveCanInteractAcrossProfilesChangedBroadcast(
+            assertFalse(didTestAppReceiveCanInteractAcrossProfilesChangedBroadcast(
                     packageName, mProfileUserId));
-            assertFalse(didDummyAppReceiveCanInteractAcrossProfilesChangedBroadcast(
+            assertFalse(didTestAppReceiveCanInteractAcrossProfilesChangedBroadcast(
                     packageName, mParentUserId));
         }
     }
 
     /** Assumes that logcat is clear before running the test. */
-    private boolean didDummyAppReceiveCanInteractAcrossProfilesChangedBroadcast(
+    private boolean didTestAppReceiveCanInteractAcrossProfilesChangedBroadcast(
             String packageName, int userId)
             throws Exception {
-        // The expected string is defined in the broadcast receiver of the dummy apps to be
+        // The expected string is defined in the broadcast receiver of the test apps to be
         // packageName#action#userId.
         final String expectedSubstring =
                 packageName + "#" + ACTION_CAN_INTERACT_ACROSS_PROFILES_CHANGED + "#" + userId;
@@ -556,18 +556,18 @@
         if (!mHasFeature) {
             return;
         }
-        installAllDummyApps();
+        installAllTestApps();
         assertMetricsLogged(
                 getDevice(),
                 () -> runWorkProfileDeviceTest(
                         ".CrossProfileTest", "testSetCrossProfilePackages_resetsAppOps_noAsserts"),
                 new DevicePolicyEventWrapper.Builder(SET_INTERACT_ACROSS_PROFILES_APP_OP_VALUE)
-                        .setStrings(DUMMY_APP_3_PKG)
+                        .setStrings(TEST_APP_3_PKG)
                         .setInt(MODE_DEFAULT)
                         .setBoolean(true) // cross-profile manifest attribute
                         .build(),
                 new DevicePolicyEventWrapper.Builder(SET_INTERACT_ACROSS_PROFILES_APP_OP_VALUE)
-                        .setStrings(DUMMY_APP_4_PKG)
+                        .setStrings(TEST_APP_4_PKG)
                         .setInt(MODE_DEFAULT)
                         .setBoolean(true) // cross-profile manifest attribute
                         .build());
@@ -578,8 +578,8 @@
         if (!mHasFeature) {
             return;
         }
-        installAllDummyApps();
-        launchAllDummyAppsInBothProfiles();
+        installAllTestApps();
+        launchAllTestAppsInBothProfiles();
         Map<String, List<String>> maintainedPackagesPids = getPackagesPids(
                 MAINTAINED_CROSS_PROFILE_PACKAGES);
         Map<String, List<String>> unsetPackagesPids = getPackagesPids(UNSET_CROSS_PROFILE_PACKAGES);
@@ -604,24 +604,24 @@
         return pids;
     }
 
-    private void launchAllDummyAppsInBothProfiles() throws Exception {
-        launchAllDummyAppsForUser(mParentUserId);
-        launchAllDummyAppsForUser(mProfileUserId);
+    private void launchAllTestAppsInBothProfiles() throws Exception {
+        launchAllTestAppsForUser(mParentUserId);
+        launchAllTestAppsForUser(mProfileUserId);
     }
 
-    private void launchAllDummyAppsForUser(int userId) throws Exception {
-        final String dummyActivity = "android.app.Activity";
-        startActivityAsUser(userId, DUMMY_APP_1_PKG, dummyActivity);
-        startActivityAsUser(userId, DUMMY_APP_2_PKG, dummyActivity);
-        startActivityAsUser(userId, DUMMY_APP_3_PKG, dummyActivity);
-        startActivityAsUser(userId, DUMMY_APP_4_PKG, dummyActivity);
+    private void launchAllTestAppsForUser(int userId) throws Exception {
+        final String testActivity = "android.app.Activity";
+        startActivityAsUser(userId, TEST_APP_1_PKG, testActivity);
+        startActivityAsUser(userId, TEST_APP_2_PKG, testActivity);
+        startActivityAsUser(userId, TEST_APP_3_PKG, testActivity);
+        startActivityAsUser(userId, TEST_APP_4_PKG, testActivity);
     }
 
     private void assertAppRunningInBothProfiles(String packageName, List<String> pids)
             throws Exception {
         Set<String> currentPids = new HashSet<>(
                 Arrays.asList(getAppPid(packageName).split(" ")));
-        assertThat(currentPids).containsAllIn(pids);
+        assertThat(currentPids).containsAtLeastElementsIn(pids);
     }
 
     private void assertAppKilledInBothProfiles(String packageName,  List<String> pids)
@@ -635,7 +635,7 @@
         return getDevice().executeShellCommand(String.format("pidof %s", packageName)).trim();
     }
 
-    private void setIdleWhitelist(String packageName, boolean enabled)
+    private void setIdleAllowlist(String packageName, boolean enabled)
             throws DeviceNotAvailableException {
         String command = "cmd deviceidle whitelist " + (enabled ? "+" : "-") + packageName;
         LogUtil.CLog.d("Output for command " + command + ": "
@@ -663,11 +663,11 @@
                 + getDevice().executeShellCommand(command));
     }
 
-    private void installAllDummyApps() throws Exception {
-        installAppAsUser(DUMMY_APP_1_APK, USER_ALL);
-        installAppAsUser(DUMMY_APP_2_APK, USER_ALL);
-        installAppAsUser(DUMMY_APP_3_APK, USER_ALL);
-        installAppAsUser(DUMMY_APP_4_APK, USER_ALL);
+    private void installAllTestApps() throws Exception {
+        installAppAsUser(TEST_APP_1_APK, USER_ALL);
+        installAppAsUser(TEST_APP_2_APK, USER_ALL);
+        installAppAsUser(TEST_APP_3_APK, USER_ALL);
+        installAppAsUser(TEST_APP_4_APK, USER_ALL);
     }
 
     private void runWorkProfileDeviceTest(String className, String methodName) throws Exception {
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfilePasswordTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfilePasswordTest.java
index bf32483..e6fc79b 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfilePasswordTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfilePasswordTest.java
@@ -156,9 +156,9 @@
             // Turn on work profile, by unlocking the profile with the device password.
             verifyUserCredential(TEST_PASSWORD, mPrimaryUserId);
 
-            // Verify profile user is running unlocked by running a sanity test on the work profile.
+            // Verify profile user is running unlocked by running a basic test on the work profile.
             installAppAsUser(SIMPLE_APP_APK, mProfileUserId);
-            runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".SanityTest", mProfileUserId);
+            runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".BasicTest", mProfileUserId);
         } finally {
             // Clean up
             changeUserCredential(/* newCredential= */ null, TEST_PASSWORD, mPrimaryUserId);
@@ -181,7 +181,7 @@
             verifyUserCredential(TEST_PASSWORD, mPrimaryUserId);
             waitForUserUnlock(mProfileUserId);
             installAppAsUser(SIMPLE_APP_APK, mProfileUserId);
-            runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".SanityTest", mProfileUserId);
+            runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".BasicTest", mProfileUserId);
         } finally {
             changeUserCredential(/* newCredential= */ null, TEST_PASSWORD, mPrimaryUserId);
             // Work-around for http://b/113866275 - password prompt being erroneously shown at the
@@ -210,7 +210,7 @@
             verifyUserCredential(profilePassword, managedProfileUserId);
             verifyUserCredential(primaryPassword, mPrimaryUserId);
             installAppAsUser(SIMPLE_APP_APK, mProfileUserId);
-            runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".SanityTest", mProfileUserId);
+            runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".BasicTest", mProfileUserId);
         } finally {
             changeUserCredential(
                     /* newCredential= */ null, profilePassword, managedProfileUserId);
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java
index fb4c5e9..acc060c 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTest.java
@@ -565,13 +565,13 @@
     @Test
     @FlakyTest
     @Ignore
-    public void testSanityCheck() throws Exception {
+    public void testBasicCheck() throws Exception {
         if (!mHasFeature) {
             return;
         }
         // Install SimpleApp in work profile only and check activity in it can be launched.
         installAppAsUser(SIMPLE_APP_APK, mProfileUserId);
-        runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".SanityTest", mProfileUserId);
+        runDeviceTestsAsUser(MANAGED_PROFILE_PKG, ".BasicTest", mProfileUserId);
     }
 
     @Test
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTimeoutTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTimeoutTest.java
index f01ff37..dfbfef1 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTimeoutTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/ManagedProfileTimeoutTest.java
@@ -38,7 +38,7 @@
         }
         setUpWorkProfileTimeout();
 
-        startDummyActivity(mPrimaryUserId, true);
+        startTestActivity(mPrimaryUserId, true);
         simulateUserInteraction(PROFILE_TIMEOUT_DELAY_MS);
 
         verifyOnlyProfileLocked(true);
@@ -53,7 +53,7 @@
         }
         setUpWorkProfileTimeout();
 
-        startDummyActivity(mProfileUserId, false);
+        startTestActivity(mProfileUserId, false);
         Thread.sleep(PROFILE_TIMEOUT_DELAY_MS);
 
         verifyOnlyProfileLocked(true);
@@ -68,7 +68,7 @@
         }
         setUpWorkProfileTimeout();
 
-        startDummyActivity(mProfileUserId, false);
+        startTestActivity(mProfileUserId, false);
         simulateUserInteraction(PROFILE_TIMEOUT_DELAY_MS);
 
         verifyOnlyProfileLocked(false);
@@ -83,7 +83,7 @@
         }
         setUpWorkProfileTimeout();
 
-        startDummyActivity(mProfileUserId, true);
+        startTestActivity(mProfileUserId, true);
         Thread.sleep(PROFILE_TIMEOUT_DELAY_MS);
 
         verifyOnlyProfileLocked(false);
@@ -123,7 +123,7 @@
                 method, userId);
     }
 
-    private void startDummyActivity(int profileUserId, boolean keepScreenOn) throws Exception {
+    private void startTestActivity(int profileUserId, boolean keepScreenOn) throws Exception {
         getDevice().executeShellCommand(String.format(
                 "am start-activity -W --user %d --ez keep_screen_on %s %s/.TimeoutActivity",
                 profileUserId, keepScreenOn, MANAGED_PROFILE_PKG));
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedDeviceOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedDeviceOwnerTest.java
index 0c23013..2280348 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedDeviceOwnerTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedDeviceOwnerTest.java
@@ -345,7 +345,7 @@
 
             // Verify event ids are consistent across a consecutive batch.
             for (int batchNumber = 0; batchNumber < 3; batchNumber++) {
-                generateDummySecurityLogs();
+                generateTestSecurityLogs();
                 getDevice().executeShellCommand("dpm force-security-logs");
                 executeDeviceTestMethod(".SecurityLoggingTest", "testVerifyLogIds",
                         Collections.singletonMap(ARG_SECURITY_LOGGING_BATCH_NUMBER,
@@ -419,7 +419,7 @@
                 + "com.android.cts.deviceandprofileowner/.NotificationListener");
     }
 
-    private void generateDummySecurityLogs() throws Exception {
+    private void generateTestSecurityLogs() throws Exception {
         // Trigger security events of type TAG_ADB_SHELL_CMD.
         for (int i = 0; i < SECURITY_EVENTS_BATCH_SIZE; i++) {
             getDevice().executeShellCommand("echo just_testing_" + i);
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedManagedProfileOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedManagedProfileOwnerTest.java
index 739b1d5..659b07e 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedManagedProfileOwnerTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedManagedProfileOwnerTest.java
@@ -197,7 +197,7 @@
     @Override
     @Test
     public void testSetSystemSetting() {
-        // Managed profile owner cannot set currently whitelisted system settings.
+        // Managed profile owner cannot set currently allowlisted system settings.
     }
 
     @Override
@@ -393,7 +393,7 @@
 
     @Override
     @Test
-    public void testLockTask_exitIfNoLongerWhitelisted() {
+    public void testLockTask_exitIfNoLongerAllowed() {
         // Managed profiles are not allowed to use lock task
     }
 
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedProfileOwnerHostSideTransferTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedProfileOwnerHostSideTransferTest.java
index 5da7a07..68a09cc 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedProfileOwnerHostSideTransferTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedProfileOwnerHostSideTransferTest.java
@@ -16,7 +16,7 @@
 package com.android.cts.devicepolicy;
 
 /**
- * Tests the DPC transfer functionality for profile owner. Testing is done by having two dummy DPCs,
+ * Tests the DPC transfer functionality for profile owner. Testing is done by having two test DPCs,
  * CtsTransferOwnerOutgoingApp and CtsTransferOwnerIncomingApp. The former is the current DPC
  * and the latter will be the new DPC after transfer. In order to run the tests from the correct
  * process, first we setup some policies in the client side in CtsTransferOwnerOutgoingApp and then
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedProfileOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedProfileOwnerTest.java
index 66b2630..6ec9ac8 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedProfileOwnerTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/MixedProfileOwnerTest.java
@@ -95,8 +95,8 @@
     @Override
     @FlakyTest(bugId = 140932104)
     @Test
-    public void testLockTask_exitIfNoLongerWhitelisted() throws Exception {
-        super.testLockTask_exitIfNoLongerWhitelisted();
+    public void testLockTask_exitIfNoLongerAllowed() throws Exception {
+        super.testLockTask_exitIfNoLongerAllowed();
     }
 
     @Override
diff --git a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/OrgOwnedProfileOwnerTest.java b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/OrgOwnedProfileOwnerTest.java
index e69f2dc..3c2440d 100644
--- a/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/OrgOwnedProfileOwnerTest.java
+++ b/hostsidetests/devicepolicy/src/com/android/cts/devicepolicy/OrgOwnedProfileOwnerTest.java
@@ -51,18 +51,18 @@
 
     private static final String TEST_APP_APK = "CtsSimpleApp.apk";
     private static final String TEST_APP_PKG = "com.android.cts.launcherapps.simpleapp";
-    private static final String DUMMY_IME_APK = "DummyIme.apk";
-    private static final String DUMMY_IME_PKG = "com.android.cts.dummyime";
-    private static final String DUMMY_IME_COMPONENT = DUMMY_IME_PKG + "/.DummyIme";
+    private static final String TEST_IME_APK = "TestIme.apk";
+    private static final String TEST_IME_PKG = "com.android.cts.testime";
+    private static final String TEST_IME_COMPONENT = TEST_IME_PKG + "/.TestIme";
     private static final String SIMPLE_SMS_APP_PKG = "android.telephony.cts.sms.simplesmsapp";
     private static final String SIMPLE_SMS_APP_APK = "SimpleSmsApp.apk";
-    private static final String DUMMY_LAUNCHER_APK = "DummyLauncher.apk";
-    private static final String DUMMY_LAUNCHER_COMPONENT =
-            "com.android.cts.dummylauncher/android.app.Activity";
+    private static final String TEST_LAUNCHER_APK = "TestLauncher.apk";
+    private static final String TEST_LAUNCHER_COMPONENT =
+            "com.android.cts.testlauncher/android.app.Activity";
     private static final String QUIET_MODE_TOGGLE_ACTIVITY =
-            "com.android.cts.dummylauncher/.QuietModeToggleActivity";
+            "com.android.cts.testlauncher/.QuietModeToggleActivity";
     private static final String EXTRA_QUIET_MODE_STATE =
-            "com.android.cts.dummyactivity.QUIET_MODE_STATE";
+            "com.android.cts.testactivity.QUIET_MODE_STATE";
     public static final String SUSPENSION_CHECKER_CLASS =
             "com.android.cts.suspensionchecker.ActivityLaunchTest";
 
@@ -457,12 +457,12 @@
 
         setPersonalAppsSuspended(true);
 
-        installAppAsUser(DUMMY_IME_APK, mPrimaryUserId);
+        installAppAsUser(TEST_IME_APK, mPrimaryUserId);
 
         // Wait until package install broadcast is processed
         waitForBroadcastIdle();
 
-        assertCanStartPersonalApp(DUMMY_IME_PKG, false);
+        assertCanStartPersonalApp(TEST_IME_PKG, false);
         setPersonalAppsSuspended(false);
     }
 
@@ -506,11 +506,11 @@
             return;
         }
 
-        installAppAsUser(DUMMY_IME_APK, mPrimaryUserId);
-        setupIme(DUMMY_IME_COMPONENT, mPrimaryUserId);
+        installAppAsUser(TEST_IME_APK, mPrimaryUserId);
+        setupIme(TEST_IME_COMPONENT, mPrimaryUserId);
         setPersonalAppsSuspended(true);
         // Active IME should not be suspended.
-        assertCanStartPersonalApp(DUMMY_IME_PKG, true);
+        assertCanStartPersonalApp(TEST_IME_PKG, true);
         setPersonalAppsSuspended(false);
     }
 
@@ -661,8 +661,8 @@
 
         final String defaultLauncher = getDefaultLauncher();
         try {
-            installAppAsUser(DUMMY_LAUNCHER_APK, true, true, mPrimaryUserId);
-            setAndStartLauncher(DUMMY_LAUNCHER_COMPONENT);
+            installAppAsUser(TEST_LAUNCHER_APK, true, true, mPrimaryUserId);
+            setAndStartLauncher(TEST_LAUNCHER_COMPONENT);
             toggleQuietMode(true);
             // Verify that at some point personal app becomes impossible to launch.
             runDeviceTestsAsUser(DEVICE_ADMIN_PKG, SUSPENSION_CHECKER_CLASS,
diff --git a/hostsidetests/dexmetadata/OWNERS b/hostsidetests/dexmetadata/OWNERS
index 994534d..5a4431e 100644
--- a/hostsidetests/dexmetadata/OWNERS
+++ b/hostsidetests/dexmetadata/OWNERS
@@ -1,3 +1,2 @@
 calin@google.com
 ngeoffray@google.com
-sehr@google.com
diff --git a/hostsidetests/dexmetadata/host/src/com/android/cts/dexmetadata/InstallDexMetadataHostTest.java b/hostsidetests/dexmetadata/host/src/com/android/cts/dexmetadata/InstallDexMetadataHostTest.java
index 15bb39b..ad6aef8 100644
--- a/hostsidetests/dexmetadata/host/src/com/android/cts/dexmetadata/InstallDexMetadataHostTest.java
+++ b/hostsidetests/dexmetadata/host/src/com/android/cts/dexmetadata/InstallDexMetadataHostTest.java
@@ -32,9 +32,12 @@
 import java.io.FileOutputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.zip.Inflater;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 import org.junit.After;
@@ -198,6 +201,28 @@
         assertTrue(runDeviceTests(TEST_PACKAGE, TEST_CLASS, "testDmForBaseButNoSplit"));
     }
 
+    static class ProfileReader {
+      byte[] data;
+
+      ProfileReader(byte[] bytes) throws Exception {
+        ByteBuffer bb = ByteBuffer.wrap(bytes);
+
+        // Read header.
+        bb.order(ByteOrder.LITTLE_ENDIAN);
+        assertEquals(0x006f7270 /* LE "pro\0" */, bb.getInt());
+        assertEquals(0x00303130 /* LE "010\0" */, bb.getInt());
+        bb.get(); // Skip dex file count.
+        int uncompressed_size = bb.getInt();
+        int compressed_size = bb.getInt();
+
+        // Decompress profile.
+        Inflater inflater = new Inflater();
+        inflater.setInput(bb.array(), bb.arrayOffset() + bb.position(), bb.remaining());
+        data = new byte[uncompressed_size];
+        assertEquals(uncompressed_size, inflater.inflate(data));
+      }
+    }
+
     @Test
     public void testProfileSnapshotAfterInstall() throws Exception {
         assumeProfilesAreEnabled();
@@ -211,8 +236,9 @@
         assertTrue(result.trim().isEmpty());
 
         // Extract the profile bytes from the dex metadata and from the profile snapshot.
-        byte[] snapshotProfileBytes = extractProfileSnapshotFromDevice();
-        byte[] expectedProfileBytes = extractProfileFromDexMetadata(mDmBaseFile);
+        byte[] snapshotProfileBytes = new ProfileReader(extractProfileSnapshotFromDevice()).data;
+        byte[] expectedProfileBytes =
+                new ProfileReader(extractProfileFromDexMetadata(mDmBaseFile)).data;
 
         assertArrayEquals(expectedProfileBytes, snapshotProfileBytes);
     }
diff --git a/hostsidetests/dumpsys/Android.bp b/hostsidetests/dumpsys/Android.bp
index 1921845..3a3a2c5 100644
--- a/hostsidetests/dumpsys/Android.bp
+++ b/hostsidetests/dumpsys/Android.bp
@@ -25,7 +25,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/dumpsys/apps/FramestatsTestApp/Android.bp b/hostsidetests/dumpsys/apps/FramestatsTestApp/Android.bp
index c35770d..f926857 100644
--- a/hostsidetests/dumpsys/apps/FramestatsTestApp/Android.bp
+++ b/hostsidetests/dumpsys/apps/FramestatsTestApp/Android.bp
@@ -21,7 +21,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/dumpsys/apps/ProcStatsHelperApp/Android.bp b/hostsidetests/dumpsys/apps/ProcStatsHelperApp/Android.bp
index c5f8ee9..3faa49a 100644
--- a/hostsidetests/dumpsys/apps/ProcStatsHelperApp/Android.bp
+++ b/hostsidetests/dumpsys/apps/ProcStatsHelperApp/Android.bp
@@ -27,7 +27,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/dumpsys/apps/ProcStatsTestApp/Android.bp b/hostsidetests/dumpsys/apps/ProcStatsTestApp/Android.bp
index 361f88c..a721e6e 100644
--- a/hostsidetests/dumpsys/apps/ProcStatsTestApp/Android.bp
+++ b/hostsidetests/dumpsys/apps/ProcStatsTestApp/Android.bp
@@ -17,7 +17,7 @@
     defaults: ["cts_defaults"],
     srcs: ["src/**/*.java"],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "junit",
     ],
     static_libs: [
@@ -29,7 +29,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/dumpsys/apps/storagedapp/Android.bp b/hostsidetests/dumpsys/apps/storagedapp/Android.bp
index bb5dd4d..7e60522 100644
--- a/hostsidetests/dumpsys/apps/storagedapp/Android.bp
+++ b/hostsidetests/dumpsys/apps/storagedapp/Android.bp
@@ -17,7 +17,7 @@
     defaults: ["cts_defaults"],
     srcs: ["src/**/*.java"],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "junit",
     ],
     static_libs: [
@@ -29,7 +29,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/dumpsys/src/android/dumpsys/cts/BatteryStatsDumpsysTest.java b/hostsidetests/dumpsys/src/android/dumpsys/cts/BatteryStatsDumpsysTest.java
index 6c651e2..e30829c 100755
--- a/hostsidetests/dumpsys/src/android/dumpsys/cts/BatteryStatsDumpsysTest.java
+++ b/hostsidetests/dumpsys/src/android/dumpsys/cts/BatteryStatsDumpsysTest.java
@@ -246,7 +246,7 @@
         assertInteger(parts[8]); // starts
         assertInteger(parts[9]); // launches
 
-        // Sanity check.
+        // Validation check.
         assertTrue("wakeup count must be >= 0", wakeup_count >= 0);
     }
 
@@ -330,7 +330,7 @@
         assertInteger(parts[27]);      // max duration
         assertInteger(parts[28]);      // total duration
 
-        // Sanity checks.
+        // Validation checks.
         assertTrue("full wakelock count must be >= 0", full_count >= 0);
         assertTrue("partial wakelock count must be >= 0", partial_count >= 0);
         assertTrue("background partial wakelock count must be >= 0", bg_partial_count >= 0);
diff --git a/hostsidetests/edi/Android.bp b/hostsidetests/edi/Android.bp
index c2f4f6e..20f626c 100644
--- a/hostsidetests/edi/Android.bp
+++ b/hostsidetests/edi/Android.bp
@@ -18,7 +18,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
diff --git a/hostsidetests/gputools/apps/Android.bp b/hostsidetests/gputools/apps/Android.bp
index 82f1ea5..3cfeafb 100644
--- a/hostsidetests/gputools/apps/Android.bp
+++ b/hostsidetests/gputools/apps/Android.bp
@@ -23,6 +23,7 @@
         "-Wall",
         "-Werror",
     ],
+    header_libs: ["jni_headers"],
     shared_libs: [
         "libandroid",
         "libvulkan",
diff --git a/hostsidetests/graphics/gpuprofiling/app/AndroidManifest.xml b/hostsidetests/graphics/gpuprofiling/app/AndroidManifest.xml
index da58bef..888bdc1 100644
--- a/hostsidetests/graphics/gpuprofiling/app/AndroidManifest.xml
+++ b/hostsidetests/graphics/gpuprofiling/app/AndroidManifest.xml
@@ -16,6 +16,9 @@
  -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="android.graphics.gpuprofiling.app">
+
+    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
+
     <application android:extractNativeLibs="true" android:debuggable="true">
         <activity android:name=".GpuRenderStagesDeviceActivity" android:exported="true">
             <intent-filter>
diff --git a/hostsidetests/harmfulappwarning/Android.bp b/hostsidetests/harmfulappwarning/Android.bp
index 6a095fc..cb7d3ef 100644
--- a/hostsidetests/harmfulappwarning/Android.bp
+++ b/hostsidetests/harmfulappwarning/Android.bp
@@ -23,7 +23,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/harmfulappwarning/sampleapp/Android.bp b/hostsidetests/harmfulappwarning/sampleapp/Android.bp
index 35de3bd..7eda22d 100644
--- a/hostsidetests/harmfulappwarning/sampleapp/Android.bp
+++ b/hostsidetests/harmfulappwarning/sampleapp/Android.bp
@@ -26,7 +26,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/harmfulappwarning/testapp/Android.bp b/hostsidetests/harmfulappwarning/testapp/Android.bp
index 8d6a584..a6d0e88 100644
--- a/hostsidetests/harmfulappwarning/testapp/Android.bp
+++ b/hostsidetests/harmfulappwarning/testapp/Android.bp
@@ -29,7 +29,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/hdmicec/Android.bp b/hostsidetests/hdmicec/Android.bp
index 4268ff1..5fa3f52 100644
--- a/hostsidetests/hdmicec/Android.bp
+++ b/hostsidetests/hdmicec/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
diff --git a/hostsidetests/hdmicec/OWNERS b/hostsidetests/hdmicec/OWNERS
index e7f5c32..e77526c 100644
--- a/hostsidetests/hdmicec/OWNERS
+++ b/hostsidetests/hdmicec/OWNERS
@@ -1,3 +1,4 @@
 # Bug component: 114946
 nchalko@google.com
 amyjojo@google.com
+marvinramin@google.com
diff --git a/hostsidetests/hdmicec/README.md b/hostsidetests/hdmicec/README.md
index 3d5b003..f8289b2 100644
--- a/hostsidetests/hdmicec/README.md
+++ b/hostsidetests/hdmicec/README.md
@@ -4,8 +4,8 @@
 Test Specification** in HDMI 1.4b *HDMI Compliance Test Specification 1.4b and
 **Android Compatibility Test Suite**.
 
-Android Compatibility Test Suite include specific tests from HDMI Compliance
-Test Specification and other Android specific tests.
+The Android Compatibility Test Suite includes specific tests from the HDMI 
+Compliance Test Specification as well as other Android specific tests.
 
 ## Setup
 
diff --git a/hostsidetests/hdmicec/app/Android.bp b/hostsidetests/hdmicec/app/Android.bp
index ed41e1a..2ac24a3 100644
--- a/hostsidetests/hdmicec/app/Android.bp
+++ b/hostsidetests/hdmicec/app/Android.bp
@@ -15,6 +15,8 @@
 android_test_helper_app {
     name: "HdmiCecHelperApp",
     defaults: ["cts_defaults"],
+    platform_apis: true,
+    certificate: "platform",
     srcs: ["src/**/*.java"],
     static_libs: [
         "services.core",
diff --git a/hostsidetests/hdmicec/app/AndroidManifest.xml b/hostsidetests/hdmicec/app/AndroidManifest.xml
index 603445e..e21fb53 100644
--- a/hostsidetests/hdmicec/app/AndroidManifest.xml
+++ b/hostsidetests/hdmicec/app/AndroidManifest.xml
@@ -16,26 +16,30 @@
  -->
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-     package="android.hdmicec.app">
+    package="android.hdmicec.app">
     <uses-feature android:name="android.software.leanback"
-         android:required="false"/>
-    <application>
-        <activity android:name=".HdmiCecKeyEventCapture"
-             android:exported="true">
+        android:required="false" />
+    <uses-permission android:name="android.permission.HDMI_CEC" />
+    <application >
+        <activity android:name=".HdmiCecKeyEventCapture" >
             <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="android.intent.category.LEANBACK_LAUNCHER"/>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
             </intent-filter>
         </activity>
-         <activity android:name=".HdmiCecAudioManager"
-              android:exported="true">
+         <activity android:name=".HdmiCecAudioManager" >
             <intent-filter>
-                <action android:name="android.hdmicec.app.MUTE"/>
-                <action android:name="android.hdmicec.app.UNMUTE"/>
-                <action android:name="android.hdmicec.app.REPORT_VOLUME"/>
-                <action android:name="android.hdmicec.app.SET_VOLUME"/>
-                <action android:name="android.hdmicec.app.GET_SUPPORTED_SAD_FORMATS"/>
-                <category android:name="android.intent.category.LEANBACK_LAUNCHER"/>
+                <action android:name="android.hdmicec.app.MUTE" />
+                <action android:name="android.hdmicec.app.UNMUTE" />
+                <action android:name="android.hdmicec.app.REPORT_VOLUME" />
+                <action android:name="android.hdmicec.app.SET_VOLUME" />
+                <action android:name="android.hdmicec.app.GET_SUPPORTED_SAD_FORMATS" />
+                <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity android:name=".HdmiControlManagerHelper" >
+            <intent-filter>
+                <action android:name="android.hdmicec.app.OTP" />
             </intent-filter>
         </activity>
     </application>
diff --git a/hostsidetests/hdmicec/app/src/android/hdmicec/app/HdmiControlManagerHelper.java b/hostsidetests/hdmicec/app/src/android/hdmicec/app/HdmiControlManagerHelper.java
new file mode 100755
index 0000000..1276df1
--- /dev/null
+++ b/hostsidetests/hdmicec/app/src/android/hdmicec/app/HdmiControlManagerHelper.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2020 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.hdmicec.app;
+
+import android.app.Activity;
+import android.hardware.hdmi.HdmiControlManager;
+import android.hardware.hdmi.HdmiPlaybackClient;
+import android.os.Bundle;
+import android.util.Log;
+
+/**
+ * A simple activity that can be used to trigger actions using the HdmiControlManager.
+ * The action supported is:
+ *
+ * 1. android.hdmicec.app.OTP: Triggers the OTP
+ *    Usage: START_COMMAND -a android.hdmicec.app.OTP
+ *
+ * where START_COMMAND is
+ * adb shell am start -n "android.hdmicec.app/android.hdmicec.app.HdmiCecControlManagerHelper"
+ */
+public class HdmiControlManagerHelper extends Activity {
+
+    private static final String TAG = HdmiControlManagerHelper.class.getSimpleName();
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+
+        HdmiControlManager hdmiControlManager = getSystemService(HdmiControlManager.class);
+        if (hdmiControlManager == null) {
+            Log.i(TAG, "Failed to get HdmiControlManager");
+            return;
+        }
+
+        switch (getIntent().getAction()) {
+            case "android.hdmicec.app.OTP":
+                initiateOtp(hdmiControlManager);
+                break;
+            default:
+                Log.w(TAG, "Unknown intent!");
+        }
+    }
+
+    private void initiateOtp(HdmiControlManager hdmiControlManager) {
+        HdmiPlaybackClient client = hdmiControlManager.getPlaybackClient();
+        if (client == null) {
+            Log.i(TAG, "Failed to get HdmiPlaybackClient");
+            return;
+        }
+
+        client.oneTouchPlay((result) -> {
+            if (result == HdmiControlManager.RESULT_SUCCESS) {
+                Log.i(TAG, "OTP successful");
+            } else {
+                Log.i(TAG, "OTP failed");
+            }
+        });
+    }
+}
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/BaseHdmiCecCtsTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/BaseHdmiCecCtsTest.java
new file mode 100644
index 0000000..b81972d
--- /dev/null
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/BaseHdmiCecCtsTest.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2020 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.hdmicec.cts;
+
+import com.android.tradefed.config.Option;
+import com.android.tradefed.config.OptionClass;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
+
+import org.junit.Before;
+import org.junit.rules.TestRule;
+
+import java.io.BufferedReader;
+import java.io.StringReader;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/** Base class for all HDMI CEC CTS tests. */
+@OptionClass(alias="hdmi-cec-client-cts-test")
+public class BaseHdmiCecCtsTest extends BaseHostJUnit4Test {
+
+    public final HdmiCecClientWrapper hdmiCecClient;
+    public LogicalAddress mDutLogicalAddress;
+
+    /**
+     * Constructor for BaseHdmiCecCtsTest. Uses the DUT logical address for the test.
+     */
+    public BaseHdmiCecCtsTest() {
+        this(LogicalAddress.UNKNOWN);
+    }
+
+    /**
+     * Constructor for BaseHdmiCecCtsTest. Uses the DUT logical address for the test.
+     *
+     * @param clientParams Extra parameters to use when launching cec-client
+     */
+    public BaseHdmiCecCtsTest(String ...clientParams) {
+        this(LogicalAddress.UNKNOWN, clientParams);
+    }
+
+    /**
+     * Constructor for BaseHdmiCecCtsTest.
+     *
+     * @param dutLogicalAddress The logical address that the DUT will have.
+     * @param clientParams Extra parameters to use when launching cec-client
+     */
+    public BaseHdmiCecCtsTest(LogicalAddress dutLogicalAddress, String ...clientParams) {
+        this.hdmiCecClient = new HdmiCecClientWrapper(clientParams);
+        mDutLogicalAddress = dutLogicalAddress;
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        if (mDutLogicalAddress == LogicalAddress.UNKNOWN) {
+            mDutLogicalAddress = LogicalAddress.getLogicalAddress(getDumpsysLogicalAddress());
+        }
+        hdmiCecClient.setTargetLogicalAddress(mDutLogicalAddress);
+        hdmiCecClient.init();
+    }
+
+    /** Class with predefined rules which can be used by HDMI CEC CTS tests. */
+    public static class CecRules {
+
+        public static TestRule requiresCec(BaseHostJUnit4Test testPointer) {
+            return new RequiredFeatureRule(testPointer, HdmiCecConstants.HDMI_CEC_FEATURE);
+        }
+
+        public static TestRule requiresLeanback(BaseHostJUnit4Test testPointer) {
+            return new RequiredFeatureRule(testPointer, HdmiCecConstants.LEANBACK_FEATURE);
+        }
+
+        public static TestRule requiresDeviceType(BaseHostJUnit4Test testPointer,
+                                                  LogicalAddress dutLogicalAddress) {
+            return RequiredPropertyRule.asCsvContainsValue(
+                        testPointer,
+                        HdmiCecConstants.HDMI_DEVICE_TYPE_PROPERTY,
+                        dutLogicalAddress.getDeviceTypeString());
+        }
+    }
+
+    @Option(name = HdmiCecConstants.PHYSICAL_ADDRESS_NAME,
+        description = "HDMI CEC physical address of the DUT",
+        mandatory = false)
+    public static int dutPhysicalAddress = HdmiCecConstants.DEFAULT_PHYSICAL_ADDRESS;
+
+    /** Gets the physical address of the DUT by parsing the dumpsys hdmi_control. */
+    public int getDumpsysPhysicalAddress() throws Exception {
+        String line;
+        String pattern = "(.*?)" + "(physical_address: )" + "(?<address>0x\\p{XDigit}{4})" +
+                "(.*?)";
+        Pattern p = Pattern.compile(pattern);
+        Matcher m;
+        ITestDevice device = getDevice();
+        String dumpsys = device.executeShellCommand("dumpsys hdmi_control");
+        BufferedReader reader = new BufferedReader(new StringReader(dumpsys));
+        while ((line = reader.readLine()) != null) {
+            m = p.matcher(line);
+            if (m.matches()) {
+                int address = Integer.decode(m.group("address"));
+                return address;
+            }
+        }
+        throw new Exception("Could not parse physical address from dumpsys.");
+    }
+
+    /** Gets the logical address of the DUT by parsing the dumpsys hdmi_control. */
+    public int getDumpsysLogicalAddress() throws Exception {
+        String line;
+        String pattern = "(.*?)" + "(mAddress: )" + "(?<address>\\d+)" +
+                "(.*?)";
+        Pattern p = Pattern.compile(pattern);
+        Matcher m;
+        ITestDevice device = getDevice();
+        String dumpsys = device.executeShellCommand("dumpsys hdmi_control");
+        BufferedReader reader = new BufferedReader(new StringReader(dumpsys));
+        while ((line = reader.readLine()) != null) {
+            m = p.matcher(line);
+            if (m.matches()) {
+                int address = Integer.decode(m.group("address"));
+                return address;
+            }
+        }
+        throw new Exception("Could not parse logical address from dumpsys.");
+    }
+}
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/CecDevice.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/CecDevice.java
deleted file mode 100644
index 68c270a..0000000
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/CecDevice.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2019 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.hdmicec.cts;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public enum CecDevice {
-    TV(0x0),
-    RECORDER_1(0x1),
-    RECORDER_2(0x2),
-    TUNER_1(0x3),
-    PLAYBACK_1(0x4),
-    AUDIO_SYSTEM(0x5),
-    TUNER_2(0x6),
-    TUNER_3(0x7),
-    PLAYBACK_2(0x8),
-    RECORDER_3(0x9),
-    TUNER_4(0xa),
-    PLAYBACK_3(0xb),
-    RESERVED_1(0xc),
-    RESERVED_2(0xd),
-    SPECIFIC_USE(0xe),
-    BROADCAST(0xf);
-
-    private final int playerId;
-    private static Map deviceMap = new HashMap<>();
-
-    @Override
-    public String toString() {
-        return Integer.toHexString(this.playerId);
-    }
-
-    static {
-        for (CecDevice device : CecDevice.values()) {
-            deviceMap.put(device.playerId, device);
-        }
-    }
-
-    public static String getDeviceType(CecDevice device) {
-        switch (device) {
-            case PLAYBACK_1:
-            case PLAYBACK_2:
-            case PLAYBACK_3:
-                return Integer.toString(HdmiCecConstants.CEC_DEVICE_TYPE_PLAYBACK_DEVICE);
-            case TV:
-                return Integer.toString(HdmiCecConstants.CEC_DEVICE_TYPE_TV);
-            case AUDIO_SYSTEM:
-                return Integer.toString(HdmiCecConstants.CEC_DEVICE_TYPE_AUDIO_SYSTEM);
-            case RECORDER_1:
-            case RECORDER_2:
-            case RECORDER_3:
-                return Integer.toString(HdmiCecConstants.CEC_DEVICE_TYPE_RECORDER);
-            case TUNER_1:
-            case TUNER_2:
-            case TUNER_3:
-            case TUNER_4:
-                return Integer.toString(HdmiCecConstants.CEC_DEVICE_TYPE_TUNER);
-            default:
-                return Integer.toString(HdmiCecConstants.CEC_DEVICE_TYPE_RESERVED);
-        }
-    }
-
-    public static CecDevice getDevice(int playerId) {
-        return (CecDevice) deviceMap.get(playerId);
-    }
-
-    private CecDevice(int playerId) {
-        this.playerId = playerId;
-    }
-}
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/CecMessage.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/CecMessage.java
index bce34e1..809461b 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/CecMessage.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/CecMessage.java
@@ -16,6 +16,8 @@
 
 package android.hdmicec.cts;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -23,18 +25,6 @@
 
     private static final int HEXADECIMAL_RADIX = 16;
 
-    /** Gets the hexadecimal ASCII character values of a string. */
-    public static String getHexAsciiString(String string) {
-        String asciiString = "";
-        byte[] ascii = string.trim().getBytes();
-
-        for (byte b : ascii) {
-            asciiString.concat(Integer.toHexString(b));
-        }
-
-        return asciiString;
-    }
-
     public static String formatParams(String rawParams) {
         StringBuilder params = new StringBuilder("");
         int position = 0;
@@ -148,6 +138,12 @@
         return params.toString();
     }
 
+    /** Assert for the DUT's physical address with the value passed from command line argument. */
+    public static void assertPhysicalAddressValid(String message, int expectedPhysicalAddress) {
+        int physicalAddress = getParams(message, HdmiCecConstants.PHYSICAL_ADDRESS_LENGTH);
+        assertThat(expectedPhysicalAddress).isEqualTo(physicalAddress);
+    }
+
     private static String getNibbles(String message) {
         final String tag1 = "group1";
         final String tag2 = "group2";
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecClientWrapper.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecClientWrapper.java
index 51da280..1fa1471 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecClientWrapper.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecClientWrapper.java
@@ -20,6 +20,8 @@
 import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 import com.android.tradefed.util.RunUtil;
 
+import org.junit.rules.ExternalResource;
+
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.InputStreamReader;
@@ -28,10 +30,9 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 import java.util.regex.Pattern;
 
-import org.junit.rules.ExternalResource;
-
 /** Class that helps communicate with the cec-client */
 public final class HdmiCecClientWrapper extends ExternalResource {
 
@@ -45,26 +46,29 @@
     private BufferedReader mInputConsole;
     private boolean mCecClientInitialised = false;
 
-    private LogicalAddress targetDevice;
+    private LogicalAddress targetDevice = LogicalAddress.UNKNOWN;
     private String clientParams[];
 
-    public HdmiCecClientWrapper(LogicalAddress targetDevice, String ...clientParams) {
-        this.targetDevice = targetDevice;
+    public HdmiCecClientWrapper(String ...clientParams) {
         this.clientParams = clientParams;
     }
 
     @Override
-    protected void before() throws Throwable {
-        this.init();
-    };
-
-    @Override
     protected void after() {
         this.killCecProcess();
     };
 
+
+    void setTargetLogicalAddress(LogicalAddress dutLogicalAddress) {
+        targetDevice = dutLogicalAddress;
+    }
+
     /** Initialise the client */
-    private void init() throws Exception {
+    void init() throws Exception {
+        if (targetDevice == LogicalAddress.UNKNOWN) {
+            throw new IllegalStateException("Missing logical address of the target device.");
+        }
+
         List<String> commands = new ArrayList();
 
         commands.add("cec-client");
@@ -72,9 +76,6 @@
          * address 2.0.0.0 */
         commands.add("-p");
         commands.add("2");
-        /* "-t x" starts the client as a TV device */
-        commands.add("-t");
-        commands.add("x");
         commands.addAll(Arrays.asList(clientParams));
 
         mCecClient = RunUtil.getDefault().runCmdInBackground(commands);
@@ -134,7 +135,9 @@
     public void sendCecMessage(LogicalAddress source, LogicalAddress destination,
             CecOperand message, String params) throws Exception {
         checkCecClient();
-        mOutputConsole.write("tx " + source + destination + ":" + message + params);
+        String sendMessageString = "tx " + source + destination + ":" + message + params;
+        CLog.e("Sending message: " + sendMessageString);
+        mOutputConsole.write(sendMessageString);
         mOutputConsole.newLine();
         mOutputConsole.flush();
     }
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecConstants.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecConstants.java
index 8af4a8b..c4df53f 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecConstants.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/HdmiCecConstants.java
@@ -20,9 +20,10 @@
 
     private HdmiCecConstants() {}
 
+    public static final String PHYSICAL_ADDRESS_NAME = "cec-phy-addr";
     public static final int REBOOT_TIMEOUT = 60000;
 
-    public static final int PHYSICAL_ADDRESS = 0x1000;
+    public static final int DEFAULT_PHYSICAL_ADDRESS = 0x1000;
     public static final int TV_PHYSICAL_ADDRESS = 0x0000;
     public static final int PHYSICAL_ADDRESS_LENGTH = 4; /* Num nibbles in CEC message */
 
@@ -54,4 +55,11 @@
     public static final int ABORT_INVALID_OPERAND = 3;
     public static final int ABORT_REFUSED = 4;
     public static final int ABORT_UNABLE_TO_DETERMINE = 5;
+
+    // CEC Device feature list
+    public static final String HDMI_CEC_FEATURE = "feature:android.hardware.hdmi.cec";
+    public static final String LEANBACK_FEATURE = "feature:android.software.leanback";
+
+    // CEC Device property list
+    public static final String HDMI_DEVICE_TYPE_PROPERTY = "ro.hdmi.device_type";
 }
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/LogicalAddress.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/LogicalAddress.java
index 5bcf5d1..87cded6 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/LogicalAddress.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/LogicalAddress.java
@@ -35,18 +35,12 @@
     RESERVED_1(0xc),
     RESERVED_2(0xd),
     SPECIFIC_USE(0xe),
-    BROADCAST(0xf);
+    BROADCAST(0xf),
+    UNKNOWN(0xf);
 
     private final int address;
     private static Map deviceMap = new HashMap<>();
 
-    // CEC Device feature list
-    public static final String HDMI_CEC_FEATURE = "feature:android.hardware.hdmi.cec";
-    public static final String LEANBACK_FEATURE = "feature:android.software.leanback";
-
-    // CEC Device property list
-    public static final String HDMI_DEVICE_TYPE_PROPERTY = "ro.hdmi.device_type";
-
     @Override
     public String toString() {
         return Integer.toHexString(this.address);
@@ -58,27 +52,31 @@
         }
     }
 
-    public String getDeviceType() {
+    public String getDeviceTypeString() {
+        return Integer.toString(getDeviceType());
+    }
+
+    public int getDeviceType() {
         switch (this) {
             case PLAYBACK_1:
             case PLAYBACK_2:
             case PLAYBACK_3:
-                return Integer.toString(HdmiCecConstants.CEC_DEVICE_TYPE_PLAYBACK_DEVICE);
+                return HdmiCecConstants.CEC_DEVICE_TYPE_PLAYBACK_DEVICE;
             case TV:
-                return Integer.toString(HdmiCecConstants.CEC_DEVICE_TYPE_TV);
+                return HdmiCecConstants.CEC_DEVICE_TYPE_TV;
             case AUDIO_SYSTEM:
-                return Integer.toString(HdmiCecConstants.CEC_DEVICE_TYPE_AUDIO_SYSTEM);
+                return HdmiCecConstants.CEC_DEVICE_TYPE_AUDIO_SYSTEM;
             case RECORDER_1:
             case RECORDER_2:
             case RECORDER_3:
-                return Integer.toString(HdmiCecConstants.CEC_DEVICE_TYPE_RECORDER);
+                return HdmiCecConstants.CEC_DEVICE_TYPE_RECORDER;
             case TUNER_1:
             case TUNER_2:
             case TUNER_3:
             case TUNER_4:
-                return Integer.toString(HdmiCecConstants.CEC_DEVICE_TYPE_TUNER);
+                return HdmiCecConstants.CEC_DEVICE_TYPE_TUNER;
             default:
-                return Integer.toString(HdmiCecConstants.CEC_DEVICE_TYPE_RESERVED);
+                return HdmiCecConstants.CEC_DEVICE_TYPE_RESERVED;
         }
     }
 
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecAudioReturnChannelControlTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecAudioReturnChannelControlTest.java
index c44b428..a8e43d3 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecAudioReturnChannelControlTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecAudioReturnChannelControlTest.java
@@ -18,6 +18,7 @@
 
 import static org.junit.Assume.assumeNoException;
 
+import android.hdmicec.cts.BaseHdmiCecCtsTest;
 import android.hdmicec.cts.CecMessage;
 import android.hdmicec.cts.CecOperand;
 import android.hdmicec.cts.HdmiCecClientWrapper;
@@ -27,7 +28,6 @@
 import android.hdmicec.cts.RequiredFeatureRule;
 
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
 import org.junit.Ignore;
 import org.junit.Rule;
@@ -38,21 +38,20 @@
 /** HDMI CEC test to test audio return channel control (Section 11.2.17) */
 @Ignore("b/162820841")
 @RunWith(DeviceJUnit4ClassRunner.class)
-public final class HdmiCecAudioReturnChannelControlTest extends BaseHostJUnit4Test {
+public final class HdmiCecAudioReturnChannelControlTest extends BaseHdmiCecCtsTest {
 
     private static final LogicalAddress AUDIO_DEVICE = LogicalAddress.AUDIO_SYSTEM;
 
-    public HdmiCecClientWrapper hdmiCecClient = new HdmiCecClientWrapper(AUDIO_DEVICE);
+    public HdmiCecAudioReturnChannelControlTest() {
+        super(AUDIO_DEVICE);
+    }
 
     @Rule
     public RuleChain ruleChain =
         RuleChain
-            .outerRule(new RequiredFeatureRule(this, LogicalAddress.HDMI_CEC_FEATURE))
-            .around(new RequiredFeatureRule(this, LogicalAddress.LEANBACK_FEATURE))
-            .around(RequiredPropertyRule.asCsvContainsValue(
-                this,
-                LogicalAddress.HDMI_DEVICE_TYPE_PROPERTY,
-                AUDIO_DEVICE.getDeviceType()))
+            .outerRule(CecRules.requiresCec(this))
+            .around(CecRules.requiresLeanback(this))
+            .around(CecRules.requiresDeviceType(this, AUDIO_DEVICE))
             .around(hdmiCecClient);
 
     private void checkArcIsInitiated(){
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecInvalidMessagesTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecInvalidMessagesTest.java
index f4481f6..accaa2f 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecInvalidMessagesTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecInvalidMessagesTest.java
@@ -20,6 +20,7 @@
 import static org.junit.Assume.assumeNoException;
 import static org.junit.Assume.assumeTrue;
 
+import android.hdmicec.cts.BaseHdmiCecCtsTest;
 import android.hdmicec.cts.CecMessage;
 import android.hdmicec.cts.CecOperand;
 import android.hdmicec.cts.HdmiCecClientWrapper;
@@ -31,7 +32,6 @@
 
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
 import org.junit.Ignore;
 import org.junit.Rule;
@@ -42,7 +42,7 @@
 /** HDMI CEC test to verify that device ignores invalid messages (Section 12) */
 @Ignore("b/162820841")
 @RunWith(DeviceJUnit4ClassRunner.class)
-public final class HdmiCecInvalidMessagesTest extends BaseHostJUnit4Test {
+public final class HdmiCecInvalidMessagesTest extends BaseHdmiCecCtsTest {
 
     private static final LogicalAddress AUDIO_DEVICE = LogicalAddress.AUDIO_SYSTEM;
     private static final String PROPERTY_LOCALE = "persist.sys.locale";
@@ -60,17 +60,16 @@
     /** The command to clear the main activity. */
     private static final String CLEAR_COMMAND = String.format("pm clear %s", PACKAGE);
 
-    public HdmiCecClientWrapper hdmiCecClient = new HdmiCecClientWrapper(AUDIO_DEVICE);
+    public HdmiCecInvalidMessagesTest() {
+        super(AUDIO_DEVICE);
+    }
 
     @Rule
     public RuleChain ruleChain =
         RuleChain
-            .outerRule(new RequiredFeatureRule(this, LogicalAddress.HDMI_CEC_FEATURE))
-            .around(new RequiredFeatureRule(this, LogicalAddress.LEANBACK_FEATURE))
-            .around(RequiredPropertyRule.asCsvContainsValue(
-                this,
-                LogicalAddress.HDMI_DEVICE_TYPE_PROPERTY,
-                AUDIO_DEVICE.getDeviceType()))
+            .outerRule(CecRules.requiresCec(this))
+            .around(CecRules.requiresLeanback(this))
+            .around(CecRules.requiresDeviceType(this, AUDIO_DEVICE))
             .around(hdmiCecClient);
 
     private String getSystemLocale() throws Exception {
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecLogicalAddressTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecLogicalAddressTest.java
index 16c37a5..151f5e0 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecLogicalAddressTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecLogicalAddressTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.hdmicec.cts.BaseHdmiCecCtsTest;
 import android.hdmicec.cts.CecMessage;
 import android.hdmicec.cts.CecOperand;
 import android.hdmicec.cts.HdmiCecClientWrapper;
@@ -28,7 +29,6 @@
 
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
 import org.junit.Ignore;
 import org.junit.Rule;
@@ -39,21 +39,20 @@
 /** HDMI CEC test to verify logical address after device reboot (Section 10.2.5) */
 @Ignore("b/162820841")
 @RunWith(DeviceJUnit4ClassRunner.class)
-public final class HdmiCecLogicalAddressTest extends BaseHostJUnit4Test {
+public final class HdmiCecLogicalAddressTest extends BaseHdmiCecCtsTest {
 
     private static final LogicalAddress AUDIO_DEVICE = LogicalAddress.AUDIO_SYSTEM;
 
-    public HdmiCecClientWrapper hdmiCecClient = new HdmiCecClientWrapper(AUDIO_DEVICE);
+    public HdmiCecLogicalAddressTest() {
+        super(AUDIO_DEVICE);
+    }
 
     @Rule
     public RuleChain ruleChain =
         RuleChain
-            .outerRule(new RequiredFeatureRule(this, LogicalAddress.HDMI_CEC_FEATURE))
-            .around(new RequiredFeatureRule(this, LogicalAddress.LEANBACK_FEATURE))
-            .around(RequiredPropertyRule.asCsvContainsValue(
-                this,
-                LogicalAddress.HDMI_DEVICE_TYPE_PROPERTY,
-                AUDIO_DEVICE.getDeviceType()))
+            .outerRule(CecRules.requiresCec(this))
+            .around(CecRules.requiresLeanback(this))
+            .around(CecRules.requiresDeviceType(this, AUDIO_DEVICE))
             .around(hdmiCecClient);
 
     /**
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecRemoteControlPassThroughTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecRemoteControlPassThroughTest.java
index 705a333..51f7351 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecRemoteControlPassThroughTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecRemoteControlPassThroughTest.java
@@ -16,6 +16,7 @@
 
 package android.hdmicec.cts.audio;
 
+import android.hdmicec.cts.BaseHdmiCecCtsTest;
 import android.hdmicec.cts.HdmiCecClientWrapper;
 import android.hdmicec.cts.HdmiCecConstants;
 import android.hdmicec.cts.LogHelper;
@@ -25,7 +26,6 @@
 
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
 import org.junit.Ignore;
 import org.junit.Rule;
@@ -35,7 +35,7 @@
 
 @Ignore("b/162820841")
 @RunWith(DeviceJUnit4ClassRunner.class)
-public final class HdmiCecRemoteControlPassThroughTest extends BaseHostJUnit4Test {
+public final class HdmiCecRemoteControlPassThroughTest extends BaseHdmiCecCtsTest {
 
     /** The package name of the APK. */
     private static final String PACKAGE = "android.hdmicec.app";
@@ -50,17 +50,16 @@
     /** The command to clear the main activity. */
     private static final String CLEAR_COMMAND = String.format("pm clear %s", PACKAGE);
 
-    public HdmiCecClientWrapper hdmiCecClient = new HdmiCecClientWrapper(LogicalAddress.AUDIO_SYSTEM);
+    public HdmiCecRemoteControlPassThroughTest() {
+        super(LogicalAddress.AUDIO_SYSTEM);
+    }
 
     @Rule
     public RuleChain ruleChain =
         RuleChain
-            .outerRule(new RequiredFeatureRule(this, LogicalAddress.HDMI_CEC_FEATURE))
-            .around(new RequiredFeatureRule(this, LogicalAddress.LEANBACK_FEATURE))
-            .around(RequiredPropertyRule.asCsvContainsValue(
-                this,
-                LogicalAddress.HDMI_DEVICE_TYPE_PROPERTY,
-                LogicalAddress.AUDIO_SYSTEM.getDeviceType()))
+            .outerRule(CecRules.requiresCec(this))
+            .around(CecRules.requiresLeanback(this))
+            .around(CecRules.requiresDeviceType(this, LogicalAddress.AUDIO_SYSTEM))
             .around(hdmiCecClient);
 
     /**
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecSystemAudioModeTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecSystemAudioModeTest.java
index 946c992..b284215 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecSystemAudioModeTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/audio/HdmiCecSystemAudioModeTest.java
@@ -21,6 +21,7 @@
 
 import com.google.common.collect.Range;
 
+import android.hdmicec.cts.BaseHdmiCecCtsTest;
 import android.hdmicec.cts.CecMessage;
 import android.hdmicec.cts.CecOperand;
 import android.hdmicec.cts.HdmiCecClientWrapper;
@@ -32,7 +33,6 @@
 
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
 import org.junit.After;
 import org.junit.Ignore;
@@ -42,6 +42,7 @@
 import org.junit.Test;
 
 import java.util.ArrayList;
+import java.util.concurrent.TimeUnit;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
@@ -49,7 +50,7 @@
 /** HDMI CEC test to test system audio mode (Section 11.2.15) */
 @Ignore("b/162820841")
 @RunWith(DeviceJUnit4ClassRunner.class)
-public final class HdmiCecSystemAudioModeTest extends BaseHostJUnit4Test {
+public final class HdmiCecSystemAudioModeTest extends BaseHdmiCecCtsTest {
 
     /** The package name of the APK. */
     private static final String PACKAGE = "android.hdmicec.app";
@@ -72,17 +73,16 @@
 
     private List<Integer> mSupportedAudioFormats = null;
 
-    public HdmiCecClientWrapper hdmiCecClient = new HdmiCecClientWrapper(AUDIO_DEVICE, "-t", "t");
+    public HdmiCecSystemAudioModeTest() {
+        super(AUDIO_DEVICE, "-t", "t");
+    }
 
     @Rule
     public RuleChain ruleChain =
         RuleChain
-            .outerRule(new RequiredFeatureRule(this, LogicalAddress.HDMI_CEC_FEATURE))
-            .around(new RequiredFeatureRule(this, LogicalAddress.LEANBACK_FEATURE))
-            .around(RequiredPropertyRule.asCsvContainsValue(
-                this,
-                LogicalAddress.HDMI_DEVICE_TYPE_PROPERTY,
-                AUDIO_DEVICE.getDeviceType()))
+            .outerRule(CecRules.requiresCec(this))
+            .around(CecRules.requiresLeanback(this))
+            .around(CecRules.requiresDeviceType(this, AUDIO_DEVICE))
             .around(hdmiCecClient);
 
     private String getRequestSadFormatsParams(boolean sendValidFormats) throws Exception {
@@ -131,6 +131,8 @@
         device.executeAdbCommand("logcat", "-c");
         // Start the APK and wait for it to complete.
         device.executeShellCommand(START_COMMAND + "android.hdmicec.app.MUTE");
+        // The audio device should send <Report Audio Status> message after mute.
+        hdmiCecClient.checkExpectedOutput(LogicalAddress.TV, CecOperand.REPORT_AUDIO_STATUS);
     }
 
     private void unmuteDevice() throws Exception {
@@ -139,6 +141,8 @@
         device.executeShellCommand(CLEAR_COMMAND);
         // Start the APK and wait for it to complete.
         device.executeShellCommand(START_COMMAND + "android.hdmicec.app.UNMUTE");
+        // The audio device should send <Report Audio Status> message after unmute.
+        hdmiCecClient.checkExpectedOutput(LogicalAddress.TV, CecOperand.REPORT_AUDIO_STATUS);
     }
 
     public boolean isDeviceMuted() throws Exception {
@@ -179,6 +183,8 @@
     }
 
     private int getDutAudioStatus() throws Exception {
+        // Give a couple of seconds for the HdmiCecAudioManager intent to complete.
+        TimeUnit.SECONDS.sleep(2);
         hdmiCecClient.sendCecMessage(LogicalAddress.TV, AUDIO_DEVICE, CecOperand.GIVE_AUDIO_STATUS);
         String message = hdmiCecClient.checkExpectedOutput(LogicalAddress.TV,
                 CecOperand.REPORT_AUDIO_STATUS);
@@ -361,15 +367,15 @@
     /**
      * Test 11.2.15-9
      * Tests that the DUT responds with a <Report Audio Status> message with correct parameters
-     * to a <Give Audio Status> message when volume is set to 0% and not muted.
+     * to a <Give Audio Status> message when volume is set to 0%.
      */
     @Test
-    public void cect_11_2_15_9_ReportAudioStatus_0_unmuted() throws Exception {
+    public void cect_11_2_15_9_ReportAudioStatus_0() throws Exception {
         sendSystemAudioModeInitiation();
         unmuteDevice();
         setDeviceVolume(0);
         int reportedVolume = getDutAudioStatus();
-        assertThat(reportedVolume).isEqualTo(0);
+        assertThat(reportedVolume).isAnyOf(0, 128);
     }
 
     /**
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecDeviceTypeTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecDeviceTypeTest.java
index 4c716cc..284605e 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecDeviceTypeTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecDeviceTypeTest.java
@@ -18,6 +18,10 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.hdmicec.cts.HdmiCecConstants;
+
+import com.android.tradefed.config.Option;
+import com.android.tradefed.config.OptionClass;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
 import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
@@ -32,8 +36,18 @@
 
 /** Tests to see that a valid HDMI CEC device type is declared by the device. */
 @RunWith(DeviceJUnit4ClassRunner.class)
+@OptionClass(alias="hdmi-cec-cts-test")
 public final class HdmiCecDeviceTypeTest extends BaseHostJUnit4Test {
 
+    @Option(name = HdmiCecConstants.PHYSICAL_ADDRESS_NAME,
+        description = "HDMI CEC physical address of the DUT",
+        mandatory = false)
+    /*
+     * This variable is defined only to enable the physical address to be passed as a CLI argument
+     * to the module, it won't be used.
+     */
+    public static int dutPhysicalAddress = HdmiCecConstants.DEFAULT_PHYSICAL_ADDRESS;
+
     private static List<String> validTypes = new ArrayList<>(
         Arrays.asList("", "0", "4", "4,5", "5,4"));
     /**
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemInformationTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemInformationTest.java
new file mode 100644
index 0000000..8adbb1d
--- /dev/null
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/common/HdmiCecSystemInformationTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2019 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.hdmicec.cts.common;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assume.assumeTrue;
+
+import android.hdmicec.cts.BaseHdmiCecCtsTest;
+import android.hdmicec.cts.CecClientMessage;
+import android.hdmicec.cts.CecMessage;
+import android.hdmicec.cts.CecOperand;
+import android.hdmicec.cts.HdmiCecConstants;
+import android.hdmicec.cts.LogicalAddress;
+
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.log.LogUtil;
+import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.RuleChain;
+import org.junit.runner.RunWith;
+
+/** HDMI CEC system information tests (Section 11.2.6) */
+@RunWith(DeviceJUnit4ClassRunner.class)
+public final class HdmiCecSystemInformationTest extends BaseHdmiCecCtsTest {
+
+    /** The version number 0x05 refers to CEC v1.4 */
+    private static final int CEC_VERSION_NUMBER = 0x05;
+
+    @Rule
+    public RuleChain ruleChain =
+            RuleChain
+                    .outerRule(CecRules.requiresCec(this))
+                    .around(CecRules.requiresLeanback(this))
+                    .around(hdmiCecClient);
+
+    /**
+     * Test 11.2.6-1
+     * Tests for Ack {@code <Polling Message>} message.
+     */
+    @Test
+    public void cect_11_2_6_1_Ack() throws Exception {
+        String command = CecClientMessage.POLL + " " + mDutLogicalAddress;
+        String expectedOutput = "POLL sent";
+        hdmiCecClient.sendConsoleMessage(command);
+        if (!hdmiCecClient.checkConsoleOutput(expectedOutput)) {
+            throw new Exception("Could not find " + expectedOutput);
+        }
+    }
+
+    /**
+     * Test 11.2.6-2
+     * Tests that the device sends a {@code <Report Physical Address>} in response to a
+     * {@code <Give Physical Address>}
+     */
+    @Test
+    public void cect_11_2_6_2_GivePhysicalAddress() throws Exception {
+        hdmiCecClient.sendCecMessage(CecOperand.GIVE_PHYSICAL_ADDRESS);
+        String message = hdmiCecClient.checkExpectedOutput(CecOperand.REPORT_PHYSICAL_ADDRESS);
+        /* Check that the physical address taken is valid. */
+        CecMessage.assertPhysicalAddressValid(message, getDumpsysPhysicalAddress());
+        int receivedParams = CecMessage.getParams(message);
+        assertThat(receivedParams & 0xFF).isEqualTo(mDutLogicalAddress.getDeviceType());
+    }
+
+    /**
+     * Test 11.2.6-6
+     * Tests that the device sends a {@code <CEC Version>} in response to a {@code <Get CEC
+     * Version>}
+     */
+    @Test
+    public void cect_11_2_6_6_GiveCecVersion() throws Exception {
+        hdmiCecClient.sendCecMessage(LogicalAddress.RECORDER_1, CecOperand.GET_CEC_VERSION);
+        String message = hdmiCecClient.checkExpectedOutput(LogicalAddress.RECORDER_1,
+                CecOperand.CEC_VERSION);
+        assertThat(CecMessage.getParams(message)).isEqualTo(CEC_VERSION_NUMBER);
+    }
+}
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecDeviceOsdNameTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecDeviceOsdNameTest.java
index ef10425..2c76ce4 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecDeviceOsdNameTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecDeviceOsdNameTest.java
@@ -18,16 +18,17 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.hdmicec.cts.BaseHdmiCecCtsTest;
 import android.hdmicec.cts.CecMessage;
 import android.hdmicec.cts.CecOperand;
 import android.hdmicec.cts.HdmiCecClientWrapper;
+import android.hdmicec.cts.HdmiCecConstants;
 import android.hdmicec.cts.LogicalAddress;
 import android.hdmicec.cts.RequiredPropertyRule;
 import android.hdmicec.cts.RequiredFeatureRule;
 
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
 import org.junit.Rule;
 import org.junit.rules.RuleChain;
@@ -36,21 +37,20 @@
 
 /** HDMI CEC tests related to the device reporting the device OSD name (Section 11.2.11) */
 @RunWith(DeviceJUnit4ClassRunner.class)
-public final class HdmiCecDeviceOsdNameTest extends BaseHostJUnit4Test {
+public final class HdmiCecDeviceOsdNameTest extends BaseHdmiCecCtsTest {
 
     private static final LogicalAddress PLAYBACK_DEVICE = LogicalAddress.PLAYBACK_1;
 
-    public HdmiCecClientWrapper hdmiCecClient = new HdmiCecClientWrapper(LogicalAddress.PLAYBACK_1);
+    public HdmiCecDeviceOsdNameTest() {
+        super(PLAYBACK_DEVICE);
+    }
 
     @Rule
     public RuleChain ruleChain =
         RuleChain
-            .outerRule(new RequiredFeatureRule(this, LogicalAddress.HDMI_CEC_FEATURE))
-            .around(new RequiredFeatureRule(this, LogicalAddress.LEANBACK_FEATURE))
-            .around(RequiredPropertyRule.asCsvContainsValue(
-                this,
-                LogicalAddress.HDMI_DEVICE_TYPE_PROPERTY,
-                LogicalAddress.PLAYBACK_1.getDeviceType()))
+            .outerRule(CecRules.requiresCec(this))
+            .around(CecRules.requiresLeanback(this))
+            .around(CecRules.requiresDeviceType(this, PLAYBACK_DEVICE))
             .around(hdmiCecClient);
 
     /**
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecLogicalAddressTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecLogicalAddressTest.java
index d48a6cd..40b2d37 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecLogicalAddressTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecLogicalAddressTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.hdmicec.cts.BaseHdmiCecCtsTest;
 import android.hdmicec.cts.CecMessage;
 import android.hdmicec.cts.CecOperand;
 import android.hdmicec.cts.HdmiCecClientWrapper;
@@ -28,7 +29,6 @@
 
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
 import org.junit.Rule;
 import org.junit.rules.RuleChain;
@@ -37,21 +37,20 @@
 
 /** HDMI CEC test to verify physical address after device reboot (Section 10.2.3) */
 @RunWith(DeviceJUnit4ClassRunner.class)
-public final class HdmiCecLogicalAddressTest extends BaseHostJUnit4Test {
+public final class HdmiCecLogicalAddressTest extends BaseHdmiCecCtsTest {
 
     private static final LogicalAddress PLAYBACK_DEVICE = LogicalAddress.PLAYBACK_1;
 
-    public HdmiCecClientWrapper hdmiCecClient = new HdmiCecClientWrapper(LogicalAddress.PLAYBACK_1);
+    public HdmiCecLogicalAddressTest() {
+        super(PLAYBACK_DEVICE);
+    }
 
     @Rule
     public RuleChain ruleChain =
         RuleChain
-            .outerRule(new RequiredFeatureRule(this, LogicalAddress.HDMI_CEC_FEATURE))
-            .around(new RequiredFeatureRule(this, LogicalAddress.LEANBACK_FEATURE))
-            .around(RequiredPropertyRule.asCsvContainsValue(
-                this,
-                LogicalAddress.HDMI_DEVICE_TYPE_PROPERTY,
-                LogicalAddress.PLAYBACK_1.getDeviceType()))
+            .outerRule(CecRules.requiresCec(this))
+            .around(CecRules.requiresLeanback(this))
+            .around(CecRules.requiresDeviceType(this, PLAYBACK_DEVICE))
             .around(hdmiCecClient);
 
     /**
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecOneTouchPlayTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecOneTouchPlayTest.java
index 56a7df2..a47a81d 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecOneTouchPlayTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecOneTouchPlayTest.java
@@ -16,29 +16,43 @@
 
 package android.hdmicec.cts.playback;
 
-import static com.google.common.truth.Truth.assertThat;
-
+import android.hdmicec.cts.BaseHdmiCecCtsTest;
 import android.hdmicec.cts.CecMessage;
 import android.hdmicec.cts.CecOperand;
 import android.hdmicec.cts.HdmiCecClientWrapper;
+import android.hdmicec.cts.HdmiCecConstants;
 import android.hdmicec.cts.LogicalAddress;
-import android.hdmicec.cts.RequiredPropertyRule;
 import android.hdmicec.cts.RequiredFeatureRule;
+import android.hdmicec.cts.RequiredPropertyRule;
 
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
+import org.junit.Ignore;
 import org.junit.Rule;
+import org.junit.Test;
 import org.junit.rules.RuleChain;
 import org.junit.runner.RunWith;
-import org.junit.Test;
 
 /** HDMI CEC tests for One Touch Play (Section 11.2.1) */
 @RunWith(DeviceJUnit4ClassRunner.class)
-public final class HdmiCecOneTouchPlayTest extends BaseHostJUnit4Test {
+public final class HdmiCecOneTouchPlayTest extends BaseHdmiCecCtsTest {
 
     private static final int PHYSICAL_ADDRESS = 0x1000;
+    /**
+     * The package name of the APK.
+     */
+    private static final String HDMI_CEC_HELPER_PACKAGE = "android.hdmicec.app";
+    /**
+     * The class name of the main activity in the APK.
+     */
+    private static final String HDMI_CONTROL_HELPER_CLASS = "HdmiControlManagerHelper";
+    /**
+     * Intent to trigger an OTP.
+     */
+    private static final String OTP_ACTION = String.format(
+        "android.hdmicec.app.OTP -n %s/%s.%s", HDMI_CEC_HELPER_PACKAGE, HDMI_CEC_HELPER_PACKAGE,
+        HDMI_CONTROL_HELPER_CLASS);
 
     /** Intent to launch the remote pairing activity */
     private static final String ACTION_CONNECT_INPUT_NORMAL =
@@ -54,17 +68,16 @@
     /** The command to stop an app. */
     private static final String FORCE_STOP_COMMAND = "am force-stop ";
 
-    public HdmiCecClientWrapper hdmiCecClient = new HdmiCecClientWrapper(LogicalAddress.PLAYBACK_1);
+    public HdmiCecOneTouchPlayTest() {
+        super(LogicalAddress.PLAYBACK_1);
+    }
 
     @Rule
     public RuleChain ruleChain =
         RuleChain
-            .outerRule(new RequiredFeatureRule(this, LogicalAddress.HDMI_CEC_FEATURE))
-            .around(new RequiredFeatureRule(this, LogicalAddress.LEANBACK_FEATURE))
-            .around(RequiredPropertyRule.asCsvContainsValue(
-                this,
-                LogicalAddress.HDMI_DEVICE_TYPE_PROPERTY,
-                LogicalAddress.PLAYBACK_1.getDeviceType()))
+            .outerRule(CecRules.requiresCec(this))
+            .around(CecRules.requiresLeanback(this))
+            .around(CecRules.requiresDeviceType(this, LogicalAddress.PLAYBACK_1))
             .around(hdmiCecClient);
 
     /**
@@ -72,14 +85,15 @@
      * Tests that the device sends a <TEXT_VIEW_ON> when the home key is pressed on device, followed
      * by a <ACTIVE_SOURCE> message.
      */
+    @Ignore("b/169755426")
     @Test
     public void cect_11_2_1_1_OneTouchPlay() throws Exception {
         ITestDevice device = getDevice();
         device.reboot();
-        device.executeShellCommand("input keyevent KEYCODE_HOME");
+        sendOtp(device);
         hdmiCecClient.checkExpectedOutput(LogicalAddress.TV, CecOperand.TEXT_VIEW_ON);
         String message = hdmiCecClient.checkExpectedOutput(CecOperand.ACTIVE_SOURCE);
-        assertThat(CecMessage.getParams(message)).isEqualTo(PHYSICAL_ADDRESS);
+        CecMessage.assertPhysicalAddressValid(message, getDumpsysPhysicalAddress());
     }
 
     /**
@@ -93,7 +107,16 @@
         device.executeShellCommand(START_COMMAND + ACTION_CONNECT_INPUT_NORMAL);
         hdmiCecClient.checkExpectedOutput(LogicalAddress.TV, CecOperand.TEXT_VIEW_ON);
         String message = hdmiCecClient.checkExpectedOutput(CecOperand.ACTIVE_SOURCE);
-        assertThat(CecMessage.getParams(message)).isEqualTo(PHYSICAL_ADDRESS);
+        CecMessage.assertPhysicalAddressValid(message, getDumpsysPhysicalAddress());
         device.executeShellCommand(FORCE_STOP_COMMAND + SETTINGS_PACKAGE);
     }
+
+    private void sendOtp(ITestDevice device) throws Exception {
+        // Clear activity
+        device.executeShellCommand(FORCE_STOP_COMMAND + HDMI_CEC_HELPER_PACKAGE);
+        // Clear logcat.
+        device.executeAdbCommand("logcat", "-c");
+        // Start the APK and wait for it to complete.
+        device.executeShellCommand(START_COMMAND + OTP_ACTION);
+    }
 }
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecPhysicalAddressTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecPhysicalAddressTest.java
index bae8490..28d8d95 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecPhysicalAddressTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecPhysicalAddressTest.java
@@ -16,8 +16,7 @@
 
 package android.hdmicec.cts.playback;
 
-import static com.google.common.truth.Truth.assertThat;
-
+import android.hdmicec.cts.BaseHdmiCecCtsTest;
 import android.hdmicec.cts.CecMessage;
 import android.hdmicec.cts.CecOperand;
 import android.hdmicec.cts.HdmiCecClientWrapper;
@@ -28,7 +27,6 @@
 
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
 import org.junit.Rule;
 import org.junit.rules.RuleChain;
@@ -37,21 +35,19 @@
 
 /** HDMI CEC test to verify physical address after device reboot (Section 10.1.2) */
 @RunWith(DeviceJUnit4ClassRunner.class)
-public final class HdmiCecPhysicalAddressTest extends BaseHostJUnit4Test {
+public final class HdmiCecPhysicalAddressTest extends BaseHdmiCecCtsTest {
 
-    public HdmiCecClientWrapper hdmiCecClient = new HdmiCecClientWrapper(LogicalAddress.PLAYBACK_1);
+    public HdmiCecPhysicalAddressTest() {
+        super(LogicalAddress.PLAYBACK_1);
+    }
 
     @Rule
     public RuleChain ruleChain =
         RuleChain
-            .outerRule(new RequiredFeatureRule(this, LogicalAddress.HDMI_CEC_FEATURE))
-            .around(new RequiredFeatureRule(this, LogicalAddress.LEANBACK_FEATURE))
-            .around(RequiredPropertyRule.asCsvContainsValue(
-                this,
-                LogicalAddress.HDMI_DEVICE_TYPE_PROPERTY,
-                LogicalAddress.PLAYBACK_1.getDeviceType()))
+            .outerRule(CecRules.requiresCec(this))
+            .around(CecRules.requiresLeanback(this))
+            .around(CecRules.requiresDeviceType(this, LogicalAddress.PLAYBACK_1))
             .around(hdmiCecClient);
-
     /**
      * Test 10.1.2-1
      * Tests that the device broadcasts a <REPORT_PHYSICAL_ADDRESS> after a reboot and that the
@@ -63,8 +59,6 @@
         device.executeShellCommand("reboot");
         device.waitForBootComplete(HdmiCecConstants.REBOOT_TIMEOUT);
         String message = hdmiCecClient.checkExpectedOutput(CecOperand.REPORT_PHYSICAL_ADDRESS);
-        int physicalAddress = CecMessage.getParams(message,
-            HdmiCecConstants.PHYSICAL_ADDRESS_LENGTH);
-        assertThat(HdmiCecConstants.PHYSICAL_ADDRESS).isEqualTo(physicalAddress);
+        CecMessage.assertPhysicalAddressValid(message, dutPhysicalAddress);
     }
 }
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecPowerStatusTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecPowerStatusTest.java
index 2d8d3ac..4484ee8 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecPowerStatusTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecPowerStatusTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.hdmicec.cts.BaseHdmiCecCtsTest;
 import android.hdmicec.cts.CecMessage;
 import android.hdmicec.cts.CecOperand;
 import android.hdmicec.cts.HdmiCecClientWrapper;
@@ -28,7 +29,6 @@
 
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
 import org.junit.Rule;
 import org.junit.rules.RuleChain;
@@ -39,7 +39,7 @@
 
 /** HDMI CEC test to check if the device reports power status correctly (Section 11.2.14) */
 @RunWith(DeviceJUnit4ClassRunner.class)
-public final class HdmiCecPowerStatusTest extends BaseHostJUnit4Test {
+public final class HdmiCecPowerStatusTest extends BaseHdmiCecCtsTest {
 
     private static final int ON = 0x0;
     private static final int OFF = 0x1;
@@ -49,17 +49,16 @@
     private static final int WAIT_TIME = 5;
     private static final int MAX_SLEEP_TIME = 8;
 
-    public HdmiCecClientWrapper hdmiCecClient = new HdmiCecClientWrapper(LogicalAddress.PLAYBACK_1);
+    public HdmiCecPowerStatusTest() {
+        super(LogicalAddress.PLAYBACK_1);
+    }
 
     @Rule
     public RuleChain ruleChain =
         RuleChain
-            .outerRule(new RequiredFeatureRule(this, LogicalAddress.HDMI_CEC_FEATURE))
-            .around(new RequiredFeatureRule(this, LogicalAddress.LEANBACK_FEATURE))
-            .around(RequiredPropertyRule.asCsvContainsValue(
-                this,
-                LogicalAddress.HDMI_DEVICE_TYPE_PROPERTY,
-                LogicalAddress.PLAYBACK_1.getDeviceType()))
+            .outerRule(CecRules.requiresCec(this))
+            .around(CecRules.requiresLeanback(this))
+            .around(CecRules.requiresDeviceType(this, LogicalAddress.PLAYBACK_1))
             .around(hdmiCecClient);
 
     /**
@@ -81,7 +80,7 @@
     /**
      * Test 11.2.14-2
      * Tests that the device broadcasts a <REPORT_POWER_STATUS> with params 0x1 when the device is
-     * powered on.
+     * powered off.
      */
     @Test
     public void cect_11_2_14_2_PowerStatusWhenOff() throws Exception {
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecRemoteControlPassThroughTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecRemoteControlPassThroughTest.java
index b0d927d..62cb442 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecRemoteControlPassThroughTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecRemoteControlPassThroughTest.java
@@ -16,6 +16,7 @@
 
 package android.hdmicec.cts.playback;
 
+import android.hdmicec.cts.BaseHdmiCecCtsTest;
 import android.hdmicec.cts.HdmiCecClientWrapper;
 import android.hdmicec.cts.HdmiCecConstants;
 import android.hdmicec.cts.LogHelper;
@@ -25,7 +26,6 @@
 
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
 import org.junit.Rule;
 import org.junit.rules.RuleChain;
@@ -34,7 +34,7 @@
 
 /** HDMI CEC test to check if the device reports power status correctly (Section 11.2.13) */
 @RunWith(DeviceJUnit4ClassRunner.class)
-public final class HdmiCecRemoteControlPassThroughTest extends BaseHostJUnit4Test {
+public final class HdmiCecRemoteControlPassThroughTest extends BaseHdmiCecCtsTest {
 
     /**
      * The package name of the APK.
@@ -54,17 +54,16 @@
      */
     private static final String CLEAR_COMMAND = String.format("pm clear %s", PACKAGE);
 
-    public HdmiCecClientWrapper hdmiCecClient = new HdmiCecClientWrapper(LogicalAddress.PLAYBACK_1);
+    public HdmiCecRemoteControlPassThroughTest() {
+        super(LogicalAddress.PLAYBACK_1);
+    }
 
     @Rule
     public RuleChain ruleChain =
         RuleChain
-            .outerRule(new RequiredFeatureRule(this, LogicalAddress.HDMI_CEC_FEATURE))
-            .around(new RequiredFeatureRule(this, LogicalAddress.LEANBACK_FEATURE))
-            .around(RequiredPropertyRule.asCsvContainsValue(
-                this,
-                LogicalAddress.HDMI_DEVICE_TYPE_PROPERTY,
-                LogicalAddress.PLAYBACK_1.getDeviceType()))
+            .outerRule(CecRules.requiresCec(this))
+            .around(CecRules.requiresLeanback(this))
+            .around(CecRules.requiresDeviceType(this, LogicalAddress.PLAYBACK_1))
             .around(hdmiCecClient);
 
     /**
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecRoutingControlTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecRoutingControlTest.java
index 8bec365..bbba1c4 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecRoutingControlTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecRoutingControlTest.java
@@ -16,8 +16,7 @@
 
 package android.hdmicec.cts.playback;
 
-import static com.google.common.truth.Truth.assertThat;
-
+import android.hdmicec.cts.BaseHdmiCecCtsTest;
 import android.hdmicec.cts.CecMessage;
 import android.hdmicec.cts.CecOperand;
 import android.hdmicec.cts.HdmiCecClientWrapper;
@@ -28,7 +27,6 @@
 
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
 import org.junit.Rule;
 import org.junit.rules.RuleChain;
@@ -39,21 +37,20 @@
 
 /** HDMI CEC test to test routing control (Section 11.2.2) */
 @RunWith(DeviceJUnit4ClassRunner.class)
-public final class HdmiCecRoutingControlTest extends BaseHostJUnit4Test {
+public final class HdmiCecRoutingControlTest extends BaseHdmiCecCtsTest {
 
     private static final int PHYSICAL_ADDRESS = 0x1000;
 
-    public HdmiCecClientWrapper hdmiCecClient = new HdmiCecClientWrapper(LogicalAddress.PLAYBACK_1);
+    public HdmiCecRoutingControlTest() {
+        super(LogicalAddress.PLAYBACK_1);
+    }
 
     @Rule
     public RuleChain ruleChain =
         RuleChain
-            .outerRule(new RequiredFeatureRule(this, LogicalAddress.HDMI_CEC_FEATURE))
-            .around(new RequiredFeatureRule(this, LogicalAddress.LEANBACK_FEATURE))
-            .around(RequiredPropertyRule.asCsvContainsValue(
-                this,
-                LogicalAddress.HDMI_DEVICE_TYPE_PROPERTY,
-                LogicalAddress.PLAYBACK_1.getDeviceType()))
+            .outerRule(CecRules.requiresCec(this))
+            .around(CecRules.requiresLeanback(this))
+            .around(CecRules.requiresDeviceType(this, LogicalAddress.PLAYBACK_1))
             .around(hdmiCecClient);
 
     /**
@@ -63,16 +60,25 @@
      */
     @Test
     public void cect_11_2_2_1_SetStreamPathToDut() throws Exception {
-        final long hdmi2Address = 0x2000;
-        /* Switch to HDMI2. Setup assumes DUT is connected to HDMI1. */
+        final long alternateAddress;
+        int dumpsysPhysicalAddress = getDumpsysPhysicalAddress();
+        if (dumpsysPhysicalAddress == 0x1000) {
+            alternateAddress = 0x2000;
+        } else {
+            alternateAddress = 0x1000;
+        }
+        /*
+         * Switch to HDMI port whose physical address is alternateAddress. DUT is connected to HDMI
+         * port whose physical address is dumpsysPhysicalAddress.
+         */
         hdmiCecClient.sendCecMessage(LogicalAddress.PLAYBACK_2, LogicalAddress.BROADCAST,
-                CecOperand.ACTIVE_SOURCE, CecMessage.formatParams(hdmi2Address));
+                CecOperand.ACTIVE_SOURCE, CecMessage.formatParams(alternateAddress));
         TimeUnit.SECONDS.sleep(3);
         hdmiCecClient.sendCecMessage(LogicalAddress.TV, LogicalAddress.BROADCAST,
                 CecOperand.SET_STREAM_PATH,
-                CecMessage.formatParams(HdmiCecConstants.PHYSICAL_ADDRESS));
+                CecMessage.formatParams(dumpsysPhysicalAddress));
         String message = hdmiCecClient.checkExpectedOutput(CecOperand.ACTIVE_SOURCE);
-        assertThat(CecMessage.getParams(message)).isEqualTo(PHYSICAL_ADDRESS);
+        CecMessage.assertPhysicalAddressValid(message, dumpsysPhysicalAddress);
     }
 
     /**
@@ -87,7 +93,7 @@
         hdmiCecClient.sendCecMessage(LogicalAddress.TV, LogicalAddress.BROADCAST,
             CecOperand.REQUEST_ACTIVE_SOURCE);
         String message = hdmiCecClient.checkExpectedOutput(CecOperand.ACTIVE_SOURCE);
-        assertThat(CecMessage.getParams(message)).isEqualTo(PHYSICAL_ADDRESS);
+        CecMessage.assertPhysicalAddressValid(message, getDumpsysPhysicalAddress());
     }
 
     /**
@@ -99,11 +105,12 @@
     public void cect_11_2_2_4_InactiveSourceOnStandby() throws Exception {
         ITestDevice device = getDevice();
         try {
+            int dumpsysPhysicalAddress = getDumpsysPhysicalAddress();
             device.executeShellCommand("input keyevent KEYCODE_HOME");
             device.executeShellCommand("input keyevent KEYCODE_SLEEP");
             String message = hdmiCecClient.checkExpectedOutput(LogicalAddress.TV,
                     CecOperand.INACTIVE_SOURCE);
-            assertThat(CecMessage.getParams(message)).isEqualTo(PHYSICAL_ADDRESS);
+            CecMessage.assertPhysicalAddressValid(message, dumpsysPhysicalAddress);
         } finally {
             /* Wake up the device */
             device.executeShellCommand("input keyevent KEYCODE_WAKEUP");
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecStartupTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecStartupTest.java
index 9a93987..69bc346 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecStartupTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecStartupTest.java
@@ -20,6 +20,7 @@
 import static com.google.common.truth.Truth.assertWithMessage;
 import static org.junit.Assume.assumeTrue;
 
+import android.hdmicec.cts.BaseHdmiCecCtsTest;
 import android.hdmicec.cts.CecOperand;
 import android.hdmicec.cts.HdmiCecClientWrapper;
 import android.hdmicec.cts.HdmiCecConstants;
@@ -29,7 +30,6 @@
 
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
@@ -47,42 +47,43 @@
  */
 @Ignore("b/149519706")
 @RunWith(DeviceJUnit4ClassRunner.class)
-public final class HdmiCecStartupTest extends BaseHostJUnit4Test {
+public final class HdmiCecStartupTest extends BaseHdmiCecCtsTest {
 
   private static final LogicalAddress PLAYBACK_DEVICE = LogicalAddress.PLAYBACK_1;
   private static final ImmutableList<CecOperand> necessaryMessages =
       new ImmutableList.Builder<CecOperand>()
-          .add(CecOperand.REPORT_PHYSICAL_ADDRESS, CecOperand.CEC_VERSION,
-              CecOperand.DEVICE_VENDOR_ID, CecOperand.GIVE_POWER_STATUS).build();
+          .add(CecOperand.REPORT_PHYSICAL_ADDRESS).build();
   private static final ImmutableList<CecOperand> permissibleMessages =
       new ImmutableList.Builder<CecOperand>()
           .add(CecOperand.VENDOR_COMMAND, CecOperand.GIVE_DEVICE_VENDOR_ID,
-              CecOperand.SET_OSD_NAME, CecOperand.GIVE_OSD_NAME).build();
+              CecOperand.SET_OSD_NAME, CecOperand.GIVE_OSD_NAME, CecOperand.CEC_VERSION,
+              CecOperand.DEVICE_VENDOR_ID, CecOperand.GIVE_POWER_STATUS,
+              CecOperand.GET_MENU_LANGUAGE).build();
 
-  public HdmiCecClientWrapper hdmiCecClient = new HdmiCecClientWrapper(LogicalAddress.PLAYBACK_1);
+    public HdmiCecStartupTest() {
+        super(LogicalAddress.PLAYBACK_1);
+    }
 
-  @Rule
-  public RuleChain ruleChain =
-      RuleChain
-          .outerRule(new RequiredFeatureRule(this, LogicalAddress.HDMI_CEC_FEATURE))
-          .around(new RequiredFeatureRule(this, LogicalAddress.LEANBACK_FEATURE))
-          .around(RequiredPropertyRule.asCsvContainsValue(
-              this,
-              LogicalAddress.HDMI_DEVICE_TYPE_PROPERTY,
-              PLAYBACK_DEVICE.getDeviceType()))
-          .around(hdmiCecClient);
+    @Rule
+    public RuleChain ruleChain =
+        RuleChain
+            .outerRule(CecRules.requiresCec(this))
+            .around(CecRules.requiresLeanback(this))
+            .around(CecRules.requiresDeviceType(this, LogicalAddress.PLAYBACK_1))
+            .around(hdmiCecClient);
 
   /**
    * Tests that the device sends all the messages that should be sent on startup. It also ensures
    * that only the device only sends messages which are allowed by the spec.
    */
+  @Ignore("b/149519706")
   @Test
   public void cectVerifyStartupMessages() throws Exception {
     ITestDevice device = getDevice();
 
     /* Make sure device is playback only. Not applicable to playback/audio combinations */
     String deviceTypeCsv = device.executeShellCommand("getprop ro.hdmi.device_type").trim();
-    assumeTrue(deviceTypeCsv.equals(LogicalAddress.PLAYBACK_1.getDeviceType()));
+    assumeTrue(deviceTypeCsv.equals(LogicalAddress.PLAYBACK_1.getDeviceTypeString()));
 
     device.executeShellCommand("reboot");
     device.waitForBootComplete(HdmiCecConstants.REBOOT_TIMEOUT);
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecSystemAudioControlTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecSystemAudioControlTest.java
index a1ee080..95baefc 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecSystemAudioControlTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecSystemAudioControlTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.hdmicec.cts.BaseHdmiCecCtsTest;
 import android.hdmicec.cts.CecMessage;
 import android.hdmicec.cts.CecOperand;
 import android.hdmicec.cts.HdmiCecClientWrapper;
@@ -28,7 +29,6 @@
 
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
 import org.junit.Ignore;
 import org.junit.Rule;
@@ -38,22 +38,20 @@
 
 /** HDMI CEC test to verify system audio control commands (Section 11.2.15) */
 @RunWith(DeviceJUnit4ClassRunner.class)
-public final class HdmiCecSystemAudioControlTest extends BaseHostJUnit4Test {
+public final class HdmiCecSystemAudioControlTest extends BaseHdmiCecCtsTest {
 
     private static final LogicalAddress PLAYBACK_DEVICE = LogicalAddress.PLAYBACK_1;
 
-    public HdmiCecClientWrapper hdmiCecClient =
-        new HdmiCecClientWrapper(LogicalAddress.PLAYBACK_1, "-t", "a");
+    public HdmiCecSystemAudioControlTest() {
+        super(LogicalAddress.PLAYBACK_1, "-t", "a");
+    }
 
     @Rule
     public RuleChain ruleChain =
         RuleChain
-            .outerRule(new RequiredFeatureRule(this, LogicalAddress.HDMI_CEC_FEATURE))
-            .around(new RequiredFeatureRule(this, LogicalAddress.LEANBACK_FEATURE))
-            .around(RequiredPropertyRule.asCsvContainsValue(
-                this,
-                LogicalAddress.HDMI_DEVICE_TYPE_PROPERTY,
-                PLAYBACK_DEVICE.getDeviceType()))
+            .outerRule(CecRules.requiresCec(this))
+            .around(CecRules.requiresLeanback(this))
+            .around(CecRules.requiresDeviceType(this, LogicalAddress.PLAYBACK_1))
             .around(hdmiCecClient);
 
     /**
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecSystemInformationTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecSystemInformationTest.java
index 5e59a8f..7a78528 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecSystemInformationTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecSystemInformationTest.java
@@ -20,86 +20,35 @@
 
 import static org.junit.Assume.assumeTrue;
 
-import android.hdmicec.cts.CecClientMessage;
+import android.hdmicec.cts.BaseHdmiCecCtsTest;
 import android.hdmicec.cts.CecMessage;
 import android.hdmicec.cts.CecOperand;
-import android.hdmicec.cts.HdmiCecClientWrapper;
-import android.hdmicec.cts.HdmiCecConstants;
 import android.hdmicec.cts.LogicalAddress;
-import android.hdmicec.cts.RequiredPropertyRule;
-import android.hdmicec.cts.RequiredFeatureRule;
 
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
 import org.junit.Rule;
+import org.junit.Test;
 import org.junit.rules.RuleChain;
 import org.junit.runner.RunWith;
-import org.junit.Test;
 
 /** HDMI CEC system information tests (Section 11.2.6) */
 @RunWith(DeviceJUnit4ClassRunner.class)
-public final class HdmiCecSystemInformationTest extends BaseHostJUnit4Test {
-
-    /** The version number 0x05 refers to CEC v1.4 */
-    private static final int CEC_VERSION_NUMBER = 0x05;
+public final class HdmiCecSystemInformationTest extends BaseHdmiCecCtsTest {
 
     private static final String PROPERTY_LOCALE = "persist.sys.locale";
 
-    public HdmiCecClientWrapper hdmiCecClient = new HdmiCecClientWrapper(LogicalAddress.PLAYBACK_1);
-
     @Rule
     public RuleChain ruleChain =
-        RuleChain
-            .outerRule(new RequiredFeatureRule(this, LogicalAddress.HDMI_CEC_FEATURE))
-            .around(new RequiredFeatureRule(this, LogicalAddress.LEANBACK_FEATURE))
-            .around(RequiredPropertyRule.asCsvContainsValue(
-                this,
-                LogicalAddress.HDMI_DEVICE_TYPE_PROPERTY,
-                LogicalAddress.PLAYBACK_1.getDeviceType()))
-            .around(hdmiCecClient);
+            RuleChain
+                    .outerRule(CecRules.requiresCec(this))
+                    .around(CecRules.requiresLeanback(this))
+                    .around(CecRules.requiresDeviceType(this, LogicalAddress.PLAYBACK_1))
+                    .around(hdmiCecClient);
 
-    /**
-     * Test 11.2.6-1
-     * Tests for Ack <Polling Message> message.
-     */
-    @Test
-    public void cect_11_2_6_1_Ack() throws Exception {
-        String command = CecClientMessage.POLL + " " + LogicalAddress.PLAYBACK_1;
-        String expectedOutput = "POLL sent";
-        hdmiCecClient.sendConsoleMessage(command);
-        if (!hdmiCecClient.checkConsoleOutput(expectedOutput)) {
-            throw new Exception("Could not find " + expectedOutput);
-        }
-    }
-
-    /**
-     * Test 11.2.6-2
-     * Tests that the device sends a <REPORT_PHYSICAL_ADDRESS> in response to a
-     * <GIVE_PHYSICAL_ADDRESS>
-     */
-    @Test
-    public void cect_11_2_6_2_GivePhysicalAddress() throws Exception {
-        hdmiCecClient.sendCecMessage(CecOperand.GIVE_PHYSICAL_ADDRESS);
-        String message = hdmiCecClient.checkExpectedOutput(CecOperand.REPORT_PHYSICAL_ADDRESS);
-        /* The checkExpectedOutput has already verified the first 4 nibbles of the message. We
-            * have to verify the last 6 nibbles */
-        int receivedParams = CecMessage.getParams(message);
-        assertThat(HdmiCecConstants.PHYSICAL_ADDRESS).isEqualTo(receivedParams >> 8);
-        assertThat(HdmiCecConstants.PLAYBACK_DEVICE_TYPE).isEqualTo(receivedParams & 0xFF);
-    }
-
-    /**
-     * Test 11.2.6-6
-     * Tests that the device sends a <CEC_VERSION> in response to a <GET_CEC_VERSION>
-     */
-    @Test
-    public void cect_11_2_6_6_GiveCecVersion() throws Exception {
-        hdmiCecClient.sendCecMessage(LogicalAddress.TV, CecOperand.GET_CEC_VERSION);
-        String message = hdmiCecClient.checkExpectedOutput(LogicalAddress.TV,
-                                                            CecOperand.CEC_VERSION);
-        assertThat(CecMessage.getParams(message)).isEqualTo(CEC_VERSION_NUMBER);
+    public HdmiCecSystemInformationTest() {
+        super(LogicalAddress.PLAYBACK_1);
     }
 
     /**
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecSystemStandbyTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecSystemStandbyTest.java
index 369542e..d78d318 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecSystemStandbyTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecSystemStandbyTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.hdmicec.cts.BaseHdmiCecCtsTest;
 import android.hdmicec.cts.CecOperand;
 import android.hdmicec.cts.HdmiCecClientWrapper;
 import android.hdmicec.cts.HdmiCecConstants;
@@ -27,7 +28,6 @@
 
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
 import org.junit.Rule;
 import org.junit.rules.RuleChain;
@@ -38,24 +38,21 @@
 
 /** HDMI CEC test to verify the device handles standby correctly (Section 11.2.3) */
 @RunWith(DeviceJUnit4ClassRunner.class)
-public final class HdmiCecSystemStandbyTest extends BaseHostJUnit4Test {
-
-    private static final LogicalAddress PLAYBACK_DEVICE = LogicalAddress.PLAYBACK_1;
+public final class HdmiCecSystemStandbyTest extends BaseHdmiCecCtsTest {
 
     private static final String HDMI_CONTROL_DEVICE_AUTO_OFF =
             "hdmi_control_auto_device_off_enabled";
 
-    public HdmiCecClientWrapper hdmiCecClient = new HdmiCecClientWrapper(LogicalAddress.PLAYBACK_1);
+    public HdmiCecSystemStandbyTest() {
+        super(LogicalAddress.PLAYBACK_1);
+    }
 
     @Rule
     public RuleChain ruleChain =
         RuleChain
-            .outerRule(new RequiredFeatureRule(this, LogicalAddress.HDMI_CEC_FEATURE))
-            .around(new RequiredFeatureRule(this, LogicalAddress.LEANBACK_FEATURE))
-            .around(RequiredPropertyRule.asCsvContainsValue(
-                this,
-                LogicalAddress.HDMI_DEVICE_TYPE_PROPERTY,
-                PLAYBACK_DEVICE.getDeviceType()))
+            .outerRule(CecRules.requiresCec(this))
+            .around(CecRules.requiresLeanback(this))
+            .around(CecRules.requiresDeviceType(this, LogicalAddress.PLAYBACK_1))
             .around(hdmiCecClient);
 
     private boolean setHdmiControlDeviceAutoOff(boolean turnOn) throws Exception {
@@ -65,8 +62,8 @@
         String valToSet = turnOn ? "1" : "0";
         device.executeShellCommand("settings put global "
                 + HDMI_CONTROL_DEVICE_AUTO_OFF + " " + valToSet);
-        device.executeShellCommand("settings get global " + HDMI_CONTROL_DEVICE_AUTO_OFF).trim();
-        return val.equals("1") ? true : false;
+        device.executeShellCommand("settings get global " + HDMI_CONTROL_DEVICE_AUTO_OFF);
+        return val.equals("1");
     }
 
     private void checkDeviceAsleepAfterStandbySent(LogicalAddress source, LogicalAddress destination)
diff --git a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecVendorCommandsTest.java b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecVendorCommandsTest.java
index edff394..4a850e9 100644
--- a/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecVendorCommandsTest.java
+++ b/hostsidetests/hdmicec/src/android/hdmicec/cts/playback/HdmiCecVendorCommandsTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.hdmicec.cts.BaseHdmiCecCtsTest;
 import android.hdmicec.cts.CecMessage;
 import android.hdmicec.cts.CecOperand;
 import android.hdmicec.cts.HdmiCecClientWrapper;
@@ -28,7 +29,6 @@
 
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
 import org.junit.Rule;
 import org.junit.rules.RuleChain;
@@ -37,22 +37,21 @@
 
 /** HDMI CEC test to verify device vendor specific commands (Section 11.2.9) */
 @RunWith(DeviceJUnit4ClassRunner.class)
-public final class HdmiCecVendorCommandsTest extends BaseHostJUnit4Test {
+public final class HdmiCecVendorCommandsTest extends BaseHdmiCecCtsTest {
 
     private static final LogicalAddress PLAYBACK_DEVICE = LogicalAddress.PLAYBACK_1;
     private static final int INCORRECT_VENDOR_ID = 0x0;
 
-    public HdmiCecClientWrapper hdmiCecClient = new HdmiCecClientWrapper(LogicalAddress.PLAYBACK_1);
+    public HdmiCecVendorCommandsTest() {
+        super(LogicalAddress.PLAYBACK_1);
+    }
 
     @Rule
     public RuleChain ruleChain =
         RuleChain
-            .outerRule(new RequiredFeatureRule(this, LogicalAddress.HDMI_CEC_FEATURE))
-            .around(new RequiredFeatureRule(this, LogicalAddress.LEANBACK_FEATURE))
-            .around(RequiredPropertyRule.asCsvContainsValue(
-                this,
-                LogicalAddress.HDMI_DEVICE_TYPE_PROPERTY,
-                PLAYBACK_DEVICE.getDeviceType()))
+            .outerRule(CecRules.requiresCec(this))
+            .around(CecRules.requiresLeanback(this))
+            .around(CecRules.requiresDeviceType(this, LogicalAddress.PLAYBACK_1))
             .around(hdmiCecClient);
 
     /**
diff --git a/hostsidetests/incident/Android.bp b/hostsidetests/incident/Android.bp
index 2bbb5a5..932948e 100644
--- a/hostsidetests/incident/Android.bp
+++ b/hostsidetests/incident/Android.bp
@@ -18,7 +18,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
diff --git a/hostsidetests/incident/apps/batterystatsapp/Android.bp b/hostsidetests/incident/apps/batterystatsapp/Android.bp
index b39fd4e..5110288 100644
--- a/hostsidetests/incident/apps/batterystatsapp/Android.bp
+++ b/hostsidetests/incident/apps/batterystatsapp/Android.bp
@@ -17,7 +17,7 @@
     defaults: ["cts_defaults"],
     srcs: ["src/**/*.java"],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "junit",
         "org.apache.http.legacy",
     ],
@@ -30,7 +30,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/incident/apps/boundwidgetapp/Android.bp b/hostsidetests/incident/apps/boundwidgetapp/Android.bp
index d89ef23..7ee158f 100644
--- a/hostsidetests/incident/apps/boundwidgetapp/Android.bp
+++ b/hostsidetests/incident/apps/boundwidgetapp/Android.bp
@@ -17,9 +17,9 @@
     defaults: ["cts_defaults"],
     srcs: ["src/**/*.java"],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "junit",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     static_libs: [
         "ctstestrunner-axt",
@@ -30,7 +30,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/incident/apps/errorsapp/Android.bp b/hostsidetests/incident/apps/errorsapp/Android.bp
index 788d72e..b21bd93 100644
--- a/hostsidetests/incident/apps/errorsapp/Android.bp
+++ b/hostsidetests/incident/apps/errorsapp/Android.bp
@@ -18,7 +18,7 @@
     srcs: ["src/**/*.java"],
     compile_multilib: "both",
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "junit",
     ],
     // Includes the jni code as a shared library
@@ -32,7 +32,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/incident/apps/errorsapp/jni/Android.bp b/hostsidetests/incident/apps/errorsapp/jni/Android.bp
index 7c61818..2e7e1f0 100644
--- a/hostsidetests/incident/apps/errorsapp/jni/Android.bp
+++ b/hostsidetests/incident/apps/errorsapp/jni/Android.bp
@@ -20,5 +20,6 @@
         "-Werror",
         "-Wno-unused-parameter",
     ],
+    header_libs: ["jni_headers"],
     sdk_version: "current",
 }
diff --git a/hostsidetests/incident/apps/errorsapp/src/com/android/server/cts/errors/ErrorsTests.java b/hostsidetests/incident/apps/errorsapp/src/com/android/server/cts/errors/ErrorsTests.java
index 923211d..97a67ba 100644
--- a/hostsidetests/incident/apps/errorsapp/src/com/android/server/cts/errors/ErrorsTests.java
+++ b/hostsidetests/incident/apps/errorsapp/src/com/android/server/cts/errors/ErrorsTests.java
@@ -17,26 +17,20 @@
 
 import static org.junit.Assert.assertTrue;
 
-import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.DropBoxManager;
 import android.util.Log;
 
 import androidx.test.InstrumentationRegistry;
 import androidx.test.runner.AndroidJUnit4;
 
+import com.android.compatibility.common.util.DropBoxReceiver;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Used by ErrorTest. Spawns misbehaving activities so reports will appear in Dropbox.
- */
+/** Used by ErrorTest. Spawns misbehaving activities so reports will appear in Dropbox. */
 @RunWith(AndroidJUnit4.class)
 public class ErrorsTests {
     private static final String TAG = "ErrorsTests";
@@ -46,37 +40,36 @@
     private static final String NATIVE_CRASH_TAG = "data_app_native_crash";
     private static final String TOMBSTONE_TAG = "SYSTEM_TOMBSTONE";
 
-    private static final int TIMEOUT_SECS = 60 * 3;
-
-    private CountDownLatch mResultsReceivedSignal;
-    private DropBoxManager mDropbox;
-    private long mStartMs;
     private Context mContext;
 
     @Before
     public void setUp() {
         mContext = InstrumentationRegistry.getTargetContext();
-        mDropbox = (DropBoxManager) mContext.getSystemService(Context.DROPBOX_SERVICE);
-        mResultsReceivedSignal = new CountDownLatch(1);
-        mStartMs = System.currentTimeMillis();
 
-        InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand(
-                "appops set " + mContext.getPackageName() + " android:get_usage_stats allow");
+        InstrumentationRegistry.getInstrumentation()
+                .getUiAutomation()
+                .executeShellCommand(
+                        "appops set "
+                                + mContext.getPackageName()
+                                + " android:get_usage_stats allow");
     }
 
     @Test
     public void testException() throws Exception {
         Log.i(TAG, "testException");
 
-        registerReceiver(mContext, mResultsReceivedSignal, CRASH_TAG,
-                 mContext.getPackageName() + ":TestProcess",
-                "java.lang.RuntimeException: This is a test exception");
+        final DropBoxReceiver receiver =
+                new DropBoxReceiver(
+                        mContext,
+                        CRASH_TAG,
+                        mContext.getPackageName() + ":TestProcess",
+                        "java.lang.RuntimeException: This is a test exception");
         Intent intent = new Intent();
         intent.setClass(mContext, ExceptionActivity.class);
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         mContext.startActivity(intent);
 
-        assertTrue(mResultsReceivedSignal.await(TIMEOUT_SECS, TimeUnit.SECONDS));
+        assertTrue(receiver.await());
     }
 
     @Test
@@ -84,76 +77,57 @@
         Log.i(TAG, "testANR");
 
         // Require that we get an ANR entry that shows that the activity is blocked in onCreate.
-        registerReceiver(mContext, mResultsReceivedSignal, ANR_TAG,
-                mContext.getPackageName() + ":TestProcess",
-                "com.android.server.cts.errors.ANRActivity.onCreate");
+        final DropBoxReceiver receiver =
+                new DropBoxReceiver(
+                        mContext,
+                        ANR_TAG,
+                        mContext.getPackageName() + ":TestProcess",
+                        "com.android.server.cts.errors.ANRActivity.onCreate");
         Intent intent = new Intent();
         intent.setClass(mContext, ANRActivity.class);
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         mContext.startActivity(intent);
 
-        final Intent receiver = new Intent(mContext, Receiver.class);
-        mContext.sendBroadcast(receiver);
+        final Intent receiverIntent = new Intent(mContext, Receiver.class);
+        mContext.sendBroadcast(receiverIntent);
         Log.i(TAG, "testANR -- sent broadcast to " + receiver);
 
-        assertTrue(mResultsReceivedSignal.await(TIMEOUT_SECS, TimeUnit.SECONDS));
+        assertTrue(receiver.await());
     }
 
     @Test
     public void testNativeCrash() throws Exception {
         Log.i(TAG, "testNativeCrash");
 
-        registerReceiver(mContext, mResultsReceivedSignal, NATIVE_CRASH_TAG,
-                mContext.getPackageName() + ":TestProcess", "backtrace:");
+        final DropBoxReceiver receiver =
+                new DropBoxReceiver(
+                        mContext,
+                        NATIVE_CRASH_TAG,
+                        mContext.getPackageName() + ":TestProcess",
+                        "backtrace:");
         Intent intent = new Intent();
         intent.setClass(mContext, NativeActivity.class);
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         mContext.startActivity(intent);
 
-        assertTrue(mResultsReceivedSignal.await(TIMEOUT_SECS, TimeUnit.SECONDS));
+        assertTrue(receiver.await());
     }
 
     @Test
     public void testTombstone() throws Exception {
         Log.i(TAG, "testTombstone");
 
-        registerReceiver(mContext, mResultsReceivedSignal, TOMBSTONE_TAG,
-                mContext.getPackageName() + ":TestProcess", "backtrace:");
+        final DropBoxReceiver receiver =
+                new DropBoxReceiver(
+                        mContext,
+                        TOMBSTONE_TAG,
+                        mContext.getPackageName() + ":TestProcess",
+                        "backtrace:");
         Intent intent = new Intent();
         intent.setClass(mContext, NativeActivity.class);
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         mContext.startActivity(intent);
 
-        assertTrue(mResultsReceivedSignal.await(TIMEOUT_SECS, TimeUnit.SECONDS));
-    }
-
-    void registerReceiver(Context ctx, CountDownLatch onReceiveLatch, String wantTag,
-            String... wantInStackTrace) {
-        ctx.registerReceiver(new BroadcastReceiver() {
-            @Override
-            public void onReceive(Context context, Intent intent) {
-                // DropBox might receive other entries while we're waiting for the error
-                // entry, so we need to check the tag and stack trace before continuing.
-                while (true) {
-                    final DropBoxManager.Entry entry = mDropbox.getNextEntry(wantTag, mStartMs);
-                    if (entry == null) {
-                        break;
-                    }
-                    Log.d(TAG, "ErrorsTest got message from drobpox: " + entry.getTag());
-                    mStartMs = entry.getTimeMillis();
-                    String stackTrace = entry.getText(64 * 1024);
-                    boolean allMatches = true;
-                    for (String line : wantInStackTrace) {
-                        boolean matched = stackTrace.contains(line);
-                        Log.d(TAG, "   matched=" + matched + " line: " + line);
-                        allMatches &= matched;
-                    }
-                    if (allMatches) {
-                        onReceiveLatch.countDown();
-                    }
-                    entry.close();
-                }
-            }
-        }, new IntentFilter(DropBoxManager.ACTION_DROPBOX_ENTRY_ADDED));
+        assertTrue(receiver.await());
     }
 }
diff --git a/hostsidetests/incident/apps/graphicsstatsapp/Android.bp b/hostsidetests/incident/apps/graphicsstatsapp/Android.bp
index 7e0c0a5..5ca33a8 100644
--- a/hostsidetests/incident/apps/graphicsstatsapp/Android.bp
+++ b/hostsidetests/incident/apps/graphicsstatsapp/Android.bp
@@ -17,7 +17,7 @@
     defaults: ["cts_defaults"],
     srcs: ["src/**/*.java"],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "junit",
     ],
     static_libs: [
@@ -30,7 +30,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/incident/apps/graphicsstatsapp/src/com/android/server/cts/device/graphicsstats/DrawFramesActivity.java b/hostsidetests/incident/apps/graphicsstatsapp/src/com/android/server/cts/device/graphicsstats/DrawFramesActivity.java
index 4f48544..f4719bc 100644
--- a/hostsidetests/incident/apps/graphicsstatsapp/src/com/android/server/cts/device/graphicsstats/DrawFramesActivity.java
+++ b/hostsidetests/incident/apps/graphicsstatsapp/src/com/android/server/cts/device/graphicsstats/DrawFramesActivity.java
@@ -121,7 +121,7 @@
 
     private void spinSleep(int durationMs) {
         long until = System.currentTimeMillis() + durationMs;
-        while (System.currentTimeMillis() < until) {}
+        while (System.currentTimeMillis() <= until) {}
     }
 
     private void scheduleDraw() {
diff --git a/hostsidetests/incident/apps/notificationsapp/Android.bp b/hostsidetests/incident/apps/notificationsapp/Android.bp
index 00cdc74..06f15e4 100644
--- a/hostsidetests/incident/apps/notificationsapp/Android.bp
+++ b/hostsidetests/incident/apps/notificationsapp/Android.bp
@@ -17,7 +17,7 @@
     defaults: ["cts_defaults"],
     srcs: ["src/**/*.java"],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "junit",
     ],
     static_libs: [
@@ -30,7 +30,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/incident/apps/procstatsapp/Android.bp b/hostsidetests/incident/apps/procstatsapp/Android.bp
index 59093c1..51b567b 100644
--- a/hostsidetests/incident/apps/procstatsapp/Android.bp
+++ b/hostsidetests/incident/apps/procstatsapp/Android.bp
@@ -17,7 +17,7 @@
     defaults: ["cts_defaults"],
     srcs: ["src/**/*.java"],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "junit",
     ],
     static_libs: [
@@ -29,7 +29,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/incident/src/com/android/server/cts/GraphicsStatsValidationTest.java b/hostsidetests/incident/src/com/android/server/cts/GraphicsStatsValidationTest.java
index 1e0a215..33859bf 100644
--- a/hostsidetests/incident/src/com/android/server/cts/GraphicsStatsValidationTest.java
+++ b/hostsidetests/incident/src/com/android/server/cts/GraphicsStatsValidationTest.java
@@ -76,8 +76,8 @@
         int jankyDelta = summaryAfter.getJankyFrames() - summaryBefore.getJankyFrames();
         // We expect 11 frames to have been drawn (first frame + the 10 more explicitly requested)
         assertTrue(frameDelta >= 11);
-        assertTrue(jankyDelta >= 1);
-        int veryJankyDelta = countFramesAbove(statsAfter, 40) - countFramesAbove(statsBefore, 40);
+        assertTrue(jankyDelta >= 0);
+        assertTrue(jankyDelta <= frameDelta);
         System.out.println("--------------------------------- testBasicDrawFrame END");
     }
 
@@ -109,7 +109,7 @@
         int veryJankyDelta = countFramesAbove(statsAfter, 60) - countFramesAbove(statsBefore, 60);
         // The 1st frame could be >40ms, but nothing after that should be
         assertThat(veryJankyDelta).isAtMost(2);
-        int noGPUJank = countGPUFramesAbove(statsAfter, 60) - countGPUFramesAbove(statsBefore, 60);
+        int noGPUJank = countGPUFramesAbove(statsAfter, 25) - countGPUFramesAbove(statsBefore, 25);
         assertThat(noGPUJank).isEqualTo(0);
     }
 
diff --git a/hostsidetests/incrementalinstall/Android.bp b/hostsidetests/incrementalinstall/Android.bp
index 64c15aa..b4576b8 100644
--- a/hostsidetests/incrementalinstall/Android.bp
+++ b/hostsidetests/incrementalinstall/Android.bp
@@ -26,6 +26,7 @@
     ],
     test_suites: [
         "cts",
+        "general-tests",
     ],
     data: [
         ":IncrementalTestAppDynamicAsset",
diff --git a/hostsidetests/incrementalinstall/app/Android.bp b/hostsidetests/incrementalinstall/app/Android.bp
index 85a8be1..bd48119 100644
--- a/hostsidetests/incrementalinstall/app/Android.bp
+++ b/hostsidetests/incrementalinstall/app/Android.bp
@@ -24,6 +24,7 @@
     },
     test_suites: [
         "cts",
+        "general-tests",
     ],
     v4_signature: true,
     static_libs: [
@@ -51,6 +52,7 @@
     },
     test_suites: [
         "cts",
+        "general-tests",
     ],
     v4_signature: true,
     static_libs: [
@@ -74,6 +76,7 @@
     },
     test_suites: [
         "cts",
+        "general-tests",
     ],
     v4_signature: true,
     static_libs: [
diff --git a/hostsidetests/incrementalinstall/app/nativelibcompressed/Android.bp b/hostsidetests/incrementalinstall/app/nativelibcompressed/Android.bp
index e4a03f8..7d7a602 100644
--- a/hostsidetests/incrementalinstall/app/nativelibcompressed/Android.bp
+++ b/hostsidetests/incrementalinstall/app/nativelibcompressed/Android.bp
@@ -16,6 +16,7 @@
     name: "libcompressednativeincrementaltest",
     sdk_version: "current", // Oreo
     cppflags: ["-std=c++11"],
+    header_libs: ["jni_headers"],
     srcs: ["src/cpp/compressednative_lib.cpp"],
     stl: "c++_static",
 }
diff --git a/hostsidetests/incrementalinstall/app/nativelibuncompressed/Android.bp b/hostsidetests/incrementalinstall/app/nativelibuncompressed/Android.bp
index 9bc1662..3421fb8 100644
--- a/hostsidetests/incrementalinstall/app/nativelibuncompressed/Android.bp
+++ b/hostsidetests/incrementalinstall/app/nativelibuncompressed/Android.bp
@@ -16,6 +16,7 @@
     name: "libuncompressednativeincrementaltest",
     sdk_version: "current", // Oreo
     cppflags: ["-std=c++11"],
+    header_libs: ["jni_headers"],
     srcs: ["src/cpp/uncompressednative_lib.cpp"],
     stl: "c++_static",
 }
diff --git a/hostsidetests/incrementalinstall/appvalidator/Android.bp b/hostsidetests/incrementalinstall/appvalidator/Android.bp
index 95cc83e..41021fa 100644
--- a/hostsidetests/incrementalinstall/appvalidator/Android.bp
+++ b/hostsidetests/incrementalinstall/appvalidator/Android.bp
@@ -23,6 +23,7 @@
     },
     test_suites: [
         "cts",
+        "general-tests",
     ],
     static_libs: [
         "ctstestrunner-axt",
@@ -31,8 +32,8 @@
         "incremental-install-common-lib",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     jni_libs: [
         "libpath_checker_jni",
diff --git a/hostsidetests/incrementalinstall/appvalidator/src/android/incrementalinstall/inrementaltestappvalidation/jni/Android.bp b/hostsidetests/incrementalinstall/appvalidator/src/android/incrementalinstall/inrementaltestappvalidation/jni/Android.bp
index 96ddc04..28d7450 100644
--- a/hostsidetests/incrementalinstall/appvalidator/src/android/incrementalinstall/inrementaltestappvalidation/jni/Android.bp
+++ b/hostsidetests/incrementalinstall/appvalidator/src/android/incrementalinstall/inrementaltestappvalidation/jni/Android.bp
@@ -25,6 +25,7 @@
          "-Wunreachable-code",
          "-Wno-unused-parameter",
      ],
+     header_libs: ["jni_headers"],
      srcs: [
        "path_checker.cpp",
      ],
@@ -32,4 +33,4 @@
        "libbase",
        "libincfs",
      ],
- }
\ No newline at end of file
+ }
diff --git a/hostsidetests/inputmethodservice/common/Android.bp b/hostsidetests/inputmethodservice/common/Android.bp
index 32d20a2..6d07408 100644
--- a/hostsidetests/inputmethodservice/common/Android.bp
+++ b/hostsidetests/inputmethodservice/common/Android.bp
@@ -20,7 +20,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/inputmethodservice/deviceside/devicetest/Android.bp b/hostsidetests/inputmethodservice/deviceside/devicetest/Android.bp
index e86e545..4d4fb3e 100644
--- a/hostsidetests/inputmethodservice/deviceside/devicetest/Android.bp
+++ b/hostsidetests/inputmethodservice/deviceside/devicetest/Android.bp
@@ -16,7 +16,7 @@
     name: "CtsInputMethodServiceDeviceTests",
     defaults: ["cts_defaults"],
     srcs: ["src/**/*.java"],
-    libs: ["android.test.runner.stubs"],
+    libs: ["android.test.runner"],
     static_libs: [
         "androidx.test.rules",
         "hamcrest",
@@ -28,7 +28,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/inputmethodservice/deviceside/edittextapp/Android.bp b/hostsidetests/inputmethodservice/deviceside/edittextapp/Android.bp
index 966de7d..bab73b4 100644
--- a/hostsidetests/inputmethodservice/deviceside/edittextapp/Android.bp
+++ b/hostsidetests/inputmethodservice/deviceside/edittextapp/Android.bp
@@ -20,7 +20,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/inputmethodservice/deviceside/ime1/Android.bp b/hostsidetests/inputmethodservice/deviceside/ime1/Android.bp
index 9d58ed5..65e546c 100644
--- a/hostsidetests/inputmethodservice/deviceside/ime1/Android.bp
+++ b/hostsidetests/inputmethodservice/deviceside/ime1/Android.bp
@@ -23,7 +23,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/inputmethodservice/deviceside/ime2/Android.bp b/hostsidetests/inputmethodservice/deviceside/ime2/Android.bp
index 2e7bc82..875c3bc 100644
--- a/hostsidetests/inputmethodservice/deviceside/ime2/Android.bp
+++ b/hostsidetests/inputmethodservice/deviceside/ime2/Android.bp
@@ -23,7 +23,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/inputmethodservice/deviceside/lib/Android.bp b/hostsidetests/inputmethodservice/deviceside/lib/Android.bp
index fbcc0ef3..01ca2c0 100644
--- a/hostsidetests/inputmethodservice/deviceside/lib/Android.bp
+++ b/hostsidetests/inputmethodservice/deviceside/lib/Android.bp
@@ -22,7 +22,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/inputmethodservice/deviceside/provider/Android.bp b/hostsidetests/inputmethodservice/deviceside/provider/Android.bp
index 7a74cd5..efbf893 100644
--- a/hostsidetests/inputmethodservice/deviceside/provider/Android.bp
+++ b/hostsidetests/inputmethodservice/deviceside/provider/Android.bp
@@ -23,7 +23,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/inputmethodservice/hostside/Android.bp b/hostsidetests/inputmethodservice/hostside/Android.bp
index 2578f45..c954414 100644
--- a/hostsidetests/inputmethodservice/hostside/Android.bp
+++ b/hostsidetests/inputmethodservice/hostside/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
diff --git a/hostsidetests/inputmethodservice/hostside/src/android/inputmethodservice/cts/hostside/MultiUserTest.java b/hostsidetests/inputmethodservice/hostside/src/android/inputmethodservice/cts/hostside/MultiUserTest.java
index f1e73a2..c1b948e 100644
--- a/hostsidetests/inputmethodservice/hostside/src/android/inputmethodservice/cts/hostside/MultiUserTest.java
+++ b/hostsidetests/inputmethodservice/hostside/src/android/inputmethodservice/cts/hostside/MultiUserTest.java
@@ -180,6 +180,12 @@
 
         switchUser(primaryUserId);
 
+        // For devices that have config_multiuserDelayUserDataLocking set to true, the
+        // secondaryUserId will be stopped after switching to the primaryUserId. This means that
+        // the InputMethodManager can no longer query for the Input Method Services since they have
+        // all been stopped.
+        getDevice().startUser(secondaryUserId, true /* waitFlag */);
+
         assertIme1NotExistInApiResult(primaryUserId);
         assertIme1ExistsInApiResult(secondaryUserId);
         assertIme1ImplicitlyEnabledSubtypeNotExist(primaryUserId);
diff --git a/hostsidetests/jdwpsecurity/Android.bp b/hostsidetests/jdwpsecurity/Android.bp
index 00c8e81..9eedf9a 100644
--- a/hostsidetests/jdwpsecurity/Android.bp
+++ b/hostsidetests/jdwpsecurity/Android.bp
@@ -23,7 +23,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJdwpApp"],
diff --git a/hostsidetests/jdwptunnel/Android.bp b/hostsidetests/jdwptunnel/Android.bp
index f649e5a..62b0ed0 100644
--- a/hostsidetests/jdwptunnel/Android.bp
+++ b/hostsidetests/jdwptunnel/Android.bp
@@ -27,15 +27,15 @@
     data: [
         // Include the JDI classes in the testcases directory.
         ":jdi-support",
-        ":CtsJdwpTunnelSampleApp",
+        ":CtsJdwpTunnelDebuggableSampleApp",
+        ":CtsJdwpTunnelProfileableSampleApp",
     ],
 
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
-    // LOCAL_CTS_TEST_PACKAGE := android.host.jdwptunnel
+    // LOCAL_CTS_TEST_PACKAGE := android.host.jdwptunnel.*
 }
diff --git a/hostsidetests/jdwptunnel/sampleapp/Android.bp b/hostsidetests/jdwptunnel/sampleapp/Android.bp
deleted file mode 100644
index 0ed8655..0000000
--- a/hostsidetests/jdwptunnel/sampleapp/Android.bp
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (C) 2019 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.
-
-android_test_helper_app {
-    name: "CtsJdwpTunnelSampleApp",
-
-    dex_preopt: {
-        enabled: false,
-    },
-
-    optimize: {
-        enabled: false,
-    },
-
-    srcs: ["src/**/*.java"],
-
-    sdk_version: "current",
-
-}
diff --git a/hostsidetests/jdwptunnel/sampleapp/AndroidManifest.xml b/hostsidetests/jdwptunnel/sampleapp/AndroidManifest.xml
deleted file mode 100755
index 67dd17d..0000000
--- a/hostsidetests/jdwptunnel/sampleapp/AndroidManifest.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Copyright (C) 2019 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.jdwptunnel.sampleapp">
-
-    <application android:debuggable="true">
-        <activity android:name=".SampleDeviceActivity" >
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-
-</manifest>
-
diff --git a/hostsidetests/jdwptunnel/sampleapp/src/android/jdwptunnel/sampleapp/SampleDeviceActivity.java b/hostsidetests/jdwptunnel/sampleapp/src/android/jdwptunnel/sampleapp/SampleDeviceActivity.java
deleted file mode 100644
index ff3142d..0000000
--- a/hostsidetests/jdwptunnel/sampleapp/src/android/jdwptunnel/sampleapp/SampleDeviceActivity.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2019 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.jdwptunnel.sampleapp;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-/**
- * A simple activity which does nothing.
- *
- * <p>This serves as a simple target application/activity to attach a debugger to.
- */
-public final class SampleDeviceActivity extends Activity {
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-        setContentView(R.layout.sample_layout);
-    }
-}
diff --git a/hostsidetests/jdwptunnel/sampleapps/debuggableapp/Android.bp b/hostsidetests/jdwptunnel/sampleapps/debuggableapp/Android.bp
new file mode 100644
index 0000000..384ee5f
--- /dev/null
+++ b/hostsidetests/jdwptunnel/sampleapps/debuggableapp/Android.bp
@@ -0,0 +1,30 @@
+// Copyright (C) 2019 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.
+
+android_test_helper_app {
+    name: "CtsJdwpTunnelDebuggableSampleApp",
+
+    dex_preopt: {
+        enabled: false,
+    },
+
+    optimize: {
+        enabled: false,
+    },
+
+    srcs: ["src/**/*.java"],
+
+    sdk_version: "current",
+
+}
diff --git a/hostsidetests/jdwptunnel/sampleapps/debuggableapp/AndroidManifest.xml b/hostsidetests/jdwptunnel/sampleapps/debuggableapp/AndroidManifest.xml
new file mode 100755
index 0000000..2e2d2dd
--- /dev/null
+++ b/hostsidetests/jdwptunnel/sampleapps/debuggableapp/AndroidManifest.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2019 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.jdwptunnel.sampleapp.debuggable">
+
+    <application android:debuggable="true">
+        <activity android:name=".DebuggableSampleDeviceActivity" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
+
diff --git a/hostsidetests/jdwptunnel/sampleapp/res/layout/sample_layout.xml b/hostsidetests/jdwptunnel/sampleapps/debuggableapp/res/layout/sample_layout.xml
similarity index 100%
rename from hostsidetests/jdwptunnel/sampleapp/res/layout/sample_layout.xml
rename to hostsidetests/jdwptunnel/sampleapps/debuggableapp/res/layout/sample_layout.xml
diff --git a/hostsidetests/jdwptunnel/sampleapps/debuggableapp/src/android/jdwptunnel/sampleapp/DebuggableSampleDeviceActivity.java b/hostsidetests/jdwptunnel/sampleapps/debuggableapp/src/android/jdwptunnel/sampleapp/DebuggableSampleDeviceActivity.java
new file mode 100644
index 0000000..f5da3f4
--- /dev/null
+++ b/hostsidetests/jdwptunnel/sampleapps/debuggableapp/src/android/jdwptunnel/sampleapp/DebuggableSampleDeviceActivity.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2019 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.jdwptunnel.sampleapp.debuggable;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * A simple activity which does nothing.
+ *
+ * <p>This serves as a simple target application/activity to attach a debugger to.
+ */
+public final class DebuggableSampleDeviceActivity extends Activity {
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        setContentView(R.layout.sample_layout);
+    }
+}
diff --git a/hostsidetests/jdwptunnel/sampleapps/profileableapp/Android.bp b/hostsidetests/jdwptunnel/sampleapps/profileableapp/Android.bp
new file mode 100644
index 0000000..b78236a
--- /dev/null
+++ b/hostsidetests/jdwptunnel/sampleapps/profileableapp/Android.bp
@@ -0,0 +1,30 @@
+// Copyright (C) 2020 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.
+
+android_test_helper_app {
+    name: "CtsJdwpTunnelProfileableSampleApp",
+
+    dex_preopt: {
+        enabled: false,
+    },
+
+    optimize: {
+        enabled: false,
+    },
+
+    srcs: ["src/**/*.java"],
+
+    sdk_version: "current",
+
+}
diff --git a/hostsidetests/jdwptunnel/sampleapps/profileableapp/AndroidManifest.xml b/hostsidetests/jdwptunnel/sampleapps/profileableapp/AndroidManifest.xml
new file mode 100755
index 0000000..eb73f5d
--- /dev/null
+++ b/hostsidetests/jdwptunnel/sampleapps/profileableapp/AndroidManifest.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2020 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.jdwptunnel.sampleapp.profileable">
+
+    <application android:debuggable="false">
+        <activity android:name=".ProfileableSampleDeviceActivity" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+       <profileable android:shell="true" />
+    </application>
+
+</manifest>
+
diff --git a/hostsidetests/jdwptunnel/sampleapp/res/layout/sample_layout.xml b/hostsidetests/jdwptunnel/sampleapps/profileableapp/res/layout/sample_layout.xml
similarity index 100%
copy from hostsidetests/jdwptunnel/sampleapp/res/layout/sample_layout.xml
copy to hostsidetests/jdwptunnel/sampleapps/profileableapp/res/layout/sample_layout.xml
diff --git a/hostsidetests/jdwptunnel/sampleapps/profileableapp/src/android/jdwptunnel/sampleapp/ProfileableSampleDeviceActivity.java b/hostsidetests/jdwptunnel/sampleapps/profileableapp/src/android/jdwptunnel/sampleapp/ProfileableSampleDeviceActivity.java
new file mode 100644
index 0000000..ff7b3e6
--- /dev/null
+++ b/hostsidetests/jdwptunnel/sampleapps/profileableapp/src/android/jdwptunnel/sampleapp/ProfileableSampleDeviceActivity.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2020 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.jdwptunnel.sampleapp.profileable;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * A simple activity which does nothing.
+ *
+ * <p>This serves as a simple target application/activity to attach a debugger to.
+ */
+public final class ProfileableSampleDeviceActivity extends Activity {
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        setContentView(R.layout.sample_layout);
+    }
+}
diff --git a/hostsidetests/jdwptunnel/src/android/jdwptunnel/cts/JdwpTunnelTest.java b/hostsidetests/jdwptunnel/src/android/jdwptunnel/cts/JdwpTunnelTest.java
index 518a1c5..cbf2303 100644
--- a/hostsidetests/jdwptunnel/src/android/jdwptunnel/cts/JdwpTunnelTest.java
+++ b/hostsidetests/jdwptunnel/src/android/jdwptunnel/cts/JdwpTunnelTest.java
@@ -17,6 +17,8 @@
 package android.jdwptunnel.cts;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -50,7 +52,7 @@
  * <p>This test ensures that it is possible to attach a debugger to an app using 'adb' and perform
  * at least some basic debugging actions.
  *
- * <p>The {@link SampleDeviceActivity} is the activity we are debugging.
+ * <p>The {@link DebuggableSampleDeviceActivity} is the activity we are debugging.
  *
  * <p>We will start that activity with 'wait-for-debugger', set a breakpoint on the first line of
  * the {@code onCreate} method and wait for the breakpoint to be hit.
@@ -59,16 +61,21 @@
  */
 @RunWith(DeviceJUnit4ClassRunner.class)
 public class JdwpTunnelTest extends BaseHostJUnit4Test {
-    private static final String TEST_APP_PACKAGE_NAME = "android.jdwptunnel.sampleapp";
-    private static final String TEST_APP_ACTIVITY_CLASS_NAME = "SampleDeviceActivity";
-    private final static String TEST_APP_FULL_CLASS_NAME =
-            TEST_APP_PACKAGE_NAME + "." + TEST_APP_ACTIVITY_CLASS_NAME;
+    private static final String DEBUGGABLE_TEST_APP_PACKAGE_NAME =
+      "android.jdwptunnel.sampleapp.debuggable";
+    private static final String DEBUGGABLE_TEST_APP_ACTIVITY_CLASS_NAME =
+      "DebuggableSampleDeviceActivity";
+    private static final String PROFILEABLE_TEST_APP_PACKAGE_NAME =
+      "android.jdwptunnel.sampleapp.profileable";
+    private static final String PROFILEABLE_TEST_APP_ACTIVITY_CLASS_NAME =
+      "ProfileableSampleDeviceActivity";
 
     private ITestDevice mDevice;
 
     @Before
     public void setUp() throws Exception {
-        installPackage("CtsJdwpTunnelSampleApp.apk");
+        installPackage("CtsJdwpTunnelDebuggableSampleApp.apk");
+        installPackage("CtsJdwpTunnelProfileableSampleApp.apk");
         mDevice = getDevice();
     }
 
@@ -110,17 +117,17 @@
         return port;
     }
 
-    private VirtualMachine startupTest() throws Exception {
+    private VirtualMachine startupTest(String packageName, String shortClassName) throws Exception {
         moveToHomeScreen();
         mDevice.executeShellCommand("cmd activity start-activity -D -W -n " +
-                TEST_APP_PACKAGE_NAME + "/." + TEST_APP_ACTIVITY_CLASS_NAME);
+                packageName + "/." + shortClassName);
         // Don't keep trying after a minute.
         final Instant deadline = Instant.now().plusSeconds(60);
         String pid = "";
         while ((pid = mDevice.executeShellCommand(
-                    "pidof " + TEST_APP_PACKAGE_NAME).trim()).equals("")) {
+                    "pidof " + packageName).trim()).equals("")) {
             if (Instant.now().isAfter(deadline)) {
-                fail("Unable to find PID of " + TEST_APP_PACKAGE_NAME + " process!");
+                fail("Unable to find PID of " + packageName + " process!");
             }
             // Wait 1 second and try again.
             Thread.sleep(1000);
@@ -138,9 +145,11 @@
      *
      * TODO: We should expand this to more functions.
      */
-    @Test
-    public void testAttachDebugger() throws DeviceNotAvailableException, Exception {
-        VirtualMachine vm = startupTest();
+    private void testAttachDebugger(String packageName, String shortClassName)
+      throws DeviceNotAvailableException, Exception {
+        String fullClassName = packageName + "." + shortClassName;
+
+        VirtualMachine vm = startupTest(packageName, shortClassName);
         EventRequestManager erm = vm.eventRequestManager();
         try {
             // Just pause the runtime so it won't get ahead of us while we setup everything.
@@ -148,20 +157,20 @@
             // Overall timeout for this whole test. 2-minutes
             final Instant deadline = Instant.now().plusSeconds(120);
             // Check the test-activity class is not already loaded.
-            assertTrue(TEST_APP_ACTIVITY_CLASS_NAME + " is not yet loaded!",
+            assertTrue(shortClassName + " is not yet loaded!",
                     vm.allClasses().stream()
-                            .noneMatch(x -> x.name().equals(TEST_APP_FULL_CLASS_NAME)));
+                            .noneMatch(x -> x.name().equals(fullClassName)));
 
             // Wait for the class to load.
             ClassPrepareRequest cpr = erm.createClassPrepareRequest();
-            cpr.addClassFilter(TEST_APP_FULL_CLASS_NAME);
+            cpr.addClassFilter(fullClassName);
             cpr.setSuspendPolicy(EventRequest.SUSPEND_ALL);
             cpr.enable();
             vm.resume();
             ReferenceType activityType = null;
             while (activityType == null) {
                 if (Instant.now().isAfter(deadline)) {
-                    fail(TEST_APP_FULL_CLASS_NAME + " did not load within timeout!");
+                    fail(fullClassName + " did not load within timeout!");
                 }
                 activityType = vm.eventQueue().remove().stream()
                         .filter(e -> cpr == e.request())
@@ -180,7 +189,7 @@
             // Wait for the event.
             while (!vm.eventQueue().remove().stream().anyMatch(e -> e.request() == bpr)) {
                 if (Instant.now().isAfter(deadline)) {
-                    fail(TEST_APP_FULL_CLASS_NAME + " did hit onCreate breakpoint within timeout!");
+                    fail(fullClassName + " did hit onCreate breakpoint within timeout!");
                 }
             }
             bpr.disable();
@@ -190,4 +199,61 @@
             vm.dispose();
         }
     }
+
+    /**
+     * Tests that we can attach a debugger and perform basic debugging functions to a
+     * debuggable app.
+     *
+     * We start the app with Wait-for-debugger. Wait for the ClassPrepare of the activity
+     * class and put and wait for a breakpoint on the onCreate function.
+     */
+    @Test
+    public void testAttachDebuggerToDebuggableApp() throws DeviceNotAvailableException, Exception {
+        testAttachDebugger(DEBUGGABLE_TEST_APP_PACKAGE_NAME,
+                           DEBUGGABLE_TEST_APP_ACTIVITY_CLASS_NAME);
+    }
+
+    /**
+     * Tests that we CANNOT attach a debugger to a non-debuggable-but-profileable app.
+     *
+     * We test the attempt to attach the debuggable should fail on a user build device at the
+     * expected API call.
+     */
+    @Test
+    public void testAttachDebuggerToProfileableApp() throws DeviceNotAvailableException, Exception {
+        java.io.IOException thrownException = null;
+        try {
+            testAttachDebugger(PROFILEABLE_TEST_APP_PACKAGE_NAME,
+                               PROFILEABLE_TEST_APP_ACTIVITY_CLASS_NAME);
+        } catch (java.io.IOException e) {
+            thrownException = e;
+        }
+        String debuggableDevice = mDevice.getProperty("ro.debuggable");
+        if (debuggableDevice.equals("1")) {
+            assertNull(thrownException);
+            return;
+        }
+        // We are on a user (production) build device.
+        assertNotNull(thrownException);
+        if (thrownException != null) {
+            // Verify the exception is thrown from the "getDebuggerConnection" method in this test
+            // when it calls the "attach" method from class AttachingConnector or its subclass.
+            // In other words, the callstack is expected to look like
+            //
+            // at jdk.jdi/com.sun.tools.jdi.SocketAttachingConnector.attach(SocketAttachingConnector.java:83)
+            // at android.jdwptunnel.cts.JdwpTunnelTest.getDebuggerConnection(JdwpTunnelTest.java:96)
+            boolean thrownByGetDebuggerConnection = false;
+            StackTraceElement[] stack = thrownException.getStackTrace();
+            for (int i = 0; i < stack.length; i++) {
+                if (stack[i].getClassName().equals("android.jdwptunnel.cts.JdwpTunnelTest") &&
+                    stack[i].getMethodName().equals("getDebuggerConnection")) {
+                    thrownByGetDebuggerConnection = true;
+                    assertTrue(i > 0);
+                    assertEquals("attach", stack[i - 1].getMethodName());
+                    break;
+                }
+            }
+            assertTrue(thrownByGetDebuggerConnection);
+        }
+    }
 }
diff --git a/hostsidetests/jvmti/allocation-tracking/Android.bp b/hostsidetests/jvmti/allocation-tracking/Android.bp
index 963c517..dce3d16 100644
--- a/hostsidetests/jvmti/allocation-tracking/Android.bp
+++ b/hostsidetests/jvmti/allocation-tracking/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/jvmti/allocation-tracking/app/Android.bp b/hostsidetests/jvmti/allocation-tracking/app/Android.bp
index da10494..6e42781 100644
--- a/hostsidetests/jvmti/allocation-tracking/app/Android.bp
+++ b/hostsidetests/jvmti/allocation-tracking/app/Android.bp
@@ -23,7 +23,6 @@
     srcs: ["src/**/*.java"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: ["CtsJvmtiDeviceAppBase"],
diff --git a/hostsidetests/jvmti/attaching/Android.bp b/hostsidetests/jvmti/attaching/Android.bp
index a621742..3d50f4a 100644
--- a/hostsidetests/jvmti/attaching/Android.bp
+++ b/hostsidetests/jvmti/attaching/Android.bp
@@ -81,7 +81,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     test_config: "host/AndroidTest.xml",
diff --git a/hostsidetests/jvmti/base/app/Android.bp b/hostsidetests/jvmti/base/app/Android.bp
index ed76b18..246fc27 100644
--- a/hostsidetests/jvmti/base/app/Android.bp
+++ b/hostsidetests/jvmti/base/app/Android.bp
@@ -20,7 +20,7 @@
         enabled: false,
     },
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "junit",
     ],
     static_libs: [
diff --git a/hostsidetests/jvmti/base/jni/Android.bp b/hostsidetests/jvmti/base/jni/Android.bp
index 4940df3..be7da74 100644
--- a/hostsidetests/jvmti/base/jni/Android.bp
+++ b/hostsidetests/jvmti/base/jni/Android.bp
@@ -24,6 +24,7 @@
     ],
 
     header_libs: [
+        "jni_headers",
         "libopenjdkjvmti_headers",
     ],
 
diff --git a/hostsidetests/jvmti/base/jni/cts_logging.cpp b/hostsidetests/jvmti/base/jni/cts_logging.cpp
index b37e1f9..e6b182e 100644
--- a/hostsidetests/jvmti/base/jni/cts_logging.cpp
+++ b/hostsidetests/jvmti/base/jni/cts_logging.cpp
@@ -25,18 +25,33 @@
 
 namespace art {
 
+typedef jvmtiError (*SetVerboseFlagExt)(jvmtiEnv*, const char*, jboolean);
 extern "C" JNIEXPORT void JNICALL
-Java_android_jvmti_cts_JvmtiRunTestBasedTest_setupExtraLogging(JNIEnv* env, jclass) {
-  JvmtiErrorToException(env, jvmti_env, jvmti_env->SetVerboseFlag(JVMTI_VERBOSE_OTHER, true));
+Java_android_jvmti_cts_JvmtiRunTestBasedTest_setupExtraLogging(JNIEnv* env, jclass, jstring arg) {
+  SetVerboseFlagExt set_flag_ext = GetExtensionFunction<SetVerboseFlagExt>(
+      env, jvmti_env, "com.android.art.misc.set_verbose_flag_ext");
+  if (set_flag_ext == nullptr) {
+    // Just do backup and enable everything.
+    JvmtiErrorToException(env, jvmti_env, jvmti_env->SetVerboseFlag(JVMTI_VERBOSE_OTHER, true));
+  } else {
+    // UTFChars doesn't need to be null terminated.
+    const char* data_raw = env->GetStringUTFChars(arg, nullptr);
+    std::string data;
+    data.resize(env->GetStringUTFLength(arg));
+    memcpy(data.data(), data_raw, data.size());
+    env->ReleaseStringUTFChars(arg, data_raw);
+    JvmtiErrorToException(env, jvmti_env, set_flag_ext(jvmti_env, data.c_str(), true));
+  }
 }
 
 static JNINativeMethod gMethods[] = {
-  { "setupExtraLogging", "()V",
-          (void*)Java_android_jvmti_cts_JvmtiRunTestBasedTest_setupExtraLogging },
+  { "setupExtraLogging",
+    "(Ljava/lang/String;)V",
+    (void*)Java_android_jvmti_cts_JvmtiRunTestBasedTest_setupExtraLogging },
 };
 void register_android_jvmti_cts_JvmtiRunTestBasedTest(jvmtiEnv* jenv, JNIEnv* env) {
-  ScopedLocalRef<jclass> klass(env, GetClass(jenv, env,
-          "android/jvmti/cts/JvmtiRunTestBasedTest", nullptr));
+  ScopedLocalRef<jclass> klass(
+      env, GetClass(jenv, env, "android/jvmti/cts/JvmtiRunTestBasedTest", nullptr));
   if (klass.get() == nullptr) {
     env->ExceptionClear();
     return;
diff --git a/hostsidetests/jvmti/base/run-test-based-app/Android.bp b/hostsidetests/jvmti/base/run-test-based-app/Android.bp
index d2f9d09..8d17dd1 100644
--- a/hostsidetests/jvmti/base/run-test-based-app/Android.bp
+++ b/hostsidetests/jvmti/base/run-test-based-app/Android.bp
@@ -14,12 +14,8 @@
 
 java_library {
     name: "CtsJvmtiDeviceRunTestAppBase",
-
-    // We explicitly enumerate, as we have a definition of art.Main to simplify development
-    // in an IDE (but want the implementation of said class to come from the ART run-tests).
     srcs: [
         "src/android/jvmti/cts/JvmtiRunTestBasedTest.java",
-        ":art_cts_jvmti_test_library",
     ],
     // Allow sun.misc.Unsafe.
     target: {
@@ -32,10 +28,11 @@
         enabled: false,
     },
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "junit",
     ],
     static_libs: [
+        "art_cts_jvmti_test_library",
         "CtsJvmtiDeviceAppBase",
         "expected_cts_outputs",
     ],
diff --git a/hostsidetests/jvmti/base/run-test-based-app/src/android/jvmti/cts/JvmtiRunTestBasedTest.java b/hostsidetests/jvmti/base/run-test-based-app/src/android/jvmti/cts/JvmtiRunTestBasedTest.java
index a59fd3f..b773c41 100644
--- a/hostsidetests/jvmti/base/run-test-based-app/src/android/jvmti/cts/JvmtiRunTestBasedTest.java
+++ b/hostsidetests/jvmti/base/run-test-based-app/src/android/jvmti/cts/JvmtiRunTestBasedTest.java
@@ -90,7 +90,11 @@
         System.setErr(oldErr);
     }
 
-    private native void setupExtraLogging();
+    private void setupExtraLogging() {
+      setupExtraLogging("plugin,deopt,jdwp,jit,agents,threads");
+    }
+
+    private native void setupExtraLogging(String arg);
 
     protected boolean doExtraLogging() throws Exception {
         return mActivity
diff --git a/hostsidetests/jvmti/redefining/Android.bp b/hostsidetests/jvmti/redefining/Android.bp
index 1dcd552..7bb3d1f 100644
--- a/hostsidetests/jvmti/redefining/Android.bp
+++ b/hostsidetests/jvmti/redefining/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRedefineClassesDeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1900/Android.bp b/hostsidetests/jvmti/run-tests/test-1900/Android.bp
index 041106a..62ed6fa 100644
--- a/hostsidetests/jvmti/run-tests/test-1900/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1900/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1900DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1901/Android.bp b/hostsidetests/jvmti/run-tests/test-1901/Android.bp
index 5774e8c..e4dca54 100644
--- a/hostsidetests/jvmti/run-tests/test-1901/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1901/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1901DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1902/Android.bp b/hostsidetests/jvmti/run-tests/test-1902/Android.bp
index c61a7dc..e9a84ad 100644
--- a/hostsidetests/jvmti/run-tests/test-1902/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1902/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1902DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1903/Android.bp b/hostsidetests/jvmti/run-tests/test-1903/Android.bp
index 68dec58..652d251 100644
--- a/hostsidetests/jvmti/run-tests/test-1903/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1903/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1903DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1904/Android.bp b/hostsidetests/jvmti/run-tests/test-1904/Android.bp
index 4bef6ba..9a61f13 100644
--- a/hostsidetests/jvmti/run-tests/test-1904/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1904/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1904DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1906/Android.bp b/hostsidetests/jvmti/run-tests/test-1906/Android.bp
index 206a3a2..8dc8213 100644
--- a/hostsidetests/jvmti/run-tests/test-1906/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1906/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1906DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1907/Android.bp b/hostsidetests/jvmti/run-tests/test-1907/Android.bp
index 1c14eba..13fe8e4 100644
--- a/hostsidetests/jvmti/run-tests/test-1907/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1907/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1907DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1908/Android.bp b/hostsidetests/jvmti/run-tests/test-1908/Android.bp
index 0adcba5..21aa2a3 100644
--- a/hostsidetests/jvmti/run-tests/test-1908/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1908/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1908DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1909/Android.bp b/hostsidetests/jvmti/run-tests/test-1909/Android.bp
index ad69a39..df71e8f 100644
--- a/hostsidetests/jvmti/run-tests/test-1909/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1909/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1909DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1910/Android.bp b/hostsidetests/jvmti/run-tests/test-1910/Android.bp
index 73a5f01..791ce9f 100644
--- a/hostsidetests/jvmti/run-tests/test-1910/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1910/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1910DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1911/Android.bp b/hostsidetests/jvmti/run-tests/test-1911/Android.bp
index dcc5b1a..b3dc656 100644
--- a/hostsidetests/jvmti/run-tests/test-1911/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1911/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1911DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1912/Android.bp b/hostsidetests/jvmti/run-tests/test-1912/Android.bp
index 1166b5b..8fdc19b 100644
--- a/hostsidetests/jvmti/run-tests/test-1912/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1912/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1912DeviceApp"]
diff --git a/hostsidetests/jvmti/run-tests/test-1913/Android.bp b/hostsidetests/jvmti/run-tests/test-1913/Android.bp
index ba74605..5ef38fa 100644
--- a/hostsidetests/jvmti/run-tests/test-1913/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1913/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1913DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1914/Android.bp b/hostsidetests/jvmti/run-tests/test-1914/Android.bp
index eac355d..7be3ddd 100644
--- a/hostsidetests/jvmti/run-tests/test-1914/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1914/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1914DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1915/Android.bp b/hostsidetests/jvmti/run-tests/test-1915/Android.bp
index 703fd54..0ba22cc 100644
--- a/hostsidetests/jvmti/run-tests/test-1915/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1915/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1915DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1916/Android.bp b/hostsidetests/jvmti/run-tests/test-1916/Android.bp
index cd05d0b..4e7e4e5 100644
--- a/hostsidetests/jvmti/run-tests/test-1916/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1916/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1916DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1917/Android.bp b/hostsidetests/jvmti/run-tests/test-1917/Android.bp
index 757db9b..64898af 100644
--- a/hostsidetests/jvmti/run-tests/test-1917/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1917/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1917DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1920/Android.bp b/hostsidetests/jvmti/run-tests/test-1920/Android.bp
index b466c1a..c8926b9 100644
--- a/hostsidetests/jvmti/run-tests/test-1920/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1920/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1920DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1921/Android.bp b/hostsidetests/jvmti/run-tests/test-1921/Android.bp
index e803ffc..a6c357f 100644
--- a/hostsidetests/jvmti/run-tests/test-1921/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1921/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1921DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1922/Android.bp b/hostsidetests/jvmti/run-tests/test-1922/Android.bp
index 707686a..73e8e51 100644
--- a/hostsidetests/jvmti/run-tests/test-1922/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1922/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1922DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1923/Android.bp b/hostsidetests/jvmti/run-tests/test-1923/Android.bp
index 171cd88..d2d6dcb 100644
--- a/hostsidetests/jvmti/run-tests/test-1923/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1923/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1923DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1924/Android.bp b/hostsidetests/jvmti/run-tests/test-1924/Android.bp
index 9ea1ee2..4c4fcd7 100644
--- a/hostsidetests/jvmti/run-tests/test-1924/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1924/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1924DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1925/Android.bp b/hostsidetests/jvmti/run-tests/test-1925/Android.bp
index 23b9e37..a981c3c 100644
--- a/hostsidetests/jvmti/run-tests/test-1925/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1925/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1925DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1926/Android.bp b/hostsidetests/jvmti/run-tests/test-1926/Android.bp
index 51e1132..110866e 100644
--- a/hostsidetests/jvmti/run-tests/test-1926/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1926/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1926DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1927/Android.bp b/hostsidetests/jvmti/run-tests/test-1927/Android.bp
index 0f87eb7..eb7078c 100644
--- a/hostsidetests/jvmti/run-tests/test-1927/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1927/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1927DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1928/Android.bp b/hostsidetests/jvmti/run-tests/test-1928/Android.bp
index 1d7e4ea..1a678da 100644
--- a/hostsidetests/jvmti/run-tests/test-1928/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1928/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1928DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1930/Android.bp b/hostsidetests/jvmti/run-tests/test-1930/Android.bp
index e4b90e4..23c9b59 100644
--- a/hostsidetests/jvmti/run-tests/test-1930/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1930/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1930DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1931/Android.bp b/hostsidetests/jvmti/run-tests/test-1931/Android.bp
index d011fbe..feb6e6a 100644
--- a/hostsidetests/jvmti/run-tests/test-1931/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1931/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1931DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1932/Android.bp b/hostsidetests/jvmti/run-tests/test-1932/Android.bp
index 2818716..5aee52d 100644
--- a/hostsidetests/jvmti/run-tests/test-1932/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1932/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1932DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1933/Android.bp b/hostsidetests/jvmti/run-tests/test-1933/Android.bp
index 5372f06..cb0fed0b 100644
--- a/hostsidetests/jvmti/run-tests/test-1933/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1933/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1933DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1934/Android.bp b/hostsidetests/jvmti/run-tests/test-1934/Android.bp
index 0dd68d8..301ffba 100644
--- a/hostsidetests/jvmti/run-tests/test-1934/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1934/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1934DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1936/Android.bp b/hostsidetests/jvmti/run-tests/test-1936/Android.bp
index 8b2bee4..6e3e1d7 100644
--- a/hostsidetests/jvmti/run-tests/test-1936/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1936/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1936DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1937/Android.bp b/hostsidetests/jvmti/run-tests/test-1937/Android.bp
index 0876bbf..e85825b 100644
--- a/hostsidetests/jvmti/run-tests/test-1937/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1937/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1937DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1939/Android.bp b/hostsidetests/jvmti/run-tests/test-1939/Android.bp
index d139c50..6c5f257 100644
--- a/hostsidetests/jvmti/run-tests/test-1939/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1939/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1939DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1941/Android.bp b/hostsidetests/jvmti/run-tests/test-1941/Android.bp
index b8a153b..80246a0 100644
--- a/hostsidetests/jvmti/run-tests/test-1941/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1941/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1941DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1942/Android.bp b/hostsidetests/jvmti/run-tests/test-1942/Android.bp
index 4e968fa..2649361 100644
--- a/hostsidetests/jvmti/run-tests/test-1942/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1942/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1942DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1943/Android.bp b/hostsidetests/jvmti/run-tests/test-1943/Android.bp
index 053b61d..2b8ff6c 100644
--- a/hostsidetests/jvmti/run-tests/test-1943/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1943/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1943DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1953/Android.bp b/hostsidetests/jvmti/run-tests/test-1953/Android.bp
index e2d17cc..5cb0fc2 100644
--- a/hostsidetests/jvmti/run-tests/test-1953/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1953/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1953DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1958/Android.bp b/hostsidetests/jvmti/run-tests/test-1958/Android.bp
index 16c31ae..ce50088 100644
--- a/hostsidetests/jvmti/run-tests/test-1958/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1958/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1958DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1962/Android.bp b/hostsidetests/jvmti/run-tests/test-1962/Android.bp
index e06a813..b1a4087 100644
--- a/hostsidetests/jvmti/run-tests/test-1962/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1962/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1962DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1967/Android.bp b/hostsidetests/jvmti/run-tests/test-1967/Android.bp
index ff060d2..370596b 100644
--- a/hostsidetests/jvmti/run-tests/test-1967/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1967/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1967DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1968/Android.bp b/hostsidetests/jvmti/run-tests/test-1968/Android.bp
index 0f2a3b3..1c9f406 100644
--- a/hostsidetests/jvmti/run-tests/test-1968/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1968/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1968DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1969/Android.bp b/hostsidetests/jvmti/run-tests/test-1969/Android.bp
index 273f130..46975d5 100644
--- a/hostsidetests/jvmti/run-tests/test-1969/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1969/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1969DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1970/Android.bp b/hostsidetests/jvmti/run-tests/test-1970/Android.bp
index ec5d612..be85e20 100644
--- a/hostsidetests/jvmti/run-tests/test-1970/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1970/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1970DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1971/Android.bp b/hostsidetests/jvmti/run-tests/test-1971/Android.bp
index d0b7956..db2d5ef 100644
--- a/hostsidetests/jvmti/run-tests/test-1971/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1971/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1971DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1974/Android.bp b/hostsidetests/jvmti/run-tests/test-1974/Android.bp
index 16f2456..87a90ed 100644
--- a/hostsidetests/jvmti/run-tests/test-1974/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1974/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1974DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1975/Android.bp b/hostsidetests/jvmti/run-tests/test-1975/Android.bp
index 4898c9c..e23cfa7 100644
--- a/hostsidetests/jvmti/run-tests/test-1975/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1975/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1975DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1976/Android.bp b/hostsidetests/jvmti/run-tests/test-1976/Android.bp
index 2deca03..38e8612 100644
--- a/hostsidetests/jvmti/run-tests/test-1976/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1976/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1976DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1977/Android.bp b/hostsidetests/jvmti/run-tests/test-1977/Android.bp
index 5261650..3b76f5b 100644
--- a/hostsidetests/jvmti/run-tests/test-1977/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1977/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1977DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1978/Android.bp b/hostsidetests/jvmti/run-tests/test-1978/Android.bp
index 45c4e58..bb3bfce 100644
--- a/hostsidetests/jvmti/run-tests/test-1978/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1978/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1978DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1979/Android.bp b/hostsidetests/jvmti/run-tests/test-1979/Android.bp
index 6f367de..bd812f7 100644
--- a/hostsidetests/jvmti/run-tests/test-1979/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1979/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1979DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1981/Android.bp b/hostsidetests/jvmti/run-tests/test-1981/Android.bp
index add3e8d..4e1982d 100644
--- a/hostsidetests/jvmti/run-tests/test-1981/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1981/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1981DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1982/Android.bp b/hostsidetests/jvmti/run-tests/test-1982/Android.bp
index 2dfb330..f946542 100644
--- a/hostsidetests/jvmti/run-tests/test-1982/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1982/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1982DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1983/Android.bp b/hostsidetests/jvmti/run-tests/test-1983/Android.bp
index a8d5295..0a829ee 100644
--- a/hostsidetests/jvmti/run-tests/test-1983/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1983/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1983DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1984/Android.bp b/hostsidetests/jvmti/run-tests/test-1984/Android.bp
index b15cb13..4a5b859 100644
--- a/hostsidetests/jvmti/run-tests/test-1984/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1984/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1984DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1988/Android.bp b/hostsidetests/jvmti/run-tests/test-1988/Android.bp
index 15e7f53..fe73550 100644
--- a/hostsidetests/jvmti/run-tests/test-1988/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1988/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1988DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1989/Android.bp b/hostsidetests/jvmti/run-tests/test-1989/Android.bp
index b0eb4f4..6cf902b 100644
--- a/hostsidetests/jvmti/run-tests/test-1989/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1989/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1989DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1990/Android.bp b/hostsidetests/jvmti/run-tests/test-1990/Android.bp
index 41b2c6b..d8236d1 100644
--- a/hostsidetests/jvmti/run-tests/test-1990/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1990/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1990DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1991/Android.bp b/hostsidetests/jvmti/run-tests/test-1991/Android.bp
index 201947f..b7457f4 100644
--- a/hostsidetests/jvmti/run-tests/test-1991/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1991/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1991DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1992/Android.bp b/hostsidetests/jvmti/run-tests/test-1992/Android.bp
index 9b50a61..6dd5bac 100644
--- a/hostsidetests/jvmti/run-tests/test-1992/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1992/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1992DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1994/Android.bp b/hostsidetests/jvmti/run-tests/test-1994/Android.bp
index 3948b2d..7445270 100644
--- a/hostsidetests/jvmti/run-tests/test-1994/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1994/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1994DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1995/Android.bp b/hostsidetests/jvmti/run-tests/test-1995/Android.bp
index b92413b..c5c9b2f 100644
--- a/hostsidetests/jvmti/run-tests/test-1995/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1995/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1995DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1996/Android.bp b/hostsidetests/jvmti/run-tests/test-1996/Android.bp
index fc2404e..f74d839 100644
--- a/hostsidetests/jvmti/run-tests/test-1996/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1996/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1996DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1997/Android.bp b/hostsidetests/jvmti/run-tests/test-1997/Android.bp
index f2414a5..c604480 100644
--- a/hostsidetests/jvmti/run-tests/test-1997/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1997/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1997DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1998/Android.bp b/hostsidetests/jvmti/run-tests/test-1998/Android.bp
index 3bbe2c9..04d2ee1 100644
--- a/hostsidetests/jvmti/run-tests/test-1998/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1998/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1998DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-1999/Android.bp b/hostsidetests/jvmti/run-tests/test-1999/Android.bp
index 00c0ff7..bb38d8e 100644
--- a/hostsidetests/jvmti/run-tests/test-1999/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-1999/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest1999DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-2001/Android.bp b/hostsidetests/jvmti/run-tests/test-2001/Android.bp
index 8d83aba..788d19b 100644
--- a/hostsidetests/jvmti/run-tests/test-2001/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-2001/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest2001DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-2002/Android.bp b/hostsidetests/jvmti/run-tests/test-2002/Android.bp
index fcf4263..6e17916 100644
--- a/hostsidetests/jvmti/run-tests/test-2002/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-2002/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest2002DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-2003/Android.bp b/hostsidetests/jvmti/run-tests/test-2003/Android.bp
index a4e9f1c..5c0a0e7 100644
--- a/hostsidetests/jvmti/run-tests/test-2003/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-2003/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest2003DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-2004/Android.bp b/hostsidetests/jvmti/run-tests/test-2004/Android.bp
index 11b5fdc..eda8530 100644
--- a/hostsidetests/jvmti/run-tests/test-2004/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-2004/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest2004DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-2005/Android.bp b/hostsidetests/jvmti/run-tests/test-2005/Android.bp
index 34a7338..866c971 100644
--- a/hostsidetests/jvmti/run-tests/test-2005/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-2005/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest2005DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-2006/Android.bp b/hostsidetests/jvmti/run-tests/test-2006/Android.bp
index d3007e2..51500ae 100644
--- a/hostsidetests/jvmti/run-tests/test-2006/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-2006/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest2006DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-2007/Android.bp b/hostsidetests/jvmti/run-tests/test-2007/Android.bp
index d1f05d3..9a9a89a 100644
--- a/hostsidetests/jvmti/run-tests/test-2007/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-2007/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest2007DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-902/Android.bp b/hostsidetests/jvmti/run-tests/test-902/Android.bp
index 39e7b54..ae7a8ed 100644
--- a/hostsidetests/jvmti/run-tests/test-902/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-902/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest902DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-903/Android.bp b/hostsidetests/jvmti/run-tests/test-903/Android.bp
index d5bef56..2fdc29d 100644
--- a/hostsidetests/jvmti/run-tests/test-903/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-903/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest903DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-904/Android.bp b/hostsidetests/jvmti/run-tests/test-904/Android.bp
index 98b3e15..df5c01f 100644
--- a/hostsidetests/jvmti/run-tests/test-904/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-904/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest904DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-905/Android.bp b/hostsidetests/jvmti/run-tests/test-905/Android.bp
index e1e0ec4..5889c77 100644
--- a/hostsidetests/jvmti/run-tests/test-905/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-905/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest905DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-906/Android.bp b/hostsidetests/jvmti/run-tests/test-906/Android.bp
index 35a024f..e72f5c2 100644
--- a/hostsidetests/jvmti/run-tests/test-906/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-906/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest906DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-907/Android.bp b/hostsidetests/jvmti/run-tests/test-907/Android.bp
index 8392db7..dd5859c 100644
--- a/hostsidetests/jvmti/run-tests/test-907/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-907/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest907DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-908/Android.bp b/hostsidetests/jvmti/run-tests/test-908/Android.bp
index b5c0660..3837c79 100644
--- a/hostsidetests/jvmti/run-tests/test-908/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-908/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest908DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-910/Android.bp b/hostsidetests/jvmti/run-tests/test-910/Android.bp
index e79fd71..8b717ec 100644
--- a/hostsidetests/jvmti/run-tests/test-910/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-910/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest910DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-911/Android.bp b/hostsidetests/jvmti/run-tests/test-911/Android.bp
index d424e67..a9e859e 100644
--- a/hostsidetests/jvmti/run-tests/test-911/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-911/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest911DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-912/Android.bp b/hostsidetests/jvmti/run-tests/test-912/Android.bp
index 8b2b487..765d95d 100644
--- a/hostsidetests/jvmti/run-tests/test-912/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-912/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest912DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-913/Android.bp b/hostsidetests/jvmti/run-tests/test-913/Android.bp
index 234e793..28d9d95a 100644
--- a/hostsidetests/jvmti/run-tests/test-913/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-913/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest913DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-914/Android.bp b/hostsidetests/jvmti/run-tests/test-914/Android.bp
index ad7e240..2f80ca7 100644
--- a/hostsidetests/jvmti/run-tests/test-914/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-914/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest914DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-915/Android.bp b/hostsidetests/jvmti/run-tests/test-915/Android.bp
index 48c51df..a316154 100644
--- a/hostsidetests/jvmti/run-tests/test-915/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-915/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest915DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-917/Android.bp b/hostsidetests/jvmti/run-tests/test-917/Android.bp
index d67a8da..c26d916 100644
--- a/hostsidetests/jvmti/run-tests/test-917/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-917/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest917DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-918/Android.bp b/hostsidetests/jvmti/run-tests/test-918/Android.bp
index 057af6c..193fe2b 100644
--- a/hostsidetests/jvmti/run-tests/test-918/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-918/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest918DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-919/Android.bp b/hostsidetests/jvmti/run-tests/test-919/Android.bp
index 2bd54f4..2c3d12d 100644
--- a/hostsidetests/jvmti/run-tests/test-919/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-919/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest919DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-920/Android.bp b/hostsidetests/jvmti/run-tests/test-920/Android.bp
index 6fa85bf..25bee668 100644
--- a/hostsidetests/jvmti/run-tests/test-920/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-920/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest920DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-922/Android.bp b/hostsidetests/jvmti/run-tests/test-922/Android.bp
index 953c964..4629fbc 100644
--- a/hostsidetests/jvmti/run-tests/test-922/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-922/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest922DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-923/Android.bp b/hostsidetests/jvmti/run-tests/test-923/Android.bp
index 570fce6..24ca2dc 100644
--- a/hostsidetests/jvmti/run-tests/test-923/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-923/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest923DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-924/Android.bp b/hostsidetests/jvmti/run-tests/test-924/Android.bp
index 86f56e2..118f711 100644
--- a/hostsidetests/jvmti/run-tests/test-924/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-924/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest924DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-926/Android.bp b/hostsidetests/jvmti/run-tests/test-926/Android.bp
index a566ec3..c56a334 100644
--- a/hostsidetests/jvmti/run-tests/test-926/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-926/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest926DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-927/Android.bp b/hostsidetests/jvmti/run-tests/test-927/Android.bp
index a2172d6..572b893 100644
--- a/hostsidetests/jvmti/run-tests/test-927/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-927/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest927DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-928/Android.bp b/hostsidetests/jvmti/run-tests/test-928/Android.bp
index 2e51186..80ec3c7 100644
--- a/hostsidetests/jvmti/run-tests/test-928/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-928/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest928DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-930/Android.bp b/hostsidetests/jvmti/run-tests/test-930/Android.bp
index 34b192b..bd76877 100644
--- a/hostsidetests/jvmti/run-tests/test-930/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-930/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest930DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-931/Android.bp b/hostsidetests/jvmti/run-tests/test-931/Android.bp
index 5d90d1d..c722fb6 100644
--- a/hostsidetests/jvmti/run-tests/test-931/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-931/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest931DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-932/Android.bp b/hostsidetests/jvmti/run-tests/test-932/Android.bp
index 587be7c..8614c27 100644
--- a/hostsidetests/jvmti/run-tests/test-932/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-932/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest932DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-940/Android.bp b/hostsidetests/jvmti/run-tests/test-940/Android.bp
index 942ddb3..5e0ccc8 100644
--- a/hostsidetests/jvmti/run-tests/test-940/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-940/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest940DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-942/Android.bp b/hostsidetests/jvmti/run-tests/test-942/Android.bp
index 261192d..3317a23 100644
--- a/hostsidetests/jvmti/run-tests/test-942/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-942/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest942DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-944/Android.bp b/hostsidetests/jvmti/run-tests/test-944/Android.bp
index aa59cf8..ce42f1e 100644
--- a/hostsidetests/jvmti/run-tests/test-944/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-944/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest944DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-945/Android.bp b/hostsidetests/jvmti/run-tests/test-945/Android.bp
index fdf288a..f129a12 100644
--- a/hostsidetests/jvmti/run-tests/test-945/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-945/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest945DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-947/Android.bp b/hostsidetests/jvmti/run-tests/test-947/Android.bp
index ed5334d..cb76f33 100644
--- a/hostsidetests/jvmti/run-tests/test-947/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-947/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest947DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-951/Android.bp b/hostsidetests/jvmti/run-tests/test-951/Android.bp
index ddcb1f4..12d7d11 100644
--- a/hostsidetests/jvmti/run-tests/test-951/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-951/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest951DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-982/Android.bp b/hostsidetests/jvmti/run-tests/test-982/Android.bp
index 8c9d15b..610e95e 100644
--- a/hostsidetests/jvmti/run-tests/test-982/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-982/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest982DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-983/Android.bp b/hostsidetests/jvmti/run-tests/test-983/Android.bp
index 8d96923..7a2a7f4 100644
--- a/hostsidetests/jvmti/run-tests/test-983/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-983/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest983DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-984/Android.bp b/hostsidetests/jvmti/run-tests/test-984/Android.bp
index 13c2f40..e3439b4 100644
--- a/hostsidetests/jvmti/run-tests/test-984/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-984/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest984DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-985/Android.bp b/hostsidetests/jvmti/run-tests/test-985/Android.bp
index 8b60d2a..9c03dea 100644
--- a/hostsidetests/jvmti/run-tests/test-985/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-985/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest985DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-986/Android.bp b/hostsidetests/jvmti/run-tests/test-986/Android.bp
index fbba23b..4c16b57 100644
--- a/hostsidetests/jvmti/run-tests/test-986/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-986/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest986DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-988/Android.bp b/hostsidetests/jvmti/run-tests/test-988/Android.bp
index 7542a44..8493a0f 100644
--- a/hostsidetests/jvmti/run-tests/test-988/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-988/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest988DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-989/Android.bp b/hostsidetests/jvmti/run-tests/test-989/Android.bp
index 7ed2a24..ddca92c 100644
--- a/hostsidetests/jvmti/run-tests/test-989/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-989/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest989DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-990/Android.bp b/hostsidetests/jvmti/run-tests/test-990/Android.bp
index efc2c85..a77521f 100644
--- a/hostsidetests/jvmti/run-tests/test-990/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-990/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest990DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-991/Android.bp b/hostsidetests/jvmti/run-tests/test-991/Android.bp
index 44f35c6..55fcb62 100644
--- a/hostsidetests/jvmti/run-tests/test-991/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-991/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest991DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-992/Android.bp b/hostsidetests/jvmti/run-tests/test-992/Android.bp
index b1da90d..a05e992 100644
--- a/hostsidetests/jvmti/run-tests/test-992/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-992/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest992DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-993/Android.bp b/hostsidetests/jvmti/run-tests/test-993/Android.bp
index 97af792..bad6f70 100644
--- a/hostsidetests/jvmti/run-tests/test-993/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-993/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest993DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-994/Android.bp b/hostsidetests/jvmti/run-tests/test-994/Android.bp
index 7078559..444f704 100644
--- a/hostsidetests/jvmti/run-tests/test-994/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-994/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest994DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-995/Android.bp b/hostsidetests/jvmti/run-tests/test-995/Android.bp
index 7ea433c..068a54a 100644
--- a/hostsidetests/jvmti/run-tests/test-995/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-995/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest995DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-996/Android.bp b/hostsidetests/jvmti/run-tests/test-996/Android.bp
index e3fe64c..48c83c6 100644
--- a/hostsidetests/jvmti/run-tests/test-996/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-996/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest996DeviceApp"],
diff --git a/hostsidetests/jvmti/run-tests/test-997/Android.bp b/hostsidetests/jvmti/run-tests/test-997/Android.bp
index f128d2a..c1bfabf 100644
--- a/hostsidetests/jvmti/run-tests/test-997/Android.bp
+++ b/hostsidetests/jvmti/run-tests/test-997/Android.bp
@@ -18,7 +18,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiRunTest997DeviceApp"],
diff --git a/hostsidetests/jvmti/tagging/Android.bp b/hostsidetests/jvmti/tagging/Android.bp
index 8ebced1..e0b0d32 100644
--- a/hostsidetests/jvmti/tagging/Android.bp
+++ b/hostsidetests/jvmti/tagging/Android.bp
@@ -19,7 +19,6 @@
     jarjar_rules: "jarjar-rules.txt",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     data: [":CtsJvmtiTaggingDeviceApp"],
diff --git a/hostsidetests/media/Android.bp b/hostsidetests/media/Android.bp
index 635c5c2..053a101 100644
--- a/hostsidetests/media/Android.bp
+++ b/hostsidetests/media/Android.bp
@@ -24,7 +24,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/hostsidetests/media/app/MediaSessionTest/Android.bp b/hostsidetests/media/app/MediaSessionTest/Android.bp
index cfa68b1..b21a6da 100644
--- a/hostsidetests/media/app/MediaSessionTest/Android.bp
+++ b/hostsidetests/media/app/MediaSessionTest/Android.bp
@@ -17,7 +17,6 @@
     defaults: ["cts_defaults"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: [
diff --git a/hostsidetests/media/app/MediaSessionTestHelper/Android.bp b/hostsidetests/media/app/MediaSessionTestHelper/Android.bp
index 106e862..d6e141f 100644
--- a/hostsidetests/media/app/MediaSessionTestHelper/Android.bp
+++ b/hostsidetests/media/app/MediaSessionTestHelper/Android.bp
@@ -22,7 +22,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/media/bitstreams/Android.bp b/hostsidetests/media/bitstreams/Android.bp
index f13984e..aa40e61 100644
--- a/hostsidetests/media/bitstreams/Android.bp
+++ b/hostsidetests/media/bitstreams/Android.bp
@@ -28,7 +28,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     java_resources: ["DynamicConfig.xml"],
diff --git a/hostsidetests/media/bitstreams/app/Android.bp b/hostsidetests/media/bitstreams/app/Android.bp
index 0934b38..477da98 100644
--- a/hostsidetests/media/bitstreams/app/Android.bp
+++ b/hostsidetests/media/bitstreams/app/Android.bp
@@ -24,7 +24,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/mediaparser/src/android/media/mediaparser/cts/MediaParserHostSideTest.java b/hostsidetests/mediaparser/src/android/media/mediaparser/cts/MediaParserHostSideTest.java
index 7f34459..e5797ce 100644
--- a/hostsidetests/mediaparser/src/android/media/mediaparser/cts/MediaParserHostSideTest.java
+++ b/hostsidetests/mediaparser/src/android/media/mediaparser/cts/MediaParserHostSideTest.java
@@ -47,7 +47,6 @@
 import java.util.stream.Collectors;
 
 /** Test for checking that the MediaParser CTS tests produce the expected media metrics. */
-// TODO(b/172494357): Re-enable tests once we can check for the mainline train version.
 public class MediaParserHostSideTest extends DeviceTestCase implements IBuildReceiver {
 
     private static final String MEDIAPARSER_TEST_APK = "CtsMediaParserTestCasesApp.apk";
@@ -86,8 +85,7 @@
 
     // Tests.
 
-    public void ignored_testCreationByNameMetrics() throws Exception {
-        runDeviceTest("testCreationByName");
+    public void testCreationByNameMetrics() throws Exception {
         String[] expectedParserNames = {
             "android.media.mediaparser.MatroskaParser",
             "android.media.mediaparser.FragmentedMp4Parser",
@@ -122,7 +120,7 @@
         assertThat(observedCreatedByName).isEqualTo(expectedCreatedByName);
     }
 
-    public void ignored_testParserPool() throws Exception {
+    public void testParserPool() throws Exception {
         runDeviceTest("testMp4");
         String[] expectedParserNamesInPool = {
             "android.media.mediaparser.MatroskaParser",
@@ -148,7 +146,7 @@
         assertThat(parserNamesInParserPool).containsExactlyElementsIn(expectedParserNamesInPool);
     }
 
-    public void ignored_testLastException() throws Exception {
+    public void testLastException() throws Exception {
         runDeviceTest("testOggInvalidHeaderSniff");
         List<MediametricsMediaParserReported> mediaParserReportedEvents =
                 getMediaParserReportedEvents();
@@ -159,7 +157,7 @@
         }
     }
 
-    public void ignored_testResourceByteCount() throws Exception {
+    public void testResourceByteCount() throws Exception {
         long actualInputSize = 101597;
         long minimumExpectedResourceByteCount =
                 (long) (actualInputSize * (1 - MEDIAPARSER_METRICS_DITHER_VALUE));
@@ -171,7 +169,7 @@
         assertThat(reportedByteCount).isAtMost(maximumExpectedResourceByteCount);
     }
 
-    public void ignored_testDurationMillis() throws Exception {
+    public void testDurationMillis() throws Exception {
         long actualDurationMillis = 1024;
         long minimumExpectedResourceByteCount =
                 (long) (actualDurationMillis * (1 - MEDIAPARSER_METRICS_DITHER_VALUE));
@@ -183,7 +181,7 @@
         assertThat(reportedDurationMillis).isAtMost(maximumExpectedResourceByteCount);
     }
 
-    public void ignored_testTrackMimeTypes() throws Exception {
+    public void testTrackMimeTypes() throws Exception {
         String[] expectedTrackMimeTypes = new String[] {"video/avc", "audio/mp4a-latm"};
         runDeviceTest("testMp4");
         String trackMimeTypesField = getSingleMediaParserReportedEvent().getTrackMimeTypes();
@@ -192,7 +190,7 @@
         assertThat(actualTrackMimeTypes).containsExactlyElementsIn(expectedTrackMimeTypes);
     }
 
-    public void ignored_testTrackCodecs() throws Exception {
+    public void testTrackCodecs() throws Exception {
         String[] expectedCodecs = new String[] {"", "mp4a.40.2"};
         runDeviceTest("testMp4");
         String trackMimeTypesField = getSingleMediaParserReportedEvent().getTrackCodecs();
@@ -201,13 +199,13 @@
         assertThat(actualTrackMimeTypes).containsExactlyElementsIn(expectedCodecs);
     }
 
-    public void ignored_testAlteredParameters() throws Exception {
+    public void testAlteredParameters() throws Exception {
         runDeviceTest("testTsWithH264DtsAudio");
         assertThat(getSingleMediaParserReportedEvent().getAlteredParameters())
                 .isEqualTo("android.media.mediaparser.ts.enableHdmvDtsAudioStreams");
     }
 
-    public void ignored_testVideoSize() throws Exception {
+    public void testVideoSize() throws Exception {
         runDeviceTest("testMp4");
         MediametricsMediaParserReported reportedEvent = getSingleMediaParserReportedEvent();
         assertThat(reportedEvent.getVideoWidth()).isEqualTo(1080);
diff --git a/hostsidetests/monkey/Android.bp b/hostsidetests/monkey/Android.bp
index 7f29b1c..102e9ae 100644
--- a/hostsidetests/monkey/Android.bp
+++ b/hostsidetests/monkey/Android.bp
@@ -24,7 +24,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/monkey/src/com/android/cts/monkey/MonkeyTest.java b/hostsidetests/monkey/src/com/android/cts/monkey/MonkeyTest.java
index 0241879..b540930 100644
--- a/hostsidetests/monkey/src/com/android/cts/monkey/MonkeyTest.java
+++ b/hostsidetests/monkey/src/com/android/cts/monkey/MonkeyTest.java
@@ -27,7 +27,7 @@
     private static final String HUMAN = "(^_^)";
 
     public void testIsMonkey() throws Exception {
-        mDevice.executeShellCommand(MONKEY_CMD + " -p " + PKGS[0] + " 500");
+        mDevice.executeShellCommand(MONKEY_CMD + " -p " + PKGS[0] + " 1000");
         assertIsUserAMonkey(true);
     }
 
diff --git a/hostsidetests/monkey/test-apps/CtsMonkeyApp/Android.bp b/hostsidetests/monkey/test-apps/CtsMonkeyApp/Android.bp
index 8110d80..be2766e 100644
--- a/hostsidetests/monkey/test-apps/CtsMonkeyApp/Android.bp
+++ b/hostsidetests/monkey/test-apps/CtsMonkeyApp/Android.bp
@@ -20,7 +20,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/monkey/test-apps/CtsMonkeyApp2/Android.bp b/hostsidetests/monkey/test-apps/CtsMonkeyApp2/Android.bp
index 20e8b20..debb8f6 100644
--- a/hostsidetests/monkey/test-apps/CtsMonkeyApp2/Android.bp
+++ b/hostsidetests/monkey/test-apps/CtsMonkeyApp2/Android.bp
@@ -20,7 +20,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/multiuser/Android.bp b/hostsidetests/multiuser/Android.bp
index 3f3b0f8..1543686 100644
--- a/hostsidetests/multiuser/Android.bp
+++ b/hostsidetests/multiuser/Android.bp
@@ -26,7 +26,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/net/Android.bp b/hostsidetests/net/Android.bp
deleted file mode 100644
index 741c961..0000000
--- a/hostsidetests/net/Android.bp
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (C) 2014 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-java_test_host {
-    name: "CtsHostsideNetworkTests",
-    defaults: ["cts_defaults"],
-    // Only compile source java files in this apk.
-    srcs: ["src/**/*.java"],
-    libs: [
-        "cts-tradefed",
-        "tradefed",
-    ],
-    // Tag this module as a cts test artifact
-    test_suites: [
-        "cts",
-        "vts10",
-        "general-tests",
-    ],
-}
diff --git a/hostsidetests/net/AndroidTest.xml b/hostsidetests/net/AndroidTest.xml
deleted file mode 100644
index b7fefaf..0000000
--- a/hostsidetests/net/AndroidTest.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 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.
--->
-<configuration description="Config for CTS net host test cases">
-    <option name="test-suite-tag" value="cts" />
-    <option name="config-descriptor:metadata" key="component" value="networking" />
-    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
-    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
-    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
-
-    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.LocationCheck" />
-    <target_preparer class="com.android.cts.net.NetworkPolicyTestsPreparer" />
-
-    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
-        <option name="teardown-command" value="cmd power set-mode 0" />
-        <option name="teardown-command" value="cmd battery reset" />
-        <option name="teardown-command" value="cmd netpolicy stop-watching" />
-    </target_preparer>
-
-    <test class="com.android.compatibility.common.tradefed.testtype.JarHostTest" >
-        <option name="jar" value="CtsHostsideNetworkTests.jar" />
-        <option name="runtime-hint" value="3m56s" />
-    </test>
-
-    <metrics_collector class="com.android.tradefed.device.metric.FilePullerLogCollector">
-        <option name="directory-keys" value="/sdcard/CtsHostsideNetworkTests" />
-        <option name="collect-on-run-ended-only" value="true" />
-    </metrics_collector>
-</configuration>
diff --git a/hostsidetests/net/OWNERS b/hostsidetests/net/OWNERS
deleted file mode 100644
index 52c8053..0000000
--- a/hostsidetests/net/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-# Bug component: 61373
-sudheersai@google.com
-lorenzo@google.com
-jchalard@google.com
diff --git a/hostsidetests/net/aidl/Android.bp b/hostsidetests/net/aidl/Android.bp
deleted file mode 100644
index 320a1fa..0000000
--- a/hostsidetests/net/aidl/Android.bp
+++ /dev/null
@@ -1,24 +0,0 @@
-// 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.
-
-java_test_helper_library {
-    name: "CtsHostsideNetworkTestsAidl",
-    sdk_version: "current",
-    srcs: [
-        "com/android/cts/net/hostside/IMyService.aidl",
-        "com/android/cts/net/hostside/INetworkCallback.aidl",
-        "com/android/cts/net/hostside/INetworkStateObserver.aidl",
-        "com/android/cts/net/hostside/IRemoteSocketFactory.aidl",
-    ],
-}
diff --git a/hostsidetests/net/aidl/com/android/cts/net/hostside/IMyService.aidl b/hostsidetests/net/aidl/com/android/cts/net/hostside/IMyService.aidl
deleted file mode 100644
index 5aafdf0..0000000
--- a/hostsidetests/net/aidl/com/android/cts/net/hostside/IMyService.aidl
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside;
-
-import com.android.cts.net.hostside.INetworkCallback;
-
-interface IMyService {
-    void registerBroadcastReceiver();
-    int getCounters(String receiverName, String action);
-    String checkNetworkStatus();
-    String getRestrictBackgroundStatus();
-    void sendNotification(int notificationId, String notificationType);
-    void registerNetworkCallback(in INetworkCallback cb);
-    void unregisterNetworkCallback();
-}
diff --git a/hostsidetests/net/aidl/com/android/cts/net/hostside/INetworkCallback.aidl b/hostsidetests/net/aidl/com/android/cts/net/hostside/INetworkCallback.aidl
deleted file mode 100644
index 2048bab..0000000
--- a/hostsidetests/net/aidl/com/android/cts/net/hostside/INetworkCallback.aidl
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.net.hostside;
-
-import android.net.Network;
-import android.net.NetworkCapabilities;
-
-interface INetworkCallback {
-    void onBlockedStatusChanged(in Network network, boolean blocked);
-    void onAvailable(in Network network);
-    void onLost(in Network network);
-    void onCapabilitiesChanged(in Network network, in NetworkCapabilities cap);
-}
diff --git a/hostsidetests/net/aidl/com/android/cts/net/hostside/INetworkStateObserver.aidl b/hostsidetests/net/aidl/com/android/cts/net/hostside/INetworkStateObserver.aidl
deleted file mode 100644
index 165f530..0000000
--- a/hostsidetests/net/aidl/com/android/cts/net/hostside/INetworkStateObserver.aidl
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside;
-
-interface INetworkStateObserver {
-    boolean isForeground();
-    void onNetworkStateChecked(String resultData);
-}
\ No newline at end of file
diff --git a/hostsidetests/net/aidl/com/android/cts/net/hostside/IRemoteSocketFactory.aidl b/hostsidetests/net/aidl/com/android/cts/net/hostside/IRemoteSocketFactory.aidl
deleted file mode 100644
index 68176ad..0000000
--- a/hostsidetests/net/aidl/com/android/cts/net/hostside/IRemoteSocketFactory.aidl
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside;
-
-import android.os.ParcelFileDescriptor;
-
-interface IRemoteSocketFactory {
-    ParcelFileDescriptor openSocketFd(String host, int port, int timeoutMs);
-    String getPackageName();
-    int getUid();
-}
diff --git a/hostsidetests/net/app/Android.bp b/hostsidetests/net/app/Android.bp
deleted file mode 100644
index 7a11456..0000000
--- a/hostsidetests/net/app/Android.bp
+++ /dev/null
@@ -1,41 +0,0 @@
-//
-// Copyright (C) 2014 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-android_test_helper_app {
-    name: "CtsHostsideNetworkTestsApp",
-    defaults: ["cts_support_defaults"],
-    //sdk_version: "current",
-    platform_apis: true,
-    static_libs: [
-        "androidx.test.rules",
-        "androidx.test.ext.junit",
-        "compatibility-device-util-axt",
-        "ctstestrunner-axt",
-        "ub-uiautomator",
-        "CtsHostsideNetworkTestsAidl",
-    ],
-    libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
-    ],
-    srcs: ["src/**/*.java"],
-    // Tag this module as a cts test artifact
-    test_suites: [
-        "cts",
-        "vts10",
-        "general-tests",
-    ],
-}
diff --git a/hostsidetests/net/app/AndroidManifest.xml b/hostsidetests/net/app/AndroidManifest.xml
deleted file mode 100644
index 3940de4..0000000
--- a/hostsidetests/net/app/AndroidManifest.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-        package="com.android.cts.net.hostside">
-
-    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
-    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
-    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
-    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
-    <uses-permission android:name="android.permission.INTERNET"/>
-    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
-    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
-    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
-    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
-    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
-
-    <application android:requestLegacyExternalStorage="true" >
-        <uses-library android:name="android.test.runner" />
-        <activity android:name=".MyActivity" />
-        <service android:name=".MyVpnService"
-                android:permission="android.permission.BIND_VPN_SERVICE">
-            <intent-filter>
-                <action android:name="android.net.VpnService"/>
-            </intent-filter>
-        </service>
-        <service
-            android:name=".MyNotificationListenerService"
-            android:label="MyNotificationListenerService"
-            android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" >
-            <intent-filter>
-                <action android:name="android.service.notification.NotificationListenerService" />
-            </intent-filter>
-        </service>
-    </application>
-
-    <instrumentation
-        android:name="androidx.test.runner.AndroidJUnitRunner"
-        android:targetPackage="com.android.cts.net.hostside" />
-
-</manifest>
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/AbstractAppIdleTestCase.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/AbstractAppIdleTestCase.java
deleted file mode 100644
index 219cc3d..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/AbstractAppIdleTestCase.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside;
-
-import static com.android.cts.net.hostside.Property.APP_STANDBY_MODE;
-import static com.android.cts.net.hostside.Property.BATTERY_SAVER_MODE;
-
-import static org.junit.Assert.assertEquals;
-
-import android.os.SystemClock;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Base class for metered and non-metered tests on idle apps.
- */
-@RequiredProperties({APP_STANDBY_MODE})
-abstract class AbstractAppIdleTestCase extends AbstractRestrictBackgroundNetworkTestCase {
-
-    @Before
-    public final void setUp() throws Exception {
-        super.setUp();
-
-        // Set initial state.
-        removePowerSaveModeWhitelist(TEST_APP2_PKG);
-        removePowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG);
-        setAppIdle(false);
-        turnBatteryOn();
-
-        registerBroadcastReceiver();
-    }
-
-    @After
-    public final void tearDown() throws Exception {
-        super.tearDown();
-
-        executeSilentShellCommand("cmd battery reset");
-        setAppIdle(false);
-    }
-
-    @Test
-    public void testBackgroundNetworkAccess_enabled() throws Exception {
-        setAppIdle(true);
-        assertBackgroundNetworkAccess(false);
-
-        assertsForegroundAlwaysHasNetworkAccess();
-        setAppIdle(true);
-        assertBackgroundNetworkAccess(false);
-
-        // Make sure foreground app doesn't lose access upon enabling it.
-        setAppIdle(true);
-        launchComponentAndAssertNetworkAccess(TYPE_COMPONENT_ACTIVTIY);
-        finishActivity();
-        assertAppIdle(false); // Sanity check - not idle anymore, since activity was launched...
-        assertBackgroundNetworkAccess(true);
-        setAppIdle(true);
-        assertBackgroundNetworkAccess(false);
-
-        // Same for foreground service.
-        setAppIdle(true);
-        launchComponentAndAssertNetworkAccess(TYPE_COMPONENT_FOREGROUND_SERVICE);
-        stopForegroundService();
-        assertAppIdle(true);
-        assertBackgroundNetworkAccess(false);
-    }
-
-    @Test
-    public void testBackgroundNetworkAccess_whitelisted() throws Exception {
-        setAppIdle(true);
-        assertBackgroundNetworkAccess(false);
-
-        addPowerSaveModeWhitelist(TEST_APP2_PKG);
-        assertAppIdle(false); // Sanity check - not idle anymore, since whitelisted
-        assertBackgroundNetworkAccess(true);
-
-        setAppIdleNoAssert(true);
-        assertAppIdle(false); // app is still whitelisted
-        removePowerSaveModeWhitelist(TEST_APP2_PKG);
-        assertAppIdle(true); // Sanity check - idle again, once whitelisted was removed
-        assertBackgroundNetworkAccess(false);
-
-        setAppIdle(true);
-        addPowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG);
-        assertAppIdle(false); // Sanity check - not idle anymore, since whitelisted
-        assertBackgroundNetworkAccess(true);
-
-        setAppIdleNoAssert(true);
-        assertAppIdle(false); // app is still whitelisted
-        removePowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG);
-        assertAppIdle(true); // Sanity check - idle again, once whitelisted was removed
-        assertBackgroundNetworkAccess(false);
-
-        assertsForegroundAlwaysHasNetworkAccess();
-
-        // Sanity check - no whitelist, no access!
-        setAppIdle(true);
-        assertBackgroundNetworkAccess(false);
-    }
-
-    @Test
-    public void testBackgroundNetworkAccess_tempWhitelisted() throws Exception {
-        setAppIdle(true);
-        assertBackgroundNetworkAccess(false);
-
-        addTempPowerSaveModeWhitelist(TEST_APP2_PKG, TEMP_POWERSAVE_WHITELIST_DURATION_MS);
-        assertBackgroundNetworkAccess(true);
-        // Wait until the whitelist duration is expired.
-        SystemClock.sleep(TEMP_POWERSAVE_WHITELIST_DURATION_MS);
-        assertBackgroundNetworkAccess(false);
-    }
-
-    @Test
-    public void testBackgroundNetworkAccess_disabled() throws Exception {
-        assertBackgroundNetworkAccess(true);
-
-        assertsForegroundAlwaysHasNetworkAccess();
-        assertBackgroundNetworkAccess(true);
-    }
-
-    @RequiredProperties({BATTERY_SAVER_MODE})
-    @Test
-    public void testAppIdleNetworkAccess_whenCharging() throws Exception {
-        // Check that app is paroled when charging
-        setAppIdle(true);
-        assertBackgroundNetworkAccess(false);
-        turnBatteryOff();
-        assertBackgroundNetworkAccess(true);
-        turnBatteryOn();
-        assertBackgroundNetworkAccess(false);
-
-        // Check that app is restricted when not idle but power-save is on
-        setAppIdle(false);
-        assertBackgroundNetworkAccess(true);
-        setBatterySaverMode(true);
-        assertBackgroundNetworkAccess(false);
-        // Use setBatterySaverMode API to leave power-save mode instead of plugging in charger
-        setBatterySaverMode(false);
-        turnBatteryOff();
-        assertBackgroundNetworkAccess(true);
-
-        // And when no longer charging, it still has network access, since it's not idle
-        turnBatteryOn();
-        assertBackgroundNetworkAccess(true);
-    }
-
-    @Test
-    public void testAppIdleNetworkAccess_idleWhitelisted() throws Exception {
-        setAppIdle(true);
-        assertAppIdle(true);
-        assertBackgroundNetworkAccess(false);
-
-        addAppIdleWhitelist(mUid);
-        assertBackgroundNetworkAccess(true);
-
-        removeAppIdleWhitelist(mUid);
-        assertBackgroundNetworkAccess(false);
-
-        // Make sure whitelisting a random app doesn't affect the tested app.
-        addAppIdleWhitelist(mUid + 1);
-        assertBackgroundNetworkAccess(false);
-        removeAppIdleWhitelist(mUid + 1);
-    }
-
-    @Test
-    public void testAppIdle_toast() throws Exception {
-        setAppIdle(true);
-        assertAppIdle(true);
-        assertEquals("Shown", showToast());
-        assertAppIdle(true);
-        // Wait for a couple of seconds for the toast to actually be shown
-        SystemClock.sleep(2000);
-        assertAppIdle(true);
-    }
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/AbstractBatterySaverModeTestCase.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/AbstractBatterySaverModeTestCase.java
deleted file mode 100644
index 04d054d..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/AbstractBatterySaverModeTestCase.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside;
-
-import static com.android.cts.net.hostside.Property.BATTERY_SAVER_MODE;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Base class for metered and non-metered Battery Saver Mode tests.
- */
-@RequiredProperties({BATTERY_SAVER_MODE})
-abstract class AbstractBatterySaverModeTestCase extends AbstractRestrictBackgroundNetworkTestCase {
-
-    @Before
-    public final void setUp() throws Exception {
-        super.setUp();
-
-        // Set initial state.
-        removePowerSaveModeWhitelist(TEST_APP2_PKG);
-        removePowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG);
-        setBatterySaverMode(false);
-
-        registerBroadcastReceiver();
-    }
-
-    @After
-    public final void tearDown() throws Exception {
-        super.tearDown();
-
-        setBatterySaverMode(false);
-    }
-
-    @Test
-    public void testBackgroundNetworkAccess_enabled() throws Exception {
-        setBatterySaverMode(true);
-        assertBackgroundNetworkAccess(false);
-
-        assertsForegroundAlwaysHasNetworkAccess();
-        assertBackgroundNetworkAccess(false);
-
-        // Make sure foreground app doesn't lose access upon Battery Saver.
-        setBatterySaverMode(false);
-        launchComponentAndAssertNetworkAccess(TYPE_COMPONENT_ACTIVTIY);
-        setBatterySaverMode(true);
-        assertForegroundNetworkAccess();
-
-        // Although it should not have access while the screen is off.
-        turnScreenOff();
-        assertBackgroundNetworkAccess(false);
-        turnScreenOn();
-        assertForegroundNetworkAccess();
-
-        // Goes back to background state.
-        finishActivity();
-        assertBackgroundNetworkAccess(false);
-
-        // Make sure foreground service doesn't lose access upon enabling Battery Saver.
-        setBatterySaverMode(false);
-        launchComponentAndAssertNetworkAccess(TYPE_COMPONENT_FOREGROUND_SERVICE);
-        setBatterySaverMode(true);
-        assertForegroundNetworkAccess();
-        stopForegroundService();
-        assertBackgroundNetworkAccess(false);
-    }
-
-    @Test
-    public void testBackgroundNetworkAccess_whitelisted() throws Exception {
-        setBatterySaverMode(true);
-        assertBackgroundNetworkAccess(false);
-
-        addPowerSaveModeWhitelist(TEST_APP2_PKG);
-        assertBackgroundNetworkAccess(true);
-
-        removePowerSaveModeWhitelist(TEST_APP2_PKG);
-        assertBackgroundNetworkAccess(false);
-
-        addPowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG);
-        assertBackgroundNetworkAccess(true);
-
-        removePowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG);
-        assertBackgroundNetworkAccess(false);
-
-        assertsForegroundAlwaysHasNetworkAccess();
-        assertBackgroundNetworkAccess(false);
-    }
-
-    @Test
-    public void testBackgroundNetworkAccess_disabled() throws Exception {
-        assertBackgroundNetworkAccess(true);
-
-        assertsForegroundAlwaysHasNetworkAccess();
-        assertBackgroundNetworkAccess(true);
-    }
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/AbstractDozeModeTestCase.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/AbstractDozeModeTestCase.java
deleted file mode 100644
index 6f32c56..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/AbstractDozeModeTestCase.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside;
-
-import static com.android.cts.net.hostside.Property.DOZE_MODE;
-import static com.android.cts.net.hostside.Property.NOT_LOW_RAM_DEVICE;
-
-import android.os.SystemClock;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Base class for metered and non-metered Doze Mode tests.
- */
-@RequiredProperties({DOZE_MODE})
-abstract class AbstractDozeModeTestCase extends AbstractRestrictBackgroundNetworkTestCase {
-
-    @Before
-    public final void setUp() throws Exception {
-        super.setUp();
-
-        // Set initial state.
-        removePowerSaveModeWhitelist(TEST_APP2_PKG);
-        removePowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG);
-        setDozeMode(false);
-
-        registerBroadcastReceiver();
-    }
-
-    @After
-    public final void tearDown() throws Exception {
-        super.tearDown();
-
-        setDozeMode(false);
-    }
-
-    @Test
-    public void testBackgroundNetworkAccess_enabled() throws Exception {
-        setDozeMode(true);
-        assertBackgroundNetworkAccess(false);
-
-        assertsForegroundAlwaysHasNetworkAccess();
-        assertBackgroundNetworkAccess(false);
-
-        // Make sure foreground service doesn't lose network access upon enabling doze.
-        setDozeMode(false);
-        launchComponentAndAssertNetworkAccess(TYPE_COMPONENT_FOREGROUND_SERVICE);
-        setDozeMode(true);
-        assertForegroundNetworkAccess();
-        stopForegroundService();
-        assertBackgroundState();
-        assertBackgroundNetworkAccess(false);
-    }
-
-    @Test
-    public void testBackgroundNetworkAccess_whitelisted() throws Exception {
-        setDozeMode(true);
-        assertBackgroundNetworkAccess(false);
-
-        addPowerSaveModeWhitelist(TEST_APP2_PKG);
-        assertBackgroundNetworkAccess(true);
-
-        removePowerSaveModeWhitelist(TEST_APP2_PKG);
-        assertBackgroundNetworkAccess(false);
-
-        addPowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG);
-        assertBackgroundNetworkAccess(false);
-
-        removePowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG);
-        assertBackgroundNetworkAccess(false);
-
-        assertsForegroundAlwaysHasNetworkAccess();
-        assertBackgroundNetworkAccess(false);
-    }
-
-    @Test
-    public void testBackgroundNetworkAccess_disabled() throws Exception {
-        assertBackgroundNetworkAccess(true);
-
-        assertsForegroundAlwaysHasNetworkAccess();
-        assertBackgroundNetworkAccess(true);
-    }
-
-    @RequiredProperties({NOT_LOW_RAM_DEVICE})
-    @Test
-    public void testBackgroundNetworkAccess_enabledButWhitelistedOnNotificationAction()
-            throws Exception {
-        setPendingIntentWhitelistDuration(NETWORK_TIMEOUT_MS);
-        try {
-            registerNotificationListenerService();
-            setDozeMode(true);
-            assertBackgroundNetworkAccess(false);
-
-            testNotification(4, NOTIFICATION_TYPE_CONTENT);
-            testNotification(8, NOTIFICATION_TYPE_DELETE);
-            testNotification(15, NOTIFICATION_TYPE_FULL_SCREEN);
-            testNotification(16, NOTIFICATION_TYPE_BUNDLE);
-            testNotification(23, NOTIFICATION_TYPE_ACTION);
-            testNotification(42, NOTIFICATION_TYPE_ACTION_BUNDLE);
-            testNotification(108, NOTIFICATION_TYPE_ACTION_REMOTE_INPUT);
-        } finally {
-            resetDeviceIdleSettings();
-        }
-    }
-
-    private void testNotification(int id, String type) throws Exception {
-        sendNotification(id, type);
-        assertBackgroundNetworkAccess(true);
-        if (type.equals(NOTIFICATION_TYPE_ACTION)) {
-            // Make sure access is disabled after it expires. Since this check considerably slows
-            // downs the CTS tests, do it just once.
-            SystemClock.sleep(NETWORK_TIMEOUT_MS);
-            assertBackgroundNetworkAccess(false);
-        }
-    }
-
-    // Must override so it only tests foreground service - once an app goes to foreground, device
-    // leaves Doze Mode.
-    @Override
-    protected void assertsForegroundAlwaysHasNetworkAccess() throws Exception {
-        launchComponentAndAssertNetworkAccess(TYPE_COMPONENT_FOREGROUND_SERVICE);
-        stopForegroundService();
-        assertBackgroundState();
-    }
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/AbstractRestrictBackgroundNetworkTestCase.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/AbstractRestrictBackgroundNetworkTestCase.java
deleted file mode 100644
index e5fd149..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/AbstractRestrictBackgroundNetworkTestCase.java
+++ /dev/null
@@ -1,881 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside;
-
-import static android.net.ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED;
-import static android.os.BatteryManager.BATTERY_PLUGGED_AC;
-import static android.os.BatteryManager.BATTERY_PLUGGED_USB;
-import static android.os.BatteryManager.BATTERY_PLUGGED_WIRELESS;
-
-import static com.android.cts.net.hostside.NetworkPolicyTestUtils.executeShellCommand;
-import static com.android.cts.net.hostside.NetworkPolicyTestUtils.getConnectivityManager;
-import static com.android.cts.net.hostside.NetworkPolicyTestUtils.getContext;
-import static com.android.cts.net.hostside.NetworkPolicyTestUtils.getInstrumentation;
-import static com.android.cts.net.hostside.NetworkPolicyTestUtils.getWifiManager;
-import static com.android.cts.net.hostside.NetworkPolicyTestUtils.isDozeModeSupported;
-import static com.android.cts.net.hostside.NetworkPolicyTestUtils.restrictBackgroundValueToString;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import android.app.ActivityManager;
-import android.app.Instrumentation;
-import android.app.NotificationManager;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo.DetailedState;
-import android.net.NetworkInfo.State;
-import android.net.wifi.WifiManager;
-import android.os.BatteryManager;
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.SystemClock;
-import android.provider.Settings;
-import android.service.notification.NotificationListenerService;
-import android.util.Log;
-
-import org.junit.Rule;
-import org.junit.rules.RuleChain;
-import org.junit.runner.RunWith;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Superclass for tests related to background network restrictions.
- */
-@RunWith(NetworkPolicyTestRunner.class)
-public abstract class AbstractRestrictBackgroundNetworkTestCase {
-    public static final String TAG = "RestrictBackgroundNetworkTests";
-
-    protected static final String TEST_PKG = "com.android.cts.net.hostside";
-    protected static final String TEST_APP2_PKG = "com.android.cts.net.hostside.app2";
-
-    private static final String TEST_APP2_ACTIVITY_CLASS = TEST_APP2_PKG + ".MyActivity";
-    private static final String TEST_APP2_SERVICE_CLASS = TEST_APP2_PKG + ".MyForegroundService";
-
-    private static final int SLEEP_TIME_SEC = 1;
-
-    // Constants below must match values defined on app2's Common.java
-    private static final String MANIFEST_RECEIVER = "ManifestReceiver";
-    private static final String DYNAMIC_RECEIVER = "DynamicReceiver";
-
-    private static final String ACTION_RECEIVER_READY =
-            "com.android.cts.net.hostside.app2.action.RECEIVER_READY";
-    static final String ACTION_SHOW_TOAST =
-            "com.android.cts.net.hostside.app2.action.SHOW_TOAST";
-
-    protected static final String NOTIFICATION_TYPE_CONTENT = "CONTENT";
-    protected static final String NOTIFICATION_TYPE_DELETE = "DELETE";
-    protected static final String NOTIFICATION_TYPE_FULL_SCREEN = "FULL_SCREEN";
-    protected static final String NOTIFICATION_TYPE_BUNDLE = "BUNDLE";
-    protected static final String NOTIFICATION_TYPE_ACTION = "ACTION";
-    protected static final String NOTIFICATION_TYPE_ACTION_BUNDLE = "ACTION_BUNDLE";
-    protected static final String NOTIFICATION_TYPE_ACTION_REMOTE_INPUT = "ACTION_REMOTE_INPUT";
-
-    // TODO: Update BatteryManager.BATTERY_PLUGGED_ANY as @TestApi
-    public static final int BATTERY_PLUGGED_ANY =
-            BATTERY_PLUGGED_AC | BATTERY_PLUGGED_USB | BATTERY_PLUGGED_WIRELESS;
-
-    private static final String NETWORK_STATUS_SEPARATOR = "\\|";
-    private static final int SECOND_IN_MS = 1000;
-    static final int NETWORK_TIMEOUT_MS = 15 * SECOND_IN_MS;
-    private static int PROCESS_STATE_FOREGROUND_SERVICE;
-
-    private static final String KEY_NETWORK_STATE_OBSERVER = TEST_PKG + ".observer";
-
-    protected static final int TYPE_COMPONENT_ACTIVTIY = 0;
-    protected static final int TYPE_COMPONENT_FOREGROUND_SERVICE = 1;
-
-    private static final int BATTERY_STATE_TIMEOUT_MS = 5000;
-    private static final int BATTERY_STATE_CHECK_INTERVAL_MS = 500;
-
-    private static final int FOREGROUND_PROC_NETWORK_TIMEOUT_MS = 6000;
-
-    // Must be higher than NETWORK_TIMEOUT_MS
-    private static final int ORDERED_BROADCAST_TIMEOUT_MS = NETWORK_TIMEOUT_MS * 4;
-
-    private static final IntentFilter BATTERY_CHANGED_FILTER =
-            new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
-
-    private static final String APP_NOT_FOREGROUND_ERROR = "app_not_fg";
-
-    protected static final long TEMP_POWERSAVE_WHITELIST_DURATION_MS = 5_000; // 5 sec
-
-    protected Context mContext;
-    protected Instrumentation mInstrumentation;
-    protected ConnectivityManager mCm;
-    protected int mUid;
-    private int mMyUid;
-    private MyServiceClient mServiceClient;
-    private String mDeviceIdleConstantsSetting;
-
-    @Rule
-    public final RuleChain mRuleChain = RuleChain.outerRule(new RequiredPropertiesRule())
-            .around(new MeterednessConfigurationRule());
-
-    protected void setUp() throws Exception {
-
-        PROCESS_STATE_FOREGROUND_SERVICE = (Integer) ActivityManager.class
-                .getDeclaredField("PROCESS_STATE_FOREGROUND_SERVICE").get(null);
-        mInstrumentation = getInstrumentation();
-        mContext = getContext();
-        mCm = getConnectivityManager();
-        mUid = getUid(TEST_APP2_PKG);
-        mMyUid = getUid(mContext.getPackageName());
-        mServiceClient = new MyServiceClient(mContext);
-        mServiceClient.bind();
-        mDeviceIdleConstantsSetting = "device_idle_constants";
-        executeShellCommand("cmd netpolicy start-watching " + mUid);
-        setAppIdle(false);
-
-        Log.i(TAG, "Apps status:\n"
-                + "\ttest app: uid=" + mMyUid + ", state=" + getProcessStateByUid(mMyUid) + "\n"
-                + "\tapp2: uid=" + mUid + ", state=" + getProcessStateByUid(mUid));
-    }
-
-    protected void tearDown() throws Exception {
-        executeShellCommand("cmd netpolicy stop-watching");
-        mServiceClient.unbind();
-    }
-
-    protected int getUid(String packageName) throws Exception {
-        return mContext.getPackageManager().getPackageUid(packageName, 0);
-    }
-
-    protected void assertRestrictBackgroundChangedReceived(int expectedCount) throws Exception {
-        assertRestrictBackgroundChangedReceived(DYNAMIC_RECEIVER, expectedCount);
-        assertRestrictBackgroundChangedReceived(MANIFEST_RECEIVER, 0);
-    }
-
-    protected void assertRestrictBackgroundChangedReceived(String receiverName, int expectedCount)
-            throws Exception {
-        int attempts = 0;
-        int count = 0;
-        final int maxAttempts = 5;
-        do {
-            attempts++;
-            count = getNumberBroadcastsReceived(receiverName, ACTION_RESTRICT_BACKGROUND_CHANGED);
-            assertFalse("Expected count " + expectedCount + " but actual is " + count,
-                    count > expectedCount);
-            if (count == expectedCount) {
-                break;
-            }
-            Log.d(TAG, "Expecting count " + expectedCount + " but actual is " + count + " after "
-                    + attempts + " attempts; sleeping "
-                    + SLEEP_TIME_SEC + " seconds before trying again");
-            SystemClock.sleep(SLEEP_TIME_SEC * SECOND_IN_MS);
-        } while (attempts <= maxAttempts);
-        assertEquals("Number of expected broadcasts for " + receiverName + " not reached after "
-                + maxAttempts * SLEEP_TIME_SEC + " seconds", expectedCount, count);
-    }
-
-    protected String sendOrderedBroadcast(Intent intent) throws Exception {
-        return sendOrderedBroadcast(intent, ORDERED_BROADCAST_TIMEOUT_MS);
-    }
-
-    protected String sendOrderedBroadcast(Intent intent, int timeoutMs) throws Exception {
-        final LinkedBlockingQueue<String> result = new LinkedBlockingQueue<>(1);
-        Log.d(TAG, "Sending ordered broadcast: " + intent);
-        mContext.sendOrderedBroadcast(intent, null, new BroadcastReceiver() {
-
-            @Override
-            public void onReceive(Context context, Intent intent) {
-                final String resultData = getResultData();
-                if (resultData == null) {
-                    Log.e(TAG, "Received null data from ordered intent");
-                    return;
-                }
-                result.offer(resultData);
-            }
-        }, null, 0, null, null);
-
-        final String resultData = result.poll(timeoutMs, TimeUnit.MILLISECONDS);
-        Log.d(TAG, "Ordered broadcast response after " + timeoutMs + "ms: " + resultData );
-        return resultData;
-    }
-
-    protected int getNumberBroadcastsReceived(String receiverName, String action) throws Exception {
-        return mServiceClient.getCounters(receiverName, action);
-    }
-
-    protected void assertRestrictBackgroundStatus(int expectedStatus) throws Exception {
-        final String status = mServiceClient.getRestrictBackgroundStatus();
-        assertNotNull("didn't get API status from app2", status);
-        assertEquals(restrictBackgroundValueToString(expectedStatus),
-                restrictBackgroundValueToString(Integer.parseInt(status)));
-    }
-
-    protected void assertBackgroundNetworkAccess(boolean expectAllowed) throws Exception {
-        assertBackgroundState(); // Sanity check.
-        assertNetworkAccess(expectAllowed /* expectAvailable */, false /* needScreenOn */);
-    }
-
-    protected void assertForegroundNetworkAccess() throws Exception {
-        assertForegroundState(); // Sanity check.
-        // We verified that app is in foreground state but if the screen turns-off while
-        // verifying for network access, the app will go into background state (in case app's
-        // foreground status was due to top activity). So, turn the screen on when verifying
-        // network connectivity.
-        assertNetworkAccess(true /* expectAvailable */, true /* needScreenOn */);
-    }
-
-    protected void assertForegroundServiceNetworkAccess() throws Exception {
-        assertForegroundServiceState(); // Sanity check.
-        assertNetworkAccess(true /* expectAvailable */, false /* needScreenOn */);
-    }
-
-    /**
-     * Asserts that an app always have access while on foreground or running a foreground service.
-     *
-     * <p>This method will launch an activity and a foreground service to make the assertion, but
-     * will finish the activity / stop the service afterwards.
-     */
-    protected void assertsForegroundAlwaysHasNetworkAccess() throws Exception{
-        // Checks foreground first.
-        launchComponentAndAssertNetworkAccess(TYPE_COMPONENT_ACTIVTIY);
-        finishActivity();
-
-        // Then foreground service
-        launchComponentAndAssertNetworkAccess(TYPE_COMPONENT_FOREGROUND_SERVICE);
-        stopForegroundService();
-    }
-
-    protected final void assertBackgroundState() throws Exception {
-        final int maxTries = 30;
-        ProcessState state = null;
-        for (int i = 1; i <= maxTries; i++) {
-            state = getProcessStateByUid(mUid);
-            Log.v(TAG, "assertBackgroundState(): status for app2 (" + mUid + ") on attempt #" + i
-                    + ": " + state);
-            if (isBackground(state.state)) {
-                return;
-            }
-            Log.d(TAG, "App not on background state (" + state + ") on attempt #" + i
-                    + "; sleeping 1s before trying again");
-            SystemClock.sleep(SECOND_IN_MS);
-        }
-        fail("App2 is not on background state after " + maxTries + " attempts: " + state );
-    }
-
-    protected final void assertForegroundState() throws Exception {
-        final int maxTries = 30;
-        ProcessState state = null;
-        for (int i = 1; i <= maxTries; i++) {
-            state = getProcessStateByUid(mUid);
-            Log.v(TAG, "assertForegroundState(): status for app2 (" + mUid + ") on attempt #" + i
-                    + ": " + state);
-            if (!isBackground(state.state)) {
-                return;
-            }
-            Log.d(TAG, "App not on foreground state on attempt #" + i
-                    + "; sleeping 1s before trying again");
-            turnScreenOn();
-            SystemClock.sleep(SECOND_IN_MS);
-        }
-        fail("App2 is not on foreground state after " + maxTries + " attempts: " + state );
-    }
-
-    protected final void assertForegroundServiceState() throws Exception {
-        final int maxTries = 30;
-        ProcessState state = null;
-        for (int i = 1; i <= maxTries; i++) {
-            state = getProcessStateByUid(mUid);
-            Log.v(TAG, "assertForegroundServiceState(): status for app2 (" + mUid + ") on attempt #"
-                    + i + ": " + state);
-            if (state.state == PROCESS_STATE_FOREGROUND_SERVICE) {
-                return;
-            }
-            Log.d(TAG, "App not on foreground service state on attempt #" + i
-                    + "; sleeping 1s before trying again");
-            SystemClock.sleep(SECOND_IN_MS);
-        }
-        fail("App2 is not on foreground service state after " + maxTries + " attempts: " + state );
-    }
-
-    /**
-     * Returns whether an app state should be considered "background" for restriction purposes.
-     */
-    protected boolean isBackground(int state) {
-        return state > PROCESS_STATE_FOREGROUND_SERVICE;
-    }
-
-    /**
-     * Asserts whether the active network is available or not.
-     */
-    private void assertNetworkAccess(boolean expectAvailable, boolean needScreenOn)
-            throws Exception {
-        final int maxTries = 5;
-        String error = null;
-        int timeoutMs = 500;
-
-        for (int i = 1; i <= maxTries; i++) {
-            error = checkNetworkAccess(expectAvailable);
-
-            if (error.isEmpty()) return;
-
-            // TODO: ideally, it should retry only when it cannot connect to an external site,
-            // or no retry at all! But, currently, the initial change fails almost always on
-            // battery saver tests because the netd changes are made asynchronously.
-            // Once b/27803922 is fixed, this retry mechanism should be revisited.
-
-            Log.w(TAG, "Network status didn't match for expectAvailable=" + expectAvailable
-                    + " on attempt #" + i + ": " + error + "\n"
-                    + "Sleeping " + timeoutMs + "ms before trying again");
-            if (needScreenOn) {
-                turnScreenOn();
-            }
-            // No sleep after the last turn
-            if (i < maxTries) {
-                SystemClock.sleep(timeoutMs);
-            }
-            // Exponential back-off.
-            timeoutMs = Math.min(timeoutMs*2, NETWORK_TIMEOUT_MS);
-        }
-        fail("Invalid state for expectAvailable=" + expectAvailable + " after " + maxTries
-                + " attempts.\nLast error: " + error);
-    }
-
-    /**
-     * Checks whether the network is available as expected.
-     *
-     * @return error message with the mismatch (or empty if assertion passed).
-     */
-    private String checkNetworkAccess(boolean expectAvailable) throws Exception {
-        final String resultData = mServiceClient.checkNetworkStatus();
-        return checkForAvailabilityInResultData(resultData, expectAvailable);
-    }
-
-    private String checkForAvailabilityInResultData(String resultData, boolean expectAvailable) {
-        if (resultData == null) {
-            assertNotNull("Network status from app2 is null", resultData);
-        }
-        // Network status format is described on MyBroadcastReceiver.checkNetworkStatus()
-        final String[] parts = resultData.split(NETWORK_STATUS_SEPARATOR);
-        assertEquals("Wrong network status: " + resultData, 5, parts.length); // Sanity check
-        final State state = parts[0].equals("null") ? null : State.valueOf(parts[0]);
-        final DetailedState detailedState = parts[1].equals("null")
-                ? null : DetailedState.valueOf(parts[1]);
-        final boolean connected = Boolean.valueOf(parts[2]);
-        final String connectionCheckDetails = parts[3];
-        final String networkInfo = parts[4];
-
-        final StringBuilder errors = new StringBuilder();
-        final State expectedState;
-        final DetailedState expectedDetailedState;
-        if (expectAvailable) {
-            expectedState = State.CONNECTED;
-            expectedDetailedState = DetailedState.CONNECTED;
-        } else {
-            expectedState = State.DISCONNECTED;
-            expectedDetailedState = DetailedState.BLOCKED;
-        }
-
-        if (expectAvailable != connected) {
-            errors.append(String.format("External site connection failed: expected %s, got %s\n",
-                    expectAvailable, connected));
-        }
-        if (expectedState != state || expectedDetailedState != detailedState) {
-            errors.append(String.format("Connection state mismatch: expected %s/%s, got %s/%s\n",
-                    expectedState, expectedDetailedState, state, detailedState));
-        }
-
-        if (errors.length() > 0) {
-            errors.append("\tnetworkInfo: " + networkInfo + "\n");
-            errors.append("\tconnectionCheckDetails: " + connectionCheckDetails + "\n");
-        }
-        return errors.toString();
-    }
-
-    /**
-     * Runs a Shell command which is not expected to generate output.
-     */
-    protected void executeSilentShellCommand(String command) {
-        final String result = executeShellCommand(command);
-        assertTrue("Command '" + command + "' failed: " + result, result.trim().isEmpty());
-    }
-
-    /**
-     * Asserts the result of a command, wait and re-running it a couple times if necessary.
-     */
-    protected void assertDelayedShellCommand(String command, final String expectedResult)
-            throws Exception {
-        assertDelayedShellCommand(command, 5, 1, expectedResult);
-    }
-
-    protected void assertDelayedShellCommand(String command, int maxTries, int napTimeSeconds,
-            final String expectedResult) throws Exception {
-        assertDelayedShellCommand(command, maxTries, napTimeSeconds, new ExpectResultChecker() {
-
-            @Override
-            public boolean isExpected(String result) {
-                return expectedResult.equals(result);
-            }
-
-            @Override
-            public String getExpected() {
-                return expectedResult;
-            }
-        });
-    }
-
-    protected void assertDelayedShellCommand(String command, int maxTries, int napTimeSeconds,
-            ExpectResultChecker checker) throws Exception {
-        String result = "";
-        for (int i = 1; i <= maxTries; i++) {
-            result = executeShellCommand(command).trim();
-            if (checker.isExpected(result)) return;
-            Log.v(TAG, "Command '" + command + "' returned '" + result + " instead of '"
-                    + checker.getExpected() + "' on attempt #" + i
-                    + "; sleeping " + napTimeSeconds + "s before trying again");
-            SystemClock.sleep(napTimeSeconds * SECOND_IN_MS);
-        }
-        fail("Command '" + command + "' did not return '" + checker.getExpected() + "' after "
-                + maxTries
-                + " attempts. Last result: '" + result + "'");
-    }
-
-    protected void addRestrictBackgroundWhitelist(int uid) throws Exception {
-        executeShellCommand("cmd netpolicy add restrict-background-whitelist " + uid);
-        assertRestrictBackgroundWhitelist(uid, true);
-        // UID policies live by the Highlander rule: "There can be only one".
-        // Hence, if app is whitelisted, it should not be blacklisted.
-        assertRestrictBackgroundBlacklist(uid, false);
-    }
-
-    protected void removeRestrictBackgroundWhitelist(int uid) throws Exception {
-        executeShellCommand("cmd netpolicy remove restrict-background-whitelist " + uid);
-        assertRestrictBackgroundWhitelist(uid, false);
-    }
-
-    protected void assertRestrictBackgroundWhitelist(int uid, boolean expected) throws Exception {
-        assertRestrictBackground("restrict-background-whitelist", uid, expected);
-    }
-
-    protected void addRestrictBackgroundBlacklist(int uid) throws Exception {
-        executeShellCommand("cmd netpolicy add restrict-background-blacklist " + uid);
-        assertRestrictBackgroundBlacklist(uid, true);
-        // UID policies live by the Highlander rule: "There can be only one".
-        // Hence, if app is blacklisted, it should not be whitelisted.
-        assertRestrictBackgroundWhitelist(uid, false);
-    }
-
-    protected void removeRestrictBackgroundBlacklist(int uid) throws Exception {
-        executeShellCommand("cmd netpolicy remove restrict-background-blacklist " + uid);
-        assertRestrictBackgroundBlacklist(uid, false);
-    }
-
-    protected void assertRestrictBackgroundBlacklist(int uid, boolean expected) throws Exception {
-        assertRestrictBackground("restrict-background-blacklist", uid, expected);
-    }
-
-    protected void addAppIdleWhitelist(int uid) throws Exception {
-        executeShellCommand("cmd netpolicy add app-idle-whitelist " + uid);
-        assertAppIdleWhitelist(uid, true);
-    }
-
-    protected void removeAppIdleWhitelist(int uid) throws Exception {
-        executeShellCommand("cmd netpolicy remove app-idle-whitelist " + uid);
-        assertAppIdleWhitelist(uid, false);
-    }
-
-    protected void assertAppIdleWhitelist(int uid, boolean expected) throws Exception {
-        assertRestrictBackground("app-idle-whitelist", uid, expected);
-    }
-
-    private void assertRestrictBackground(String list, int uid, boolean expected) throws Exception {
-        final int maxTries = 5;
-        boolean actual = false;
-        final String expectedUid = Integer.toString(uid);
-        String uids = "";
-        for (int i = 1; i <= maxTries; i++) {
-            final String output =
-                    executeShellCommand("cmd netpolicy list " + list);
-            uids = output.split(":")[1];
-            for (String candidate : uids.split(" ")) {
-                actual = candidate.trim().equals(expectedUid);
-                if (expected == actual) {
-                    return;
-                }
-            }
-            Log.v(TAG, list + " check for uid " + uid + " doesn't match yet (expected "
-                    + expected + ", got " + actual + "); sleeping 1s before polling again");
-            SystemClock.sleep(SECOND_IN_MS);
-        }
-        fail(list + " check for uid " + uid + " failed: expected " + expected + ", got " + actual
-                + ". Full list: " + uids);
-    }
-
-    protected void addTempPowerSaveModeWhitelist(String packageName, long duration)
-            throws Exception {
-        Log.i(TAG, "Adding pkg " + packageName + " to temp-power-save-mode whitelist");
-        executeShellCommand("dumpsys deviceidle tempwhitelist -d " + duration + " " + packageName);
-    }
-
-    protected void assertPowerSaveModeWhitelist(String packageName, boolean expected)
-            throws Exception {
-        // TODO: currently the power-save mode is behaving like idle, but once it changes, we'll
-        // need to use netpolicy for whitelisting
-        assertDelayedShellCommand("dumpsys deviceidle whitelist =" + packageName,
-                Boolean.toString(expected));
-    }
-
-    protected void addPowerSaveModeWhitelist(String packageName) throws Exception {
-        Log.i(TAG, "Adding package " + packageName + " to power-save-mode whitelist");
-        // TODO: currently the power-save mode is behaving like idle, but once it changes, we'll
-        // need to use netpolicy for whitelisting
-        executeShellCommand("dumpsys deviceidle whitelist +" + packageName);
-        assertPowerSaveModeWhitelist(packageName, true); // Sanity check
-    }
-
-    protected void removePowerSaveModeWhitelist(String packageName) throws Exception {
-        Log.i(TAG, "Removing package " + packageName + " from power-save-mode whitelist");
-        // TODO: currently the power-save mode is behaving like idle, but once it changes, we'll
-        // need to use netpolicy for whitelisting
-        executeShellCommand("dumpsys deviceidle whitelist -" + packageName);
-        assertPowerSaveModeWhitelist(packageName, false); // Sanity check
-    }
-
-    protected void assertPowerSaveModeExceptIdleWhitelist(String packageName, boolean expected)
-            throws Exception {
-        // TODO: currently the power-save mode is behaving like idle, but once it changes, we'll
-        // need to use netpolicy for whitelisting
-        assertDelayedShellCommand("dumpsys deviceidle except-idle-whitelist =" + packageName,
-                Boolean.toString(expected));
-    }
-
-    protected void addPowerSaveModeExceptIdleWhitelist(String packageName) throws Exception {
-        Log.i(TAG, "Adding package " + packageName + " to power-save-mode-except-idle whitelist");
-        // TODO: currently the power-save mode is behaving like idle, but once it changes, we'll
-        // need to use netpolicy for whitelisting
-        executeShellCommand("dumpsys deviceidle except-idle-whitelist +" + packageName);
-        assertPowerSaveModeExceptIdleWhitelist(packageName, true); // Sanity check
-    }
-
-    protected void removePowerSaveModeExceptIdleWhitelist(String packageName) throws Exception {
-        Log.i(TAG, "Removing package " + packageName
-                + " from power-save-mode-except-idle whitelist");
-        // TODO: currently the power-save mode is behaving like idle, but once it changes, we'll
-        // need to use netpolicy for whitelisting
-        executeShellCommand("dumpsys deviceidle except-idle-whitelist reset");
-        assertPowerSaveModeExceptIdleWhitelist(packageName, false); // Sanity check
-    }
-
-    protected void turnBatteryOn() throws Exception {
-        executeSilentShellCommand("cmd battery unplug");
-        executeSilentShellCommand("cmd battery set status "
-                + BatteryManager.BATTERY_STATUS_DISCHARGING);
-        assertBatteryState(false);
-    }
-
-    protected void turnBatteryOff() throws Exception {
-        executeSilentShellCommand("cmd battery set ac " + BATTERY_PLUGGED_ANY);
-        executeSilentShellCommand("cmd battery set level 100");
-        executeSilentShellCommand("cmd battery set status "
-                + BatteryManager.BATTERY_STATUS_CHARGING);
-        assertBatteryState(true);
-    }
-
-    private void assertBatteryState(boolean pluggedIn) throws Exception {
-        final long endTime = SystemClock.elapsedRealtime() + BATTERY_STATE_TIMEOUT_MS;
-        while (isDevicePluggedIn() != pluggedIn && SystemClock.elapsedRealtime() <= endTime) {
-            Thread.sleep(BATTERY_STATE_CHECK_INTERVAL_MS);
-        }
-        if (isDevicePluggedIn() != pluggedIn) {
-            fail("Timed out waiting for the plugged-in state to change,"
-                    + " expected pluggedIn: " + pluggedIn);
-        }
-    }
-
-    private boolean isDevicePluggedIn() {
-        final Intent batteryIntent = mContext.registerReceiver(null, BATTERY_CHANGED_FILTER);
-        return batteryIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) > 0;
-    }
-
-    protected void turnScreenOff() throws Exception {
-        executeSilentShellCommand("input keyevent KEYCODE_SLEEP");
-    }
-
-    protected void turnScreenOn() throws Exception {
-        executeSilentShellCommand("input keyevent KEYCODE_WAKEUP");
-        executeSilentShellCommand("wm dismiss-keyguard");
-    }
-
-    protected void setBatterySaverMode(boolean enabled) throws Exception {
-        Log.i(TAG, "Setting Battery Saver Mode to " + enabled);
-        if (enabled) {
-            turnBatteryOn();
-            executeSilentShellCommand("cmd power set-mode 1");
-        } else {
-            executeSilentShellCommand("cmd power set-mode 0");
-            turnBatteryOff();
-        }
-    }
-
-    protected void setDozeMode(boolean enabled) throws Exception {
-        // Sanity check, since tests should check beforehand....
-        assertTrue("Device does not support Doze Mode", isDozeModeSupported());
-
-        Log.i(TAG, "Setting Doze Mode to " + enabled);
-        if (enabled) {
-            turnBatteryOn();
-            turnScreenOff();
-            executeShellCommand("dumpsys deviceidle force-idle deep");
-        } else {
-            turnScreenOn();
-            turnBatteryOff();
-            executeShellCommand("dumpsys deviceidle unforce");
-        }
-        // Sanity check.
-        assertDozeMode(enabled);
-    }
-
-    protected void assertDozeMode(boolean enabled) throws Exception {
-        assertDelayedShellCommand("dumpsys deviceidle get deep", enabled ? "IDLE" : "ACTIVE");
-    }
-
-    protected void setAppIdle(boolean enabled) throws Exception {
-        Log.i(TAG, "Setting app idle to " + enabled);
-        executeSilentShellCommand("am set-inactive " + TEST_APP2_PKG + " " + enabled );
-        assertAppIdle(enabled); // Sanity check
-    }
-
-    protected void setAppIdleNoAssert(boolean enabled) throws Exception {
-        Log.i(TAG, "Setting app idle to " + enabled);
-        executeSilentShellCommand("am set-inactive " + TEST_APP2_PKG + " " + enabled );
-    }
-
-    protected void assertAppIdle(boolean enabled) throws Exception {
-        try {
-            assertDelayedShellCommand("am get-inactive " + TEST_APP2_PKG, 15, 2, "Idle=" + enabled);
-        } catch (Throwable e) {
-            throw e;
-        }
-    }
-
-    /**
-     * Starts a service that will register a broadcast receiver to receive
-     * {@code RESTRICT_BACKGROUND_CHANGE} intents.
-     * <p>
-     * The service must run in a separate app because otherwise it would be killed every time
-     * {@link #runDeviceTests(String, String)} is executed.
-     */
-    protected void registerBroadcastReceiver() throws Exception {
-        mServiceClient.registerBroadcastReceiver();
-
-        final Intent intent = new Intent(ACTION_RECEIVER_READY)
-                .addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
-        // Wait until receiver is ready.
-        final int maxTries = 10;
-        for (int i = 1; i <= maxTries; i++) {
-            final String message = sendOrderedBroadcast(intent, SECOND_IN_MS * 4);
-            Log.d(TAG, "app2 receiver acked: " + message);
-            if (message != null) {
-                return;
-            }
-            Log.v(TAG, "app2 receiver is not ready yet; sleeping 1s before polling again");
-            SystemClock.sleep(SECOND_IN_MS);
-        }
-        fail("app2 receiver is not ready");
-    }
-
-    protected void registerNetworkCallback(INetworkCallback cb) throws Exception {
-        mServiceClient.registerNetworkCallback(cb);
-    }
-
-    protected void unregisterNetworkCallback() throws Exception {
-        mServiceClient.unregisterNetworkCallback();
-    }
-
-    /**
-     * Registers a {@link NotificationListenerService} implementation that will execute the
-     * notification actions right after the notification is sent.
-     */
-    protected void registerNotificationListenerService() throws Exception {
-        executeShellCommand("cmd notification allow_listener "
-                + MyNotificationListenerService.getId());
-        final NotificationManager nm = mContext.getSystemService(NotificationManager.class);
-        final ComponentName listenerComponent = MyNotificationListenerService.getComponentName();
-        assertTrue(listenerComponent + " has not been granted access",
-                nm.isNotificationListenerAccessGranted(listenerComponent));
-    }
-
-    protected void setPendingIntentWhitelistDuration(int durationMs) throws Exception {
-        executeSilentShellCommand(String.format(
-                "settings put global %s %s=%d", mDeviceIdleConstantsSetting,
-                "notification_whitelist_duration", durationMs));
-    }
-
-    protected void resetDeviceIdleSettings() throws Exception {
-        executeShellCommand(String.format("settings delete global %s",
-                mDeviceIdleConstantsSetting));
-    }
-
-    protected void launchComponentAndAssertNetworkAccess(int type) throws Exception {
-        if (type == TYPE_COMPONENT_FOREGROUND_SERVICE) {
-            startForegroundService();
-            assertForegroundServiceNetworkAccess();
-            return;
-        } else if (type == TYPE_COMPONENT_ACTIVTIY) {
-            turnScreenOn();
-            // Wait for screen-on state to propagate through the system.
-            SystemClock.sleep(2000);
-            final CountDownLatch latch = new CountDownLatch(1);
-            final Intent launchIntent = getIntentForComponent(type);
-            final Bundle extras = new Bundle();
-            final String[] errors = new String[]{null};
-            extras.putBinder(KEY_NETWORK_STATE_OBSERVER, getNewNetworkStateObserver(latch, errors));
-            launchIntent.putExtras(extras);
-            mContext.startActivity(launchIntent);
-            if (latch.await(FOREGROUND_PROC_NETWORK_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
-                if (!errors[0].isEmpty()) {
-                    if (errors[0] == APP_NOT_FOREGROUND_ERROR) {
-                        // App didn't come to foreground when the activity is started, so try again.
-                        assertForegroundNetworkAccess();
-                    } else {
-                        fail("Network is not available for app2 (" + mUid + "): " + errors[0]);
-                    }
-                }
-            } else {
-                fail("Timed out waiting for network availability status from app2 (" + mUid + ")");
-            }
-        } else {
-            throw new IllegalArgumentException("Unknown type: " + type);
-        }
-    }
-
-    private void startForegroundService() throws Exception {
-        final Intent launchIntent = getIntentForComponent(TYPE_COMPONENT_FOREGROUND_SERVICE);
-        mContext.startForegroundService(launchIntent);
-        assertForegroundServiceState();
-    }
-
-    private Intent getIntentForComponent(int type) {
-        final Intent intent = new Intent();
-        if (type == TYPE_COMPONENT_ACTIVTIY) {
-            intent.setComponent(new ComponentName(TEST_APP2_PKG, TEST_APP2_ACTIVITY_CLASS))
-                    .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        } else if (type == TYPE_COMPONENT_FOREGROUND_SERVICE) {
-            intent.setComponent(new ComponentName(TEST_APP2_PKG, TEST_APP2_SERVICE_CLASS))
-                    .setFlags(1);
-        } else {
-            fail("Unknown type: " + type);
-        }
-        return intent;
-    }
-
-    protected void stopForegroundService() throws Exception {
-        executeShellCommand(String.format("am startservice -f 2 %s/%s",
-                TEST_APP2_PKG, TEST_APP2_SERVICE_CLASS));
-        // NOTE: cannot assert state because it depends on whether activity was on top before.
-    }
-
-    private Binder getNewNetworkStateObserver(final CountDownLatch latch,
-            final String[] errors) {
-        return new INetworkStateObserver.Stub() {
-            @Override
-            public boolean isForeground() {
-                try {
-                    final ProcessState state = getProcessStateByUid(mUid);
-                    return !isBackground(state.state);
-                } catch (Exception e) {
-                    Log.d(TAG, "Error while reading the proc state for " + mUid + ": " + e);
-                    return false;
-                }
-            }
-
-            @Override
-            public void onNetworkStateChecked(String resultData) {
-                errors[0] = resultData == null
-                        ? APP_NOT_FOREGROUND_ERROR
-                        : checkForAvailabilityInResultData(resultData, true);
-                latch.countDown();
-            }
-        };
-    }
-
-    /**
-     * Finishes an activity on app2 so its process is demoted fromforeground status.
-     */
-    protected void finishActivity() throws Exception {
-        executeShellCommand("am broadcast -a "
-                + " com.android.cts.net.hostside.app2.action.FINISH_ACTIVITY "
-                + "--receiver-foreground --receiver-registered-only");
-    }
-
-    protected void sendNotification(int notificationId, String notificationType) throws Exception {
-        Log.d(TAG, "Sending notification broadcast (id=" + notificationId
-                + ", type=" + notificationType);
-        mServiceClient.sendNotification(notificationId, notificationType);
-    }
-
-    protected String showToast() {
-        final Intent intent = new Intent(ACTION_SHOW_TOAST);
-        intent.setPackage(TEST_APP2_PKG);
-        Log.d(TAG, "Sending request to show toast");
-        try {
-            return sendOrderedBroadcast(intent, 3 * SECOND_IN_MS);
-        } catch (Exception e) {
-            return "";
-        }
-    }
-
-    private ProcessState getProcessStateByUid(int uid) throws Exception {
-        return new ProcessState(executeShellCommand("cmd activity get-uid-state " + uid));
-    }
-
-    private static class ProcessState {
-        private final String fullState;
-        final int state;
-
-        ProcessState(String fullState) {
-            this.fullState = fullState;
-            try {
-                this.state = Integer.parseInt(fullState.split(" ")[0]);
-            } catch (Exception e) {
-                throw new IllegalArgumentException("Could not parse " + fullState);
-            }
-        }
-
-        @Override
-        public String toString() {
-            return fullState;
-        }
-    }
-
-    /**
-     * Helper class used to assert the result of a Shell command.
-     */
-    protected static interface ExpectResultChecker {
-        /**
-         * Checkes whether the result of the command matched the expectation.
-         */
-        boolean isExpected(String result);
-        /**
-         * Gets the expected result so it's displayed on log and failure messages.
-         */
-        String getExpected();
-    }
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/AppIdleMeteredTest.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/AppIdleMeteredTest.java
deleted file mode 100644
index f1858d6..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/AppIdleMeteredTest.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside;
-
-import static com.android.cts.net.hostside.Property.METERED_NETWORK;
-
-@RequiredProperties({METERED_NETWORK})
-public class AppIdleMeteredTest extends AbstractAppIdleTestCase {
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/AppIdleNonMeteredTest.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/AppIdleNonMeteredTest.java
deleted file mode 100644
index e737a6d..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/AppIdleNonMeteredTest.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside;
-
-import static com.android.cts.net.hostside.Property.NON_METERED_NETWORK;
-
-@RequiredProperties({NON_METERED_NETWORK})
-public class AppIdleNonMeteredTest extends AbstractAppIdleTestCase {
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/BatterySaverModeMeteredTest.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/BatterySaverModeMeteredTest.java
deleted file mode 100644
index c78ca2e..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/BatterySaverModeMeteredTest.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside;
-
-import static com.android.cts.net.hostside.Property.METERED_NETWORK;
-
-@RequiredProperties({METERED_NETWORK})
-public class BatterySaverModeMeteredTest extends AbstractBatterySaverModeTestCase {
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/BatterySaverModeNonMeteredTest.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/BatterySaverModeNonMeteredTest.java
deleted file mode 100644
index fb52a54..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/BatterySaverModeNonMeteredTest.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside;
-
-
-import static com.android.cts.net.hostside.Property.NON_METERED_NETWORK;
-
-@RequiredProperties({NON_METERED_NETWORK})
-public class BatterySaverModeNonMeteredTest extends AbstractBatterySaverModeTestCase {
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/DataSaverModeTest.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/DataSaverModeTest.java
deleted file mode 100644
index aa2c914..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/DataSaverModeTest.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside;
-
-import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED;
-import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED;
-import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_WHITELISTED;
-
-import static com.android.cts.net.hostside.NetworkPolicyTestUtils.setRestrictBackground;
-import static com.android.cts.net.hostside.Property.DATA_SAVER_MODE;
-import static com.android.cts.net.hostside.Property.METERED_NETWORK;
-import static com.android.cts.net.hostside.Property.NO_DATA_SAVER_MODE;
-
-import static org.junit.Assert.fail;
-
-import com.android.compatibility.common.util.CddTest;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import androidx.test.filters.LargeTest;
-
-@RequiredProperties({DATA_SAVER_MODE, METERED_NETWORK})
-@LargeTest
-public class DataSaverModeTest extends AbstractRestrictBackgroundNetworkTestCase {
-
-    private static final String[] REQUIRED_WHITELISTED_PACKAGES = {
-        "com.android.providers.downloads"
-    };
-
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-
-        // Set initial state.
-        setRestrictBackground(false);
-        removeRestrictBackgroundWhitelist(mUid);
-        removeRestrictBackgroundBlacklist(mUid);
-
-        registerBroadcastReceiver();
-        assertRestrictBackgroundChangedReceived(0);
-   }
-
-    @After
-    public void tearDown() throws Exception {
-        super.tearDown();
-
-        setRestrictBackground(false);
-    }
-
-    @Test
-    public void testGetRestrictBackgroundStatus_disabled() throws Exception {
-        assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_DISABLED);
-
-        // Sanity check: make sure status is always disabled, never whitelisted
-        addRestrictBackgroundWhitelist(mUid);
-        assertRestrictBackgroundChangedReceived(0);
-        assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_DISABLED);
-
-        assertsForegroundAlwaysHasNetworkAccess();
-        assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_DISABLED);
-    }
-
-    @Test
-    public void testGetRestrictBackgroundStatus_whitelisted() throws Exception {
-        setRestrictBackground(true);
-        assertRestrictBackgroundChangedReceived(1);
-        assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_ENABLED);
-
-        addRestrictBackgroundWhitelist(mUid);
-        assertRestrictBackgroundChangedReceived(2);
-        assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_WHITELISTED);
-
-        removeRestrictBackgroundWhitelist(mUid);
-        assertRestrictBackgroundChangedReceived(3);
-        assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_ENABLED);
-
-        assertsForegroundAlwaysHasNetworkAccess();
-        assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_ENABLED);
-    }
-
-    @Test
-    public void testGetRestrictBackgroundStatus_enabled() throws Exception {
-        setRestrictBackground(true);
-        assertRestrictBackgroundChangedReceived(1);
-        assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_ENABLED);
-
-        assertsForegroundAlwaysHasNetworkAccess();
-        assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_ENABLED);
-
-        // Make sure foreground app doesn't lose access upon enabling Data Saver.
-        setRestrictBackground(false);
-        launchComponentAndAssertNetworkAccess(TYPE_COMPONENT_ACTIVTIY);
-        setRestrictBackground(true);
-        assertForegroundNetworkAccess();
-
-        // Although it should not have access while the screen is off.
-        turnScreenOff();
-        assertBackgroundNetworkAccess(false);
-        turnScreenOn();
-        assertForegroundNetworkAccess();
-
-        // Goes back to background state.
-        finishActivity();
-        assertBackgroundNetworkAccess(false);
-
-        // Make sure foreground service doesn't lose access upon enabling Data Saver.
-        setRestrictBackground(false);
-        launchComponentAndAssertNetworkAccess(TYPE_COMPONENT_FOREGROUND_SERVICE);
-        setRestrictBackground(true);
-        assertForegroundNetworkAccess();
-        stopForegroundService();
-        assertBackgroundNetworkAccess(false);
-    }
-
-    @Test
-    public void testGetRestrictBackgroundStatus_blacklisted() throws Exception {
-        addRestrictBackgroundBlacklist(mUid);
-        assertRestrictBackgroundChangedReceived(1);
-        assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_ENABLED);
-
-        assertsForegroundAlwaysHasNetworkAccess();
-        assertRestrictBackgroundChangedReceived(1);
-        assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_ENABLED);
-
-        // UID policies live by the Highlander rule: "There can be only one".
-        // Hence, if app is whitelisted, it should not be blacklisted anymore.
-        setRestrictBackground(true);
-        assertRestrictBackgroundChangedReceived(2);
-        assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_ENABLED);
-        addRestrictBackgroundWhitelist(mUid);
-        assertRestrictBackgroundChangedReceived(3);
-        assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_WHITELISTED);
-
-        // Check status after removing blacklist.
-        // ...re-enables first
-        addRestrictBackgroundBlacklist(mUid);
-        assertRestrictBackgroundChangedReceived(4);
-        assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_ENABLED);
-        assertsForegroundAlwaysHasNetworkAccess();
-        // ... remove blacklist - access's still rejected because Data Saver is on
-        removeRestrictBackgroundBlacklist(mUid);
-        assertRestrictBackgroundChangedReceived(4);
-        assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_ENABLED);
-        assertsForegroundAlwaysHasNetworkAccess();
-        // ... finally, disable Data Saver
-        setRestrictBackground(false);
-        assertRestrictBackgroundChangedReceived(5);
-        assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_DISABLED);
-        assertsForegroundAlwaysHasNetworkAccess();
-    }
-
-    @Test
-    public void testGetRestrictBackgroundStatus_requiredWhitelistedPackages() throws Exception {
-        final StringBuilder error = new StringBuilder();
-        for (String packageName : REQUIRED_WHITELISTED_PACKAGES) {
-            int uid = -1;
-            try {
-                uid = getUid(packageName);
-                assertRestrictBackgroundWhitelist(uid, true);
-            } catch (Throwable t) {
-                error.append("\nFailed for '").append(packageName).append("'");
-                if (uid > 0) {
-                    error.append(" (uid ").append(uid).append(")");
-                }
-                error.append(": ").append(t).append("\n");
-            }
-        }
-        if (error.length() > 0) {
-            fail(error.toString());
-        }
-    }
-
-    @RequiredProperties({NO_DATA_SAVER_MODE})
-    @CddTest(requirement="7.4.7/C-2-2")
-    @Test
-    public void testBroadcastNotSentOnUnsupportedDevices() throws Exception {
-        setRestrictBackground(true);
-        assertRestrictBackgroundChangedReceived(0);
-
-        setRestrictBackground(false);
-        assertRestrictBackgroundChangedReceived(0);
-
-        setRestrictBackground(true);
-        assertRestrictBackgroundChangedReceived(0);
-    }
-
-    private void assertDataSaverStatusOnBackground(int expectedStatus) throws Exception {
-        assertRestrictBackgroundStatus(expectedStatus);
-        assertBackgroundNetworkAccess(expectedStatus != RESTRICT_BACKGROUND_STATUS_ENABLED);
-    }
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/DozeModeMeteredTest.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/DozeModeMeteredTest.java
deleted file mode 100644
index 4306c99..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/DozeModeMeteredTest.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside;
-
-import static com.android.cts.net.hostside.Property.METERED_NETWORK;
-
-@RequiredProperties({METERED_NETWORK})
-public class DozeModeMeteredTest extends AbstractDozeModeTestCase {
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/DozeModeNonMeteredTest.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/DozeModeNonMeteredTest.java
deleted file mode 100644
index 1e89f15..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/DozeModeNonMeteredTest.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside;
-
-import static com.android.cts.net.hostside.Property.NON_METERED_NETWORK;
-
-@RequiredProperties({NON_METERED_NETWORK})
-public class DozeModeNonMeteredTest extends AbstractDozeModeTestCase {
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/DumpOnFailureRule.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/DumpOnFailureRule.java
deleted file mode 100644
index 5ecb399..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/DumpOnFailureRule.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.cts.net.hostside;
-
-import static com.android.cts.net.hostside.AbstractRestrictBackgroundNetworkTestCase.TAG;
-import static com.android.cts.net.hostside.AbstractRestrictBackgroundNetworkTestCase.TEST_APP2_PKG;
-import static com.android.cts.net.hostside.AbstractRestrictBackgroundNetworkTestCase.TEST_PKG;
-
-import android.os.Environment;
-import android.os.FileUtils;
-import android.os.ParcelFileDescriptor;
-import android.util.Log;
-
-import com.android.compatibility.common.util.OnFailureRule;
-
-import org.junit.AssumptionViolatedException;
-import org.junit.runner.Description;
-import org.junit.runners.model.Statement;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-
-import androidx.test.platform.app.InstrumentationRegistry;
-
-public class DumpOnFailureRule extends OnFailureRule {
-    private File mDumpDir = new File(Environment.getExternalStorageDirectory(),
-            "CtsHostsideNetworkTests");
-
-    @Override
-    public void onTestFailure(Statement base, Description description, Throwable throwable) {
-        final String testName = description.getClassName() + "_" + description.getMethodName();
-
-        if (throwable instanceof AssumptionViolatedException) {
-            Log.d(TAG, "Skipping test " + testName + ": " + throwable);
-            return;
-        }
-
-        prepareDumpRootDir();
-        final File dumpFile = new File(mDumpDir, "dump-" + testName);
-        Log.i(TAG, "Dumping debug info for " + description + ": " + dumpFile.getPath());
-        try (FileOutputStream out = new FileOutputStream(dumpFile)) {
-            for (String cmd : new String[] {
-                    "dumpsys netpolicy",
-                    "dumpsys network_management",
-                    "dumpsys usagestats " + TEST_PKG + " " + TEST_APP2_PKG,
-                    "dumpsys usagestats appstandby",
-            }) {
-                dumpCommandOutput(out, cmd);
-            }
-        } catch (FileNotFoundException e) {
-            Log.e(TAG, "Error opening file: " + dumpFile, e);
-        } catch (IOException e) {
-            Log.e(TAG, "Error closing file: " + dumpFile, e);
-        }
-    }
-
-    void dumpCommandOutput(FileOutputStream out, String cmd) {
-        final ParcelFileDescriptor pfd = InstrumentationRegistry.getInstrumentation()
-                .getUiAutomation().executeShellCommand(cmd);
-        try (FileInputStream in = new ParcelFileDescriptor.AutoCloseInputStream(pfd)) {
-            out.write(("Output of '" + cmd + "':\n").getBytes(StandardCharsets.UTF_8));
-            FileUtils.copy(in, out);
-            out.write("\n\n=================================================================\n\n"
-                    .getBytes(StandardCharsets.UTF_8));
-        } catch (IOException e) {
-            Log.e(TAG, "Error dumping '" + cmd + "'", e);
-        }
-    }
-
-    void prepareDumpRootDir() {
-        if (!mDumpDir.exists() && !mDumpDir.mkdir()) {
-            Log.e(TAG, "Error creating " + mDumpDir);
-        }
-    }
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/MeterednessConfigurationRule.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/MeterednessConfigurationRule.java
deleted file mode 100644
index 8fadf9e..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/MeterednessConfigurationRule.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.cts.net.hostside;
-
-import static com.android.cts.net.hostside.NetworkPolicyTestUtils.resetMeteredNetwork;
-import static com.android.cts.net.hostside.NetworkPolicyTestUtils.setupMeteredNetwork;
-import static com.android.cts.net.hostside.Property.METERED_NETWORK;
-import static com.android.cts.net.hostside.Property.NON_METERED_NETWORK;
-
-import android.util.ArraySet;
-import android.util.Pair;
-
-import com.android.compatibility.common.util.BeforeAfterRule;
-
-import org.junit.runner.Description;
-import org.junit.runners.model.Statement;
-
-public class MeterednessConfigurationRule extends BeforeAfterRule {
-    private Pair<String, Boolean> mSsidAndInitialMeteredness;
-
-    @Override
-    public void onBefore(Statement base, Description description) throws Throwable {
-        final ArraySet<Property> requiredProperties
-                = RequiredPropertiesRule.getRequiredProperties();
-        if (requiredProperties.contains(METERED_NETWORK)) {
-            configureNetworkMeteredness(true);
-        } else if (requiredProperties.contains(NON_METERED_NETWORK)) {
-            configureNetworkMeteredness(false);
-        }
-    }
-
-    @Override
-    public void onAfter(Statement base, Description description) throws Throwable {
-        resetNetworkMeteredness();
-    }
-
-    public void configureNetworkMeteredness(boolean metered) throws Exception {
-        mSsidAndInitialMeteredness = setupMeteredNetwork(metered);
-    }
-
-    public void resetNetworkMeteredness() throws Exception {
-        if (mSsidAndInitialMeteredness != null) {
-            resetMeteredNetwork(mSsidAndInitialMeteredness.first,
-                    mSsidAndInitialMeteredness.second);
-        }
-    }
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/MixedModesTest.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/MixedModesTest.java
deleted file mode 100644
index c9edda6..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/MixedModesTest.java
+++ /dev/null
@@ -1,370 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside;
-
-import static com.android.cts.net.hostside.NetworkPolicyTestUtils.setRestrictBackground;
-import static com.android.cts.net.hostside.Property.APP_STANDBY_MODE;
-import static com.android.cts.net.hostside.Property.BATTERY_SAVER_MODE;
-import static com.android.cts.net.hostside.Property.DATA_SAVER_MODE;
-import static com.android.cts.net.hostside.Property.DOZE_MODE;
-import static com.android.cts.net.hostside.Property.METERED_NETWORK;
-import static com.android.cts.net.hostside.Property.NON_METERED_NETWORK;
-
-import android.os.SystemClock;
-import android.util.Log;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Test cases for the more complex scenarios where multiple restrictions (like Battery Saver Mode
- * and Data Saver Mode) are applied simultaneously.
- * <p>
- * <strong>NOTE: </strong>it might sound like the test methods on this class are testing too much,
- * which would make it harder to diagnose individual failures, but the assumption is that such
- * failure most likely will happen when the restriction is tested individually as well.
- */
-public class MixedModesTest extends AbstractRestrictBackgroundNetworkTestCase {
-    private static final String TAG = "MixedModesTest";
-
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-
-        // Set initial state.
-        removeRestrictBackgroundWhitelist(mUid);
-        removeRestrictBackgroundBlacklist(mUid);
-        removePowerSaveModeWhitelist(TEST_APP2_PKG);
-        removePowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG);
-
-        registerBroadcastReceiver();
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        super.tearDown();
-
-        try {
-            setRestrictBackground(false);
-        } finally {
-            setBatterySaverMode(false);
-        }
-    }
-
-    /**
-     * Tests all DS ON and BS ON scenarios from network-policy-restrictions.md on metered networks.
-     */
-    @RequiredProperties({DATA_SAVER_MODE, BATTERY_SAVER_MODE, METERED_NETWORK})
-    @Test
-    public void testDataAndBatterySaverModes_meteredNetwork() throws Exception {
-        final MeterednessConfigurationRule meterednessConfiguration
-                = new MeterednessConfigurationRule();
-        meterednessConfiguration.configureNetworkMeteredness(true);
-        try {
-            setRestrictBackground(true);
-            setBatterySaverMode(true);
-
-            Log.v(TAG, "Not whitelisted for any.");
-            assertBackgroundNetworkAccess(false);
-            assertsForegroundAlwaysHasNetworkAccess();
-            assertBackgroundNetworkAccess(false);
-
-            Log.v(TAG, "Whitelisted for Data Saver but not for Battery Saver.");
-            addRestrictBackgroundWhitelist(mUid);
-            removePowerSaveModeWhitelist(TEST_APP2_PKG);
-            assertBackgroundNetworkAccess(false);
-            assertsForegroundAlwaysHasNetworkAccess();
-            assertBackgroundNetworkAccess(false);
-            removeRestrictBackgroundWhitelist(mUid);
-
-            Log.v(TAG, "Whitelisted for Battery Saver but not for Data Saver.");
-            addPowerSaveModeWhitelist(TEST_APP2_PKG);
-            removeRestrictBackgroundWhitelist(mUid);
-            assertBackgroundNetworkAccess(false);
-            assertsForegroundAlwaysHasNetworkAccess();
-            assertBackgroundNetworkAccess(false);
-            removePowerSaveModeWhitelist(TEST_APP2_PKG);
-
-            Log.v(TAG, "Whitelisted for both.");
-            addRestrictBackgroundWhitelist(mUid);
-            addPowerSaveModeWhitelist(TEST_APP2_PKG);
-            assertBackgroundNetworkAccess(true);
-            assertsForegroundAlwaysHasNetworkAccess();
-            assertBackgroundNetworkAccess(true);
-            removePowerSaveModeWhitelist(TEST_APP2_PKG);
-            assertBackgroundNetworkAccess(false);
-            removeRestrictBackgroundWhitelist(mUid);
-
-            Log.v(TAG, "Blacklisted for Data Saver, not whitelisted for Battery Saver.");
-            addRestrictBackgroundBlacklist(mUid);
-            removePowerSaveModeWhitelist(TEST_APP2_PKG);
-            assertBackgroundNetworkAccess(false);
-            assertsForegroundAlwaysHasNetworkAccess();
-            assertBackgroundNetworkAccess(false);
-            removeRestrictBackgroundBlacklist(mUid);
-
-            Log.v(TAG, "Blacklisted for Data Saver, whitelisted for Battery Saver.");
-            addRestrictBackgroundBlacklist(mUid);
-            addPowerSaveModeWhitelist(TEST_APP2_PKG);
-            assertBackgroundNetworkAccess(false);
-            assertsForegroundAlwaysHasNetworkAccess();
-            assertBackgroundNetworkAccess(false);
-            removeRestrictBackgroundBlacklist(mUid);
-            removePowerSaveModeWhitelist(TEST_APP2_PKG);
-        } finally {
-            meterednessConfiguration.resetNetworkMeteredness();
-        }
-    }
-
-    /**
-     * Tests all DS ON and BS ON scenarios from network-policy-restrictions.md on non-metered
-     * networks.
-     */
-    @RequiredProperties({DATA_SAVER_MODE, BATTERY_SAVER_MODE, NON_METERED_NETWORK})
-    @Test
-    public void testDataAndBatterySaverModes_nonMeteredNetwork() throws Exception {
-        final MeterednessConfigurationRule meterednessConfiguration
-                = new MeterednessConfigurationRule();
-        meterednessConfiguration.configureNetworkMeteredness(false);
-        try {
-            setRestrictBackground(true);
-            setBatterySaverMode(true);
-
-            Log.v(TAG, "Not whitelisted for any.");
-            assertBackgroundNetworkAccess(false);
-            assertsForegroundAlwaysHasNetworkAccess();
-            assertBackgroundNetworkAccess(false);
-
-            Log.v(TAG, "Whitelisted for Data Saver but not for Battery Saver.");
-            addRestrictBackgroundWhitelist(mUid);
-            removePowerSaveModeWhitelist(TEST_APP2_PKG);
-            assertBackgroundNetworkAccess(false);
-            assertsForegroundAlwaysHasNetworkAccess();
-            assertBackgroundNetworkAccess(false);
-            removeRestrictBackgroundWhitelist(mUid);
-
-            Log.v(TAG, "Whitelisted for Battery Saver but not for Data Saver.");
-            addPowerSaveModeWhitelist(TEST_APP2_PKG);
-            removeRestrictBackgroundWhitelist(mUid);
-            assertBackgroundNetworkAccess(true);
-            assertsForegroundAlwaysHasNetworkAccess();
-            assertBackgroundNetworkAccess(true);
-            removePowerSaveModeWhitelist(TEST_APP2_PKG);
-
-            Log.v(TAG, "Whitelisted for both.");
-            addRestrictBackgroundWhitelist(mUid);
-            addPowerSaveModeWhitelist(TEST_APP2_PKG);
-            assertBackgroundNetworkAccess(true);
-            assertsForegroundAlwaysHasNetworkAccess();
-            assertBackgroundNetworkAccess(true);
-            removePowerSaveModeWhitelist(TEST_APP2_PKG);
-            assertBackgroundNetworkAccess(false);
-            removeRestrictBackgroundWhitelist(mUid);
-
-            Log.v(TAG, "Blacklisted for Data Saver, not whitelisted for Battery Saver.");
-            addRestrictBackgroundBlacklist(mUid);
-            removePowerSaveModeWhitelist(TEST_APP2_PKG);
-            assertBackgroundNetworkAccess(false);
-            assertsForegroundAlwaysHasNetworkAccess();
-            assertBackgroundNetworkAccess(false);
-            removeRestrictBackgroundBlacklist(mUid);
-
-            Log.v(TAG, "Blacklisted for Data Saver, whitelisted for Battery Saver.");
-            addRestrictBackgroundBlacklist(mUid);
-            addPowerSaveModeWhitelist(TEST_APP2_PKG);
-            assertBackgroundNetworkAccess(true);
-            assertsForegroundAlwaysHasNetworkAccess();
-            assertBackgroundNetworkAccess(true);
-            removeRestrictBackgroundBlacklist(mUid);
-            removePowerSaveModeWhitelist(TEST_APP2_PKG);
-        } finally {
-            meterednessConfiguration.resetNetworkMeteredness();
-        }
-    }
-
-    /**
-     * Tests that powersave whitelists works as expected when doze and battery saver modes
-     * are enabled.
-     */
-    @RequiredProperties({DOZE_MODE, BATTERY_SAVER_MODE})
-    @Test
-    public void testDozeAndBatterySaverMode_powerSaveWhitelists() throws Exception {
-        setBatterySaverMode(true);
-        setDozeMode(true);
-
-        try {
-            addPowerSaveModeWhitelist(TEST_APP2_PKG);
-            assertBackgroundNetworkAccess(true);
-
-            removePowerSaveModeWhitelist(TEST_APP2_PKG);
-            assertBackgroundNetworkAccess(false);
-
-            addPowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG);
-            assertBackgroundNetworkAccess(false);
-
-            removePowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG);
-            assertBackgroundNetworkAccess(false);
-        } finally {
-            setBatterySaverMode(false);
-            setDozeMode(false);
-        }
-    }
-
-    /**
-     * Tests that powersave whitelists works as expected when doze and appIdle modes
-     * are enabled.
-     */
-    @RequiredProperties({DOZE_MODE, APP_STANDBY_MODE})
-    @Test
-    public void testDozeAndAppIdle_powerSaveWhitelists() throws Exception {
-        setDozeMode(true);
-        setAppIdle(true);
-
-        try {
-            addPowerSaveModeWhitelist(TEST_APP2_PKG);
-            assertBackgroundNetworkAccess(true);
-
-            removePowerSaveModeWhitelist(TEST_APP2_PKG);
-            assertBackgroundNetworkAccess(false);
-
-            addPowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG);
-            assertBackgroundNetworkAccess(false);
-
-            removePowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG);
-            assertBackgroundNetworkAccess(false);
-        } finally {
-            setAppIdle(false);
-            setDozeMode(false);
-        }
-    }
-
-    @RequiredProperties({APP_STANDBY_MODE, DOZE_MODE})
-    @Test
-    public void testAppIdleAndDoze_tempPowerSaveWhitelists() throws Exception {
-        setDozeMode(true);
-        setAppIdle(true);
-
-        try {
-            assertBackgroundNetworkAccess(false);
-
-            addTempPowerSaveModeWhitelist(TEST_APP2_PKG, TEMP_POWERSAVE_WHITELIST_DURATION_MS);
-            assertBackgroundNetworkAccess(true);
-
-            // Wait until the whitelist duration is expired.
-            SystemClock.sleep(TEMP_POWERSAVE_WHITELIST_DURATION_MS);
-            assertBackgroundNetworkAccess(false);
-        } finally {
-            setAppIdle(false);
-            setDozeMode(false);
-        }
-    }
-
-    @RequiredProperties({APP_STANDBY_MODE, BATTERY_SAVER_MODE})
-    @Test
-    public void testAppIdleAndBatterySaver_tempPowerSaveWhitelists() throws Exception {
-        setBatterySaverMode(true);
-        setAppIdle(true);
-
-        try {
-            assertBackgroundNetworkAccess(false);
-
-            addTempPowerSaveModeWhitelist(TEST_APP2_PKG, TEMP_POWERSAVE_WHITELIST_DURATION_MS);
-            assertBackgroundNetworkAccess(true);
-
-            // Wait until the whitelist duration is expired.
-            SystemClock.sleep(TEMP_POWERSAVE_WHITELIST_DURATION_MS);
-            assertBackgroundNetworkAccess(false);
-        } finally {
-            setAppIdle(false);
-            setBatterySaverMode(false);
-        }
-    }
-
-    /**
-     * Tests that the app idle whitelist works as expected when doze and appIdle mode are enabled.
-     */
-    @RequiredProperties({DOZE_MODE, APP_STANDBY_MODE})
-    @Test
-    public void testDozeAndAppIdle_appIdleWhitelist() throws Exception {
-        setDozeMode(true);
-        setAppIdle(true);
-
-        try {
-            assertBackgroundNetworkAccess(false);
-
-            // UID still shouldn't have access because of Doze.
-            addAppIdleWhitelist(mUid);
-            assertBackgroundNetworkAccess(false);
-
-            removeAppIdleWhitelist(mUid);
-            assertBackgroundNetworkAccess(false);
-        } finally {
-            setAppIdle(false);
-            setDozeMode(false);
-        }
-    }
-
-    @RequiredProperties({APP_STANDBY_MODE, DOZE_MODE})
-    @Test
-    public void testAppIdleAndDoze_tempPowerSaveAndAppIdleWhitelists() throws Exception {
-        setDozeMode(true);
-        setAppIdle(true);
-
-        try {
-            assertBackgroundNetworkAccess(false);
-
-            addAppIdleWhitelist(mUid);
-            assertBackgroundNetworkAccess(false);
-
-            addTempPowerSaveModeWhitelist(TEST_APP2_PKG, TEMP_POWERSAVE_WHITELIST_DURATION_MS);
-            assertBackgroundNetworkAccess(true);
-
-            // Wait until the whitelist duration is expired.
-            SystemClock.sleep(TEMP_POWERSAVE_WHITELIST_DURATION_MS);
-            assertBackgroundNetworkAccess(false);
-        } finally {
-            setAppIdle(false);
-            setDozeMode(false);
-            removeAppIdleWhitelist(mUid);
-        }
-    }
-
-    @RequiredProperties({APP_STANDBY_MODE, BATTERY_SAVER_MODE})
-    @Test
-    public void testAppIdleAndBatterySaver_tempPowerSaveAndAppIdleWhitelists() throws Exception {
-        setBatterySaverMode(true);
-        setAppIdle(true);
-
-        try {
-            assertBackgroundNetworkAccess(false);
-
-            addAppIdleWhitelist(mUid);
-            assertBackgroundNetworkAccess(false);
-
-            addTempPowerSaveModeWhitelist(TEST_APP2_PKG, TEMP_POWERSAVE_WHITELIST_DURATION_MS);
-            assertBackgroundNetworkAccess(true);
-
-            // Wait until the whitelist duration is expired.
-            SystemClock.sleep(TEMP_POWERSAVE_WHITELIST_DURATION_MS);
-            assertBackgroundNetworkAccess(false);
-        } finally {
-            setAppIdle(false);
-            setBatterySaverMode(false);
-            removeAppIdleWhitelist(mUid);
-        }
-    }
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/MyActivity.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/MyActivity.java
deleted file mode 100644
index 0d0bc58..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/MyActivity.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.net.hostside;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.os.Bundle;
-import android.view.WindowManager;
-
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
-
-public class MyActivity extends Activity {
-    private final LinkedBlockingQueue<Integer> mResult = new LinkedBlockingQueue<>(1);
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
-                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
-                | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
-    }
-
-    @Override
-    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-        if (mResult.offer(resultCode) == false) {
-            throw new RuntimeException("Queue is full! This should never happen");
-        }
-    }
-
-    public Integer getResult(int timeoutMs) throws InterruptedException {
-        return mResult.poll(timeoutMs, TimeUnit.MILLISECONDS);
-    }
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/MyNotificationListenerService.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/MyNotificationListenerService.java
deleted file mode 100644
index 0132536..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/MyNotificationListenerService.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside;
-
-import android.app.Notification;
-import android.app.PendingIntent;
-import android.app.PendingIntent.CanceledException;
-import android.app.RemoteInput;
-import android.content.ComponentName;
-import android.os.Bundle;
-import android.service.notification.NotificationListenerService;
-import android.service.notification.StatusBarNotification;
-import android.util.Log;
-
-/**
- * NotificationListenerService implementation that executes the notification actions once they're
- * created.
- */
-public class MyNotificationListenerService extends NotificationListenerService {
-    private static final String TAG = "MyNotificationListenerService";
-
-    @Override
-    public void onListenerConnected() {
-        Log.d(TAG, "onListenerConnected()");
-    }
-
-    @Override
-    public void onNotificationPosted(StatusBarNotification sbn) {
-        Log.d(TAG, "onNotificationPosted(): "  + sbn);
-        if (!sbn.getPackageName().startsWith(getPackageName())) {
-            Log.v(TAG, "ignoring notification from a different package");
-            return;
-        }
-        final PendingIntentSender sender = new PendingIntentSender();
-        final Notification notification = sbn.getNotification();
-        if (notification.contentIntent != null) {
-            sender.send("content", notification.contentIntent);
-        }
-        if (notification.deleteIntent != null) {
-            sender.send("delete", notification.deleteIntent);
-        }
-        if (notification.fullScreenIntent != null) {
-            sender.send("full screen", notification.fullScreenIntent);
-        }
-        if (notification.actions != null) {
-            for (Notification.Action action : notification.actions) {
-                sender.send("action", action.actionIntent);
-                sender.send("action extras", action.getExtras());
-                final RemoteInput[] remoteInputs = action.getRemoteInputs();
-                if (remoteInputs != null && remoteInputs.length > 0) {
-                    for (RemoteInput remoteInput : remoteInputs) {
-                        sender.send("remote input extras", remoteInput.getExtras());
-                    }
-                }
-            }
-        }
-        sender.send("notification extras", notification.extras);
-    }
-
-    static String getId() {
-        return String.format("%s/%s", MyNotificationListenerService.class.getPackage().getName(),
-                MyNotificationListenerService.class.getName());
-    }
-
-    static ComponentName getComponentName() {
-        return new ComponentName(MyNotificationListenerService.class.getPackage().getName(),
-                MyNotificationListenerService.class.getName());
-    }
-
-    private static final class PendingIntentSender {
-        private PendingIntent mSentIntent = null;
-        private String mReason = null;
-
-        private void send(String reason, PendingIntent pendingIntent) {
-            if (pendingIntent == null) {
-                // Could happen on action that only has extras
-                Log.v(TAG, "Not sending null pending intent for " + reason);
-                return;
-            }
-            if (mSentIntent != null || mReason != null) {
-                // Sanity check: make sure test case set up just one pending intent in the
-                // notification, otherwise it could pass because another pending intent caused the
-                // whitelisting.
-                throw new IllegalStateException("Already sent a PendingIntent (" + mSentIntent
-                        + ") for reason '" + mReason + "' when requested another for '" + reason
-                        + "' (" + pendingIntent + ")");
-            }
-            Log.i(TAG, "Sending pending intent for " + reason + ":" + pendingIntent);
-            try {
-                pendingIntent.send();
-                mSentIntent = pendingIntent;
-                mReason = reason;
-            } catch (CanceledException e) {
-                Log.w(TAG, "Pending intent " + pendingIntent + " canceled");
-            }
-        }
-
-        private void send(String reason, Bundle extras) {
-            if (extras != null) {
-                for (String key : extras.keySet()) {
-                    Object value = extras.get(key);
-                    if (value instanceof PendingIntent) {
-                        send(reason + " with key '" + key + "'", (PendingIntent) value);
-                    }
-                }
-            }
-        }
-
-    }
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/MyServiceClient.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/MyServiceClient.java
deleted file mode 100644
index 6546e26..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/MyServiceClient.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.ConditionVariable;
-import android.os.IBinder;
-import android.os.RemoteException;
-
-import com.android.cts.net.hostside.IMyService;
-
-public class MyServiceClient {
-    private static final int TIMEOUT_MS = 5000;
-    private static final String PACKAGE = MyServiceClient.class.getPackage().getName();
-    private static final String APP2_PACKAGE = PACKAGE + ".app2";
-    private static final String SERVICE_NAME = APP2_PACKAGE + ".MyService";
-
-    private Context mContext;
-    private ServiceConnection mServiceConnection;
-    private IMyService mService;
-
-    public MyServiceClient(Context context) {
-        mContext = context;
-    }
-
-    public void bind() {
-        if (mService != null) {
-            throw new IllegalStateException("Already bound");
-        }
-
-        final ConditionVariable cv = new ConditionVariable();
-        mServiceConnection = new ServiceConnection() {
-            @Override
-            public void onServiceConnected(ComponentName name, IBinder service) {
-                mService = IMyService.Stub.asInterface(service);
-                cv.open();
-            }
-            @Override
-            public void onServiceDisconnected(ComponentName name) {
-                mService = null;
-            }
-        };
-
-        final Intent intent = new Intent();
-        intent.setComponent(new ComponentName(APP2_PACKAGE, SERVICE_NAME));
-        // Needs to use BIND_NOT_FOREGROUND so app2 does not run in
-        // the same process state as app
-        mContext.bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE
-                | Context.BIND_NOT_FOREGROUND);
-        cv.block(TIMEOUT_MS);
-        if (mService == null) {
-            throw new IllegalStateException(
-                    "Could not bind to MyService service after " + TIMEOUT_MS + "ms");
-        }
-    }
-
-    public void unbind() {
-        if (mService != null) {
-            mContext.unbindService(mServiceConnection);
-        }
-    }
-
-    public void registerBroadcastReceiver() throws RemoteException {
-        mService.registerBroadcastReceiver();
-    }
-
-    public int getCounters(String receiverName, String action) throws RemoteException {
-        return mService.getCounters(receiverName, action);
-    }
-
-    public String checkNetworkStatus() throws RemoteException {
-        return mService.checkNetworkStatus();
-    }
-
-    public String getRestrictBackgroundStatus() throws RemoteException {
-        return mService.getRestrictBackgroundStatus();
-    }
-
-    public void sendNotification(int notificationId, String notificationType) throws RemoteException {
-        mService.sendNotification(notificationId, notificationType);
-    }
-
-    public void registerNetworkCallback(INetworkCallback cb) throws RemoteException {
-        mService.registerNetworkCallback(cb);
-    }
-
-    public void unregisterNetworkCallback() throws RemoteException {
-        mService.unregisterNetworkCallback();
-    }
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/MyVpnService.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/MyVpnService.java
deleted file mode 100644
index 7d3d4fc..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/MyVpnService.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.net.hostside;
-
-import android.content.Intent;
-import android.net.Network;
-import android.net.ProxyInfo;
-import android.net.VpnService;
-import android.os.ParcelFileDescriptor;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-
-public class MyVpnService extends VpnService {
-
-    private static String TAG = "MyVpnService";
-    private static int MTU = 1799;
-
-    public static final String ACTION_ESTABLISHED = "com.android.cts.net.hostside.ESTABNLISHED";
-    public static final String EXTRA_ALWAYS_ON = "is-always-on";
-    public static final String EXTRA_LOCKDOWN_ENABLED = "is-lockdown-enabled";
-
-    private ParcelFileDescriptor mFd = null;
-    private PacketReflector mPacketReflector = null;
-
-    @Override
-    public int onStartCommand(Intent intent, int flags, int startId) {
-        String packageName = getPackageName();
-        String cmd = intent.getStringExtra(packageName + ".cmd");
-        if ("disconnect".equals(cmd)) {
-            stop();
-        } else if ("connect".equals(cmd)) {
-            start(packageName, intent);
-        }
-
-        return START_NOT_STICKY;
-    }
-
-    private void start(String packageName, Intent intent) {
-        Builder builder = new Builder();
-
-        String addresses = intent.getStringExtra(packageName + ".addresses");
-        if (addresses != null) {
-            String[] addressArray = addresses.split(",");
-            for (int i = 0; i < addressArray.length; i++) {
-                String[] prefixAndMask = addressArray[i].split("/");
-                try {
-                    InetAddress address = InetAddress.getByName(prefixAndMask[0]);
-                    int prefixLength = Integer.parseInt(prefixAndMask[1]);
-                    builder.addAddress(address, prefixLength);
-                } catch (UnknownHostException|NumberFormatException|
-                         ArrayIndexOutOfBoundsException e) {
-                    continue;
-                }
-            }
-        }
-
-        String routes = intent.getStringExtra(packageName + ".routes");
-        if (routes != null) {
-            String[] routeArray = routes.split(",");
-            for (int i = 0; i < routeArray.length; i++) {
-                String[] prefixAndMask = routeArray[i].split("/");
-                try {
-                    InetAddress address = InetAddress.getByName(prefixAndMask[0]);
-                    int prefixLength = Integer.parseInt(prefixAndMask[1]);
-                    builder.addRoute(address, prefixLength);
-                } catch (UnknownHostException|NumberFormatException|
-                         ArrayIndexOutOfBoundsException e) {
-                    continue;
-                }
-            }
-        }
-
-        String allowed = intent.getStringExtra(packageName + ".allowedapplications");
-        if (allowed != null) {
-            String[] packageArray = allowed.split(",");
-            for (int i = 0; i < packageArray.length; i++) {
-                String allowedPackage = packageArray[i];
-                if (!TextUtils.isEmpty(allowedPackage)) {
-                    try {
-                        builder.addAllowedApplication(allowedPackage);
-                    } catch(NameNotFoundException e) {
-                        continue;
-                    }
-                }
-            }
-        }
-
-        String disallowed = intent.getStringExtra(packageName + ".disallowedapplications");
-        if (disallowed != null) {
-            String[] packageArray = disallowed.split(",");
-            for (int i = 0; i < packageArray.length; i++) {
-                String disallowedPackage = packageArray[i];
-                if (!TextUtils.isEmpty(disallowedPackage)) {
-                    try {
-                        builder.addDisallowedApplication(disallowedPackage);
-                    } catch(NameNotFoundException e) {
-                        continue;
-                    }
-                }
-            }
-        }
-
-        ArrayList<Network> underlyingNetworks =
-                intent.getParcelableArrayListExtra(packageName + ".underlyingNetworks");
-        if (underlyingNetworks == null) {
-            // VPN tracks default network
-            builder.setUnderlyingNetworks(null);
-        } else {
-            builder.setUnderlyingNetworks(underlyingNetworks.toArray(new Network[0]));
-        }
-
-        boolean isAlwaysMetered = intent.getBooleanExtra(packageName + ".isAlwaysMetered", false);
-        builder.setMetered(isAlwaysMetered);
-
-        ProxyInfo vpnProxy = intent.getParcelableExtra(packageName + ".httpProxy");
-        builder.setHttpProxy(vpnProxy);
-        builder.setMtu(MTU);
-        builder.setBlocking(true);
-        builder.setSession("MyVpnService");
-
-        Log.i(TAG, "Establishing VPN,"
-                + " addresses=" + addresses
-                + " routes=" + routes
-                + " allowedApplications=" + allowed
-                + " disallowedApplications=" + disallowed);
-
-        mFd = builder.establish();
-        Log.i(TAG, "Established, fd=" + (mFd == null ? "null" : mFd.getFd()));
-
-        broadcastEstablished();
-
-        mPacketReflector = new PacketReflector(mFd.getFileDescriptor(), MTU);
-        mPacketReflector.start();
-    }
-
-    private void broadcastEstablished() {
-        final Intent bcIntent = new Intent(ACTION_ESTABLISHED);
-        bcIntent.putExtra(EXTRA_ALWAYS_ON, isAlwaysOn());
-        bcIntent.putExtra(EXTRA_LOCKDOWN_ENABLED, isLockdownEnabled());
-        sendBroadcast(bcIntent);
-    }
-
-    private void stop() {
-        if (mPacketReflector != null) {
-            mPacketReflector.interrupt();
-            mPacketReflector = null;
-        }
-        try {
-            if (mFd != null) {
-                Log.i(TAG, "Closing filedescriptor");
-                mFd.close();
-            }
-        } catch(IOException e) {
-        } finally {
-            mFd = null;
-        }
-    }
-
-    @Override
-    public void onDestroy() {
-        stop();
-        super.onDestroy();
-    }
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/NetworkCallbackTest.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/NetworkCallbackTest.java
deleted file mode 100644
index 2ac29e7..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/NetworkCallbackTest.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.net.hostside;
-
-import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
-import static com.android.cts.net.hostside.NetworkPolicyTestUtils.canChangeActiveNetworkMeteredness;
-import static com.android.cts.net.hostside.NetworkPolicyTestUtils.setRestrictBackground;
-import static com.android.cts.net.hostside.NetworkPolicyTestUtils.isActiveNetworkMetered;
-import static com.android.cts.net.hostside.Property.BATTERY_SAVER_MODE;
-import static com.android.cts.net.hostside.Property.DATA_SAVER_MODE;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
-
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.util.Log;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import java.util.Objects;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
-
-public class NetworkCallbackTest extends AbstractRestrictBackgroundNetworkTestCase {
-    private Network mNetwork;
-    private final TestNetworkCallback mTestNetworkCallback = new TestNetworkCallback();
-    @Rule
-    public final MeterednessConfigurationRule mMeterednessConfiguration
-            = new MeterednessConfigurationRule();
-
-    enum CallbackState {
-        NONE,
-        AVAILABLE,
-        LOST,
-        BLOCKED_STATUS,
-        CAPABILITIES
-    }
-
-    private static class CallbackInfo {
-        public final CallbackState state;
-        public final Network network;
-        public final Object arg;
-
-        CallbackInfo(CallbackState s, Network n, Object o) {
-            state = s; network = n; arg = o;
-        }
-
-        public String toString() {
-            return String.format("%s (%s) (%s)", state, network, arg);
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (!(o instanceof CallbackInfo)) return false;
-            // Ignore timeMs, since it's unpredictable.
-            final CallbackInfo other = (CallbackInfo) o;
-            return (state == other.state) && Objects.equals(network, other.network)
-                    && Objects.equals(arg, other.arg);
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(state, network, arg);
-        }
-    }
-
-    private class TestNetworkCallback extends INetworkCallback.Stub {
-        private static final int TEST_CONNECT_TIMEOUT_MS = 30_000;
-        private static final int TEST_CALLBACK_TIMEOUT_MS = 5_000;
-
-        private final LinkedBlockingQueue<CallbackInfo> mCallbacks = new LinkedBlockingQueue<>();
-
-        protected void setLastCallback(CallbackState state, Network network, Object o) {
-            mCallbacks.offer(new CallbackInfo(state, network, o));
-        }
-
-        CallbackInfo nextCallback(int timeoutMs) {
-            CallbackInfo cb = null;
-            try {
-                cb = mCallbacks.poll(timeoutMs, TimeUnit.MILLISECONDS);
-            } catch (InterruptedException e) {
-            }
-            if (cb == null) {
-                fail("Did not receive callback after " + timeoutMs + "ms");
-            }
-            return cb;
-        }
-
-        CallbackInfo expectCallback(CallbackState state, Network expectedNetwork, Object o) {
-            final CallbackInfo expected = new CallbackInfo(state, expectedNetwork, o);
-            final CallbackInfo actual = nextCallback(TEST_CALLBACK_TIMEOUT_MS);
-            assertEquals("Unexpected callback:", expected, actual);
-            return actual;
-        }
-
-        @Override
-        public void onAvailable(Network network) {
-            setLastCallback(CallbackState.AVAILABLE, network, null);
-        }
-
-        @Override
-        public void onLost(Network network) {
-            setLastCallback(CallbackState.LOST, network, null);
-        }
-
-        @Override
-        public void onBlockedStatusChanged(Network network, boolean blocked) {
-            setLastCallback(CallbackState.BLOCKED_STATUS, network, blocked);
-        }
-
-        @Override
-        public void onCapabilitiesChanged(Network network, NetworkCapabilities cap) {
-            setLastCallback(CallbackState.CAPABILITIES, network, cap);
-        }
-
-        public Network expectAvailableCallbackAndGetNetwork() {
-            final CallbackInfo cb = nextCallback(TEST_CONNECT_TIMEOUT_MS);
-            if (cb.state != CallbackState.AVAILABLE) {
-                fail("Network is not available. Instead obtained the following callback :"
-                        + cb);
-            }
-            return cb.network;
-        }
-
-        public void expectBlockedStatusCallback(Network expectedNetwork, boolean expectBlocked) {
-            expectCallback(CallbackState.BLOCKED_STATUS, expectedNetwork, expectBlocked);
-        }
-
-        public void expectBlockedStatusCallbackEventually(Network expectedNetwork,
-                boolean expectBlocked) {
-            final long deadline = System.currentTimeMillis() + TEST_CALLBACK_TIMEOUT_MS;
-            do {
-                final CallbackInfo cb = nextCallback((int) (deadline - System.currentTimeMillis()));
-                if (cb.state == CallbackState.BLOCKED_STATUS
-                        && cb.network.equals(expectedNetwork)) {
-                    assertEquals(expectBlocked, cb.arg);
-                    return;
-                }
-            } while (System.currentTimeMillis() <= deadline);
-            fail("Didn't receive onBlockedStatusChanged()");
-        }
-
-        public void expectCapabilitiesCallbackEventually(Network expectedNetwork, boolean hasCap,
-                int cap) {
-            final long deadline = System.currentTimeMillis() + TEST_CALLBACK_TIMEOUT_MS;
-            do {
-                final CallbackInfo cb = nextCallback((int) (deadline - System.currentTimeMillis()));
-                if (cb.state != CallbackState.CAPABILITIES
-                        || !expectedNetwork.equals(cb.network)
-                        || (hasCap != ((NetworkCapabilities) cb.arg).hasCapability(cap))) {
-                    Log.i("NetworkCallbackTest#expectCapabilitiesCallback",
-                            "Ignoring non-matching callback : " + cb);
-                    continue;
-                }
-                // Found a match, return
-                return;
-            } while (System.currentTimeMillis() <= deadline);
-            fail("Didn't receive the expected callback to onCapabilitiesChanged(). Check the "
-                    + "log for a list of received callbacks, if any.");
-        }
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-
-        assumeTrue(isActiveNetworkMetered(true) || canChangeActiveNetworkMeteredness());
-
-        registerBroadcastReceiver();
-
-        removeRestrictBackgroundWhitelist(mUid);
-        removeRestrictBackgroundBlacklist(mUid);
-        assertRestrictBackgroundChangedReceived(0);
-
-        // Initial state
-        setBatterySaverMode(false);
-        setRestrictBackground(false);
-
-        // Make wifi a metered network.
-        mMeterednessConfiguration.configureNetworkMeteredness(true);
-
-        // Register callback
-        registerNetworkCallback((INetworkCallback.Stub) mTestNetworkCallback);
-        // Once the wifi is marked as metered, the wifi will reconnect. Wait for onAvailable()
-        // callback to ensure wifi is connected before the test and store the default network.
-        mNetwork = mTestNetworkCallback.expectAvailableCallbackAndGetNetwork();
-        // Check that the network is metered.
-        mTestNetworkCallback.expectCapabilitiesCallbackEventually(mNetwork,
-                false /* hasCapability */, NET_CAPABILITY_NOT_METERED);
-        mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, false);
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        super.tearDown();
-
-        setRestrictBackground(false);
-        setBatterySaverMode(false);
-        unregisterNetworkCallback();
-    }
-
-    @RequiredProperties({DATA_SAVER_MODE})
-    @Test
-    public void testOnBlockedStatusChanged_dataSaver() throws Exception {
-        try {
-            // Enable restrict background
-            setRestrictBackground(true);
-            assertBackgroundNetworkAccess(false);
-            mTestNetworkCallback.expectBlockedStatusCallbackEventually(mNetwork, true);
-
-            // Add to whitelist
-            addRestrictBackgroundWhitelist(mUid);
-            assertBackgroundNetworkAccess(true);
-            mTestNetworkCallback.expectBlockedStatusCallbackEventually(mNetwork, false);
-
-            // Remove from whitelist
-            removeRestrictBackgroundWhitelist(mUid);
-            assertBackgroundNetworkAccess(false);
-            mTestNetworkCallback.expectBlockedStatusCallbackEventually(mNetwork, true);
-        } finally {
-            mMeterednessConfiguration.resetNetworkMeteredness();
-        }
-
-        // Set to non-metered network
-        mMeterednessConfiguration.configureNetworkMeteredness(false);
-        mTestNetworkCallback.expectCapabilitiesCallbackEventually(mNetwork,
-                true /* hasCapability */, NET_CAPABILITY_NOT_METERED);
-        try {
-            assertBackgroundNetworkAccess(true);
-            mTestNetworkCallback.expectBlockedStatusCallbackEventually(mNetwork, false);
-
-            // Disable restrict background, should not trigger callback
-            setRestrictBackground(false);
-            assertBackgroundNetworkAccess(true);
-        } finally {
-            mMeterednessConfiguration.resetNetworkMeteredness();
-        }
-    }
-
-    @RequiredProperties({BATTERY_SAVER_MODE})
-    @Test
-    public void testOnBlockedStatusChanged_powerSaver() throws Exception {
-        try {
-            // Enable Power Saver
-            setBatterySaverMode(true);
-            assertBackgroundNetworkAccess(false);
-            mTestNetworkCallback.expectBlockedStatusCallbackEventually(mNetwork, true);
-
-            // Disable Power Saver
-            setBatterySaverMode(false);
-            assertBackgroundNetworkAccess(true);
-            mTestNetworkCallback.expectBlockedStatusCallbackEventually(mNetwork, false);
-        } finally {
-            mMeterednessConfiguration.resetNetworkMeteredness();
-        }
-
-        // Set to non-metered network
-        mMeterednessConfiguration.configureNetworkMeteredness(false);
-        mTestNetworkCallback.expectCapabilitiesCallbackEventually(mNetwork,
-                true /* hasCapability */, NET_CAPABILITY_NOT_METERED);
-        try {
-            // Enable Power Saver
-            setBatterySaverMode(true);
-            assertBackgroundNetworkAccess(false);
-            mTestNetworkCallback.expectBlockedStatusCallbackEventually(mNetwork, true);
-
-            // Disable Power Saver
-            setBatterySaverMode(false);
-            assertBackgroundNetworkAccess(true);
-            mTestNetworkCallback.expectBlockedStatusCallbackEventually(mNetwork, false);
-        } finally {
-            mMeterednessConfiguration.resetNetworkMeteredness();
-        }
-    }
-
-    // TODO: 1. test against VPN lockdown.
-    //       2. test against multiple networks.
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/NetworkPolicyTestRunner.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/NetworkPolicyTestRunner.java
deleted file mode 100644
index f340907..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/NetworkPolicyTestRunner.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.net.hostside;
-
-import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner;
-
-import org.junit.rules.RunRules;
-import org.junit.rules.TestRule;
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.InitializationError;
-import org.junit.runners.model.Statement;
-
-import java.util.List;
-
-/**
- * Custom runner to allow dumping logs after a test failure before the @After methods get to run.
- */
-public class NetworkPolicyTestRunner extends AndroidJUnit4ClassRunner {
-    private TestRule mDumpOnFailureRule = new DumpOnFailureRule();
-
-    public NetworkPolicyTestRunner(Class<?> klass) throws InitializationError {
-        super(klass);
-    }
-
-    @Override
-    public Statement methodInvoker(FrameworkMethod method, Object test) {
-        return new RunRules(super.methodInvoker(method, test), List.of(mDumpOnFailureRule),
-                describeChild(method));
-    }
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/NetworkPolicyTestUtils.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/NetworkPolicyTestUtils.java
deleted file mode 100644
index 3807d79..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/NetworkPolicyTestUtils.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.net.hostside;
-
-import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED;
-import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED;
-import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_WHITELISTED;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
-import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
-
-import static com.android.compatibility.common.util.SystemUtil.runShellCommand;
-import static com.android.cts.net.hostside.AbstractRestrictBackgroundNetworkTestCase.TAG;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import android.app.ActivityManager;
-import android.app.Instrumentation;
-import android.content.Context;
-import android.location.LocationManager;
-import android.net.ConnectivityManager;
-import android.net.ConnectivityManager.NetworkCallback;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.wifi.WifiManager;
-import android.os.Process;
-import android.text.TextUtils;
-import android.util.Log;
-import android.util.Pair;
-
-import com.android.compatibility.common.util.AppStandbyUtils;
-import com.android.compatibility.common.util.BatteryUtils;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import androidx.test.platform.app.InstrumentationRegistry;
-
-public class NetworkPolicyTestUtils {
-
-    private static final int TIMEOUT_CHANGE_METEREDNESS_MS = 5000;
-
-    private static ConnectivityManager mCm;
-    private static WifiManager mWm;
-
-    private static Boolean mBatterySaverSupported;
-    private static Boolean mDataSaverSupported;
-    private static Boolean mDozeModeSupported;
-    private static Boolean mAppStandbySupported;
-
-    private NetworkPolicyTestUtils() {}
-
-    public static boolean isBatterySaverSupported() {
-        if (mBatterySaverSupported == null) {
-            mBatterySaverSupported = BatteryUtils.isBatterySaverSupported();
-        }
-        return mBatterySaverSupported;
-    }
-
-    /**
-     * As per CDD requirements, if the device doesn't support data saver mode then
-     * ConnectivityManager.getRestrictBackgroundStatus() will always return
-     * RESTRICT_BACKGROUND_STATUS_DISABLED. So, enable the data saver mode and check if
-     * ConnectivityManager.getRestrictBackgroundStatus() for an app in background returns
-     * RESTRICT_BACKGROUND_STATUS_DISABLED or not.
-     */
-    public static boolean isDataSaverSupported() {
-        if (mDataSaverSupported == null) {
-            assertMyRestrictBackgroundStatus(RESTRICT_BACKGROUND_STATUS_DISABLED);
-            try {
-                setRestrictBackground(true);
-                mDataSaverSupported = !isMyRestrictBackgroundStatus(
-                        RESTRICT_BACKGROUND_STATUS_DISABLED);
-            } finally {
-                setRestrictBackground(false);
-            }
-        }
-        return mDataSaverSupported;
-    }
-
-    public static boolean isDozeModeSupported() {
-        if (mDozeModeSupported == null) {
-            final String result = executeShellCommand("cmd deviceidle enabled deep");
-            mDozeModeSupported = result.equals("1");
-        }
-        return mDozeModeSupported;
-    }
-
-    public static boolean isAppStandbySupported() {
-        if (mAppStandbySupported == null) {
-            mAppStandbySupported = AppStandbyUtils.isAppStandbyEnabled();
-        }
-        return mAppStandbySupported;
-    }
-
-    public static boolean isLowRamDevice() {
-        final ActivityManager am = (ActivityManager) getContext().getSystemService(
-                Context.ACTIVITY_SERVICE);
-        return am.isLowRamDevice();
-    }
-
-    public static boolean isLocationEnabled() {
-        final LocationManager lm = (LocationManager) getContext().getSystemService(
-                Context.LOCATION_SERVICE);
-        return lm.isLocationEnabled();
-    }
-
-    public static void setLocationEnabled(boolean enabled) {
-        final LocationManager lm = (LocationManager) getContext().getSystemService(
-                Context.LOCATION_SERVICE);
-        lm.setLocationEnabledForUser(enabled, Process.myUserHandle());
-        assertEquals("Couldn't change location enabled state", lm.isLocationEnabled(), enabled);
-        Log.d(TAG, "Changed location enabled state to " + enabled);
-    }
-
-    public static boolean isActiveNetworkMetered(boolean metered) {
-        return getConnectivityManager().isActiveNetworkMetered() == metered;
-    }
-
-    public static boolean canChangeActiveNetworkMeteredness() {
-        final Network activeNetwork = getConnectivityManager().getActiveNetwork();
-        final NetworkCapabilities networkCapabilities
-                = getConnectivityManager().getNetworkCapabilities(activeNetwork);
-        return networkCapabilities.hasTransport(TRANSPORT_WIFI);
-    }
-
-    public static Pair<String, Boolean> setupMeteredNetwork(boolean metered) throws Exception {
-        if (isActiveNetworkMetered(metered)) {
-            return null;
-        }
-        final boolean isLocationEnabled = isLocationEnabled();
-        try {
-            if (!isLocationEnabled) {
-                setLocationEnabled(true);
-            }
-            final String ssid = unquoteSSID(getWifiManager().getConnectionInfo().getSSID());
-            assertNotEquals(WifiManager.UNKNOWN_SSID, ssid);
-            setWifiMeteredStatus(ssid, metered);
-            return Pair.create(ssid, !metered);
-        } finally {
-            // Reset the location enabled state
-            if (!isLocationEnabled) {
-                setLocationEnabled(false);
-            }
-        }
-    }
-
-    public static void resetMeteredNetwork(String ssid, boolean metered) throws Exception {
-        setWifiMeteredStatus(ssid, metered);
-    }
-
-    public static void setWifiMeteredStatus(String ssid, boolean metered) throws Exception {
-        assertFalse("SSID should not be empty", TextUtils.isEmpty(ssid));
-        final String cmd = "cmd netpolicy set metered-network " + ssid + " " + metered;
-        executeShellCommand(cmd);
-        assertWifiMeteredStatus(ssid, metered);
-        assertActiveNetworkMetered(metered);
-    }
-
-    public static void assertWifiMeteredStatus(String ssid, boolean expectedMeteredStatus) {
-        final String result = executeShellCommand("cmd netpolicy list wifi-networks");
-        final String expectedLine = ssid + ";" + expectedMeteredStatus;
-        assertTrue("Expected line: " + expectedLine + "; Actual result: " + result,
-                result.contains(expectedLine));
-    }
-
-    // Copied from cts/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java
-    public static void assertActiveNetworkMetered(boolean expectedMeteredStatus) throws Exception {
-        final CountDownLatch latch = new CountDownLatch(1);
-        final NetworkCallback networkCallback = new NetworkCallback() {
-            @Override
-            public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) {
-                final boolean metered = !nc.hasCapability(NET_CAPABILITY_NOT_METERED);
-                if (metered == expectedMeteredStatus) {
-                    latch.countDown();
-                }
-            }
-        };
-        // Registering a callback here guarantees onCapabilitiesChanged is called immediately
-        // with the current setting. Therefore, if the setting has already been changed,
-        // this method will return right away, and if not it will wait for the setting to change.
-        getConnectivityManager().registerDefaultNetworkCallback(networkCallback);
-        if (!latch.await(TIMEOUT_CHANGE_METEREDNESS_MS, TimeUnit.MILLISECONDS)) {
-            fail("Timed out waiting for active network metered status to change to "
-                    + expectedMeteredStatus + " ; network = "
-                    + getConnectivityManager().getActiveNetwork());
-        }
-        getConnectivityManager().unregisterNetworkCallback(networkCallback);
-    }
-
-    public static void setRestrictBackground(boolean enabled) {
-        executeShellCommand("cmd netpolicy set restrict-background " + enabled);
-        final String output = executeShellCommand("cmd netpolicy get restrict-background");
-        final String expectedSuffix = enabled ? "enabled" : "disabled";
-        assertTrue("output '" + output + "' should end with '" + expectedSuffix + "'",
-                output.endsWith(expectedSuffix));
-    }
-
-    public static boolean isMyRestrictBackgroundStatus(int expectedStatus) {
-        final int actualStatus = getConnectivityManager().getRestrictBackgroundStatus();
-        if (expectedStatus != actualStatus) {
-            Log.d(TAG, "MyRestrictBackgroundStatus: "
-                    + "Expected: " + restrictBackgroundValueToString(expectedStatus)
-                    + "; Actual: " + restrictBackgroundValueToString(actualStatus));
-            return false;
-        }
-        return true;
-    }
-
-    // Copied from cts/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java
-    private static String unquoteSSID(String ssid) {
-        // SSID is returned surrounded by quotes if it can be decoded as UTF-8.
-        // Otherwise it's guaranteed not to start with a quote.
-        if (ssid.charAt(0) == '"') {
-            return ssid.substring(1, ssid.length() - 1);
-        } else {
-            return ssid;
-        }
-    }
-
-    public static String restrictBackgroundValueToString(int status) {
-        switch (status) {
-            case RESTRICT_BACKGROUND_STATUS_DISABLED:
-                return "DISABLED";
-            case RESTRICT_BACKGROUND_STATUS_WHITELISTED:
-                return "WHITELISTED";
-            case RESTRICT_BACKGROUND_STATUS_ENABLED:
-                return "ENABLED";
-            default:
-                return "UNKNOWN_STATUS_" + status;
-        }
-    }
-
-    public static String executeShellCommand(String command) {
-        final String result = runShellCommand(command).trim();
-        Log.d(TAG, "Output of '" + command + "': '" + result + "'");
-        return result;
-    }
-
-    public static void assertMyRestrictBackgroundStatus(int expectedStatus) {
-        final int actualStatus = getConnectivityManager().getRestrictBackgroundStatus();
-        assertEquals(restrictBackgroundValueToString(expectedStatus),
-                restrictBackgroundValueToString(actualStatus));
-    }
-
-    public static ConnectivityManager getConnectivityManager() {
-        if (mCm == null) {
-            mCm = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
-        }
-        return mCm;
-    }
-
-    public static WifiManager getWifiManager() {
-        if (mWm == null) {
-            mWm = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE);
-        }
-        return mWm;
-    }
-
-    public static Context getContext() {
-        return getInstrumentation().getContext();
-    }
-
-    public static Instrumentation getInstrumentation() {
-        return InstrumentationRegistry.getInstrumentation();
-    }
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/PacketReflector.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/PacketReflector.java
deleted file mode 100644
index 124c2c3..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/PacketReflector.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.net.hostside;
-
-import static android.system.OsConstants.ICMP6_ECHO_REPLY;
-import static android.system.OsConstants.ICMP6_ECHO_REQUEST;
-import static android.system.OsConstants.ICMP_ECHO;
-import static android.system.OsConstants.ICMP_ECHOREPLY;
-
-import android.system.ErrnoException;
-import android.system.Os;
-import android.util.Log;
-
-import java.io.FileDescriptor;
-import java.io.IOException;
-
-public class PacketReflector extends Thread {
-
-    private static int IPV4_HEADER_LENGTH = 20;
-    private static int IPV6_HEADER_LENGTH = 40;
-
-    private static int IPV4_ADDR_OFFSET = 12;
-    private static int IPV6_ADDR_OFFSET = 8;
-    private static int IPV4_ADDR_LENGTH = 4;
-    private static int IPV6_ADDR_LENGTH = 16;
-
-    private static int IPV4_PROTO_OFFSET = 9;
-    private static int IPV6_PROTO_OFFSET = 6;
-
-    private static final byte IPPROTO_ICMP = 1;
-    private static final byte IPPROTO_TCP = 6;
-    private static final byte IPPROTO_UDP = 17;
-    private static final byte IPPROTO_ICMPV6 = 58;
-
-    private static int ICMP_HEADER_LENGTH = 8;
-    private static int TCP_HEADER_LENGTH = 20;
-    private static int UDP_HEADER_LENGTH = 8;
-
-    private static final byte ICMP_ECHO = 8;
-    private static final byte ICMP_ECHOREPLY = 0;
-
-    private static String TAG = "PacketReflector";
-
-    private FileDescriptor mFd;
-    private byte[] mBuf;
-
-    public PacketReflector(FileDescriptor fd, int mtu) {
-        super("PacketReflector");
-        mFd = fd;
-        mBuf = new byte[mtu];
-    }
-
-    private static void swapBytes(byte[] buf, int pos1, int pos2, int len) {
-        for (int i = 0; i < len; i++) {
-            byte b = buf[pos1 + i];
-            buf[pos1 + i] = buf[pos2 + i];
-            buf[pos2 + i] = b;
-        }
-    }
-
-    private static void swapAddresses(byte[] buf, int version) {
-        int addrPos, addrLen;
-        switch(version) {
-            case 4:
-                addrPos = IPV4_ADDR_OFFSET;
-                addrLen = IPV4_ADDR_LENGTH;
-                break;
-            case 6:
-                addrPos = IPV6_ADDR_OFFSET;
-                addrLen = IPV6_ADDR_LENGTH;
-                break;
-            default:
-                throw new IllegalArgumentException();
-        }
-        swapBytes(buf, addrPos, addrPos + addrLen, addrLen);
-    }
-
-    // Reflect TCP packets: swap the source and destination addresses, but don't change the ports.
-    // This is used by the test to "connect to itself" through the VPN.
-    private void processTcpPacket(byte[] buf, int version, int len, int hdrLen) {
-        if (len < hdrLen + TCP_HEADER_LENGTH) {
-            return;
-        }
-
-        // Swap src and dst IP addresses.
-        swapAddresses(buf, version);
-
-        // Send the packet back.
-        writePacket(buf, len);
-    }
-
-    // Echo UDP packets: swap source and destination addresses, and source and destination ports.
-    // This is used by the test to check that the bytes it sends are echoed back.
-    private void processUdpPacket(byte[] buf, int version, int len, int hdrLen) {
-        if (len < hdrLen + UDP_HEADER_LENGTH) {
-            return;
-        }
-
-        // Swap src and dst IP addresses.
-        swapAddresses(buf, version);
-
-        // Swap dst and src ports.
-        int portOffset = hdrLen;
-        swapBytes(buf, portOffset, portOffset + 2, 2);
-
-        // Send the packet back.
-        writePacket(buf, len);
-    }
-
-    private void processIcmpPacket(byte[] buf, int version, int len, int hdrLen) {
-        if (len < hdrLen + ICMP_HEADER_LENGTH) {
-            return;
-        }
-
-        byte type = buf[hdrLen];
-        if (!(version == 4 && type == ICMP_ECHO) &&
-            !(version == 6 && type == (byte) ICMP6_ECHO_REQUEST)) {
-            return;
-        }
-
-        // Save the ping packet we received.
-        byte[] request = buf.clone();
-
-        // Swap src and dst IP addresses, and send the packet back.
-        // This effectively pings the device to see if it replies.
-        swapAddresses(buf, version);
-        writePacket(buf, len);
-
-        // The device should have replied, and buf should now contain a ping response.
-        int received = readPacket(buf);
-        if (received != len) {
-            Log.i(TAG, "Reflecting ping did not result in ping response: " +
-                       "read=" + received + " expected=" + len);
-            return;
-        }
-
-        byte replyType = buf[hdrLen];
-        if ((type == ICMP_ECHO && replyType != ICMP_ECHOREPLY)
-                || (type == (byte) ICMP6_ECHO_REQUEST && replyType != (byte) ICMP6_ECHO_REPLY)) {
-            Log.i(TAG, "Received unexpected ICMP reply: original " + type
-                    + ", reply " + replyType);
-            return;
-        }
-
-        // Compare the response we got with the original packet.
-        // The only thing that should have changed are addresses, type and checksum.
-        // Overwrite them with the received bytes and see if the packet is otherwise identical.
-        request[hdrLen] = buf[hdrLen];          // Type
-        request[hdrLen + 2] = buf[hdrLen + 2];  // Checksum byte 1.
-        request[hdrLen + 3] = buf[hdrLen + 3];  // Checksum byte 2.
-
-        // Since Linux kernel 4.2, net.ipv6.auto_flowlabels is set by default, and therefore
-        // the request and reply may have different IPv6 flow label: ignore that as well.
-        if (version == 6) {
-            request[1] = (byte)(request[1] & 0xf0 | buf[1] & 0x0f);
-            request[2] = buf[2];
-            request[3] = buf[3];
-        }
-
-        for (int i = 0; i < len; i++) {
-            if (buf[i] != request[i]) {
-                Log.i(TAG, "Received non-matching packet when expecting ping response.");
-                return;
-            }
-        }
-
-        // Now swap the addresses again and reflect the packet. This sends a ping reply.
-        swapAddresses(buf, version);
-        writePacket(buf, len);
-    }
-
-    private void writePacket(byte[] buf, int len) {
-        try {
-            Os.write(mFd, buf, 0, len);
-        } catch (ErrnoException|IOException e) {
-            Log.e(TAG, "Error writing packet: " + e.getMessage());
-        }
-    }
-
-    private int readPacket(byte[] buf) {
-        int len;
-        try {
-            len = Os.read(mFd, buf, 0, buf.length);
-        } catch (ErrnoException|IOException e) {
-            Log.e(TAG, "Error reading packet: " + e.getMessage());
-            len = -1;
-        }
-        return len;
-    }
-
-    // Reads one packet from our mFd, and possibly writes the packet back.
-    private void processPacket() {
-        int len = readPacket(mBuf);
-        if (len < 1) {
-            return;
-        }
-
-        int version = mBuf[0] >> 4;
-        int addrPos, protoPos, hdrLen, addrLen;
-        if (version == 4) {
-            hdrLen = IPV4_HEADER_LENGTH;
-            protoPos = IPV4_PROTO_OFFSET;
-            addrPos = IPV4_ADDR_OFFSET;
-            addrLen = IPV4_ADDR_LENGTH;
-        } else if (version == 6) {
-            hdrLen = IPV6_HEADER_LENGTH;
-            protoPos = IPV6_PROTO_OFFSET;
-            addrPos = IPV6_ADDR_OFFSET;
-            addrLen = IPV6_ADDR_LENGTH;
-        } else {
-            return;
-        }
-
-        if (len < hdrLen) {
-            return;
-        }
-
-        byte proto = mBuf[protoPos];
-        switch (proto) {
-            case IPPROTO_ICMP:
-            case IPPROTO_ICMPV6:
-                processIcmpPacket(mBuf, version, len, hdrLen);
-                break;
-            case IPPROTO_TCP:
-                processTcpPacket(mBuf, version, len, hdrLen);
-                break;
-            case IPPROTO_UDP:
-                processUdpPacket(mBuf, version, len, hdrLen);
-                break;
-        }
-    }
-
-    public void run() {
-        Log.i(TAG, "PacketReflector starting fd=" + mFd + " valid=" + mFd.valid());
-        while (!interrupted() && mFd.valid()) {
-            processPacket();
-        }
-        Log.i(TAG, "PacketReflector exiting fd=" + mFd + " valid=" + mFd.valid());
-    }
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/Property.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/Property.java
deleted file mode 100644
index 18805f9..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/Property.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.cts.net.hostside;
-
-import static com.android.cts.net.hostside.NetworkPolicyTestUtils.canChangeActiveNetworkMeteredness;
-import static com.android.cts.net.hostside.NetworkPolicyTestUtils.isActiveNetworkMetered;
-import static com.android.cts.net.hostside.NetworkPolicyTestUtils.isAppStandbySupported;
-import static com.android.cts.net.hostside.NetworkPolicyTestUtils.isBatterySaverSupported;
-import static com.android.cts.net.hostside.NetworkPolicyTestUtils.isDataSaverSupported;
-import static com.android.cts.net.hostside.NetworkPolicyTestUtils.isDozeModeSupported;
-import static com.android.cts.net.hostside.NetworkPolicyTestUtils.isLowRamDevice;
-
-public enum Property {
-    BATTERY_SAVER_MODE(1 << 0) {
-        public boolean isSupported() { return isBatterySaverSupported(); }
-    },
-
-    DATA_SAVER_MODE(1 << 1) {
-        public boolean isSupported() { return isDataSaverSupported(); }
-    },
-
-    NO_DATA_SAVER_MODE(~DATA_SAVER_MODE.getValue()) {
-        public boolean isSupported() { return !isDataSaverSupported(); }
-    },
-
-    DOZE_MODE(1 << 2) {
-        public boolean isSupported() { return isDozeModeSupported(); }
-    },
-
-    APP_STANDBY_MODE(1 << 3) {
-        public boolean isSupported() { return isAppStandbySupported(); }
-    },
-
-    NOT_LOW_RAM_DEVICE(1 << 4) {
-        public boolean isSupported() { return !isLowRamDevice(); }
-    },
-
-    METERED_NETWORK(1 << 5) {
-        public boolean isSupported() {
-            return isActiveNetworkMetered(true) || canChangeActiveNetworkMeteredness();
-        }
-    },
-
-    NON_METERED_NETWORK(~METERED_NETWORK.getValue()) {
-        public boolean isSupported() {
-            return isActiveNetworkMetered(false) || canChangeActiveNetworkMeteredness();
-        }
-    };
-
-    private int mValue;
-
-    Property(int value) { mValue = value; }
-
-    public int getValue() { return mValue; }
-
-    abstract boolean isSupported();
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/RemoteSocketFactoryClient.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/RemoteSocketFactoryClient.java
deleted file mode 100644
index 80f99b6..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/RemoteSocketFactoryClient.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.ConditionVariable;
-import android.os.IBinder;
-import android.os.ParcelFileDescriptor;
-import android.os.RemoteException;
-import android.system.ErrnoException;
-import android.system.Os;
-
-import com.android.cts.net.hostside.IRemoteSocketFactory;
-
-import java.io.FileDescriptor;
-import java.io.IOException;
-
-public class RemoteSocketFactoryClient {
-    private static final int TIMEOUT_MS = 5000;
-    private static final String PACKAGE = RemoteSocketFactoryClient.class.getPackage().getName();
-    private static final String APP2_PACKAGE = PACKAGE + ".app2";
-    private static final String SERVICE_NAME = APP2_PACKAGE + ".RemoteSocketFactoryService";
-
-    private Context mContext;
-    private ServiceConnection mServiceConnection;
-    private IRemoteSocketFactory mService;
-
-    public RemoteSocketFactoryClient(Context context) {
-        mContext = context;
-    }
-
-    public void bind() {
-        if (mService != null) {
-            throw new IllegalStateException("Already bound");
-        }
-
-        final ConditionVariable cv = new ConditionVariable();
-        mServiceConnection = new ServiceConnection() {
-            @Override
-            public void onServiceConnected(ComponentName name, IBinder service) {
-                mService = IRemoteSocketFactory.Stub.asInterface(service);
-                cv.open();
-            }
-            @Override
-            public void onServiceDisconnected(ComponentName name) {
-                mService = null;
-            }
-        };
-
-        final Intent intent = new Intent();
-        intent.setComponent(new ComponentName(APP2_PACKAGE, SERVICE_NAME));
-        mContext.bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
-        cv.block(TIMEOUT_MS);
-        if (mService == null) {
-            throw new IllegalStateException(
-                    "Could not bind to RemoteSocketFactory service after " + TIMEOUT_MS + "ms");
-        }
-    }
-
-    public void unbind() {
-        if (mService != null) {
-            mContext.unbindService(mServiceConnection);
-        }
-    }
-
-    public FileDescriptor openSocketFd(String host, int port, int timeoutMs)
-            throws RemoteException, ErrnoException, IOException {
-        // Dup the filedescriptor so ParcelFileDescriptor's finalizer doesn't garbage collect it
-        // and cause our fd to become invalid. http://b/35927643 .
-        ParcelFileDescriptor pfd = mService.openSocketFd(host, port, timeoutMs);
-        FileDescriptor fd = Os.dup(pfd.getFileDescriptor());
-        pfd.close();
-        return fd;
-    }
-
-    public String getPackageName() throws RemoteException {
-        return mService.getPackageName();
-    }
-
-    public int getUid() throws RemoteException {
-        return mService.getUid();
-    }
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/RequiredProperties.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/RequiredProperties.java
deleted file mode 100644
index 96838bb..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/RequiredProperties.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.cts.net.hostside;
-
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-@Retention(RUNTIME)
-@Target({METHOD, TYPE})
-@Inherited
-public @interface RequiredProperties {
-    Property[] value();
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/RequiredPropertiesRule.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/RequiredPropertiesRule.java
deleted file mode 100644
index 01f9f3e..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/RequiredPropertiesRule.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.cts.net.hostside;
-
-import static com.android.cts.net.hostside.AbstractRestrictBackgroundNetworkTestCase.TAG;
-
-import android.text.TextUtils;
-import android.util.ArraySet;
-import android.util.Log;
-
-import com.android.compatibility.common.util.BeforeAfterRule;
-
-import org.junit.Assume;
-import org.junit.runner.Description;
-import org.junit.runners.model.Statement;
-
-import java.util.ArrayList;
-import java.util.Collections;
-
-public class RequiredPropertiesRule extends BeforeAfterRule {
-
-    private static ArraySet<Property> mRequiredProperties;
-
-    @Override
-    public void onBefore(Statement base, Description description) {
-        mRequiredProperties = getAllRequiredProperties(description);
-
-        final String testName = description.getClassName() + "#" + description.getMethodName();
-        assertTestIsValid(testName, mRequiredProperties);
-        Log.i(TAG, "Running test " + testName + " with required properties: "
-                + propertiesToString(mRequiredProperties));
-    }
-
-    private ArraySet<Property> getAllRequiredProperties(Description description) {
-        final ArraySet<Property> allRequiredProperties = new ArraySet<>();
-        RequiredProperties requiredProperties = description.getAnnotation(RequiredProperties.class);
-        if (requiredProperties != null) {
-            Collections.addAll(allRequiredProperties, requiredProperties.value());
-        }
-
-        for (Class<?> clazz = description.getTestClass();
-                clazz != null; clazz = clazz.getSuperclass()) {
-            requiredProperties = clazz.getDeclaredAnnotation(RequiredProperties.class);
-            if (requiredProperties == null) {
-                continue;
-            }
-            for (Property requiredProperty : requiredProperties.value()) {
-                for (Property p : Property.values()) {
-                    if (p.getValue() == ~requiredProperty.getValue()
-                            && allRequiredProperties.contains(p)) {
-                        continue;
-                    }
-                }
-                allRequiredProperties.add(requiredProperty);
-            }
-        }
-        return allRequiredProperties;
-    }
-
-    private void assertTestIsValid(String testName, ArraySet<Property> requiredProperies) {
-        if (requiredProperies == null) {
-            return;
-        }
-        final ArrayList<Property> unsupportedProperties = new ArrayList<>();
-        for (Property property : requiredProperies) {
-            if (!property.isSupported()) {
-                unsupportedProperties.add(property);
-            }
-        }
-        Assume.assumeTrue("Unsupported properties: "
-                + propertiesToString(unsupportedProperties), unsupportedProperties.isEmpty());
-    }
-
-    public static ArraySet<Property> getRequiredProperties() {
-        return mRequiredProperties;
-    }
-
-    private static String propertiesToString(Iterable<Property> properties) {
-        return "[" + TextUtils.join(",", properties) + "]";
-    }
-}
diff --git a/hostsidetests/net/app/src/com/android/cts/net/hostside/VpnTest.java b/hostsidetests/net/app/src/com/android/cts/net/hostside/VpnTest.java
deleted file mode 100755
index a451ea8..0000000
--- a/hostsidetests/net/app/src/com/android/cts/net/hostside/VpnTest.java
+++ /dev/null
@@ -1,1090 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.net.hostside;
-
-import static android.os.Process.INVALID_UID;
-import static android.system.OsConstants.*;
-
-import android.annotation.Nullable;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.net.ConnectivityManager;
-import android.net.ConnectivityManager.NetworkCallback;
-import android.net.LinkProperties;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.NetworkRequest;
-import android.net.Proxy;
-import android.net.ProxyInfo;
-import android.net.VpnService;
-import android.net.wifi.WifiManager;
-import android.provider.Settings;
-import android.os.ParcelFileDescriptor;
-import android.os.Process;
-import android.os.SystemProperties;
-import android.support.test.uiautomator.UiDevice;
-import android.support.test.uiautomator.UiObject;
-import android.support.test.uiautomator.UiSelector;
-import android.system.ErrnoException;
-import android.system.Os;
-import android.system.OsConstants;
-import android.system.StructPollfd;
-import android.test.InstrumentationTestCase;
-import android.test.MoreAsserts;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.compatibility.common.util.BlockingBroadcastReceiver;
-
-import java.io.Closeable;
-import java.io.FileDescriptor;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.DatagramPacket;
-import java.net.DatagramSocket;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.net.SocketException;
-import java.net.UnknownHostException;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Objects;
-import java.util.Random;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Tests for the VpnService API.
- *
- * These tests establish a VPN via the VpnService API, and have the service reflect the packets back
- * to the device without causing any network traffic. This allows testing the local VPN data path
- * without a network connection or a VPN server.
- *
- * Note: in Lollipop, VPN functionality relies on kernel support for UID-based routing. If these
- * tests fail, it may be due to the lack of kernel support. The necessary patches can be
- * cherry-picked from the Android common kernel trees:
- *
- * android-3.10:
- *   https://android-review.googlesource.com/#/c/99220/
- *   https://android-review.googlesource.com/#/c/100545/
- *
- * android-3.4:
- *   https://android-review.googlesource.com/#/c/99225/
- *   https://android-review.googlesource.com/#/c/100557/
- *
- * To ensure that the kernel has the required commits, run the kernel unit
- * tests described at:
- *
- *   https://source.android.com/devices/tech/config/kernel_network_tests.html
- *
- */
-public class VpnTest extends InstrumentationTestCase {
-
-    // These are neither public nor @TestApi.
-    // TODO: add them to @TestApi.
-    private static final String PRIVATE_DNS_MODE_SETTING = "private_dns_mode";
-    private static final String PRIVATE_DNS_MODE_PROVIDER_HOSTNAME = "hostname";
-    private static final String PRIVATE_DNS_MODE_OPPORTUNISTIC = "opportunistic";
-    private static final String PRIVATE_DNS_SPECIFIER_SETTING = "private_dns_specifier";
-
-    public static String TAG = "VpnTest";
-    public static int TIMEOUT_MS = 3 * 1000;
-    public static int SOCKET_TIMEOUT_MS = 100;
-    public static String TEST_HOST = "connectivitycheck.gstatic.com";
-
-    private UiDevice mDevice;
-    private MyActivity mActivity;
-    private String mPackageName;
-    private ConnectivityManager mCM;
-    private WifiManager mWifiManager;
-    private RemoteSocketFactoryClient mRemoteSocketFactoryClient;
-
-    Network mNetwork;
-    NetworkCallback mCallback;
-    final Object mLock = new Object();
-    final Object mLockShutdown = new Object();
-
-    private String mOldPrivateDnsMode;
-    private String mOldPrivateDnsSpecifier;
-
-    private boolean supportedHardware() {
-        final PackageManager pm = getInstrumentation().getContext().getPackageManager();
-        return !pm.hasSystemFeature("android.hardware.type.watch");
-    }
-
-    @Override
-    public void setUp() throws Exception {
-        super.setUp();
-
-        mNetwork = null;
-        mCallback = null;
-        storePrivateDnsSetting();
-
-        mDevice = UiDevice.getInstance(getInstrumentation());
-        mActivity = launchActivity(getInstrumentation().getTargetContext().getPackageName(),
-                MyActivity.class, null);
-        mPackageName = mActivity.getPackageName();
-        mCM = (ConnectivityManager) mActivity.getSystemService(Context.CONNECTIVITY_SERVICE);
-        mWifiManager = (WifiManager) mActivity.getSystemService(Context.WIFI_SERVICE);
-        mRemoteSocketFactoryClient = new RemoteSocketFactoryClient(mActivity);
-        mRemoteSocketFactoryClient.bind();
-        mDevice.waitForIdle();
-    }
-
-    @Override
-    public void tearDown() throws Exception {
-        restorePrivateDnsSetting();
-        mRemoteSocketFactoryClient.unbind();
-        if (mCallback != null) {
-            mCM.unregisterNetworkCallback(mCallback);
-        }
-        Log.i(TAG, "Stopping VPN");
-        stopVpn();
-        mActivity.finish();
-        super.tearDown();
-    }
-
-    private void prepareVpn() throws Exception {
-        final int REQUEST_ID = 42;
-
-        // Attempt to prepare.
-        Log.i(TAG, "Preparing VPN");
-        Intent intent = VpnService.prepare(mActivity);
-
-        if (intent != null) {
-            // Start the confirmation dialog and click OK.
-            mActivity.startActivityForResult(intent, REQUEST_ID);
-            mDevice.waitForIdle();
-
-            String packageName = intent.getComponent().getPackageName();
-            String resourceIdRegex = "android:id/button1$|button_start_vpn";
-            final UiObject okButton = new UiObject(new UiSelector()
-                    .className("android.widget.Button")
-                    .packageName(packageName)
-                    .resourceIdMatches(resourceIdRegex));
-            if (okButton.waitForExists(TIMEOUT_MS) == false) {
-                mActivity.finishActivity(REQUEST_ID);
-                fail("VpnService.prepare returned an Intent for '" + intent.getComponent() + "' " +
-                     "to display the VPN confirmation dialog, but this test could not find the " +
-                     "button to allow the VPN application to connect. Please ensure that the "  +
-                     "component displays a button with a resource ID matching the regexp: '" +
-                     resourceIdRegex + "'.");
-            }
-
-            // Click the button and wait for RESULT_OK.
-            okButton.click();
-            try {
-                int result = mActivity.getResult(TIMEOUT_MS);
-                if (result != MyActivity.RESULT_OK) {
-                    fail("The VPN confirmation dialog did not return RESULT_OK when clicking on " +
-                         "the button matching the regular expression '" + resourceIdRegex +
-                         "' of " + intent.getComponent() + "'. Please ensure that clicking on " +
-                         "that button allows the VPN application to connect. " +
-                         "Return value: " + result);
-                }
-            } catch (InterruptedException e) {
-                fail("VPN confirmation dialog did not return after " + TIMEOUT_MS + "ms");
-            }
-
-            // Now we should be prepared.
-            intent = VpnService.prepare(mActivity);
-            if (intent != null) {
-                fail("VpnService.prepare returned non-null even after the VPN dialog " +
-                     intent.getComponent() + "returned RESULT_OK.");
-            }
-        }
-    }
-
-    // TODO: Consider replacing arguments with a Builder.
-    private void startVpn(
-        String[] addresses, String[] routes, String allowedApplications,
-        String disallowedApplications, @Nullable ProxyInfo proxyInfo,
-        @Nullable ArrayList<Network> underlyingNetworks, boolean isAlwaysMetered) throws Exception {
-        prepareVpn();
-
-        // Register a callback so we will be notified when our VPN comes up.
-        final NetworkRequest request = new NetworkRequest.Builder()
-                .addTransportType(NetworkCapabilities.TRANSPORT_VPN)
-                .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
-                .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
-                .build();
-        mCallback = new NetworkCallback() {
-            public void onAvailable(Network network) {
-                synchronized (mLock) {
-                    Log.i(TAG, "Got available callback for network=" + network);
-                    mNetwork = network;
-                    mLock.notify();
-                }
-            }
-        };
-        mCM.registerNetworkCallback(request, mCallback);  // Unregistered in tearDown.
-
-        // Start the service and wait up for TIMEOUT_MS ms for the VPN to come up.
-        Intent intent = new Intent(mActivity, MyVpnService.class)
-                .putExtra(mPackageName + ".cmd", "connect")
-                .putExtra(mPackageName + ".addresses", TextUtils.join(",", addresses))
-                .putExtra(mPackageName + ".routes", TextUtils.join(",", routes))
-                .putExtra(mPackageName + ".allowedapplications", allowedApplications)
-                .putExtra(mPackageName + ".disallowedapplications", disallowedApplications)
-                .putExtra(mPackageName + ".httpProxy", proxyInfo)
-                .putParcelableArrayListExtra(
-                    mPackageName + ".underlyingNetworks", underlyingNetworks)
-                .putExtra(mPackageName + ".isAlwaysMetered", isAlwaysMetered);
-
-        mActivity.startService(intent);
-        synchronized (mLock) {
-            if (mNetwork == null) {
-                 Log.i(TAG, "bf mLock");
-                 mLock.wait(TIMEOUT_MS);
-                 Log.i(TAG, "af mLock");
-            }
-        }
-
-        if (mNetwork == null) {
-            fail("VPN did not become available after " + TIMEOUT_MS + "ms");
-        }
-
-        // Unfortunately, when the available callback fires, the VPN UID ranges are not yet
-        // configured. Give the system some time to do so. http://b/18436087 .
-        try { Thread.sleep(3000); } catch(InterruptedException e) {}
-    }
-
-    private void stopVpn() {
-        // Register a callback so we will be notified when our VPN comes up.
-        final NetworkRequest request = new NetworkRequest.Builder()
-                .addTransportType(NetworkCapabilities.TRANSPORT_VPN)
-                .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
-                .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
-                .build();
-        mCallback = new NetworkCallback() {
-            public void onLost(Network network) {
-                synchronized (mLockShutdown) {
-                    Log.i(TAG, "Got lost callback for network=" + network
-                            + ",mNetwork = " + mNetwork);
-                    if( mNetwork == network){
-                        mLockShutdown.notify();
-                    }
-                }
-            }
-       };
-        mCM.registerNetworkCallback(request, mCallback);  // Unregistered in tearDown.
-        // Simply calling mActivity.stopService() won't stop the service, because the system binds
-        // to the service for the purpose of sending it a revoke command if another VPN comes up,
-        // and stopping a bound service has no effect. Instead, "start" the service again with an
-        // Intent that tells it to disconnect.
-        Intent intent = new Intent(mActivity, MyVpnService.class)
-                .putExtra(mPackageName + ".cmd", "disconnect");
-        mActivity.startService(intent);
-        synchronized (mLockShutdown) {
-            try {
-                 Log.i(TAG, "bf mLockShutdown");
-                 mLockShutdown.wait(TIMEOUT_MS);
-                 Log.i(TAG, "af mLockShutdown");
-            } catch(InterruptedException e) {}
-        }
-    }
-
-    private static void closeQuietly(Closeable c) {
-        if (c != null) {
-            try {
-                c.close();
-            } catch (IOException e) {
-            }
-        }
-    }
-
-    private static void checkPing(String to) throws IOException, ErrnoException {
-        InetAddress address = InetAddress.getByName(to);
-        FileDescriptor s;
-        final int LENGTH = 64;
-        byte[] packet = new byte[LENGTH];
-        byte[] header;
-
-        // Construct a ping packet.
-        Random random = new Random();
-        random.nextBytes(packet);
-        if (address instanceof Inet6Address) {
-            s = Os.socket(AF_INET6, SOCK_DGRAM, IPPROTO_ICMPV6);
-            header = new byte[] { (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00 };
-        } else {
-            // Note that this doesn't actually work due to http://b/18558481 .
-            s = Os.socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP);
-            header = new byte[] { (byte) 0x08, (byte) 0x00, (byte) 0x00, (byte) 0x00 };
-        }
-        System.arraycopy(header, 0, packet, 0, header.length);
-
-        // Send the packet.
-        int port = random.nextInt(65534) + 1;
-        Os.connect(s, address, port);
-        Os.write(s, packet, 0, packet.length);
-
-        // Expect a reply.
-        StructPollfd pollfd = new StructPollfd();
-        pollfd.events = (short) POLLIN;  // "error: possible loss of precision"
-        pollfd.fd = s;
-        int ret = Os.poll(new StructPollfd[] { pollfd }, SOCKET_TIMEOUT_MS);
-        assertEquals("Expected reply after sending ping", 1, ret);
-
-        byte[] reply = new byte[LENGTH];
-        int read = Os.read(s, reply, 0, LENGTH);
-        assertEquals(LENGTH, read);
-
-        // Find out what the kernel set the ICMP ID to.
-        InetSocketAddress local = (InetSocketAddress) Os.getsockname(s);
-        port = local.getPort();
-        packet[4] = (byte) ((port >> 8) & 0xff);
-        packet[5] = (byte) (port & 0xff);
-
-        // Check the contents.
-        if (packet[0] == (byte) 0x80) {
-            packet[0] = (byte) 0x81;
-        } else {
-            packet[0] = 0;
-        }
-        // Zero out the checksum in the reply so it matches the uninitialized checksum in packet.
-        reply[2] = reply[3] = 0;
-        MoreAsserts.assertEquals(packet, reply);
-    }
-
-    // Writes data to out and checks that it appears identically on in.
-    private static void writeAndCheckData(
-            OutputStream out, InputStream in, byte[] data) throws IOException {
-        out.write(data, 0, data.length);
-        out.flush();
-
-        byte[] read = new byte[data.length];
-        int bytesRead = 0, totalRead = 0;
-        do {
-            bytesRead = in.read(read, totalRead, read.length - totalRead);
-            totalRead += bytesRead;
-        } while (bytesRead >= 0 && totalRead < data.length);
-        assertEquals(totalRead, data.length);
-        MoreAsserts.assertEquals(data, read);
-    }
-
-    private void checkTcpReflection(String to, String expectedFrom) throws IOException {
-        // Exercise TCP over the VPN by "connecting to ourselves". We open a server socket and a
-        // client socket, and connect the client socket to a remote host, with the port of the
-        // server socket. The PacketReflector reflects the packets, changing the source addresses
-        // but not the ports, so our client socket is connected to our server socket, though both
-        // sockets think their peers are on the "remote" IP address.
-
-        // Open a listening socket.
-        ServerSocket listen = new ServerSocket(0, 10, InetAddress.getByName("::"));
-
-        // Connect the client socket to it.
-        InetAddress toAddr = InetAddress.getByName(to);
-        Socket client = new Socket();
-        try {
-            client.connect(new InetSocketAddress(toAddr, listen.getLocalPort()), SOCKET_TIMEOUT_MS);
-            if (expectedFrom == null) {
-                closeQuietly(listen);
-                closeQuietly(client);
-                fail("Expected connection to fail, but it succeeded.");
-            }
-        } catch (IOException e) {
-            if (expectedFrom != null) {
-                closeQuietly(listen);
-                fail("Expected connection to succeed, but it failed.");
-            } else {
-                // We expected the connection to fail, and it did, so there's nothing more to test.
-                return;
-            }
-        }
-
-        // The connection succeeded, and we expected it to succeed. Send some data; if things are
-        // working, the data will be sent to the VPN, reflected by the PacketReflector, and arrive
-        // at our server socket. For good measure, send some data in the other direction.
-        Socket server = null;
-        try {
-            // Accept the connection on the server side.
-            listen.setSoTimeout(SOCKET_TIMEOUT_MS);
-            server = listen.accept();
-            checkConnectionOwnerUidTcp(client);
-            checkConnectionOwnerUidTcp(server);
-            // Check that the source and peer addresses are as expected.
-            assertEquals(expectedFrom, client.getLocalAddress().getHostAddress());
-            assertEquals(expectedFrom, server.getLocalAddress().getHostAddress());
-            assertEquals(
-                    new InetSocketAddress(toAddr, client.getLocalPort()),
-                    server.getRemoteSocketAddress());
-            assertEquals(
-                    new InetSocketAddress(toAddr, server.getLocalPort()),
-                    client.getRemoteSocketAddress());
-
-            // Now write some data.
-            final int LENGTH = 32768;
-            byte[] data = new byte[LENGTH];
-            new Random().nextBytes(data);
-
-            // Make sure our writes don't block or time out, because we're single-threaded and can't
-            // read and write at the same time.
-            server.setReceiveBufferSize(LENGTH * 2);
-            client.setSendBufferSize(LENGTH * 2);
-            client.setSoTimeout(SOCKET_TIMEOUT_MS);
-            server.setSoTimeout(SOCKET_TIMEOUT_MS);
-
-            // Send some data from client to server, then from server to client.
-            writeAndCheckData(client.getOutputStream(), server.getInputStream(), data);
-            writeAndCheckData(server.getOutputStream(), client.getInputStream(), data);
-        } finally {
-            closeQuietly(listen);
-            closeQuietly(client);
-            closeQuietly(server);
-        }
-    }
-
-    private void checkConnectionOwnerUidUdp(DatagramSocket s, boolean expectSuccess) {
-        final int expectedUid = expectSuccess ? Process.myUid() : INVALID_UID;
-        InetSocketAddress loc = new InetSocketAddress(s.getLocalAddress(), s.getLocalPort());
-        InetSocketAddress rem = new InetSocketAddress(s.getInetAddress(), s.getPort());
-        int uid = mCM.getConnectionOwnerUid(OsConstants.IPPROTO_UDP, loc, rem);
-        assertEquals(expectedUid, uid);
-    }
-
-    private void checkConnectionOwnerUidTcp(Socket s) {
-        final int expectedUid = Process.myUid();
-        InetSocketAddress loc = new InetSocketAddress(s.getLocalAddress(), s.getLocalPort());
-        InetSocketAddress rem = new InetSocketAddress(s.getInetAddress(), s.getPort());
-        int uid = mCM.getConnectionOwnerUid(OsConstants.IPPROTO_TCP, loc, rem);
-        assertEquals(expectedUid, uid);
-    }
-
-    private void checkUdpEcho(String to, String expectedFrom) throws IOException {
-        DatagramSocket s;
-        InetAddress address = InetAddress.getByName(to);
-        if (address instanceof Inet6Address) {  // http://b/18094870
-            s = new DatagramSocket(0, InetAddress.getByName("::"));
-        } else {
-            s = new DatagramSocket();
-        }
-        s.setSoTimeout(SOCKET_TIMEOUT_MS);
-
-        Random random = new Random();
-        byte[] data = new byte[random.nextInt(1650)];
-        random.nextBytes(data);
-        DatagramPacket p = new DatagramPacket(data, data.length);
-        s.connect(address, 7);
-
-        if (expectedFrom != null) {
-            assertEquals("Unexpected source address: ",
-                         expectedFrom, s.getLocalAddress().getHostAddress());
-        }
-
-        try {
-            if (expectedFrom != null) {
-                s.send(p);
-                checkConnectionOwnerUidUdp(s, true);
-                s.receive(p);
-                MoreAsserts.assertEquals(data, p.getData());
-            } else {
-                try {
-                    s.send(p);
-                    s.receive(p);
-                    fail("Received unexpected reply");
-                } catch (IOException expected) {
-                    checkConnectionOwnerUidUdp(s, false);
-                }
-            }
-        } finally {
-            s.close();
-        }
-    }
-
-    private void checkTrafficOnVpn() throws Exception {
-        checkUdpEcho("192.0.2.251", "192.0.2.2");
-        checkUdpEcho("2001:db8:dead:beef::f00", "2001:db8:1:2::ffe");
-        checkPing("2001:db8:dead:beef::f00");
-        checkTcpReflection("192.0.2.252", "192.0.2.2");
-        checkTcpReflection("2001:db8:dead:beef::f00", "2001:db8:1:2::ffe");
-    }
-
-    private void checkNoTrafficOnVpn() throws Exception {
-        checkUdpEcho("192.0.2.251", null);
-        checkUdpEcho("2001:db8:dead:beef::f00", null);
-        checkTcpReflection("192.0.2.252", null);
-        checkTcpReflection("2001:db8:dead:beef::f00", null);
-    }
-
-    private FileDescriptor openSocketFd(String host, int port, int timeoutMs) throws Exception {
-        Socket s = new Socket(host, port);
-        s.setSoTimeout(timeoutMs);
-        // Dup the filedescriptor so ParcelFileDescriptor's finalizer doesn't garbage collect it
-        // and cause our fd to become invalid. http://b/35927643 .
-        FileDescriptor fd = Os.dup(ParcelFileDescriptor.fromSocket(s).getFileDescriptor());
-        s.close();
-        return fd;
-    }
-
-    private FileDescriptor openSocketFdInOtherApp(
-            String host, int port, int timeoutMs) throws Exception {
-        Log.d(TAG, String.format("Creating test socket in UID=%d, my UID=%d",
-                mRemoteSocketFactoryClient.getUid(), Os.getuid()));
-        FileDescriptor fd = mRemoteSocketFactoryClient.openSocketFd(host, port, TIMEOUT_MS);
-        return fd;
-    }
-
-    private void sendRequest(FileDescriptor fd, String host) throws Exception {
-        String request = "GET /generate_204 HTTP/1.1\r\n" +
-                "Host: " + host + "\r\n" +
-                "Connection: keep-alive\r\n\r\n";
-        byte[] requestBytes = request.getBytes(StandardCharsets.UTF_8);
-        int ret = Os.write(fd, requestBytes, 0, requestBytes.length);
-        Log.d(TAG, "Wrote " + ret + "bytes");
-
-        String expected = "HTTP/1.1 204 No Content\r\n";
-        byte[] response = new byte[expected.length()];
-        Os.read(fd, response, 0, response.length);
-
-        String actual = new String(response, StandardCharsets.UTF_8);
-        assertEquals(expected, actual);
-        Log.d(TAG, "Got response: " + actual);
-    }
-
-    private void assertSocketStillOpen(FileDescriptor fd, String host) throws Exception {
-        try {
-            assertTrue(fd.valid());
-            sendRequest(fd, host);
-            assertTrue(fd.valid());
-        } finally {
-            Os.close(fd);
-        }
-    }
-
-    private void assertSocketClosed(FileDescriptor fd, String host) throws Exception {
-        try {
-            assertTrue(fd.valid());
-            sendRequest(fd, host);
-            fail("Socket opened before VPN connects should be closed when VPN connects");
-        } catch (ErrnoException expected) {
-            assertEquals(ECONNABORTED, expected.errno);
-            assertTrue(fd.valid());
-        } finally {
-            Os.close(fd);
-        }
-    }
-
-    private ContentResolver getContentResolver() {
-        return getInstrumentation().getContext().getContentResolver();
-    }
-
-    private boolean isPrivateDnsInStrictMode() {
-        return PRIVATE_DNS_MODE_PROVIDER_HOSTNAME.equals(
-                Settings.Global.getString(getContentResolver(), PRIVATE_DNS_MODE_SETTING));
-    }
-
-    private void storePrivateDnsSetting() {
-        mOldPrivateDnsMode = Settings.Global.getString(getContentResolver(),
-                PRIVATE_DNS_MODE_SETTING);
-        mOldPrivateDnsSpecifier = Settings.Global.getString(getContentResolver(),
-                PRIVATE_DNS_SPECIFIER_SETTING);
-    }
-
-    private void restorePrivateDnsSetting() {
-        Settings.Global.putString(getContentResolver(), PRIVATE_DNS_MODE_SETTING,
-                mOldPrivateDnsMode);
-        Settings.Global.putString(getContentResolver(), PRIVATE_DNS_SPECIFIER_SETTING,
-                mOldPrivateDnsSpecifier);
-    }
-
-    // TODO: replace with CtsNetUtils.awaitPrivateDnsSetting in Q or above.
-    private void expectPrivateDnsHostname(final String hostname) throws Exception {
-        final NetworkRequest request = new NetworkRequest.Builder()
-                .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
-                .build();
-        final CountDownLatch latch = new CountDownLatch(1);
-        final NetworkCallback callback = new NetworkCallback() {
-            @Override
-            public void onLinkPropertiesChanged(Network network, LinkProperties lp) {
-                if (network.equals(mNetwork) &&
-                        Objects.equals(lp.getPrivateDnsServerName(), hostname)) {
-                    latch.countDown();
-                }
-            }
-        };
-
-        mCM.registerNetworkCallback(request, callback);
-
-        try {
-            assertTrue("Private DNS hostname was not " + hostname + " after " + TIMEOUT_MS + "ms",
-                    latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        } finally {
-            mCM.unregisterNetworkCallback(callback);
-        }
-    }
-
-    private void setAndVerifyPrivateDns(boolean strictMode) throws Exception {
-        final ContentResolver cr = getInstrumentation().getContext().getContentResolver();
-        String privateDnsHostname;
-
-        if (strictMode) {
-            privateDnsHostname = "vpncts-nx.metric.gstatic.com";
-            Settings.Global.putString(cr, PRIVATE_DNS_SPECIFIER_SETTING, privateDnsHostname);
-            Settings.Global.putString(cr, PRIVATE_DNS_MODE_SETTING,
-                    PRIVATE_DNS_MODE_PROVIDER_HOSTNAME);
-        } else {
-            Settings.Global.putString(cr, PRIVATE_DNS_MODE_SETTING, PRIVATE_DNS_MODE_OPPORTUNISTIC);
-            privateDnsHostname = null;
-        }
-
-        expectPrivateDnsHostname(privateDnsHostname);
-
-        String randomName = "vpncts-" + new Random().nextInt(1000000000) + "-ds.metric.gstatic.com";
-        if (strictMode) {
-            // Strict mode private DNS is enabled. DNS lookups should fail, because the private DNS
-            // server name is invalid.
-            try {
-                InetAddress.getByName(randomName);
-                fail("VPN DNS lookup should fail with private DNS enabled");
-            } catch (UnknownHostException expected) {
-            }
-        } else {
-            // Strict mode private DNS is disabled. DNS lookup should succeed, because the VPN
-            // provides no DNS servers, and thus DNS falls through to the default network.
-            assertNotNull("VPN DNS lookup should succeed with private DNS disabled",
-                    InetAddress.getByName(randomName));
-        }
-    }
-
-    // Tests that strict mode private DNS is used on VPNs.
-    private void checkStrictModePrivateDns() throws Exception {
-        final boolean initialMode = isPrivateDnsInStrictMode();
-        setAndVerifyPrivateDns(!initialMode);
-        setAndVerifyPrivateDns(initialMode);
-    }
-
-    public void testDefault() throws Exception {
-        if (!supportedHardware()) return;
-        // If adb TCP port opened, this test may running by adb over network.
-        // All of socket would be destroyed in this test. So this test don't
-        // support adb over network, see b/119382723.
-        if (SystemProperties.getInt("persist.adb.tcp.port", -1) > -1
-                || SystemProperties.getInt("service.adb.tcp.port", -1) > -1) {
-            Log.i(TAG, "adb is running over the network, so skip this test");
-            return;
-        }
-
-        final BlockingBroadcastReceiver receiver = new BlockingBroadcastReceiver(
-                getInstrumentation().getTargetContext(), MyVpnService.ACTION_ESTABLISHED);
-        receiver.register();
-
-        FileDescriptor fd = openSocketFdInOtherApp(TEST_HOST, 80, TIMEOUT_MS);
-
-        startVpn(new String[] {"192.0.2.2/32", "2001:db8:1:2::ffe/128"},
-                 new String[] {"0.0.0.0/0", "::/0"},
-                 "", "", null, null /* underlyingNetworks */, false /* isAlwaysMetered */);
-
-        final Intent intent = receiver.awaitForBroadcast(TimeUnit.MINUTES.toMillis(1));
-        assertNotNull("Failed to receive broadcast from VPN service", intent);
-        assertFalse("Wrong VpnService#isAlwaysOn",
-                intent.getBooleanExtra(MyVpnService.EXTRA_ALWAYS_ON, true));
-        assertFalse("Wrong VpnService#isLockdownEnabled",
-                intent.getBooleanExtra(MyVpnService.EXTRA_LOCKDOWN_ENABLED, true));
-
-        assertSocketClosed(fd, TEST_HOST);
-
-        checkTrafficOnVpn();
-
-        checkStrictModePrivateDns();
-
-        receiver.unregisterQuietly();
-    }
-
-    public void testAppAllowed() throws Exception {
-        if (!supportedHardware()) return;
-
-        FileDescriptor fd = openSocketFdInOtherApp(TEST_HOST, 80, TIMEOUT_MS);
-
-        // Shell app must not be put in here or it would kill the ADB-over-network use case
-        String allowedApps = mRemoteSocketFactoryClient.getPackageName() + "," + mPackageName;
-        startVpn(new String[] {"192.0.2.2/32", "2001:db8:1:2::ffe/128"},
-                 new String[] {"192.0.2.0/24", "2001:db8::/32"},
-                 allowedApps, "", null, null /* underlyingNetworks */, false /* isAlwaysMetered */);
-
-        assertSocketClosed(fd, TEST_HOST);
-
-        checkTrafficOnVpn();
-
-        checkStrictModePrivateDns();
-    }
-
-    public void testAppDisallowed() throws Exception {
-        if (!supportedHardware()) return;
-
-        FileDescriptor localFd = openSocketFd(TEST_HOST, 80, TIMEOUT_MS);
-        FileDescriptor remoteFd = openSocketFdInOtherApp(TEST_HOST, 80, TIMEOUT_MS);
-
-        String disallowedApps = mRemoteSocketFactoryClient.getPackageName() + "," + mPackageName;
-        // If adb TCP port opened, this test may running by adb over TCP.
-        // Add com.android.shell appllication into blacklist to exclude adb socket for VPN test,
-        // see b/119382723.
-        // Note: The test don't support running adb over network for root device
-        disallowedApps = disallowedApps + ",com.android.shell";
-        Log.i(TAG, "Append shell app to disallowedApps: " + disallowedApps);
-        startVpn(new String[] {"192.0.2.2/32", "2001:db8:1:2::ffe/128"},
-                 new String[] {"192.0.2.0/24", "2001:db8::/32"},
-                 "", disallowedApps, null, null /* underlyingNetworks */,
-                 false /* isAlwaysMetered */);
-
-        assertSocketStillOpen(localFd, TEST_HOST);
-        assertSocketStillOpen(remoteFd, TEST_HOST);
-
-        checkNoTrafficOnVpn();
-    }
-
-    public void testGetConnectionOwnerUidSecurity() throws Exception {
-        if (!supportedHardware()) return;
-
-        DatagramSocket s;
-        InetAddress address = InetAddress.getByName("localhost");
-        s = new DatagramSocket();
-        s.setSoTimeout(SOCKET_TIMEOUT_MS);
-        s.connect(address, 7);
-        InetSocketAddress loc = new InetSocketAddress(s.getLocalAddress(), s.getLocalPort());
-        InetSocketAddress rem = new InetSocketAddress(s.getInetAddress(), s.getPort());
-        try {
-            int uid = mCM.getConnectionOwnerUid(OsConstants.IPPROTO_TCP, loc, rem);
-            fail("Only an active VPN app may call this API.");
-        } catch (SecurityException expected) {
-            return;
-        }
-    }
-
-    public void testSetProxy() throws  Exception {
-        if (!supportedHardware()) return;
-        ProxyInfo initialProxy = mCM.getDefaultProxy();
-        // Receiver for the proxy change broadcast.
-        BlockingBroadcastReceiver proxyBroadcastReceiver = new ProxyChangeBroadcastReceiver();
-        proxyBroadcastReceiver.register();
-
-        String allowedApps = mPackageName;
-        ProxyInfo testProxyInfo = ProxyInfo.buildDirectProxy("10.0.0.1", 8888);
-        startVpn(new String[] {"192.0.2.2/32", "2001:db8:1:2::ffe/128"},
-                new String[] {"0.0.0.0/0", "::/0"}, allowedApps, "",
-                testProxyInfo, null /* underlyingNetworks */, false /* isAlwaysMetered */);
-
-        // Check that the proxy change broadcast is received
-        try {
-            assertNotNull("No proxy change was broadcast when VPN is connected.",
-                    proxyBroadcastReceiver.awaitForBroadcast());
-        } finally {
-            proxyBroadcastReceiver.unregisterQuietly();
-        }
-
-        // Proxy is set correctly in network and in link properties.
-        assertNetworkHasExpectedProxy(testProxyInfo, mNetwork);
-        assertDefaultProxy(testProxyInfo);
-
-        proxyBroadcastReceiver = new ProxyChangeBroadcastReceiver();
-        proxyBroadcastReceiver.register();
-        stopVpn();
-        try {
-            assertNotNull("No proxy change was broadcast when VPN was disconnected.",
-                    proxyBroadcastReceiver.awaitForBroadcast());
-        } finally {
-            proxyBroadcastReceiver.unregisterQuietly();
-        }
-
-        // After disconnecting from VPN, the proxy settings are the ones of the initial network.
-        assertDefaultProxy(initialProxy);
-    }
-
-    public void testSetProxyDisallowedApps() throws Exception {
-        if (!supportedHardware()) return;
-        ProxyInfo initialProxy = mCM.getDefaultProxy();
-
-        // If adb TCP port opened, this test may running by adb over TCP.
-        // Add com.android.shell appllication into blacklist to exclude adb socket for VPN test,
-        // see b/119382723.
-        // Note: The test don't support running adb over network for root device
-        String disallowedApps = mPackageName + ",com.android.shell";
-        ProxyInfo testProxyInfo = ProxyInfo.buildDirectProxy("10.0.0.1", 8888);
-        startVpn(new String[] {"192.0.2.2/32", "2001:db8:1:2::ffe/128"},
-                new String[] {"0.0.0.0/0", "::/0"}, "", disallowedApps,
-                testProxyInfo, null /* underlyingNetworks */, false /* isAlwaysMetered */);
-
-        // The disallowed app does has the proxy configs of the default network.
-        assertNetworkHasExpectedProxy(initialProxy, mCM.getActiveNetwork());
-        assertDefaultProxy(initialProxy);
-    }
-
-    public void testNoProxy() throws Exception {
-        if (!supportedHardware()) return;
-        ProxyInfo initialProxy = mCM.getDefaultProxy();
-        BlockingBroadcastReceiver proxyBroadcastReceiver = new ProxyChangeBroadcastReceiver();
-        proxyBroadcastReceiver.register();
-        String allowedApps = mPackageName;
-        startVpn(new String[] {"192.0.2.2/32", "2001:db8:1:2::ffe/128"},
-                new String[] {"0.0.0.0/0", "::/0"}, allowedApps, "", null,
-                null /* underlyingNetworks */, false /* isAlwaysMetered */);
-
-        try {
-            assertNotNull("No proxy change was broadcast.",
-                    proxyBroadcastReceiver.awaitForBroadcast());
-        } finally {
-            proxyBroadcastReceiver.unregisterQuietly();
-        }
-
-        // The VPN network has no proxy set.
-        assertNetworkHasExpectedProxy(null, mNetwork);
-
-        proxyBroadcastReceiver = new ProxyChangeBroadcastReceiver();
-        proxyBroadcastReceiver.register();
-        stopVpn();
-        try {
-            assertNotNull("No proxy change was broadcast.",
-                    proxyBroadcastReceiver.awaitForBroadcast());
-        } finally {
-            proxyBroadcastReceiver.unregisterQuietly();
-        }
-        // After disconnecting from VPN, the proxy settings are the ones of the initial network.
-        assertDefaultProxy(initialProxy);
-        assertNetworkHasExpectedProxy(initialProxy, mCM.getActiveNetwork());
-    }
-
-    public void testBindToNetworkWithProxy() throws Exception {
-        if (!supportedHardware()) return;
-        String allowedApps = mPackageName;
-        Network initialNetwork = mCM.getActiveNetwork();
-        ProxyInfo initialProxy = mCM.getDefaultProxy();
-        ProxyInfo testProxyInfo = ProxyInfo.buildDirectProxy("10.0.0.1", 8888);
-        // Receiver for the proxy change broadcast.
-        BlockingBroadcastReceiver proxyBroadcastReceiver = new ProxyChangeBroadcastReceiver();
-        proxyBroadcastReceiver.register();
-        startVpn(new String[] {"192.0.2.2/32", "2001:db8:1:2::ffe/128"},
-                new String[] {"0.0.0.0/0", "::/0"}, allowedApps, "",
-                testProxyInfo, null /* underlyingNetworks */, false /* isAlwaysMetered */);
-
-        assertDefaultProxy(testProxyInfo);
-        mCM.bindProcessToNetwork(initialNetwork);
-        try {
-            assertNotNull("No proxy change was broadcast.",
-                proxyBroadcastReceiver.awaitForBroadcast());
-        } finally {
-            proxyBroadcastReceiver.unregisterQuietly();
-        }
-        assertDefaultProxy(initialProxy);
-    }
-
-    public void testVpnMeterednessWithNoUnderlyingNetwork() throws Exception {
-        if (!supportedHardware()) {
-            return;
-        }
-        // VPN is not routing any traffic i.e. its underlying networks is an empty array.
-        ArrayList<Network> underlyingNetworks = new ArrayList<>();
-        String allowedApps = mPackageName;
-
-        startVpn(new String[] {"192.0.2.2/32", "2001:db8:1:2::ffe/128"},
-                new String[] {"0.0.0.0/0", "::/0"}, allowedApps, "", null,
-                underlyingNetworks, false /* isAlwaysMetered */);
-
-        // VPN should now be the active network.
-        assertEquals(mNetwork, mCM.getActiveNetwork());
-        assertVpnTransportContains(NetworkCapabilities.TRANSPORT_VPN);
-        // VPN with no underlying networks should be metered by default.
-        assertTrue(isNetworkMetered(mNetwork));
-        assertTrue(mCM.isActiveNetworkMetered());
-    }
-
-    public void testVpnMeterednessWithNullUnderlyingNetwork() throws Exception {
-        if (!supportedHardware()) {
-            return;
-        }
-        Network underlyingNetwork = mCM.getActiveNetwork();
-        if (underlyingNetwork == null) {
-            Log.i(TAG, "testVpnMeterednessWithNullUnderlyingNetwork cannot execute"
-                    + " unless there is an active network");
-            return;
-        }
-        // VPN tracks platform default.
-        ArrayList<Network> underlyingNetworks = null;
-        String allowedApps = mPackageName;
-
-        startVpn(new String[] {"192.0.2.2/32", "2001:db8:1:2::ffe/128"},
-                new String[] {"0.0.0.0/0", "::/0"}, allowedApps, "", null,
-                underlyingNetworks, false /*isAlwaysMetered */);
-
-        // Ensure VPN transports contains underlying network's transports.
-        assertVpnTransportContains(underlyingNetwork);
-        // Its meteredness should be same as that of underlying network.
-        assertEquals(isNetworkMetered(underlyingNetwork), isNetworkMetered(mNetwork));
-        // Meteredness based on VPN capabilities and CM#isActiveNetworkMetered should be in sync.
-        assertEquals(isNetworkMetered(mNetwork), mCM.isActiveNetworkMetered());
-    }
-
-    public void testVpnMeterednessWithNonNullUnderlyingNetwork() throws Exception {
-        if (!supportedHardware()) {
-            return;
-        }
-        Network underlyingNetwork = mCM.getActiveNetwork();
-        if (underlyingNetwork == null) {
-            Log.i(TAG, "testVpnMeterednessWithNonNullUnderlyingNetwork cannot execute"
-                    + " unless there is an active network");
-            return;
-        }
-        // VPN explicitly declares WiFi to be its underlying network.
-        ArrayList<Network> underlyingNetworks = new ArrayList<>(1);
-        underlyingNetworks.add(underlyingNetwork);
-        String allowedApps = mPackageName;
-
-        startVpn(new String[] {"192.0.2.2/32", "2001:db8:1:2::ffe/128"},
-                new String[] {"0.0.0.0/0", "::/0"}, allowedApps, "", null,
-                underlyingNetworks, false /* isAlwaysMetered */);
-
-        // Ensure VPN transports contains underlying network's transports.
-        assertVpnTransportContains(underlyingNetwork);
-        // Its meteredness should be same as that of underlying network.
-        assertEquals(isNetworkMetered(underlyingNetwork), isNetworkMetered(mNetwork));
-        // Meteredness based on VPN capabilities and CM#isActiveNetworkMetered should be in sync.
-        assertEquals(isNetworkMetered(mNetwork), mCM.isActiveNetworkMetered());
-    }
-
-    public void testAlwaysMeteredVpnWithNullUnderlyingNetwork() throws Exception {
-        if (!supportedHardware()) {
-            return;
-        }
-        Network underlyingNetwork = mCM.getActiveNetwork();
-        if (underlyingNetwork == null) {
-            Log.i(TAG, "testAlwaysMeteredVpnWithNullUnderlyingNetwork cannot execute"
-                    + " unless there is an active network");
-            return;
-        }
-        // VPN tracks platform default.
-        ArrayList<Network> underlyingNetworks = null;
-        String allowedApps = mPackageName;
-        boolean isAlwaysMetered = true;
-
-        startVpn(new String[] {"192.0.2.2/32", "2001:db8:1:2::ffe/128"},
-                new String[] {"0.0.0.0/0", "::/0"}, allowedApps, "", null,
-                underlyingNetworks, isAlwaysMetered);
-
-        // VPN's meteredness does not depend on underlying network since it is always metered.
-        assertTrue(isNetworkMetered(mNetwork));
-        assertTrue(mCM.isActiveNetworkMetered());
-    }
-
-    public void testAlwaysMeteredVpnWithNonNullUnderlyingNetwork() throws Exception {
-        if (!supportedHardware()) {
-            return;
-        }
-        Network underlyingNetwork = mCM.getActiveNetwork();
-        if (underlyingNetwork == null) {
-            Log.i(TAG, "testAlwaysMeteredVpnWithNonNullUnderlyingNetwork cannot execute"
-                    + " unless there is an active network");
-            return;
-        }
-        // VPN explicitly declares its underlying network.
-        ArrayList<Network> underlyingNetworks = new ArrayList<>(1);
-        underlyingNetworks.add(underlyingNetwork);
-        String allowedApps = mPackageName;
-        boolean isAlwaysMetered = true;
-
-        startVpn(new String[] {"192.0.2.2/32", "2001:db8:1:2::ffe/128"},
-                new String[] {"0.0.0.0/0", "::/0"}, allowedApps, "", null,
-                underlyingNetworks, isAlwaysMetered);
-
-        // VPN's meteredness does not depend on underlying network since it is always metered.
-        assertTrue(isNetworkMetered(mNetwork));
-        assertTrue(mCM.isActiveNetworkMetered());
-    }
-
-    public void testB141603906() throws Exception {
-        final InetSocketAddress src = new InetSocketAddress(0);
-        final InetSocketAddress dst = new InetSocketAddress(0);
-        final int NUM_THREADS = 8;
-        final int NUM_SOCKETS = 5000;
-        final Thread[] threads = new Thread[NUM_THREADS];
-        startVpn(new String[] {"192.0.2.2/32", "2001:db8:1:2::ffe/128"},
-                 new String[] {"0.0.0.0/0", "::/0"},
-                 "" /* allowedApplications */, "com.android.shell" /* disallowedApplications */,
-                null /* proxyInfo */, null /* underlyingNetworks */, false /* isAlwaysMetered */);
-
-        for (int i = 0; i < NUM_THREADS; i++) {
-            threads[i] = new Thread(() -> {
-                for (int j = 0; j < NUM_SOCKETS; j++) {
-                    mCM.getConnectionOwnerUid(IPPROTO_TCP, src, dst);
-                }
-            });
-        }
-        for (Thread thread : threads) {
-            thread.start();
-        }
-        for (Thread thread : threads) {
-            thread.join();
-        }
-        stopVpn();
-    }
-
-    private boolean isNetworkMetered(Network network) {
-        NetworkCapabilities nc = mCM.getNetworkCapabilities(network);
-        return !nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
-    }
-
-    private void assertVpnTransportContains(Network underlyingNetwork) {
-        int[] transports = mCM.getNetworkCapabilities(underlyingNetwork).getTransportTypes();
-        assertVpnTransportContains(transports);
-    }
-
-    private void assertVpnTransportContains(int... transports) {
-        NetworkCapabilities vpnCaps = mCM.getNetworkCapabilities(mNetwork);
-        for (int transport : transports) {
-            assertTrue(vpnCaps.hasTransport(transport));
-        }
-    }
-
-    private void assertDefaultProxy(ProxyInfo expected) {
-        assertEquals("Incorrect proxy config.", expected, mCM.getDefaultProxy());
-        String expectedHost = expected == null ? null : expected.getHost();
-        String expectedPort = expected == null ? null : String.valueOf(expected.getPort());
-        assertEquals("Incorrect proxy host system property.", expectedHost,
-            System.getProperty("http.proxyHost"));
-        assertEquals("Incorrect proxy port system property.", expectedPort,
-            System.getProperty("http.proxyPort"));
-    }
-
-    private void assertNetworkHasExpectedProxy(ProxyInfo expected, Network network) {
-        LinkProperties lp = mCM.getLinkProperties(network);
-        assertNotNull("The network link properties object is null.", lp);
-        assertEquals("Incorrect proxy config.", expected, lp.getHttpProxy());
-
-        assertEquals(expected, mCM.getProxyForNetwork(network));
-    }
-
-    class ProxyChangeBroadcastReceiver extends BlockingBroadcastReceiver {
-        private boolean received;
-
-        public ProxyChangeBroadcastReceiver() {
-            super(VpnTest.this.getInstrumentation().getContext(), Proxy.PROXY_CHANGE_ACTION);
-            received = false;
-        }
-
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            if (!received) {
-                // Do not call onReceive() more than once.
-                super.onReceive(context, intent);
-            }
-            received = true;
-        }
-    }
-}
diff --git a/hostsidetests/net/app2/Android.bp b/hostsidetests/net/app2/Android.bp
deleted file mode 100644
index a6e9b11..0000000
--- a/hostsidetests/net/app2/Android.bp
+++ /dev/null
@@ -1,30 +0,0 @@
-//
-// 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.
-//
-
-android_test_helper_app {
-    name: "CtsHostsideNetworkTestsApp2",
-    defaults: ["cts_support_defaults"],
-    sdk_version: "current",
-    static_libs: ["CtsHostsideNetworkTestsAidl"],
-    srcs: ["src/**/*.java"],
-    // Tag this module as a cts test artifact
-    test_suites: [
-        "cts",
-        "vts10",
-        "general-tests",
-    ],
-    certificate: ":cts-net-app",
-}
diff --git a/hostsidetests/net/app2/AndroidManifest.xml b/hostsidetests/net/app2/AndroidManifest.xml
deleted file mode 100644
index ad270b3..0000000
--- a/hostsidetests/net/app2/AndroidManifest.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?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="com.android.cts.net.hostside.app2" >
-
-    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
-    <uses-permission android:name="android.permission.INTERNET" />
-
-    <!--
-         This application is used to listen to RESTRICT_BACKGROUND_CHANGED intents and store
-         them in a shared preferences which is then read by the test app. These broadcasts are
-         handled by 2 listeners, one defined the manifest and another dynamically registered by
-         a service.
-
-         The manifest-defined listener also handles ordered broadcasts used to share data with the
-         test app.
-
-         This application also provides a service, RemoteSocketFactoryService, that the test app can
-         use to open sockets to remote hosts as a different user ID.
-    -->
-    <application android:usesCleartextTraffic="true">
-        <activity android:name=".MyActivity" android:exported="true"/>
-        <service android:name=".MyService" android:exported="true"/>
-        <service android:name=".MyForegroundService" android:exported="true"/>
-        <service android:name=".RemoteSocketFactoryService" android:exported="true"/>
-
-        <receiver android:name=".MyBroadcastReceiver" >
-            <intent-filter>
-                <action android:name="android.net.conn.RESTRICT_BACKGROUND_CHANGED" />
-                <action android:name="com.android.cts.net.hostside.app2.action.GET_COUNTERS" />
-                <action android:name="com.android.cts.net.hostside.app2.action.GET_RESTRICT_BACKGROUND_STATUS" />
-                <action android:name="com.android.cts.net.hostside.app2.action.CHECK_NETWORK" />
-                <action android:name="com.android.cts.net.hostside.app2.action.SEND_NOTIFICATION" />
-                <action android:name="com.android.cts.net.hostside.app2.action.SHOW_TOAST" />
-                </intent-filter>
-        </receiver>
-    </application>
-
-</manifest>
diff --git a/hostsidetests/net/app2/res/drawable/ic_notification.png b/hostsidetests/net/app2/res/drawable/ic_notification.png
deleted file mode 100644
index 6ae570b..0000000
--- a/hostsidetests/net/app2/res/drawable/ic_notification.png
+++ /dev/null
Binary files differ
diff --git a/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/Common.java b/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/Common.java
deleted file mode 100644
index 351733e..0000000
--- a/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/Common.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside.app2;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.util.Log;
-
-import com.android.cts.net.hostside.INetworkStateObserver;
-
-public final class Common {
-
-    static final String TAG = "CtsNetApp2";
-
-    // Constants below must match values defined on app's
-    // AbstractRestrictBackgroundNetworkTestCase.java
-    static final String MANIFEST_RECEIVER = "ManifestReceiver";
-    static final String DYNAMIC_RECEIVER = "DynamicReceiver";
-
-    static final String ACTION_RECEIVER_READY =
-            "com.android.cts.net.hostside.app2.action.RECEIVER_READY";
-    static final String ACTION_FINISH_ACTIVITY =
-            "com.android.cts.net.hostside.app2.action.FINISH_ACTIVITY";
-    static final String ACTION_SHOW_TOAST =
-            "com.android.cts.net.hostside.app2.action.SHOW_TOAST";
-
-    static final String NOTIFICATION_TYPE_CONTENT = "CONTENT";
-    static final String NOTIFICATION_TYPE_DELETE = "DELETE";
-    static final String NOTIFICATION_TYPE_FULL_SCREEN = "FULL_SCREEN";
-    static final String NOTIFICATION_TYPE_BUNDLE = "BUNDLE";
-    static final String NOTIFICATION_TYPE_ACTION = "ACTION";
-    static final String NOTIFICATION_TYPE_ACTION_BUNDLE = "ACTION_BUNDLE";
-    static final String NOTIFICATION_TYPE_ACTION_REMOTE_INPUT = "ACTION_REMOTE_INPUT";
-
-    static final String TEST_PKG = "com.android.cts.net.hostside";
-    static final String KEY_NETWORK_STATE_OBSERVER = TEST_PKG + ".observer";
-
-    static int getUid(Context context) {
-        final String packageName = context.getPackageName();
-        try {
-            return context.getPackageManager().getPackageUid(packageName, 0);
-        } catch (NameNotFoundException e) {
-            throw new IllegalStateException("Could not get UID for " + packageName, e);
-        }
-    }
-
-    static void notifyNetworkStateObserver(Context context, Intent intent) {
-        if (intent == null) {
-            return;
-        }
-        final Bundle extras = intent.getExtras();
-        if (extras == null) {
-            return;
-        }
-        final INetworkStateObserver observer = INetworkStateObserver.Stub.asInterface(
-                extras.getBinder(KEY_NETWORK_STATE_OBSERVER));
-        if (observer != null) {
-            try {
-                if (!observer.isForeground()) {
-                    Log.e(TAG, "App didn't come to foreground");
-                    observer.onNetworkStateChecked(null);
-                    return;
-                }
-            } catch (RemoteException e) {
-                Log.e(TAG, "Error occurred while reading the proc state: " + e);
-            }
-            AsyncTask.execute(() -> {
-                try {
-                    observer.onNetworkStateChecked(
-                            MyBroadcastReceiver.checkNetworkStatus(context));
-                } catch (RemoteException e) {
-                    Log.e(TAG, "Error occurred while notifying the observer: " + e);
-                }
-            });
-        }
-    }
-}
diff --git a/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/MyActivity.java b/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/MyActivity.java
deleted file mode 100644
index 286cc2f..0000000
--- a/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/MyActivity.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside.app2;
-
-import static com.android.cts.net.hostside.app2.Common.ACTION_FINISH_ACTIVITY;
-import static com.android.cts.net.hostside.app2.Common.TAG;
-import static com.android.cts.net.hostside.app2.Common.TEST_PKG;
-
-import android.app.Activity;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.util.Log;
-
-import com.android.cts.net.hostside.INetworkStateObserver;
-
-/**
- * Activity used to bring process to foreground.
- */
-public class MyActivity extends Activity {
-
-    private BroadcastReceiver finishCommandReceiver = null;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        Log.d(TAG, "MyActivity.onCreate()");
-        Common.notifyNetworkStateObserver(this, getIntent());
-        finishCommandReceiver = new BroadcastReceiver() {
-            @Override
-            public void onReceive(Context context, Intent intent) {
-                Log.d(TAG, "Finishing MyActivity");
-                MyActivity.this.finish();
-            }
-        };
-        registerReceiver(finishCommandReceiver, new IntentFilter(ACTION_FINISH_ACTIVITY));
-    }
-
-    @Override
-    public void finish() {
-        if (finishCommandReceiver != null) {
-            unregisterReceiver(finishCommandReceiver);
-        }
-        super.finish();
-    }
-
-    @Override
-    protected void onStart() {
-        super.onStart();
-        Log.d(TAG, "MyActivity.onStart()");
-    }
-
-    @Override
-    protected void onDestroy() {
-        Log.d(TAG, "MyActivity.onDestroy()");
-        super.onDestroy();
-    }
-}
diff --git a/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/MyBroadcastReceiver.java b/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/MyBroadcastReceiver.java
deleted file mode 100644
index aa54075..0000000
--- a/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/MyBroadcastReceiver.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside.app2;
-
-import static android.net.ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED;
-
-import static com.android.cts.net.hostside.app2.Common.ACTION_RECEIVER_READY;
-import static com.android.cts.net.hostside.app2.Common.ACTION_SHOW_TOAST;
-import static com.android.cts.net.hostside.app2.Common.MANIFEST_RECEIVER;
-import static com.android.cts.net.hostside.app2.Common.NOTIFICATION_TYPE_ACTION;
-import static com.android.cts.net.hostside.app2.Common.NOTIFICATION_TYPE_ACTION_BUNDLE;
-import static com.android.cts.net.hostside.app2.Common.NOTIFICATION_TYPE_ACTION_REMOTE_INPUT;
-import static com.android.cts.net.hostside.app2.Common.NOTIFICATION_TYPE_BUNDLE;
-import static com.android.cts.net.hostside.app2.Common.NOTIFICATION_TYPE_CONTENT;
-import static com.android.cts.net.hostside.app2.Common.NOTIFICATION_TYPE_DELETE;
-import static com.android.cts.net.hostside.app2.Common.NOTIFICATION_TYPE_FULL_SCREEN;
-import static com.android.cts.net.hostside.app2.Common.TAG;
-import static com.android.cts.net.hostside.app2.Common.getUid;
-
-import android.app.Notification;
-import android.app.Notification.Action;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.app.RemoteInput;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
-import android.os.Bundle;
-import android.util.Log;
-import android.widget.Toast;
-
-import java.net.HttpURLConnection;
-import java.net.URL;
-
-/**
- * Receiver used to:
- * <ol>
- *   <li>Count number of {@code RESTRICT_BACKGROUND_CHANGED} broadcasts received.
- *   <li>Show a toast.
- * </ol>
- */
-public class MyBroadcastReceiver extends BroadcastReceiver {
-
-    private static final int NETWORK_TIMEOUT_MS = 5 * 1000;
-
-    private final String mName;
-
-    public MyBroadcastReceiver() {
-        this(MANIFEST_RECEIVER);
-    }
-
-    MyBroadcastReceiver(String name) {
-        Log.d(TAG, "Constructing MyBroadcastReceiver named " + name);
-        mName = name;
-    }
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        Log.d(TAG, "onReceive() for " + mName + ": " + intent);
-        final String action = intent.getAction();
-        switch (action) {
-            case ACTION_RESTRICT_BACKGROUND_CHANGED:
-                increaseCounter(context, action);
-                break;
-            case ACTION_RECEIVER_READY:
-                final String message = mName + " is ready to rumble";
-                Log.d(TAG, message);
-                setResultData(message);
-                break;
-            case ACTION_SHOW_TOAST:
-                showToast(context);
-                break;
-            default:
-                Log.e(TAG, "received unexpected action: " + action);
-        }
-    }
-
-    @Override
-    public String toString() {
-        return "[MyBroadcastReceiver: mName=" + mName + "]";
-    }
-
-    private void increaseCounter(Context context, String action) {
-        final SharedPreferences prefs = context.getApplicationContext()
-                .getSharedPreferences(mName, Context.MODE_PRIVATE);
-        final int value = prefs.getInt(action, 0) + 1;
-        Log.d(TAG, "increaseCounter('" + action + "'): setting '" + mName + "' to " + value);
-        prefs.edit().putInt(action, value).apply();
-    }
-
-    static int getCounter(Context context, String action, String receiverName) {
-        final SharedPreferences prefs = context.getSharedPreferences(receiverName,
-                Context.MODE_PRIVATE);
-        final int value = prefs.getInt(action, 0);
-        Log.d(TAG, "getCounter('" + action + "', '" + receiverName + "'): " + value);
-        return value;
-    }
-
-    static String getRestrictBackgroundStatus(Context context) {
-        final ConnectivityManager cm = (ConnectivityManager) context
-                .getSystemService(Context.CONNECTIVITY_SERVICE);
-        final int apiStatus = cm.getRestrictBackgroundStatus();
-        Log.d(TAG, "getRestrictBackgroundStatus: returning " + apiStatus);
-        return String.valueOf(apiStatus);
-    }
-
-    private static final String NETWORK_STATUS_TEMPLATE = "%s|%s|%s|%s|%s";
-    /**
-     * Checks whether the network is available and return a string which can then be send as a
-     * result data for the ordered broadcast.
-     *
-     * <p>
-     * The string has the following format:
-     *
-     * <p><pre><code>
-     * NetinfoState|NetinfoDetailedState|RealConnectionCheck|RealConnectionCheckDetails|Netinfo
-     * </code></pre>
-     *
-     * <p>Where:
-     *
-     * <ul>
-     * <li>{@code NetinfoState}: enum value of {@link NetworkInfo.State}.
-     * <li>{@code NetinfoDetailedState}: enum value of {@link NetworkInfo.DetailedState}.
-     * <li>{@code RealConnectionCheck}: boolean value of a real connection check (i.e., an attempt
-     *     to access an external website.
-     * <li>{@code RealConnectionCheckDetails}: if HTTP output core or exception string of the real
-     *     connection attempt
-     * <li>{@code Netinfo}: string representation of the {@link NetworkInfo}.
-     * </ul>
-     *
-     * For example, if the connection was established fine, the result would be something like:
-     * <p><pre><code>
-     * CONNECTED|CONNECTED|true|200|[type: WIFI[], state: CONNECTED/CONNECTED, reason: ...]
-     * </code></pre>
-     *
-     */
-    // TODO: now that it uses Binder, it counl return a Bundle with the data parts instead...
-    static String checkNetworkStatus(Context context) {
-        final ConnectivityManager cm =
-                (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
-        // TODO: connect to a hostside server instead
-        final String address = "http://example.com";
-        final NetworkInfo networkInfo = cm.getActiveNetworkInfo();
-        Log.d(TAG, "Running checkNetworkStatus() on thread "
-                + Thread.currentThread().getName() + " for UID " + getUid(context)
-                + "\n\tactiveNetworkInfo: " + networkInfo + "\n\tURL: " + address);
-        boolean checkStatus = false;
-        String checkDetails = "N/A";
-        try {
-            final URL url = new URL(address);
-            final HttpURLConnection conn = (HttpURLConnection) url.openConnection();
-            conn.setReadTimeout(NETWORK_TIMEOUT_MS);
-            conn.setConnectTimeout(NETWORK_TIMEOUT_MS / 2);
-            conn.setRequestMethod("GET");
-            conn.setDoInput(true);
-            conn.connect();
-            final int response = conn.getResponseCode();
-            checkStatus = true;
-            checkDetails = "HTTP response for " + address + ": " + response;
-        } catch (Exception e) {
-            checkStatus = false;
-            checkDetails = "Exception getting " + address + ": " + e;
-        }
-        Log.d(TAG, checkDetails);
-        final String state, detailedState;
-        if (networkInfo != null) {
-            state = networkInfo.getState().name();
-            detailedState = networkInfo.getDetailedState().name();
-        } else {
-            state = detailedState = "null";
-        }
-        final String status = String.format(NETWORK_STATUS_TEMPLATE, state, detailedState,
-                Boolean.valueOf(checkStatus), checkDetails, networkInfo);
-        Log.d(TAG, "Offering " + status);
-        return status;
-    }
-
-    /**
-     * Sends a system notification containing actions with pending intents to launch the app's
-     * main activitiy or service.
-     */
-    static void sendNotification(Context context, String channelId, int notificationId,
-            String notificationType ) {
-        Log.d(TAG, "sendNotification: id=" + notificationId + ", type=" + notificationType);
-        final Intent serviceIntent = new Intent(context, MyService.class);
-        final PendingIntent pendingIntent = PendingIntent.getService(context, 0, serviceIntent,
-                notificationId);
-        final Bundle bundle = new Bundle();
-        bundle.putCharSequence("parcelable", "I am not");
-
-        final Notification.Builder builder = new Notification.Builder(context, channelId)
-                .setSmallIcon(R.drawable.ic_notification);
-
-        Action action = null;
-        switch (notificationType) {
-            case NOTIFICATION_TYPE_CONTENT:
-                builder
-                    .setContentTitle("Light, Cameras...")
-                    .setContentIntent(pendingIntent);
-                break;
-            case NOTIFICATION_TYPE_DELETE:
-                builder.setDeleteIntent(pendingIntent);
-                break;
-            case NOTIFICATION_TYPE_FULL_SCREEN:
-                builder.setFullScreenIntent(pendingIntent, true);
-                break;
-            case NOTIFICATION_TYPE_BUNDLE:
-                bundle.putParcelable("Magnum P.I. (Pending Intent)", pendingIntent);
-                builder.setExtras(bundle);
-                break;
-            case NOTIFICATION_TYPE_ACTION:
-                action = new Action.Builder(
-                        R.drawable.ic_notification, "ACTION", pendingIntent)
-                        .build();
-                builder.addAction(action);
-                break;
-            case NOTIFICATION_TYPE_ACTION_BUNDLE:
-                bundle.putParcelable("Magnum A.P.I. (Action Pending Intent)", pendingIntent);
-                action = new Action.Builder(
-                        R.drawable.ic_notification, "ACTION WITH BUNDLE", null)
-                        .addExtras(bundle)
-                        .build();
-                builder.addAction(action);
-                break;
-            case NOTIFICATION_TYPE_ACTION_REMOTE_INPUT:
-                bundle.putParcelable("Magnum R.I. (Remote Input)", null);
-                final RemoteInput remoteInput = new RemoteInput.Builder("RI")
-                    .addExtras(bundle)
-                    .build();
-                action = new Action.Builder(
-                        R.drawable.ic_notification, "ACTION WITH REMOTE INPUT", pendingIntent)
-                        .addRemoteInput(remoteInput)
-                        .build();
-                builder.addAction(action);
-                break;
-            default:
-                Log.e(TAG, "Unknown notification type: " + notificationType);
-                return;
-        }
-
-        final Notification notification = builder.build();
-        ((NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE))
-            .notify(notificationId, notification);
-    }
-
-    private void showToast(Context context) {
-        Toast.makeText(context, "Toast from CTS test", Toast.LENGTH_SHORT).show();
-        setResultData("Shown");
-    }
-}
diff --git a/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/MyForegroundService.java b/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/MyForegroundService.java
deleted file mode 100644
index ff4ba65..0000000
--- a/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/MyForegroundService.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside.app2;
-
-import static com.android.cts.net.hostside.app2.Common.TAG;
-import static com.android.cts.net.hostside.app2.Common.TEST_PKG;
-
-import android.R;
-import android.app.Notification;
-import android.app.NotificationChannel;
-import android.app.NotificationManager;
-import android.app.Service;
-import android.content.Intent;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.util.Log;
-
-import com.android.cts.net.hostside.INetworkStateObserver;
-
-/**
- * Service used to change app state to FOREGROUND_SERVICE.
- */
-public class MyForegroundService extends Service {
-    private static final String NOTIFICATION_CHANNEL_ID = "cts/MyForegroundService";
-    private static final int FLAG_START_FOREGROUND = 1;
-    private static final int FLAG_STOP_FOREGROUND = 2;
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        return null;
-    }
-
-    @Override
-    public int onStartCommand(Intent intent, int flags, int startId) {
-        Log.v(TAG, "MyForegroundService.onStartCommand(): " + intent);
-        NotificationManager notificationManager = getSystemService(NotificationManager.class);
-        notificationManager.createNotificationChannel(new NotificationChannel(
-                NOTIFICATION_CHANNEL_ID, NOTIFICATION_CHANNEL_ID,
-                NotificationManager.IMPORTANCE_DEFAULT));
-        switch (intent.getFlags()) {
-            case FLAG_START_FOREGROUND:
-                Log.d(TAG, "Starting foreground");
-                startForeground(42, new Notification.Builder(this, NOTIFICATION_CHANNEL_ID)
-                        .setSmallIcon(R.drawable.ic_dialog_alert) // any icon is fine
-                        .build());
-                Common.notifyNetworkStateObserver(this, intent);
-                break;
-            case FLAG_STOP_FOREGROUND:
-                Log.d(TAG, "Stopping foreground");
-                stopForeground(true);
-                break;
-            default:
-                Log.wtf(TAG, "Invalid flag on intent " + intent);
-        }
-        return START_STICKY;
-    }
-}
diff --git a/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/MyService.java b/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/MyService.java
deleted file mode 100644
index 590e17e..0000000
--- a/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/MyService.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside.app2;
-
-import static android.net.ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED;
-
-import static com.android.cts.net.hostside.app2.Common.ACTION_RECEIVER_READY;
-import static com.android.cts.net.hostside.app2.Common.DYNAMIC_RECEIVER;
-import static com.android.cts.net.hostside.app2.Common.TAG;
-
-import android.app.NotificationChannel;
-import android.app.NotificationManager;
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.ConnectivityManager;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.NetworkRequest;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.util.Log;
-
-import com.android.cts.net.hostside.IMyService;
-import com.android.cts.net.hostside.INetworkCallback;
-
-/**
- * Service used to dynamically register a broadcast receiver.
- */
-public class MyService extends Service {
-    private static final String NOTIFICATION_CHANNEL_ID = "MyService";
-
-    ConnectivityManager mCm;
-
-    private MyBroadcastReceiver mReceiver;
-    private ConnectivityManager.NetworkCallback mNetworkCallback;
-
-    // TODO: move MyBroadcast static functions here - they were kept there to make git diff easier.
-
-    private IMyService.Stub mBinder =
-        new IMyService.Stub() {
-
-        @Override
-        public void registerBroadcastReceiver() {
-            if (mReceiver != null) {
-                Log.d(TAG, "receiver already registered: " + mReceiver);
-                return;
-            }
-            final Context context = getApplicationContext();
-            mReceiver = new MyBroadcastReceiver(DYNAMIC_RECEIVER);
-            context.registerReceiver(mReceiver, new IntentFilter(ACTION_RECEIVER_READY));
-            context.registerReceiver(mReceiver,
-                    new IntentFilter(ACTION_RESTRICT_BACKGROUND_CHANGED));
-            Log.d(TAG, "receiver registered");
-        }
-
-        @Override
-        public int getCounters(String receiverName, String action) {
-            return MyBroadcastReceiver.getCounter(getApplicationContext(), action, receiverName);
-        }
-
-        @Override
-        public String checkNetworkStatus() {
-            return MyBroadcastReceiver.checkNetworkStatus(getApplicationContext());
-        }
-
-        @Override
-        public String getRestrictBackgroundStatus() {
-            return MyBroadcastReceiver.getRestrictBackgroundStatus(getApplicationContext());
-        }
-
-        @Override
-        public void sendNotification(int notificationId, String notificationType) {
-            MyBroadcastReceiver .sendNotification(getApplicationContext(), NOTIFICATION_CHANNEL_ID,
-                    notificationId, notificationType);
-        }
-
-        @Override
-        public void registerNetworkCallback(INetworkCallback cb) {
-            if (mNetworkCallback != null) {
-                Log.d(TAG, "unregister previous network callback: " + mNetworkCallback);
-                unregisterNetworkCallback();
-            }
-            Log.d(TAG, "registering network callback");
-
-            mNetworkCallback = new ConnectivityManager.NetworkCallback() {
-                @Override
-                public void onBlockedStatusChanged(Network network, boolean blocked) {
-                    try {
-                        cb.onBlockedStatusChanged(network, blocked);
-                    } catch (RemoteException e) {
-                        Log.d(TAG, "Cannot send onBlockedStatusChanged: " + e);
-                        unregisterNetworkCallback();
-                    }
-                }
-
-                @Override
-                public void onAvailable(Network network) {
-                    try {
-                        cb.onAvailable(network);
-                    } catch (RemoteException e) {
-                        Log.d(TAG, "Cannot send onAvailable: " + e);
-                        unregisterNetworkCallback();
-                    }
-                }
-
-                @Override
-                public void onLost(Network network) {
-                    try {
-                        cb.onLost(network);
-                    } catch (RemoteException e) {
-                        Log.d(TAG, "Cannot send onLost: " + e);
-                        unregisterNetworkCallback();
-                    }
-                }
-
-                @Override
-                public void onCapabilitiesChanged(Network network, NetworkCapabilities cap) {
-                    try {
-                        cb.onCapabilitiesChanged(network, cap);
-                    } catch (RemoteException e) {
-                        Log.d(TAG, "Cannot send onCapabilitiesChanged: " + e);
-                        unregisterNetworkCallback();
-                    }
-                }
-            };
-            mCm.registerNetworkCallback(makeWifiNetworkRequest(), mNetworkCallback);
-            try {
-                cb.asBinder().linkToDeath(() -> unregisterNetworkCallback(), 0);
-            } catch (RemoteException e) {
-                unregisterNetworkCallback();
-            }
-        }
-
-        @Override
-        public void unregisterNetworkCallback() {
-            Log.d(TAG, "unregistering network callback");
-            if (mNetworkCallback != null) {
-                mCm.unregisterNetworkCallback(mNetworkCallback);
-                mNetworkCallback = null;
-            }
-        }
-      };
-
-    private NetworkRequest makeWifiNetworkRequest() {
-        return new NetworkRequest.Builder()
-                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
-                .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
-                .build();
-    }
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        return mBinder;
-    }
-
-    @Override
-    public void onCreate() {
-        final Context context = getApplicationContext();
-        ((NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE))
-                .createNotificationChannel(new NotificationChannel(NOTIFICATION_CHANNEL_ID,
-                        NOTIFICATION_CHANNEL_ID, NotificationManager.IMPORTANCE_DEFAULT));
-        mCm = (ConnectivityManager) getApplicationContext()
-                .getSystemService(Context.CONNECTIVITY_SERVICE);
-    }
-
-    @Override
-    public void onDestroy() {
-        final Context context = getApplicationContext();
-        ((NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE))
-                .deleteNotificationChannel(NOTIFICATION_CHANNEL_ID);
-        if (mReceiver != null) {
-            Log.d(TAG, "onDestroy(): unregistering " + mReceiver);
-            getApplicationContext().unregisterReceiver(mReceiver);
-        }
-
-        super.onDestroy();
-    }
-}
diff --git a/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/RemoteSocketFactoryService.java b/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/RemoteSocketFactoryService.java
deleted file mode 100644
index b1b7d77..0000000
--- a/hostsidetests/net/app2/src/com/android/cts/net/hostside/app2/RemoteSocketFactoryService.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * 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 com.android.cts.net.hostside.app2;
-
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.os.IBinder;
-import android.os.ParcelFileDescriptor;
-import android.os.Process;
-import android.util.Log;
-
-import com.android.cts.net.hostside.IRemoteSocketFactory;
-
-import java.net.Socket;
-
-
-public class RemoteSocketFactoryService extends Service {
-
-    private static final String TAG = RemoteSocketFactoryService.class.getSimpleName();
-
-    private IRemoteSocketFactory.Stub mBinder = new IRemoteSocketFactory.Stub() {
-        @Override
-        public ParcelFileDescriptor openSocketFd(String host, int port, int timeoutMs) {
-            try {
-                Socket s = new Socket(host, port);
-                s.setSoTimeout(timeoutMs);
-                return ParcelFileDescriptor.fromSocket(s);
-            } catch (Exception e) {
-                throw new IllegalArgumentException(e);
-            }
-        }
-
-        @Override
-        public String getPackageName() {
-            return RemoteSocketFactoryService.this.getPackageName();
-        }
-
-        @Override
-        public int getUid() {
-            return Process.myUid();
-        }
-    };
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        return mBinder;
-    }
-}
diff --git a/hostsidetests/net/certs/Android.bp b/hostsidetests/net/certs/Android.bp
deleted file mode 100644
index ab4cf34..0000000
--- a/hostsidetests/net/certs/Android.bp
+++ /dev/null
@@ -1,4 +0,0 @@
-android_app_certificate {
-    name: "cts-net-app",
-    certificate: "cts-net-app",
-}
diff --git a/hostsidetests/net/certs/README b/hostsidetests/net/certs/README
deleted file mode 100644
index b660a82..0000000
--- a/hostsidetests/net/certs/README
+++ /dev/null
@@ -1,2 +0,0 @@
-# Generated with:
-development/tools/make_key cts-net-app '/CN=cts-net-app'
diff --git a/hostsidetests/net/certs/cts-net-app.pk8 b/hostsidetests/net/certs/cts-net-app.pk8
deleted file mode 100644
index 1703e4e..0000000
--- a/hostsidetests/net/certs/cts-net-app.pk8
+++ /dev/null
Binary files differ
diff --git a/hostsidetests/net/certs/cts-net-app.x509.pem b/hostsidetests/net/certs/cts-net-app.x509.pem
deleted file mode 100644
index a15ff48..0000000
--- a/hostsidetests/net/certs/cts-net-app.x509.pem
+++ /dev/null
@@ -1,19 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDAjCCAeqgAwIBAgIJAMhWwIIqr1r6MA0GCSqGSIb3DQEBCwUAMBYxFDASBgNV
-BAMMC2N0cy1uZXQtYXBwMB4XDTE4MDYyMDAyMjAwN1oXDTQ1MTEwNTAyMjAwN1ow
-FjEUMBIGA1UEAwwLY3RzLW5ldC1hcHAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQDefOayWQss1E+FQIONK6IhlXhe0BEyHshIrnPOOmuCPa/Svfbnmziy
-hr1KTjaQ3ET/mGShwlt6AUti7nKx9aB71IJp5mSBuwW62A8jvN3yNOo45YV8+n1o
-TrEoMWMf7hQmoOSqaSJ+VFuVms/kPSEh99okDgHCej6rsEkEcDoh6pJajQyUYDwR
-SNAF8SrqCDhqFbZW/LWedvuikCUlNtzuv7/GrcLcsiWEfHv7UOBKpMjLo9BhD1XF
-IefnxImcBQrQGMnE9TLixBiEeX5yauLgbZuxBqD/zsI2TH1FjxTeuJan83kLbqqH
-FgyvPaUjwckAdQPyom7ZUYFnBc0LQ9xzAgMBAAGjUzBRMB0GA1UdDgQWBBRZrBEw
-tAB2WNXj8dQ7ZOuJ34kY5DAfBgNVHSMEGDAWgBRZrBEwtAB2WNXj8dQ7ZOuJ34kY
-5DAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQDeI9AnLW6l/39y
-z96w/ldxZVFPzBRiFIsJsPHVyXlD5vUHZv/ju2jFn8TZSZR5TK0bzCEoVLp34Sho
-bbS0magP82yIvCRibyoyD+TDNnZkNJwjYnikE+/oyshTSQtpkn/rDA+0Y09BUC1E
-N2I6bV9pTXLFg7oah2FmqPRPzhgeYUKENgOQkrrjUCn6y0i/k374n7aftzdniSIz
-2kCRVEeN9gws6CnoMPx0vr32v/JVuPV6zfdJYadgj/eFRyTNE4msd9kE82Wc46eU
-YiI+LuXZ3ZMUNWGY7MK2pOUUS52JsBQ3K235dA5WaU4x8OBlY/WkNYX/eLbNs5jj
-FzLmhZZ1
------END CERTIFICATE-----
diff --git a/hostsidetests/net/src/com/android/cts/net/HostsideNetworkCallbackTests.java b/hostsidetests/net/src/com/android/cts/net/HostsideNetworkCallbackTests.java
deleted file mode 100644
index 1312085..0000000
--- a/hostsidetests/net/src/com/android/cts/net/HostsideNetworkCallbackTests.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.cts.net;
-public class HostsideNetworkCallbackTests extends HostsideNetworkTestCase {
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        uninstallPackage(TEST_APP2_PKG, false);
-        installPackage(TEST_APP2_APK);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        uninstallPackage(TEST_APP2_PKG, true);
-    }
-
-    public void testOnBlockedStatusChanged_dataSaver() throws Exception {
-        runDeviceTests(TEST_PKG,
-                TEST_PKG + ".NetworkCallbackTest", "testOnBlockedStatusChanged_dataSaver");
-    }
-
-    public void testOnBlockedStatusChanged_powerSaver() throws Exception {
-        runDeviceTests(TEST_PKG,
-                TEST_PKG + ".NetworkCallbackTest", "testOnBlockedStatusChanged_powerSaver");
-    }
-}
-
diff --git a/hostsidetests/net/src/com/android/cts/net/HostsideNetworkTestCase.java b/hostsidetests/net/src/com/android/cts/net/HostsideNetworkTestCase.java
deleted file mode 100644
index ce20379..0000000
--- a/hostsidetests/net/src/com/android/cts/net/HostsideNetworkTestCase.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * 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 com.android.cts.net;
-
-import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
-import com.android.ddmlib.Log;
-import com.android.ddmlib.testrunner.RemoteAndroidTestRunner;
-import com.android.ddmlib.testrunner.TestResult.TestStatus;
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.result.CollectingTestListener;
-import com.android.tradefed.result.TestDescription;
-import com.android.tradefed.result.TestResult;
-import com.android.tradefed.result.TestRunResult;
-import com.android.tradefed.testtype.DeviceTestCase;
-import com.android.tradefed.testtype.IAbi;
-import com.android.tradefed.testtype.IAbiReceiver;
-import com.android.tradefed.testtype.IBuildReceiver;
-
-import java.io.FileNotFoundException;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-abstract class HostsideNetworkTestCase extends DeviceTestCase implements IAbiReceiver,
-        IBuildReceiver {
-    protected static final boolean DEBUG = false;
-    protected static final String TAG = "HostsideNetworkTests";
-    protected static final String TEST_PKG = "com.android.cts.net.hostside";
-    protected static final String TEST_APK = "CtsHostsideNetworkTestsApp.apk";
-    protected static final String TEST_APP2_PKG = "com.android.cts.net.hostside.app2";
-    protected static final String TEST_APP2_APK = "CtsHostsideNetworkTestsApp2.apk";
-
-    private IAbi mAbi;
-    private IBuildInfo mCtsBuild;
-
-    @Override
-    public void setAbi(IAbi abi) {
-        mAbi = abi;
-    }
-
-    @Override
-    public void setBuild(IBuildInfo buildInfo) {
-        mCtsBuild = buildInfo;
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        assertNotNull(mAbi);
-        assertNotNull(mCtsBuild);
-
-        uninstallPackage(TEST_PKG, false);
-        installPackage(TEST_APK);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-
-        uninstallPackage(TEST_PKG, true);
-    }
-
-    protected void installPackage(String apk) throws FileNotFoundException,
-            DeviceNotAvailableException {
-        CompatibilityBuildHelper buildHelper = new CompatibilityBuildHelper(mCtsBuild);
-        assertNull(getDevice().installPackage(buildHelper.getTestFile(apk),
-                false /* reinstall */, true /* grantPermissions */));
-    }
-
-    protected void uninstallPackage(String packageName, boolean shouldSucceed)
-            throws DeviceNotAvailableException {
-        final String result = getDevice().uninstallPackage(packageName);
-        if (shouldSucceed) {
-            assertNull("uninstallPackage(" + packageName + ") failed: " + result, result);
-        }
-    }
-
-    protected void assertPackageUninstalled(String packageName) throws DeviceNotAvailableException,
-            InterruptedException {
-        final String command = "cmd package list packages " + packageName;
-        final int max_tries = 5;
-        for (int i = 1; i <= max_tries; i++) {
-            final String result = runCommand(command);
-            if (result.trim().isEmpty()) {
-                return;
-            }
-            // 'list packages' filters by substring, so we need to iterate with the results
-            // and check one by one, otherwise 'com.android.cts.net.hostside' could return
-            // 'com.android.cts.net.hostside.app2'
-            boolean found = false;
-            for (String line : result.split("[\\r\\n]+")) {
-                if (line.endsWith(packageName)) {
-                    found = true;
-                    break;
-                }
-            }
-            if (!found) {
-                return;
-            }
-            i++;
-            Log.v(TAG, "Package " + packageName + " not uninstalled yet (" + result
-                    + "); sleeping 1s before polling again");
-            Thread.sleep(1000);
-        }
-        fail("Package '" + packageName + "' not uinstalled after " + max_tries + " seconds");
-    }
-
-    protected void runDeviceTests(String packageName, String testClassName)
-            throws DeviceNotAvailableException {
-        runDeviceTests(packageName, testClassName, null);
-    }
-
-    protected void runDeviceTests(String packageName, String testClassName, String methodName)
-            throws DeviceNotAvailableException {
-        RemoteAndroidTestRunner testRunner = new RemoteAndroidTestRunner(packageName,
-                "androidx.test.runner.AndroidJUnitRunner", getDevice().getIDevice());
-
-        if (testClassName != null) {
-            if (methodName != null) {
-                testRunner.setMethodName(testClassName, methodName);
-            } else {
-                testRunner.setClassName(testClassName);
-            }
-        }
-
-        final CollectingTestListener listener = new CollectingTestListener();
-        getDevice().runInstrumentationTests(testRunner, listener);
-
-        final TestRunResult result = listener.getCurrentRunResults();
-        if (result.isRunFailure()) {
-            throw new AssertionError("Failed to successfully run device tests for "
-                    + result.getName() + ": " + result.getRunFailureMessage());
-        }
-
-        if (result.hasFailedTests()) {
-            // build a meaningful error message
-            StringBuilder errorBuilder = new StringBuilder("on-device tests failed:\n");
-            for (Map.Entry<TestDescription, TestResult> resultEntry :
-                result.getTestResults().entrySet()) {
-                if (!resultEntry.getValue().getStatus().equals(TestStatus.PASSED)) {
-                    errorBuilder.append(resultEntry.getKey().toString());
-                    errorBuilder.append(":\n");
-                    errorBuilder.append(resultEntry.getValue().getStackTrace());
-                }
-            }
-            throw new AssertionError(errorBuilder.toString());
-        }
-    }
-
-    private static final Pattern UID_PATTERN =
-            Pattern.compile(".*userId=([0-9]+)$", Pattern.MULTILINE);
-
-    protected int getUid(String packageName) throws DeviceNotAvailableException {
-        final String output = runCommand("dumpsys package " + packageName);
-        final Matcher matcher = UID_PATTERN.matcher(output);
-        while (matcher.find()) {
-            final String match = matcher.group(1);
-            return Integer.parseInt(match);
-        }
-        throw new RuntimeException("Did not find regexp '" + UID_PATTERN + "' on adb output\n"
-                + output);
-    }
-
-    protected String runCommand(String command) throws DeviceNotAvailableException {
-        Log.d(TAG, "Command: '" + command + "'");
-        final String output = getDevice().executeShellCommand(command);
-        if (DEBUG) Log.v(TAG, "Output: " + output.trim());
-        return output;
-    }
-}
diff --git a/hostsidetests/net/src/com/android/cts/net/HostsideRestrictBackgroundNetworkTests.java b/hostsidetests/net/src/com/android/cts/net/HostsideRestrictBackgroundNetworkTests.java
deleted file mode 100644
index 4598c39..0000000
--- a/hostsidetests/net/src/com/android/cts/net/HostsideRestrictBackgroundNetworkTests.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- * 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 com.android.cts.net;
-
-import com.android.ddmlib.Log;
-import com.android.tradefed.device.DeviceNotAvailableException;
-
-public class HostsideRestrictBackgroundNetworkTests extends HostsideNetworkTestCase {
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        uninstallPackage(TEST_APP2_PKG, false);
-        installPackage(TEST_APP2_APK);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-
-        uninstallPackage(TEST_APP2_PKG, true);
-    }
-
-    /**************************
-     * Data Saver Mode tests. *
-     **************************/
-
-    public void testDataSaverMode_disabled() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".DataSaverModeTest",
-                "testGetRestrictBackgroundStatus_disabled");
-    }
-
-    public void testDataSaverMode_whitelisted() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".DataSaverModeTest",
-                "testGetRestrictBackgroundStatus_whitelisted");
-    }
-
-    public void testDataSaverMode_enabled() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".DataSaverModeTest",
-                "testGetRestrictBackgroundStatus_enabled");
-    }
-
-    public void testDataSaverMode_blacklisted() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".DataSaverModeTest",
-                "testGetRestrictBackgroundStatus_blacklisted");
-    }
-
-    public void testDataSaverMode_reinstall() throws Exception {
-        final int oldUid = getUid(TEST_APP2_PKG);
-
-        // Make sure whitelist is revoked when package is removed
-        addRestrictBackgroundWhitelist(oldUid);
-
-        uninstallPackage(TEST_APP2_PKG, true);
-        assertPackageUninstalled(TEST_APP2_PKG);
-        assertRestrictBackgroundWhitelist(oldUid, false);
-
-        installPackage(TEST_APP2_APK);
-        final int newUid = getUid(TEST_APP2_PKG);
-        assertRestrictBackgroundWhitelist(oldUid, false);
-        assertRestrictBackgroundWhitelist(newUid, false);
-    }
-
-    public void testDataSaverMode_requiredWhitelistedPackages() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".DataSaverModeTest",
-                "testGetRestrictBackgroundStatus_requiredWhitelistedPackages");
-    }
-
-    public void testDataSaverMode_broadcastNotSentOnUnsupportedDevices() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".DataSaverModeTest",
-                "testBroadcastNotSentOnUnsupportedDevices");
-    }
-
-    /*****************************
-     * Battery Saver Mode tests. *
-     *****************************/
-
-    public void testBatterySaverModeMetered_disabled() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".BatterySaverModeMeteredTest",
-                "testBackgroundNetworkAccess_disabled");
-    }
-
-    public void testBatterySaverModeMetered_whitelisted() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".BatterySaverModeMeteredTest",
-                "testBackgroundNetworkAccess_whitelisted");
-    }
-
-    public void testBatterySaverModeMetered_enabled() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".BatterySaverModeMeteredTest",
-                "testBackgroundNetworkAccess_enabled");
-    }
-
-    public void testBatterySaverMode_reinstall() throws Exception {
-        if (!isDozeModeEnabled()) {
-            Log.w(TAG, "testBatterySaverMode_reinstall() skipped because device does not support "
-                    + "Doze Mode");
-            return;
-        }
-
-        addPowerSaveModeWhitelist(TEST_APP2_PKG);
-
-        uninstallPackage(TEST_APP2_PKG, true);
-        assertPackageUninstalled(TEST_APP2_PKG);
-        assertPowerSaveModeWhitelist(TEST_APP2_PKG, false);
-
-        installPackage(TEST_APP2_APK);
-        assertPowerSaveModeWhitelist(TEST_APP2_PKG, false);
-    }
-
-    public void testBatterySaverModeNonMetered_disabled() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".BatterySaverModeNonMeteredTest",
-                "testBackgroundNetworkAccess_disabled");
-    }
-
-    public void testBatterySaverModeNonMetered_whitelisted() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".BatterySaverModeNonMeteredTest",
-                "testBackgroundNetworkAccess_whitelisted");
-    }
-
-    public void testBatterySaverModeNonMetered_enabled() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".BatterySaverModeNonMeteredTest",
-                "testBackgroundNetworkAccess_enabled");
-    }
-
-    /*******************
-     * App idle tests. *
-     *******************/
-
-    public void testAppIdleMetered_disabled() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleMeteredTest",
-                "testBackgroundNetworkAccess_disabled");
-    }
-
-    public void testAppIdleMetered_whitelisted() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleMeteredTest",
-                "testBackgroundNetworkAccess_whitelisted");
-    }
-
-    public void testAppIdleMetered_tempWhitelisted() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleMeteredTest",
-                "testBackgroundNetworkAccess_tempWhitelisted");
-    }
-
-    public void testAppIdleMetered_enabled() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleMeteredTest",
-                "testBackgroundNetworkAccess_enabled");
-    }
-
-    public void testAppIdleMetered_idleWhitelisted() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleMeteredTest",
-                "testAppIdleNetworkAccess_idleWhitelisted");
-    }
-
-    // TODO: currently power-save mode and idle uses the same whitelist, so this test would be
-    // redundant (as it would be testing the same as testBatterySaverMode_reinstall())
-    //    public void testAppIdle_reinstall() throws Exception {
-    //    }
-
-    public void testAppIdleNonMetered_disabled() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleNonMeteredTest",
-                "testBackgroundNetworkAccess_disabled");
-    }
-
-    public void testAppIdleNonMetered_whitelisted() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleNonMeteredTest",
-                "testBackgroundNetworkAccess_whitelisted");
-    }
-
-    public void testAppIdleNonMetered_tempWhitelisted() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleNonMeteredTest",
-                "testBackgroundNetworkAccess_tempWhitelisted");
-    }
-
-    public void testAppIdleNonMetered_enabled() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleNonMeteredTest",
-                "testBackgroundNetworkAccess_enabled");
-    }
-
-    public void testAppIdleNonMetered_idleWhitelisted() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleNonMeteredTest",
-                "testAppIdleNetworkAccess_idleWhitelisted");
-    }
-
-    public void testAppIdleNonMetered_whenCharging() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleNonMeteredTest",
-                "testAppIdleNetworkAccess_whenCharging");
-    }
-
-    public void testAppIdleMetered_whenCharging() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleMeteredTest",
-                "testAppIdleNetworkAccess_whenCharging");
-    }
-
-    public void testAppIdle_toast() throws Exception {
-        // Check that showing a toast doesn't bring an app out of standby
-        runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleNonMeteredTest",
-                "testAppIdle_toast");
-    }
-
-    /********************
-     * Doze Mode tests. *
-     ********************/
-
-    public void testDozeModeMetered_disabled() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".DozeModeMeteredTest",
-                "testBackgroundNetworkAccess_disabled");
-    }
-
-    public void testDozeModeMetered_whitelisted() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".DozeModeMeteredTest",
-                "testBackgroundNetworkAccess_whitelisted");
-    }
-
-    public void testDozeModeMetered_enabled() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".DozeModeMeteredTest",
-                "testBackgroundNetworkAccess_enabled");
-    }
-
-    public void testDozeModeMetered_enabledButWhitelistedOnNotificationAction() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".DozeModeMeteredTest",
-                "testBackgroundNetworkAccess_enabledButWhitelistedOnNotificationAction");
-    }
-
-    // TODO: currently power-save mode and idle uses the same whitelist, so this test would be
-    // redundant (as it would be testing the same as testBatterySaverMode_reinstall())
-    //    public void testDozeMode_reinstall() throws Exception {
-    //    }
-
-    public void testDozeModeNonMetered_disabled() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".DozeModeNonMeteredTest",
-                "testBackgroundNetworkAccess_disabled");
-    }
-
-    public void testDozeModeNonMetered_whitelisted() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".DozeModeNonMeteredTest",
-                "testBackgroundNetworkAccess_whitelisted");
-    }
-
-    public void testDozeModeNonMetered_enabled() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".DozeModeNonMeteredTest",
-                "testBackgroundNetworkAccess_enabled");
-    }
-
-    public void testDozeModeNonMetered_enabledButWhitelistedOnNotificationAction()
-            throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".DozeModeNonMeteredTest",
-                "testBackgroundNetworkAccess_enabledButWhitelistedOnNotificationAction");
-    }
-
-    /**********************
-     * Mixed modes tests. *
-     **********************/
-
-    public void testDataAndBatterySaverModes_meteredNetwork() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".MixedModesTest",
-                "testDataAndBatterySaverModes_meteredNetwork");
-    }
-
-    public void testDataAndBatterySaverModes_nonMeteredNetwork() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".MixedModesTest",
-                "testDataAndBatterySaverModes_nonMeteredNetwork");
-    }
-
-    public void testDozeAndBatterySaverMode_powerSaveWhitelists() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".MixedModesTest",
-                "testDozeAndBatterySaverMode_powerSaveWhitelists");
-    }
-
-    public void testDozeAndAppIdle_powerSaveWhitelists() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".MixedModesTest",
-                "testDozeAndAppIdle_powerSaveWhitelists");
-    }
-
-    public void testAppIdleAndDoze_tempPowerSaveWhitelists() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".MixedModesTest",
-                "testAppIdleAndDoze_tempPowerSaveWhitelists");
-    }
-
-    public void testAppIdleAndBatterySaver_tempPowerSaveWhitelists() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".MixedModesTest",
-                "testAppIdleAndBatterySaver_tempPowerSaveWhitelists");
-    }
-
-    public void testDozeAndAppIdle_appIdleWhitelist() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".MixedModesTest",
-                "testDozeAndAppIdle_appIdleWhitelist");
-    }
-
-    public void testAppIdleAndDoze_tempPowerSaveAndAppIdleWhitelists() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".MixedModesTest",
-                "testAppIdleAndDoze_tempPowerSaveAndAppIdleWhitelists");
-    }
-
-    public void testAppIdleAndBatterySaver_tempPowerSaveAndAppIdleWhitelists() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".MixedModesTest",
-                "testAppIdleAndBatterySaver_tempPowerSaveAndAppIdleWhitelists");
-    }
-
-    /*******************
-     * Helper methods. *
-     *******************/
-
-    private void assertRestrictBackgroundWhitelist(int uid, boolean expected) throws Exception {
-        final int max_tries = 5;
-        boolean actual = false;
-        for (int i = 1; i <= max_tries; i++) {
-            final String output = runCommand("cmd netpolicy list restrict-background-whitelist ");
-            actual = output.contains(Integer.toString(uid));
-            if (expected == actual) {
-                return;
-            }
-            Log.v(TAG, "whitelist check for uid " + uid + " doesn't match yet (expected "
-                    + expected + ", got " + actual + "); sleeping 1s before polling again");
-            Thread.sleep(1000);
-        }
-        fail("whitelist check for uid " + uid + " failed: expected "
-                + expected + ", got " + actual);
-    }
-
-    private void assertPowerSaveModeWhitelist(String packageName, boolean expected)
-            throws Exception {
-        // TODO: currently the power-save mode is behaving like idle, but once it changes, we'll
-        // need to use netpolicy for whitelisting
-        assertDelayedCommand("dumpsys deviceidle whitelist =" + packageName,
-                Boolean.toString(expected));
-    }
-
-    /**
-     * Asserts the result of a command, wait and re-running it a couple times if necessary.
-     */
-    private void assertDelayedCommand(String command, String expectedResult)
-            throws InterruptedException, DeviceNotAvailableException {
-        final int maxTries = 5;
-        for (int i = 1; i <= maxTries; i++) {
-            final String result = runCommand(command).trim();
-            if (result.equals(expectedResult)) return;
-            Log.v(TAG, "Command '" + command + "' returned '" + result + " instead of '"
-                    + expectedResult + "' on attempt #; sleeping 1s before polling again");
-            Thread.sleep(1000);
-        }
-        fail("Command '" + command + "' did not return '" + expectedResult + "' after " + maxTries
-                + " attempts");
-    }
-
-    protected void addRestrictBackgroundWhitelist(int uid) throws Exception {
-        runCommand("cmd netpolicy add restrict-background-whitelist " + uid);
-        assertRestrictBackgroundWhitelist(uid, true);
-    }
-
-    private void addPowerSaveModeWhitelist(String packageName) throws Exception {
-        Log.i(TAG, "Adding package " + packageName + " to power-save-mode whitelist");
-        // TODO: currently the power-save mode is behaving like idle, but once it changes, we'll
-        // need to use netpolicy for whitelisting
-        runCommand("dumpsys deviceidle whitelist +" + packageName);
-        assertPowerSaveModeWhitelist(packageName, true); // Sanity check
-    }
-
-    protected boolean isDozeModeEnabled() throws Exception {
-        final String result = runCommand("cmd deviceidle enabled deep").trim();
-        return result.equals("1");
-    }
-}
diff --git a/hostsidetests/net/src/com/android/cts/net/HostsideVpnTests.java b/hostsidetests/net/src/com/android/cts/net/HostsideVpnTests.java
deleted file mode 100644
index 62925ad..0000000
--- a/hostsidetests/net/src/com/android/cts/net/HostsideVpnTests.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * 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 com.android.cts.net;
-
-public class HostsideVpnTests extends HostsideNetworkTestCase {
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        uninstallPackage(TEST_APP2_PKG, false);
-        installPackage(TEST_APP2_APK);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-
-        uninstallPackage(TEST_APP2_PKG, true);
-    }
-
-    public void testDefault() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".VpnTest", "testDefault");
-    }
-
-    public void testAppAllowed() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".VpnTest", "testAppAllowed");
-    }
-
-    public void testAppDisallowed() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".VpnTest", "testAppDisallowed");
-    }
-
-    public void testGetConnectionOwnerUidSecurity() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".VpnTest", "testGetConnectionOwnerUidSecurity");
-    }
-
-    public void testSetProxy() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".VpnTest", "testSetProxy");
-    }
-
-    public void testSetProxyDisallowedApps() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".VpnTest", "testSetProxyDisallowedApps");
-    }
-
-    public void testNoProxy() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".VpnTest", "testNoProxy");
-    }
-
-    public void testBindToNetworkWithProxy() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".VpnTest", "testBindToNetworkWithProxy");
-    }
-
-    public void testVpnMeterednessWithNoUnderlyingNetwork() throws Exception {
-        runDeviceTests(
-                TEST_PKG, TEST_PKG + ".VpnTest", "testVpnMeterednessWithNoUnderlyingNetwork");
-    }
-
-    public void testVpnMeterednessWithNullUnderlyingNetwork() throws Exception {
-        runDeviceTests(
-                TEST_PKG, TEST_PKG + ".VpnTest", "testVpnMeterednessWithNullUnderlyingNetwork");
-    }
-
-    public void testVpnMeterednessWithNonNullUnderlyingNetwork() throws Exception {
-        runDeviceTests(
-                TEST_PKG, TEST_PKG + ".VpnTest", "testVpnMeterednessWithNonNullUnderlyingNetwork");
-    }
-
-    public void testAlwaysMeteredVpnWithNullUnderlyingNetwork() throws Exception {
-        runDeviceTests(
-                TEST_PKG, TEST_PKG + ".VpnTest", "testAlwaysMeteredVpnWithNullUnderlyingNetwork");
-    }
-
-    public void testAlwaysMeteredVpnWithNonNullUnderlyingNetwork() throws Exception {
-        runDeviceTests(
-                TEST_PKG,
-                TEST_PKG + ".VpnTest",
-                "testAlwaysMeteredVpnWithNonNullUnderlyingNetwork");
-    }
-
-    public void testB141603906() throws Exception {
-        runDeviceTests(TEST_PKG, TEST_PKG + ".VpnTest", "testB141603906");
-    }
-}
diff --git a/hostsidetests/net/src/com/android/cts/net/NetworkPolicyTestsPreparer.java b/hostsidetests/net/src/com/android/cts/net/NetworkPolicyTestsPreparer.java
deleted file mode 100644
index 23aca24..0000000
--- a/hostsidetests/net/src/com/android/cts/net/NetworkPolicyTestsPreparer.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.cts.net;
-
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.device.ITestDevice;
-import com.android.tradefed.invoker.TestInformation;
-import com.android.tradefed.log.LogUtil;
-import com.android.tradefed.targetprep.ITargetPreparer;
-
-public class NetworkPolicyTestsPreparer implements ITargetPreparer {
-    private ITestDevice mDevice;
-    private boolean mOriginalAirplaneModeEnabled;
-    private String mOriginalAppStandbyEnabled;
-    private String mOriginalBatteryStatsConstants;
-    private final static String KEY_STABLE_CHARGING_DELAY_MS = "battery_charged_delay_ms";
-    private final static int DESIRED_STABLE_CHARGING_DELAY_MS = 0;
-
-    @Override
-    public void setUp(TestInformation testInformation) throws DeviceNotAvailableException {
-        mDevice = testInformation.getDevice();
-        mOriginalAppStandbyEnabled = getAppStandbyEnabled();
-        setAppStandbyEnabled("1");
-        LogUtil.CLog.d("Original app_standby_enabled: " + mOriginalAppStandbyEnabled);
-
-        mOriginalBatteryStatsConstants = getBatteryStatsConstants();
-        setBatteryStatsConstants(
-                KEY_STABLE_CHARGING_DELAY_MS + "=" + DESIRED_STABLE_CHARGING_DELAY_MS);
-        LogUtil.CLog.d("Original battery_saver_constants: " + mOriginalBatteryStatsConstants);
-
-        mOriginalAirplaneModeEnabled = getAirplaneModeEnabled();
-        // Turn off airplane mode in case another test left the device in that state.
-        setAirplaneModeEnabled(false);
-        LogUtil.CLog.d("Original airplane mode state: " + mOriginalAirplaneModeEnabled);
-    }
-
-    @Override
-    public void tearDown(TestInformation testInformation, Throwable e)
-            throws DeviceNotAvailableException {
-        setAirplaneModeEnabled(mOriginalAirplaneModeEnabled);
-        setAppStandbyEnabled(mOriginalAppStandbyEnabled);
-        setBatteryStatsConstants(mOriginalBatteryStatsConstants);
-    }
-
-    private void setAirplaneModeEnabled(boolean enable) throws DeviceNotAvailableException {
-        executeCmd("cmd connectivity airplane-mode " + (enable ? "enable" : "disable"));
-    }
-
-    private boolean getAirplaneModeEnabled() throws DeviceNotAvailableException {
-        return "enabled".equals(executeCmd("cmd connectivity airplane-mode").trim());
-    }
-
-    private void setAppStandbyEnabled(String appStandbyEnabled) throws DeviceNotAvailableException {
-        if ("null".equals(appStandbyEnabled)) {
-            executeCmd("settings delete global app_standby_enabled");
-        } else {
-            executeCmd("settings put global app_standby_enabled " + appStandbyEnabled);
-        }
-    }
-
-    private String getAppStandbyEnabled() throws DeviceNotAvailableException {
-        return executeCmd("settings get global app_standby_enabled").trim();
-    }
-
-    private void setBatteryStatsConstants(String batteryStatsConstants)
-            throws DeviceNotAvailableException {
-        executeCmd("settings put global battery_stats_constants \"" + batteryStatsConstants + "\"");
-    }
-
-    private String getBatteryStatsConstants() throws DeviceNotAvailableException {
-        return executeCmd("settings get global battery_stats_constants");
-    }
-
-    private String executeCmd(String cmd) throws DeviceNotAvailableException {
-        final String output = mDevice.executeShellCommand(cmd).trim();
-        LogUtil.CLog.d("Output for '%s': %s", cmd, output);
-        return output;
-    }
-}
diff --git a/hostsidetests/net/src/com/android/cts/net/ProcNetTest.java b/hostsidetests/net/src/com/android/cts/net/ProcNetTest.java
deleted file mode 100644
index 19e61c6..0000000
--- a/hostsidetests/net/src/com/android/cts/net/ProcNetTest.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.security.cts;
-
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.device.ITestDevice;
-import com.android.tradefed.testtype.DeviceTestCase;
-import com.android.tradefed.testtype.IBuildReceiver;
-import com.android.tradefed.testtype.IDeviceTest;
-
-import java.lang.Integer;
-import java.lang.String;
-import java.util.Arrays;
-import java.util.List;
-import java.util.ArrayList;
-
-/**
- * Host-side tests for values in /proc/net.
- *
- * These tests analyze /proc/net to verify that certain networking properties are correct.
- */
-public class ProcNetTest extends DeviceTestCase implements IBuildReceiver, IDeviceTest {
-    private static final String SPI_TIMEOUT_SYSCTL = "/proc/sys/net/core/xfrm_acq_expires";
-    private static final int MIN_ACQ_EXPIRES = 3600;
-    // Global sysctls. Must be present and set to 1.
-    private static final String[] GLOBAL_SYSCTLS = {
-        "/proc/sys/net/ipv4/fwmark_reflect",
-        "/proc/sys/net/ipv6/fwmark_reflect",
-        "/proc/sys/net/ipv4/tcp_fwmark_accept",
-    };
-
-    // Per-interface IPv6 autoconf sysctls.
-    private static final String IPV6_SYSCTL_DIR = "/proc/sys/net/ipv6/conf";
-    private static final String AUTOCONF_SYSCTL = "accept_ra_rt_table";
-
-    // Expected values for MIN|MAX_PLEN.
-    private static final String ACCEPT_RA_RT_INFO_MIN_PLEN_STRING = "accept_ra_rt_info_min_plen";
-    private static final int ACCEPT_RA_RT_INFO_MIN_PLEN_VALUE = 48;
-    private static final String ACCEPT_RA_RT_INFO_MAX_PLEN_STRING = "accept_ra_rt_info_max_plen";
-    private static final int ACCEPT_RA_RT_INFO_MAX_PLEN_VALUE = 64;
-    // Expected values for RFC 7559 router soliciations.
-    // Maximum number of router solicitations to send. -1 means no limit.
-    private static final int IPV6_WIFI_ROUTER_SOLICITATIONS = -1;
-    private ITestDevice mDevice;
-    private IBuildInfo mBuild;
-    private String[] mSysctlDirs;
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setBuild(IBuildInfo build) {
-        mBuild = build;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setDevice(ITestDevice device) {
-        super.setDevice(device);
-        mDevice = device;
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mSysctlDirs = getSysctlDirs();
-    }
-
-    private String[] getSysctlDirs() throws Exception {
-        String interfaceDirs[] = mDevice.executeAdbCommand("shell", "ls", "-1",
-                IPV6_SYSCTL_DIR).split("\n");
-        List<String> interfaceDirsList = new ArrayList<String>(Arrays.asList(interfaceDirs));
-        interfaceDirsList.remove("all");
-        interfaceDirsList.remove("lo");
-        return interfaceDirsList.toArray(new String[interfaceDirsList.size()]);
-    }
-
-
-    protected void assertLess(String sysctl, int a, int b) {
-        assertTrue("value of " + sysctl + ": expected < " + b + " but was: " + a, a < b);
-    }
-
-    protected void assertAtLeast(String sysctl, int a, int b) {
-        assertTrue("value of " + sysctl + ": expected >= " + b + " but was: " + a, a >= b);
-    }
-
-    public int readIntFromPath(String path) throws Exception {
-        String mode = mDevice.executeAdbCommand("shell", "stat", "-c", "%a", path).trim();
-        String user = mDevice.executeAdbCommand("shell", "stat", "-c", "%u", path).trim();
-        String group = mDevice.executeAdbCommand("shell", "stat", "-c", "%g", path).trim();
-        assertEquals(mode, "644");
-        assertEquals(user, "0");
-        assertEquals(group, "0");
-        return Integer.parseInt(mDevice.executeAdbCommand("shell", "cat", path).trim());
-    }
-
-    /**
-     * Checks that SPI default timeouts are overridden, and set to a reasonable length of time
-     */
-    public void testMinAcqExpires() throws Exception {
-        int value = readIntFromPath(SPI_TIMEOUT_SYSCTL);
-        assertAtLeast(SPI_TIMEOUT_SYSCTL, value, MIN_ACQ_EXPIRES);
-    }
-
-    /**
-     * Checks that the sysctls for multinetwork kernel features are present and
-     * enabled.
-     */
-    public void testProcSysctls() throws Exception {
-        for (String sysctl : GLOBAL_SYSCTLS) {
-            int value = readIntFromPath(sysctl);
-            assertEquals(sysctl, 1, value);
-        }
-
-        for (String interfaceDir : mSysctlDirs) {
-            String path = IPV6_SYSCTL_DIR + "/" + interfaceDir + "/" + AUTOCONF_SYSCTL;
-            int value = readIntFromPath(path);
-            assertLess(path, value, 0);
-        }
-    }
-
-    /**
-     * Verify that accept_ra_rt_info_{min,max}_plen exists and is set to the expected value
-     */
-    public void testAcceptRaRtInfoMinMaxPlen() throws Exception {
-        for (String interfaceDir : mSysctlDirs) {
-            String path = IPV6_SYSCTL_DIR + "/" + interfaceDir + "/" + "accept_ra_rt_info_min_plen";
-            int value = readIntFromPath(path);
-            assertEquals(path, value, ACCEPT_RA_RT_INFO_MIN_PLEN_VALUE);
-            path = IPV6_SYSCTL_DIR + "/" + interfaceDir + "/" + "accept_ra_rt_info_max_plen";
-            value = readIntFromPath(path);
-            assertEquals(path, value, ACCEPT_RA_RT_INFO_MAX_PLEN_VALUE);
-        }
-    }
-
-    /**
-     * Verify that router_solicitations exists and is set to the expected value
-     * and verify that router_solicitation_max_interval exists and is in an acceptable interval.
-     */
-    public void testRouterSolicitations() throws Exception {
-        for (String interfaceDir : mSysctlDirs) {
-            String path = IPV6_SYSCTL_DIR + "/" + interfaceDir + "/" + "router_solicitations";
-            int value = readIntFromPath(path);
-            assertEquals(IPV6_WIFI_ROUTER_SOLICITATIONS, value);
-            path = IPV6_SYSCTL_DIR + "/" + interfaceDir + "/" + "router_solicitation_max_interval";
-            int interval = readIntFromPath(path);
-            final int lowerBoundSec = 15 * 60;
-            final int upperBoundSec = 60 * 60;
-            assertTrue(lowerBoundSec <= interval);
-            assertTrue(interval <= upperBoundSec);
-        }
-    }
-}
diff --git a/hostsidetests/numberblocking/Android.bp b/hostsidetests/numberblocking/Android.bp
index fea09b4..8f7563f 100644
--- a/hostsidetests/numberblocking/Android.bp
+++ b/hostsidetests/numberblocking/Android.bp
@@ -18,7 +18,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
diff --git a/hostsidetests/numberblocking/app/Android.bp b/hostsidetests/numberblocking/app/Android.bp
index a54cf17..653121d 100644
--- a/hostsidetests/numberblocking/app/Android.bp
+++ b/hostsidetests/numberblocking/app/Android.bp
@@ -25,11 +25,10 @@
         "ctstestrunner-axt",
         "androidx.test.rules",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/os/Android.bp b/hostsidetests/os/Android.bp
index 997bfb9..dabbcbe 100644
--- a/hostsidetests/os/Android.bp
+++ b/hostsidetests/os/Android.bp
@@ -29,7 +29,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/os/app/Android.bp b/hostsidetests/os/app/Android.bp
index 9612332..c240299 100644
--- a/hostsidetests/os/app/Android.bp
+++ b/hostsidetests/os/app/Android.bp
@@ -20,7 +20,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/os/src/android/os/cts/QuiescentBootTests.java b/hostsidetests/os/src/android/os/cts/QuiescentBootTests.java
index ec25a3b..af7a35e 100644
--- a/hostsidetests/os/src/android/os/cts/QuiescentBootTests.java
+++ b/hostsidetests/os/src/android/os/cts/QuiescentBootTests.java
@@ -23,9 +23,11 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assume.assumeTrue;
+import static org.junit.Assume.assumeFalse;
 
 import android.os.PowerManagerInternalProto.Wakefulness;
 
+import com.android.compatibility.common.util.PropertyUtil;
 import com.android.compatibility.common.util.ProtoUtils;
 import com.android.server.power.PowerManagerServiceDumpProto;
 import com.android.tradefed.device.ITestDevice;
@@ -53,6 +55,8 @@
     public synchronized void setUp() throws Exception {
         mDevice = getDevice();
         assumeTrue("Test only applicable to TVs.", hasDeviceFeature(FEATURE_LEANBACK_ONLY));
+        assumeFalse("Test only applicable to devices launching on android R or later.",
+            (PropertyUtil.getFirstApiLevel(mDevice) < 30));
     }
 
     @After
diff --git a/hostsidetests/os/test-apps/EnvironmentTestApp/Android.bp b/hostsidetests/os/test-apps/EnvironmentTestApp/Android.bp
index d6020f2..ea30d9c 100644
--- a/hostsidetests/os/test-apps/EnvironmentTestApp/Android.bp
+++ b/hostsidetests/os/test-apps/EnvironmentTestApp/Android.bp
@@ -23,7 +23,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/os/test-apps/HostLinkVerificationApp/Android.bp b/hostsidetests/os/test-apps/HostLinkVerificationApp/Android.bp
index 5f63d50..6b89473 100644
--- a/hostsidetests/os/test-apps/HostLinkVerificationApp/Android.bp
+++ b/hostsidetests/os/test-apps/HostLinkVerificationApp/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/os/test-apps/InattentiveSleepTestApp/Android.bp b/hostsidetests/os/test-apps/InattentiveSleepTestApp/Android.bp
index 73d747c..a465c17 100644
--- a/hostsidetests/os/test-apps/InattentiveSleepTestApp/Android.bp
+++ b/hostsidetests/os/test-apps/InattentiveSleepTestApp/Android.bp
@@ -20,7 +20,6 @@
     sdk_version: "current",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "cts_instant",
     ],
diff --git a/hostsidetests/os/test-apps/PowerManagerTestApp/Android.bp b/hostsidetests/os/test-apps/PowerManagerTestApp/Android.bp
index 79f5a3f..e8cf353 100644
--- a/hostsidetests/os/test-apps/PowerManagerTestApp/Android.bp
+++ b/hostsidetests/os/test-apps/PowerManagerTestApp/Android.bp
@@ -22,7 +22,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/os/test-apps/ProcfsTestApp/Android.bp b/hostsidetests/os/test-apps/ProcfsTestApp/Android.bp
index ef6a272..4b71269 100644
--- a/hostsidetests/os/test-apps/ProcfsTestApp/Android.bp
+++ b/hostsidetests/os/test-apps/ProcfsTestApp/Android.bp
@@ -22,7 +22,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/os/test-apps/StaticSharedLibConsumerApp1/Android.bp b/hostsidetests/os/test-apps/StaticSharedLibConsumerApp1/Android.bp
index 9ac5b1e..b95f392 100644
--- a/hostsidetests/os/test-apps/StaticSharedLibConsumerApp1/Android.bp
+++ b/hostsidetests/os/test-apps/StaticSharedLibConsumerApp1/Android.bp
@@ -26,7 +26,6 @@
     platform_apis: true,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/os/test-apps/StaticSharedLibConsumerApp2/Android.bp b/hostsidetests/os/test-apps/StaticSharedLibConsumerApp2/Android.bp
index a11c386..f2a40dd 100644
--- a/hostsidetests/os/test-apps/StaticSharedLibConsumerApp2/Android.bp
+++ b/hostsidetests/os/test-apps/StaticSharedLibConsumerApp2/Android.bp
@@ -22,7 +22,6 @@
     sdk_version: "current",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/os/test-apps/StaticSharedLibConsumerApp3/Android.bp b/hostsidetests/os/test-apps/StaticSharedLibConsumerApp3/Android.bp
index 2c55229..95b497c 100644
--- a/hostsidetests/os/test-apps/StaticSharedLibConsumerApp3/Android.bp
+++ b/hostsidetests/os/test-apps/StaticSharedLibConsumerApp3/Android.bp
@@ -22,7 +22,6 @@
     sdk_version: "current",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/os/test-apps/StaticSharedLibProviderApp1/Android.bp b/hostsidetests/os/test-apps/StaticSharedLibProviderApp1/Android.bp
index fe1e3f7..99c1bd5 100644
--- a/hostsidetests/os/test-apps/StaticSharedLibProviderApp1/Android.bp
+++ b/hostsidetests/os/test-apps/StaticSharedLibProviderApp1/Android.bp
@@ -22,7 +22,6 @@
     certificate: ":cts-keyset-test-b",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     optimize: {
diff --git a/hostsidetests/os/test-apps/StaticSharedLibProviderApp2/Android.bp b/hostsidetests/os/test-apps/StaticSharedLibProviderApp2/Android.bp
index 0a79366..d16ac9b 100644
--- a/hostsidetests/os/test-apps/StaticSharedLibProviderApp2/Android.bp
+++ b/hostsidetests/os/test-apps/StaticSharedLibProviderApp2/Android.bp
@@ -21,7 +21,6 @@
     certificate: ":cts-keyset-test-b",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     aaptflags: ["--shared-lib"],
diff --git a/hostsidetests/os/test-apps/StaticSharedLibProviderApp3/Android.bp b/hostsidetests/os/test-apps/StaticSharedLibProviderApp3/Android.bp
index bae3285..4919e6b 100644
--- a/hostsidetests/os/test-apps/StaticSharedLibProviderApp3/Android.bp
+++ b/hostsidetests/os/test-apps/StaticSharedLibProviderApp3/Android.bp
@@ -20,7 +20,6 @@
     certificate: ":cts-keyset-test-b",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     aaptflags: ["--shared-lib"],
diff --git a/hostsidetests/os/test-apps/StaticSharedLibProviderApp4/Android.bp b/hostsidetests/os/test-apps/StaticSharedLibProviderApp4/Android.bp
index f649fb9..83226d0 100644
--- a/hostsidetests/os/test-apps/StaticSharedLibProviderApp4/Android.bp
+++ b/hostsidetests/os/test-apps/StaticSharedLibProviderApp4/Android.bp
@@ -21,7 +21,6 @@
     certificate: ":cts-keyset-test-a",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     optimize: {
diff --git a/hostsidetests/os/test-apps/StaticSharedLibProviderApp5/Android.bp b/hostsidetests/os/test-apps/StaticSharedLibProviderApp5/Android.bp
index 25452c6..aa549ff 100644
--- a/hostsidetests/os/test-apps/StaticSharedLibProviderApp5/Android.bp
+++ b/hostsidetests/os/test-apps/StaticSharedLibProviderApp5/Android.bp
@@ -21,7 +21,6 @@
     certificate: ":cts-keyset-test-b",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     aaptflags: ["--shared-lib"],
diff --git a/hostsidetests/os/test-apps/StaticSharedLibProviderApp6/Android.bp b/hostsidetests/os/test-apps/StaticSharedLibProviderApp6/Android.bp
index 6cf004b..3827722 100644
--- a/hostsidetests/os/test-apps/StaticSharedLibProviderApp6/Android.bp
+++ b/hostsidetests/os/test-apps/StaticSharedLibProviderApp6/Android.bp
@@ -21,7 +21,6 @@
     certificate: ":cts-keyset-test-b",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     aaptflags: ["--shared-lib"],
diff --git a/hostsidetests/os/test-apps/StaticSharedLibProviderApp7/Android.bp b/hostsidetests/os/test-apps/StaticSharedLibProviderApp7/Android.bp
index 64fe8a4..8a2388d 100644
--- a/hostsidetests/os/test-apps/StaticSharedLibProviderApp7/Android.bp
+++ b/hostsidetests/os/test-apps/StaticSharedLibProviderApp7/Android.bp
@@ -23,7 +23,6 @@
     additional_certificates: [":cts-keyset-test-a"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     optimize: {
diff --git a/hostsidetests/os/test-apps/StaticSharedLibProviderAppRecursive/Android.bp b/hostsidetests/os/test-apps/StaticSharedLibProviderAppRecursive/Android.bp
index faef230..b3ee2aa 100644
--- a/hostsidetests/os/test-apps/StaticSharedLibProviderAppRecursive/Android.bp
+++ b/hostsidetests/os/test-apps/StaticSharedLibProviderAppRecursive/Android.bp
@@ -21,7 +21,6 @@
     certificate: ":cts-keyset-test-b",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     optimize: {
diff --git a/hostsidetests/os/test-apps/StaticSharedNativeLibConsumer/Android.bp b/hostsidetests/os/test-apps/StaticSharedNativeLibConsumer/Android.bp
index 5c0a10e..d41aabe 100644
--- a/hostsidetests/os/test-apps/StaticSharedNativeLibConsumer/Android.bp
+++ b/hostsidetests/os/test-apps/StaticSharedNativeLibConsumer/Android.bp
@@ -24,7 +24,6 @@
     compile_multilib: "both",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -38,6 +37,7 @@
         "-Werror",
     ],
     srcs: ["**/*.cpp"],
+    header_libs: ["jni_headers"],
     shared_libs: [
         "liblog",
         "libstaticsharednativelibprovider",
diff --git a/hostsidetests/os/test-apps/StaticSharedNativeLibProvider/Android.bp b/hostsidetests/os/test-apps/StaticSharedNativeLibProvider/Android.bp
index 96525d0..76e2fd5 100644
--- a/hostsidetests/os/test-apps/StaticSharedNativeLibProvider/Android.bp
+++ b/hostsidetests/os/test-apps/StaticSharedNativeLibProvider/Android.bp
@@ -21,7 +21,6 @@
     sdk_version: "current",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     optimize: {
diff --git a/hostsidetests/os/test-apps/StaticSharedNativeLibProvider1/Android.bp b/hostsidetests/os/test-apps/StaticSharedNativeLibProvider1/Android.bp
index 44dc1a3..3062d9e 100644
--- a/hostsidetests/os/test-apps/StaticSharedNativeLibProvider1/Android.bp
+++ b/hostsidetests/os/test-apps/StaticSharedNativeLibProvider1/Android.bp
@@ -21,7 +21,6 @@
     sdk_version: "current",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     optimize: {
diff --git a/hostsidetests/packagemanager/codepath/Android.bp b/hostsidetests/packagemanager/codepath/Android.bp
index 1a33ab0..059f3c6 100644
--- a/hostsidetests/packagemanager/codepath/Android.bp
+++ b/hostsidetests/packagemanager/codepath/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
diff --git a/hostsidetests/packagemanager/codepath/app/Android.bp b/hostsidetests/packagemanager/codepath/app/Android.bp
index 20c5dcf..fc71169 100644
--- a/hostsidetests/packagemanager/codepath/app/Android.bp
+++ b/hostsidetests/packagemanager/codepath/app/Android.bp
@@ -20,7 +20,6 @@
     srcs: ["src/**/*.java",],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: ["androidx.test.rules"],
diff --git a/hostsidetests/packagemanager/dynamicmime/Android.bp b/hostsidetests/packagemanager/dynamicmime/Android.bp
index 0f8938b..3608b51 100644
--- a/hostsidetests/packagemanager/dynamicmime/Android.bp
+++ b/hostsidetests/packagemanager/dynamicmime/Android.bp
@@ -18,7 +18,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
diff --git a/hostsidetests/packagemanager/dynamicmime/app/Android.bp b/hostsidetests/packagemanager/dynamicmime/app/Android.bp
index 9a92556..21fcf05 100644
--- a/hostsidetests/packagemanager/dynamicmime/app/Android.bp
+++ b/hostsidetests/packagemanager/dynamicmime/app/Android.bp
@@ -20,7 +20,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
@@ -35,7 +34,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
@@ -50,7 +48,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
@@ -65,7 +62,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
@@ -80,7 +76,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/packagemanager/dynamicmime/app/src/android/dynamicmime/app/AppMimeGroupsReceiver.java b/hostsidetests/packagemanager/dynamicmime/app/src/android/dynamicmime/app/AppMimeGroupsReceiver.java
index 6ff1cf4..c65fa2e 100644
--- a/hostsidetests/packagemanager/dynamicmime/app/src/android/dynamicmime/app/AppMimeGroupsReceiver.java
+++ b/hostsidetests/packagemanager/dynamicmime/app/src/android/dynamicmime/app/AppMimeGroupsReceiver.java
@@ -50,6 +50,7 @@
         Intent response = new Intent(ACTION_RESPONSE);
         try {
             handleRequest(context, mimeGroup, mimeTypes, requestCode, response);
+            response.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
             context.sendBroadcast(response);
         } catch (IllegalArgumentException ignored) {
         }
diff --git a/hostsidetests/packagemanager/dynamicmime/test/Android.bp b/hostsidetests/packagemanager/dynamicmime/test/Android.bp
index 2816450..b8f2122 100644
--- a/hostsidetests/packagemanager/dynamicmime/test/Android.bp
+++ b/hostsidetests/packagemanager/dynamicmime/test/Android.bp
@@ -27,7 +27,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/packagemanager/dynamicmime/test/src/android/dynamicmime/testapp/util/AppMimeGroups.java b/hostsidetests/packagemanager/dynamicmime/test/src/android/dynamicmime/testapp/util/AppMimeGroups.java
index 935cbf6..0bfc6c6 100644
--- a/hostsidetests/packagemanager/dynamicmime/test/src/android/dynamicmime/testapp/util/AppMimeGroups.java
+++ b/hostsidetests/packagemanager/dynamicmime/test/src/android/dynamicmime/testapp/util/AppMimeGroups.java
@@ -85,6 +85,7 @@
         Intent intent = new Intent(ACTION_REQUEST);
         intent.setPackage(mTargetPackage);
         intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
+        intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
 
         intent.putExtra(EXTRA_GROUP, mimeGroup);
         intent.putExtra(EXTRA_MIMES, mimeTypes);
diff --git a/hostsidetests/packagemanager/extractnativelibs/Android.bp b/hostsidetests/packagemanager/extractnativelibs/Android.bp
index 34c4a4d..634b40d 100644
--- a/hostsidetests/packagemanager/extractnativelibs/Android.bp
+++ b/hostsidetests/packagemanager/extractnativelibs/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
diff --git a/hostsidetests/packagemanager/extractnativelibs/apps/Android.bp b/hostsidetests/packagemanager/extractnativelibs/apps/Android.bp
index 8d1a673..5ae4dd3 100644
--- a/hostsidetests/packagemanager/extractnativelibs/apps/Android.bp
+++ b/hostsidetests/packagemanager/extractnativelibs/apps/Android.bp
@@ -21,6 +21,7 @@
         "-Werror",
         "-Wno-unused-parameter",
     ],
+    header_libs: ["jni_headers"],
     sdk_version: "current",
 }
 
@@ -32,7 +33,6 @@
     manifest: "app_no_extract/AndroidManifest.xml",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     jni_libs: [
@@ -52,7 +52,6 @@
     manifest: "app_extract/AndroidManifest.xml",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     jni_libs: [
diff --git a/hostsidetests/rollback/Android.bp b/hostsidetests/rollback/Android.bp
index 7b02704..9871ab4 100644
--- a/hostsidetests/rollback/Android.bp
+++ b/hostsidetests/rollback/Android.bp
@@ -16,7 +16,8 @@
     name: "CtsRollbackManagerHostTestCases",
     defaults: ["cts_defaults"],
     srcs: ["src/**/*.java"],
-    libs: ["cts-tradefed", "tradefed", "truth-prebuilt"],
+    libs: ["cts-tradefed", "cts-shim-host-lib", "tradefed", "truth-prebuilt"],
+    static_libs: ["cts-install-lib-host"],
     data: [":CtsRollbackManagerHostTestHelperApp", ":CtsRollbackManagerHostTestHelperApp2"],
     test_suites: ["cts", "general-tests"],
 }
diff --git a/hostsidetests/rollback/AndroidTest.xml b/hostsidetests/rollback/AndroidTest.xml
index 766fd9a..c19d529 100644
--- a/hostsidetests/rollback/AndroidTest.xml
+++ b/hostsidetests/rollback/AndroidTest.xml
@@ -33,4 +33,7 @@
     <test class="com.android.tradefed.testtype.HostTest" >
         <option name="class" value="com.android.cts.rollback.host.RollbackManagerHostTest" />
     </test>
+    <!-- Controller that will skip the module if a native bridge situation is detected -->
+    <!-- For example: module wants to run arm and device is x86 -->
+    <object type="module_controller" class="com.android.tradefed.testtype.suite.module.NativeBridgeModuleController" />
 </configuration>
diff --git a/hostsidetests/rollback/app/src/com/android/cts/rollback/host/app/HostTestHelper.java b/hostsidetests/rollback/app/src/com/android/cts/rollback/host/app/HostTestHelper.java
index ac3f8d5..76de24a 100644
--- a/hostsidetests/rollback/app/src/com/android/cts/rollback/host/app/HostTestHelper.java
+++ b/hostsidetests/rollback/app/src/com/android/cts/rollback/host/app/HostTestHelper.java
@@ -16,6 +16,9 @@
 
 package com.android.cts.rollback.host.app;
 
+import static com.android.cts.shim.lib.ShimPackage.PRIVILEGED_SHIM_PACKAGE_NAME;
+import static com.android.cts.shim.lib.ShimPackage.SHIM_APEX_PACKAGE_NAME;
+import static com.android.cts.shim.lib.ShimPackage.SHIM_PACKAGE_NAME;
 import static com.android.cts.rollback.lib.RollbackInfoSubject.assertThat;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -56,10 +59,8 @@
     private static final String TAG = "RollbackTest";
 
     private static final TestApp Apex2SignedBobRotRollback = new TestApp(
-            "Apex2SignedBobRotRollback", TestApp.Apex, 2, /*isApex*/true,
+            "Apex2SignedBobRotRollback", SHIM_APEX_PACKAGE_NAME, 2, /*isApex*/true,
             "com.android.apex.cts.shim.v2_signed_bob_rot_rollback.apex");
-    private static final String ApkInShimApexPackageName = "com.android.cts.ctsshim";
-    private static final String PrivApkInShimApexPackageName = "com.android.cts.priv.ctsshim";
     private static final String APK_VERSION_FILENAME = "ctsrollback_apkversion";
     private static final String APK_VERSION_SEPARATOR = ",";
 
@@ -314,7 +315,7 @@
      */
     @Test
     public void testApexOnlyStagedRollback_Phase1() throws Exception {
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
         Install.single(TestApp.Apex2).setStaged().commit();
     }
 
@@ -324,7 +325,7 @@
      */
     @Test
     public void testApexOnlyStagedRollback_Phase2() throws Exception {
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(2);
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
 
         // keep the versions of the apks in shim apex for verifying in phase3
         recordApkInApexVersion();
@@ -338,20 +339,20 @@
      */
     @Test
     public void testApexOnlyStagedRollback_Phase3() throws Exception {
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(3);
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(3);
 
         long[] versions = retrieveApkInApexVersion();
         final long apkInShimApexVersion = versions[0];
         final long privApkInShimApexVersion = versions[1];
 
-        RollbackInfo available = RollbackUtils.getAvailableRollback(TestApp.Apex);
+        RollbackInfo available = RollbackUtils.getAvailableRollback(SHIM_APEX_PACKAGE_NAME);
         assertThat(available).isStaged();
         assertThat(available).packagesContainsExactly(
                 Rollback.from(TestApp.Apex3).to(TestApp.Apex2),
-                Rollback.from(ApkInShimApexPackageName, 0)
-                        .to(ApkInShimApexPackageName, apkInShimApexVersion),
-                Rollback.from(PrivApkInShimApexPackageName, 0)
-                        .to(PrivApkInShimApexPackageName, privApkInShimApexVersion));
+                Rollback.from(SHIM_PACKAGE_NAME, 0)
+                        .to(SHIM_PACKAGE_NAME, apkInShimApexVersion),
+                Rollback.from(PRIVILEGED_SHIM_PACKAGE_NAME, 0)
+                        .to(PRIVILEGED_SHIM_PACKAGE_NAME, privApkInShimApexVersion));
 
         RollbackUtils.rollback(available.getRollbackId(), TestApp.Apex3);
         RollbackInfo committed = RollbackUtils.getCommittedRollbackById(available.getRollbackId());
@@ -359,17 +360,17 @@
         assertThat(committed).isStaged();
         assertThat(committed).packagesContainsExactly(
                 Rollback.from(TestApp.Apex3).to(TestApp.Apex2),
-                Rollback.from(ApkInShimApexPackageName, 0)
-                        .to(ApkInShimApexPackageName, apkInShimApexVersion),
-                Rollback.from(PrivApkInShimApexPackageName, 0)
-                        .to(PrivApkInShimApexPackageName, privApkInShimApexVersion));
+                Rollback.from(SHIM_PACKAGE_NAME, 0)
+                        .to(SHIM_PACKAGE_NAME, apkInShimApexVersion),
+                Rollback.from(PRIVILEGED_SHIM_PACKAGE_NAME, 0)
+                        .to(PRIVILEGED_SHIM_PACKAGE_NAME, privApkInShimApexVersion));
         assertThat(committed).causePackagesContainsExactly(TestApp.Apex3);
         assertThat(committed.getCommittedSessionId()).isNotEqualTo(-1);
 
         // Note: The app is not rolled back until after the rollback is staged
         // and the device has been rebooted.
         InstallUtils.waitForSessionReady(committed.getCommittedSessionId());
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(3);
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(3);
     }
 
     /**
@@ -378,7 +379,7 @@
      */
     @Test
     public void testApexOnlyStagedRollback_Phase4() throws Exception {
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(2);
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
 
         // Rollback data for shim apex will remain in storage since the apex cannot be completely
         // removed and thus the rollback data won't be expired. Unfortunately, we can't also delete
@@ -390,7 +391,7 @@
      */
     @Test
     public void testApexOnlySystemVersionStagedRollback_Phase1() throws Exception {
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
 
         // keep the versions of the apks in shim apex for verifying in phase2
         recordApkInApexVersion();
@@ -400,20 +401,20 @@
 
     @Test
     public void testApexOnlySystemVersionStagedRollback_Phase2() throws Exception {
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(2);
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
 
         long[] versions = retrieveApkInApexVersion();
         final long apkInShimApexVersion = versions[0];
         final long privApkInShimApexVersion = versions[1];
 
-        RollbackInfo available = RollbackUtils.getAvailableRollback(TestApp.Apex);
+        RollbackInfo available = RollbackUtils.getAvailableRollback(SHIM_APEX_PACKAGE_NAME);
         assertThat(available).isStaged();
         assertThat(available).packagesContainsExactly(
                 Rollback.from(TestApp.Apex2).to(TestApp.Apex1),
-                Rollback.from(ApkInShimApexPackageName, 0)
-                        .to(ApkInShimApexPackageName, apkInShimApexVersion),
-                Rollback.from(PrivApkInShimApexPackageName, 0)
-                        .to(PrivApkInShimApexPackageName, privApkInShimApexVersion));
+                Rollback.from(SHIM_PACKAGE_NAME, 0)
+                        .to(SHIM_PACKAGE_NAME, apkInShimApexVersion),
+                Rollback.from(PRIVILEGED_SHIM_PACKAGE_NAME, 0)
+                        .to(PRIVILEGED_SHIM_PACKAGE_NAME, privApkInShimApexVersion));
 
         RollbackUtils.rollback(available.getRollbackId(), TestApp.Apex2);
         RollbackInfo committed = RollbackUtils.getCommittedRollbackById(available.getRollbackId());
@@ -421,22 +422,22 @@
         assertThat(committed).isStaged();
         assertThat(committed).packagesContainsExactly(
                 Rollback.from(TestApp.Apex2).to(TestApp.Apex1),
-                Rollback.from(ApkInShimApexPackageName, 0)
-                        .to(ApkInShimApexPackageName, apkInShimApexVersion),
-                Rollback.from(PrivApkInShimApexPackageName, 0)
-                        .to(PrivApkInShimApexPackageName, privApkInShimApexVersion));
+                Rollback.from(SHIM_PACKAGE_NAME, 0)
+                        .to(SHIM_PACKAGE_NAME, apkInShimApexVersion),
+                Rollback.from(PRIVILEGED_SHIM_PACKAGE_NAME, 0)
+                        .to(PRIVILEGED_SHIM_PACKAGE_NAME, privApkInShimApexVersion));
         assertThat(committed).causePackagesContainsExactly(TestApp.Apex2);
         assertThat(committed.getCommittedSessionId()).isNotEqualTo(-1);
 
         // Note: The app is not rolled back until after the rollback is staged
         // and the device has been rebooted.
         InstallUtils.waitForSessionReady(committed.getCommittedSessionId());
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(2);
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
     }
 
     @Test
     public void testApexOnlySystemVersionStagedRollback_Phase3() throws Exception {
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
     }
 
     /**
@@ -445,7 +446,7 @@
      */
     @Test
     public void testApexAndApkStagedRollback_Phase1() throws Exception {
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
         assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(-1);
 
         Install.multi(TestApp.Apex2, TestApp.A1).setStaged().commit();
@@ -457,7 +458,7 @@
      */
     @Test
     public void testApexAndApkStagedRollback_Phase2() throws Exception {
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(2);
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
         assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(1);
 
         // keep the versions of the apks in shim apex for verifying in phase3 and phase4
@@ -472,7 +473,7 @@
      */
     @Test
     public void testApexAndApkStagedRollback_Phase3() throws Exception {
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(3);
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(3);
         assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(2);
         InstallUtils.processUserData(TestApp.A);
 
@@ -480,15 +481,15 @@
         final long apkInShimApexVersion = versions[0];
         final long privApkInShimApexVersion = versions[1];
 
-        RollbackInfo available = RollbackUtils.getAvailableRollback(TestApp.Apex);
+        RollbackInfo available = RollbackUtils.getAvailableRollback(SHIM_APEX_PACKAGE_NAME);
         assertThat(available).isStaged();
         assertThat(available).packagesContainsExactly(
                 Rollback.from(TestApp.Apex3).to(TestApp.Apex2),
                 Rollback.from(TestApp.A2).to(TestApp.A1),
-                Rollback.from(ApkInShimApexPackageName, 0)
-                        .to(ApkInShimApexPackageName, apkInShimApexVersion),
-                Rollback.from(PrivApkInShimApexPackageName, 0)
-                        .to(PrivApkInShimApexPackageName, privApkInShimApexVersion));
+                Rollback.from(SHIM_PACKAGE_NAME, 0)
+                        .to(SHIM_PACKAGE_NAME, apkInShimApexVersion),
+                Rollback.from(PRIVILEGED_SHIM_PACKAGE_NAME, 0)
+                        .to(PRIVILEGED_SHIM_PACKAGE_NAME, privApkInShimApexVersion));
 
         RollbackUtils.rollback(available.getRollbackId(), TestApp.Apex3, TestApp.A2);
         RollbackInfo committed = RollbackUtils.getCommittedRollback(TestApp.A);
@@ -497,17 +498,17 @@
         assertThat(committed).packagesContainsExactly(
                 Rollback.from(TestApp.Apex3).to(TestApp.Apex2),
                 Rollback.from(TestApp.A2).to(TestApp.A1),
-                Rollback.from(ApkInShimApexPackageName, 0)
-                        .to(ApkInShimApexPackageName, apkInShimApexVersion),
-                Rollback.from(PrivApkInShimApexPackageName, 0)
-                        .to(PrivApkInShimApexPackageName, privApkInShimApexVersion));
+                Rollback.from(SHIM_PACKAGE_NAME, 0)
+                        .to(SHIM_PACKAGE_NAME, apkInShimApexVersion),
+                Rollback.from(PRIVILEGED_SHIM_PACKAGE_NAME, 0)
+                        .to(PRIVILEGED_SHIM_PACKAGE_NAME, privApkInShimApexVersion));
         assertThat(committed).causePackagesContainsExactly(TestApp.Apex3, TestApp.A2);
         assertThat(committed.getCommittedSessionId()).isNotEqualTo(-1);
 
         // Note: The app is not rolled back until after the rollback is staged
         // and the device has been rebooted.
         InstallUtils.waitForSessionReady(committed.getCommittedSessionId());
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(3);
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(3);
         assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(2);
     }
 
@@ -517,7 +518,7 @@
      */
     @Test
     public void testApexAndApkStagedRollback_Phase4() throws Exception {
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(2);
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
         assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(1);
         InstallUtils.processUserData(TestApp.A);
 
@@ -530,10 +531,10 @@
         assertThat(committed).packagesContainsExactly(
                 Rollback.from(TestApp.Apex3).to(TestApp.Apex2),
                 Rollback.from(TestApp.A2).to(TestApp.A1),
-                Rollback.from(ApkInShimApexPackageName, 0)
-                        .to(ApkInShimApexPackageName, apkInShimApexVersion),
-                Rollback.from(PrivApkInShimApexPackageName, 0)
-                        .to(PrivApkInShimApexPackageName, privApkInShimApexVersion));
+                Rollback.from(SHIM_PACKAGE_NAME, 0)
+                        .to(SHIM_PACKAGE_NAME, apkInShimApexVersion),
+                Rollback.from(PRIVILEGED_SHIM_PACKAGE_NAME, 0)
+                        .to(PRIVILEGED_SHIM_PACKAGE_NAME, privApkInShimApexVersion));
         assertThat(committed).causePackagesContainsExactly(TestApp.Apex3, TestApp.A2);
         assertThat(committed.getCommittedSessionId()).isNotEqualTo(-1);
 
@@ -548,7 +549,7 @@
      */
     @Test
     public void testApexRollbackExpiration_Phase1() throws Exception {
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
 
         Install.single(TestApp.Apex2).setStaged().setEnableRollback().commit();
     }
@@ -559,8 +560,8 @@
      */
     @Test
     public void testApexRollbackExpiration_Phase2() throws Exception {
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(2);
-        assertThat(RollbackUtils.getAvailableRollback(TestApp.Apex)).isNotNull();
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
+        assertThat(RollbackUtils.getAvailableRollback(SHIM_APEX_PACKAGE_NAME)).isNotNull();
         Install.single(TestApp.Apex3).setStaged().commit();
     }
 
@@ -570,8 +571,8 @@
      */
     @Test
     public void testApexRollbackExpiration_Phase3() throws Exception {
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(3);
-        assertThat(RollbackUtils.getAvailableRollback(TestApp.Apex)).isNull();
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(3);
+        assertThat(RollbackUtils.getAvailableRollback(SHIM_APEX_PACKAGE_NAME)).isNull();
     }
 
     /**
@@ -579,7 +580,7 @@
      */
     @Test
     public void testApexKeyRotationStagedRollback_Phase1() throws Exception {
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
 
         // keep the versions of the apks in shim apex for verifying in phase2
         recordApkInApexVersion();
@@ -589,8 +590,8 @@
 
     @Test
     public void testApexKeyRotationStagedRollback_Phase2() throws Exception {
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(2);
-        RollbackInfo available = RollbackUtils.getAvailableRollback(TestApp.Apex);
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
+        RollbackInfo available = RollbackUtils.getAvailableRollback(SHIM_APEX_PACKAGE_NAME);
         long[] versions = retrieveApkInApexVersion();
         final long apkInShimApexVersion = versions[0];
         final long privApkInShimApexVersion = versions[1];
@@ -598,10 +599,10 @@
         assertThat(available).isStaged();
         assertThat(available).packagesContainsExactly(
                 Rollback.from(Apex2SignedBobRotRollback).to(TestApp.Apex1),
-                Rollback.from(ApkInShimApexPackageName, 0)
-                        .to(ApkInShimApexPackageName, apkInShimApexVersion),
-                Rollback.from(PrivApkInShimApexPackageName, 0)
-                        .to(PrivApkInShimApexPackageName, privApkInShimApexVersion));
+                Rollback.from(SHIM_PACKAGE_NAME, 0)
+                        .to(SHIM_PACKAGE_NAME, apkInShimApexVersion),
+                Rollback.from(PRIVILEGED_SHIM_PACKAGE_NAME, 0)
+                        .to(PRIVILEGED_SHIM_PACKAGE_NAME, privApkInShimApexVersion));
 
         RollbackUtils.rollback(available.getRollbackId(), Apex2SignedBobRotRollback);
         RollbackInfo committed = RollbackUtils.getCommittedRollbackById(available.getRollbackId());
@@ -609,22 +610,22 @@
         assertThat(committed).isStaged();
         assertThat(committed).packagesContainsExactly(
                 Rollback.from(Apex2SignedBobRotRollback).to(TestApp.Apex1),
-                Rollback.from(ApkInShimApexPackageName, 0)
-                        .to(ApkInShimApexPackageName, apkInShimApexVersion),
-                Rollback.from(PrivApkInShimApexPackageName, 0)
-                        .to(PrivApkInShimApexPackageName, privApkInShimApexVersion));
+                Rollback.from(SHIM_PACKAGE_NAME, 0)
+                        .to(SHIM_PACKAGE_NAME, apkInShimApexVersion),
+                Rollback.from(PRIVILEGED_SHIM_PACKAGE_NAME, 0)
+                        .to(PRIVILEGED_SHIM_PACKAGE_NAME, privApkInShimApexVersion));
         assertThat(committed).causePackagesContainsExactly(Apex2SignedBobRotRollback);
         assertThat(committed.getCommittedSessionId()).isNotEqualTo(-1);
 
         // Note: The app is not rolled back until after the rollback is staged
         // and the device has been rebooted.
         InstallUtils.waitForSessionReady(committed.getCommittedSessionId());
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(2);
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
     }
 
     @Test
     public void testApexKeyRotationStagedRollback_Phase3() throws Exception {
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
     }
 
     @Test
@@ -649,19 +650,12 @@
         assertThat(RollbackUtils.getRollbackManager().getAvailableRollbacks()).isEmpty();
     }
 
-    @Test
-    public void isCheckpointSupported() {
-        Context context = InstrumentationRegistry.getInstrumentation().getContext();
-        StorageManager sm = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
-        assertThat(sm.isCheckpointSupported()).isTrue();
-    }
-
     /**
      * Record the versions of Apk in shim apex and PrivApk in shim apex
      * in the order into {@link #APK_VERSION_FILENAME}.
      *
-     * @see #ApkInShimApexPackageName
-     * @see #PrivApkInShimApexPackageName
+     * @see ShimPackage#SHIM_PACKAGE_NAME
+     * @see ShimPackage#PRIVILEGED_SHIM_PACKAGE_NAME
      */
     private void recordApkInApexVersion() throws Exception {
         final File versionFile = getApkInApexVersionFile();
@@ -670,9 +664,9 @@
             versionFile.createNewFile();
         }
 
-        final long apkInApexVersion = InstallUtils.getInstalledVersion(ApkInShimApexPackageName);
+        final long apkInApexVersion = InstallUtils.getInstalledVersion(SHIM_PACKAGE_NAME);
         final long privApkInApexVersion = InstallUtils.getInstalledVersion(
-                PrivApkInShimApexPackageName);
+                PRIVILEGED_SHIM_PACKAGE_NAME);
 
         try (BufferedWriter writer = new BufferedWriter(new FileWriter(versionFile))) {
             writer.write(apkInApexVersion + APK_VERSION_SEPARATOR + privApkInApexVersion);
@@ -683,8 +677,8 @@
      * Returns the array of the versions of Apk in shim apex and PrivApk in shim apex
      * in the order from {@link #APK_VERSION_FILENAME}.
      *
-     * @see #ApkInShimApexPackageName
-     * @see #PrivApkInShimApexPackageName
+     * @see ShimPackage#SHIM_PACKAGE_NAME
+     * @see ShimPackage#PRIVILEGED_SHIM_PACKAGE_NAME
      */
     private long[] retrieveApkInApexVersion() throws Exception {
         final File versionFile = getApkInApexVersionFile();
diff --git a/hostsidetests/rollback/src/com/android/cts/rollback/host/RollbackManagerHostTest.java b/hostsidetests/rollback/src/com/android/cts/rollback/host/RollbackManagerHostTest.java
index 157b2ae..0a0ea0d 100644
--- a/hostsidetests/rollback/src/com/android/cts/rollback/host/RollbackManagerHostTest.java
+++ b/hostsidetests/rollback/src/com/android/cts/rollback/host/RollbackManagerHostTest.java
@@ -23,9 +23,8 @@
 import static org.junit.Assume.assumeThat;
 import static org.junit.Assume.assumeTrue;
 
-import com.android.ddmlib.Log;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.device.ITestDevice;
+import android.cts.install.lib.host.InstallUtilsHost;
+
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
 import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
@@ -41,8 +40,7 @@
 public class RollbackManagerHostTest extends BaseHostJUnit4Test {
 
     private static final String TAG = "RollbackManagerHostTest";
-
-    private static final String SHIM_APEX_PACKAGE_NAME = "com.android.apex.cts.shim";
+    private final InstallUtilsHost mHostUtils = new InstallUtilsHost(this);
 
     /**
      * Runs the helper app test method on device.
@@ -67,55 +65,6 @@
     }
 
     /**
-     * Return {@code true} if and only if device supports updating apex.
-     */
-    private boolean isApexUpdateSupported() throws Exception {
-        return "true".equals(getDevice().getProperty("ro.apex.updatable"));
-    }
-
-    /**
-     * Uninstalls a shim apex only if it's latest version is installed on /data partition (i.e.
-     * it has a version higher than {@code 1}).
-     *
-     * <p>This is purely to optimize tests run time, since uninstalling an apex requires a reboot.
-     */
-    private void uninstallShimApexIfNecessary() throws Exception {
-        if (!isApexUpdateSupported()) {
-            // Device doesn't support updating apex. Nothing to uninstall.
-            return;
-        }
-
-        if (getShimApex().sourceDir.startsWith("/data")) {
-            final String errorMessage = getDevice().uninstallPackage(SHIM_APEX_PACKAGE_NAME);
-            if (errorMessage == null) {
-                Log.i(TAG, "Uninstalling shim apex");
-                getDevice().reboot();
-            } else {
-                Log.e(TAG, "Failed to uninstall shim APEX : " + errorMessage);
-            }
-        }
-        assertThat(getShimApex().versionCode).isEqualTo(1L);
-    }
-
-    /**
-     * Get {@link ITestDevice.ApexInfo} for the installed shim apex.
-     */
-    private ITestDevice.ApexInfo getShimApex() throws DeviceNotAvailableException {
-        return getDevice().getActiveApexes().stream().filter(
-                apex -> apex.name.equals(SHIM_APEX_PACKAGE_NAME)).findAny().orElseThrow(
-                () -> new AssertionError("Can't find " + SHIM_APEX_PACKAGE_NAME));
-    }
-
-    private boolean isCheckpointSupported() throws Exception {
-        try {
-            run("isCheckpointSupported");
-            return true;
-        } catch (AssertionError ignore) {
-            return false;
-        }
-    }
-
-    /**
      * Uninstalls any version greater than 1 of shim apex and reboots the device if necessary
      * to complete the uninstall.
      *
@@ -131,7 +80,7 @@
         getDevice().executeShellCommand("pm uninstall com.android.cts.install.lib.testapp.A");
         getDevice().executeShellCommand("pm uninstall com.android.cts.install.lib.testapp.B");
         run("cleanUp");
-        uninstallShimApexIfNecessary();
+        mHostUtils.uninstallShimApexIfNecessary();
     }
 
     /**
@@ -151,7 +100,9 @@
      */
     @Test
     public void testApkOnlyMultipleStagedRollback() throws Exception {
-        assumeTrue(isCheckpointSupported());
+        assumeTrue("Device does not support file-system checkpoint",
+                mHostUtils.isCheckpointSupported());
+
         run("testApkOnlyMultipleStagedRollback_Phase1");
         getDevice().reboot();
         run("testApkOnlyMultipleStagedRollback_Phase2");
@@ -164,7 +115,9 @@
      */
     @Test
     public void testApkOnlyMultipleStagedPartialRollback() throws Exception {
-        assumeTrue(isCheckpointSupported());
+        assumeTrue("Device does not support file-system checkpoint",
+                mHostUtils.isCheckpointSupported());
+
         run("testApkOnlyMultipleStagedPartialRollback_Phase1");
         getDevice().reboot();
         run("testApkOnlyMultipleStagedPartialRollback_Phase2");
@@ -177,7 +130,7 @@
      */
     @Test
     public void testApexOnlyStagedRollback() throws Exception {
-        assumeTrue("Device does not support updating APEX", isApexUpdateSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         run("testApexOnlyStagedRollback_Phase1");
         getDevice().reboot();
@@ -193,7 +146,7 @@
      */
     @Test
     public void testApexOnlySystemVersionStagedRollback() throws Exception {
-        assumeTrue("Device does not support updating APEX", isApexUpdateSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         run("testApexOnlySystemVersionStagedRollback_Phase1");
         getDevice().reboot();
@@ -207,7 +160,7 @@
      */
     @Test
     public void testApexAndApkStagedRollback() throws Exception {
-        assumeTrue("Device does not support updating APEX", isApexUpdateSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         run("testApexAndApkStagedRollback_Phase1");
         getDevice().reboot();
@@ -223,7 +176,7 @@
      */
     @Test
     public void testApexRollbackExpiration() throws Exception {
-        assumeTrue("Device does not support updating APEX", isApexUpdateSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         run("testApexRollbackExpiration_Phase1");
         getDevice().reboot();
@@ -237,7 +190,7 @@
      */
     @Test
     public void testApexKeyRotationStagedRollback() throws Exception {
-        assumeTrue("Device does not support updating APEX", isApexUpdateSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         run("testApexKeyRotationStagedRollback_Phase1");
         getDevice().reboot();
diff --git a/hostsidetests/sample/Android.bp b/hostsidetests/sample/Android.bp
index 514085b..781babd 100644
--- a/hostsidetests/sample/Android.bp
+++ b/hostsidetests/sample/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
diff --git a/hostsidetests/scopedstorage/AndroidTest.xml b/hostsidetests/scopedstorage/AndroidTest.xml
index 43208ac..bbdf653 100644
--- a/hostsidetests/scopedstorage/AndroidTest.xml
+++ b/hostsidetests/scopedstorage/AndroidTest.xml
@@ -18,6 +18,7 @@
     <option name="config-descriptor:metadata" key="component" value="framework" />
     <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
     <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
+    <!-- TODO(b/169101565): change to secondary_user when fixed -->
     <option name="config-descriptor:metadata" key="parameter" value="not_secondary_user" />
     <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
         <option name="cleanup-apks" value="true" />
diff --git a/hostsidetests/scopedstorage/OWNERS b/hostsidetests/scopedstorage/OWNERS
index 9156e6b..0b2799a 100644
--- a/hostsidetests/scopedstorage/OWNERS
+++ b/hostsidetests/scopedstorage/OWNERS
@@ -1,6 +1,6 @@
+corinac@google.com
 jsharkey@android.com
 maco@google.com
 marcone@google.com
 nandana@google.com
-shafik@google.com
 zezeozue@google.com
diff --git a/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/BaseHostTestCase.java b/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/BaseHostTestCase.java
new file mode 100644
index 0000000..983cc66
--- /dev/null
+++ b/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/BaseHostTestCase.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2020 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.scopedstorage.cts.host;
+
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.device.NativeDevice;
+import com.android.tradefed.log.LogUtil.CLog;
+import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
+
+abstract class BaseHostTestCase extends BaseHostJUnit4Test {
+    private int mCurrentUserId = NativeDevice.INVALID_USER_ID;
+
+    protected String executeShellCommand(String cmd, Object... args) throws Exception {
+        return getDevice().executeShellCommand(String.format(cmd, args));
+    }
+
+    protected int getCurrentUserId() throws Exception {
+        setCurrentUserId();
+
+        return mCurrentUserId;
+    }
+
+    private void setCurrentUserId() throws Exception {
+        if (mCurrentUserId != NativeDevice.INVALID_USER_ID) return;
+
+        ITestDevice device = getDevice();
+        mCurrentUserId = device.getCurrentUser();
+        CLog.i("Current user: %d");
+    }
+}
diff --git a/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/LegacyStorageHostTest.java b/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/LegacyStorageHostTest.java
index 8729f9b..594fd6a 100644
--- a/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/LegacyStorageHostTest.java
+++ b/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/LegacyStorageHostTest.java
@@ -18,12 +18,10 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.junit.Assert.assertTrue;
-
 import android.platform.test.annotations.AppModeFull;
 
+import com.android.tradefed.device.contentprovider.ContentProviderHandler;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
 import org.junit.After;
 import org.junit.Before;
@@ -35,20 +33,19 @@
  */
 @RunWith(DeviceJUnit4ClassRunner.class)
 @AppModeFull
-public class LegacyStorageHostTest extends BaseHostJUnit4Test {
-    private boolean isExternalStorageSetup = false;
+public class LegacyStorageHostTest extends BaseHostTestCase {
 
-    private String executeShellCommand(String cmd) throws Exception {
-        return getDevice().executeShellCommand(cmd);
-    }
+    private boolean mIsExternalStorageSetup;
+
+    private ContentProviderHandler mContentProviderHandler;
 
     /**
      * Runs the given phase of LegacyFileAccessTest by calling into the device.
      * Throws an exception if the test phase fails.
      */
     void runDeviceTest(String phase) throws Exception {
-        assertTrue(runDeviceTests("android.scopedstorage.cts.legacy",
-                "android.scopedstorage.cts.legacy.LegacyStorageTest", phase));
+        assertThat(runDeviceTests("android.scopedstorage.cts.legacy",
+                "android.scopedstorage.cts.legacy.LegacyStorageTest", phase)).isTrue();
     }
 
     /**
@@ -56,14 +53,18 @@
      * so in order to test a case where the reader has only WRITE, we must explicitly revoke READ.
      */
     private void grantPermissions(String... perms) throws Exception {
+        int currentUserId = getCurrentUserId();
         for (String perm : perms) {
-            executeShellCommand("pm grant android.scopedstorage.cts.legacy " + perm);
+            executeShellCommand("pm grant --user %d android.scopedstorage.cts.legacy %s",
+                    currentUserId, perm);
         }
     }
 
     private void revokePermissions(String... perms) throws Exception {
+        int currentUserId = getCurrentUserId();
         for (String perm : perms) {
-            executeShellCommand("pm revoke android.scopedstorage.cts.legacy " + perm);
+            executeShellCommand("pm revoke --user %d android.scopedstorage.cts.legacy %s",
+                    currentUserId, perm);
         }
     }
 
@@ -72,19 +73,21 @@
      * creating file.
      */
     private void createFileAsShell(String filePath) throws Exception {
-        executeShellCommand("touch " + filePath);
+        executeShellCommand("touch %s", filePath);
         assertThat(getDevice().doesFileExist(filePath)).isTrue();
     }
 
     private void setupExternalStorage() throws Exception {
-        if (!isExternalStorageSetup) {
+        if (!mIsExternalStorageSetup) {
             runDeviceTest("setupExternalStorage");
-            isExternalStorageSetup = true;
+            mIsExternalStorageSetup = true;
         }
     }
 
     @Before
     public void setup() throws Exception {
+        mContentProviderHandler = new ContentProviderHandler(getDevice());
+        mContentProviderHandler.setUp();
         setupExternalStorage();
         // Granting WRITE automatically grants READ as well, so we grant them both explicitly by
         // default in order to avoid confusion. Test cases that don't want any of those permissions
@@ -95,6 +98,7 @@
 
     @After
     public void tearDown() throws Exception {
+        mContentProviderHandler.tearDown();
         revokePermissions("android.permission.WRITE_EXTERNAL_STORAGE",
                 "android.permission.READ_EXTERNAL_STORAGE");
     }
diff --git a/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/PublicVolumeHostTest.java b/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/PublicVolumeHostTest.java
index dbfa9fb..256540a 100644
--- a/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/PublicVolumeHostTest.java
+++ b/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/PublicVolumeHostTest.java
@@ -16,7 +16,7 @@
 
 package android.scopedstorage.cts.host;
 
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.android.tradefed.device.ITestDevice;
 
@@ -25,16 +25,14 @@
 
 public class PublicVolumeHostTest extends ScopedStorageHostTest {
     /** Used to clean up the virtual volume after the test */
-    private static ITestDevice sDevice = null;
-    private boolean mIsPublicVolumeSetup = false;
-    String executeShellCommand(String cmd) throws Exception {
-        return getDevice().executeShellCommand(cmd);
-    }
+    private static ITestDevice sDevice;
+    private boolean mIsPublicVolumeSetup;
 
     private void setupNewPublicVolume() throws Exception {
         if (!mIsPublicVolumeSetup) {
-            assertTrue(runDeviceTests("android.scopedstorage.cts",
-                    "android.scopedstorage.cts.PublicVolumeTestHelper", "setupNewPublicVolume"));
+            assertThat(runDeviceTests("android.scopedstorage.cts",
+                    "android.scopedstorage.cts.PublicVolumeTestHelper", "setupNewPublicVolume"))
+                            .isTrue();
             mIsPublicVolumeSetup = true;
         }
     }
@@ -51,8 +49,8 @@
      */
     @Override
     void runDeviceTest(String phase) throws Exception {
-        assertTrue(runDeviceTests("android.scopedstorage.cts",
-                "android.scopedstorage.cts.PublicVolumeTest", phase));
+        assertThat(runDeviceTests("android.scopedstorage.cts",
+                "android.scopedstorage.cts.PublicVolumeTest", phase)).isTrue();
     }
 
     @Before
diff --git a/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/PublicVolumeLegacyHostTest.java b/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/PublicVolumeLegacyHostTest.java
index c9bd65f..4b38df1 100644
--- a/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/PublicVolumeLegacyHostTest.java
+++ b/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/PublicVolumeLegacyHostTest.java
@@ -16,7 +16,7 @@
 
 package android.scopedstorage.cts.host;
 
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
@@ -33,8 +33,9 @@
 
     private void setupNewPublicVolume() throws Exception {
         if (!mIsPublicVolumeSetup) {
-            assertTrue(runDeviceTests("android.scopedstorage.cts",
-                    "android.scopedstorage.cts.PublicVolumeTestHelper", "setupNewPublicVolume"));
+            assertThat(runDeviceTests("android.scopedstorage.cts",
+                    "android.scopedstorage.cts.PublicVolumeTestHelper", "setupNewPublicVolume"))
+                            .isTrue();
             mIsPublicVolumeSetup = true;
         }
     }
@@ -51,8 +52,8 @@
      */
     @Override
     void runDeviceTest(String phase) throws Exception {
-        assertTrue(runDeviceTests("android.scopedstorage.cts.legacy",
-                "android.scopedstorage.cts.legacy.PublicVolumeLegacyTest", phase));
+        assertThat(runDeviceTests("android.scopedstorage.cts.legacy",
+                "android.scopedstorage.cts.legacy.PublicVolumeLegacyTest", phase)).isTrue();
     }
 
     @Before
diff --git a/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/ScopedStorageHostTest.java b/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/ScopedStorageHostTest.java
index b20342c..9e29480 100644
--- a/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/ScopedStorageHostTest.java
+++ b/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/ScopedStorageHostTest.java
@@ -16,13 +16,13 @@
 
 package android.scopedstorage.cts.host;
 
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 
 import android.platform.test.annotations.AppModeFull;
 
 import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.device.contentprovider.ContentProviderHandler;
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 import com.android.tradefed.testtype.junit4.DeviceTestRunOptions;
 
 import org.junit.After;
@@ -35,17 +35,18 @@
  */
 @RunWith(DeviceJUnit4ClassRunner.class)
 @AppModeFull
-public class ScopedStorageHostTest extends BaseHostJUnit4Test {
-    private boolean mIsExternalStorageSetup = false;
+public class ScopedStorageHostTest extends BaseHostTestCase {
+    private boolean mIsExternalStorageSetup;
+
+    private ContentProviderHandler mContentProviderHandler;
 
     /**
      * Runs the given phase of ScopedStorageTest by calling into the device.
      * Throws an exception if the test phase fails.
      */
     void runDeviceTest(String phase) throws Exception {
-        assertTrue(runDeviceTests("android.scopedstorage.cts",
-                "android.scopedstorage.cts.ScopedStorageTest", phase));
-
+        assertThat(runDeviceTests("android.scopedstorage.cts",
+                "android.scopedstorage.cts.ScopedStorageTest", phase)).isTrue();
     }
 
     /**
@@ -61,10 +62,6 @@
             .setDisableIsolatedStorage(true));
     }
 
-    String executeShellCommand(String cmd) throws Exception {
-        return getDevice().executeShellCommand(cmd);
-    }
-
     private void setupExternalStorage() throws Exception {
         if (!mIsExternalStorageSetup) {
             runDeviceTest("setupExternalStorage");
@@ -74,6 +71,11 @@
 
     @Before
     public void setup() throws Exception {
+        // Set up content provider. This would install android.tradefed.contentprovider
+        // which is used to create and delete files/Dir on device side test.
+        mContentProviderHandler = new ContentProviderHandler(getDevice());
+        mContentProviderHandler.setUp();
+
         setupExternalStorage();
         executeShellCommand("mkdir /sdcard/Android/data/com.android.shell -m 2770");
         executeShellCommand("mkdir /sdcard/Android/data/com.android.shell/files -m 2770");
@@ -87,6 +89,7 @@
 
     @After
     public void tearDown() throws Exception {
+        mContentProviderHandler.tearDown();
         executeShellCommand("rm -r /sdcard/Android/data/com.android.shell");
     }
 
@@ -512,14 +515,18 @@
     }
 
     private void grantPermissions(String... perms) throws Exception {
+        int currentUserId = getCurrentUserId();
         for (String perm : perms) {
-            executeShellCommand("pm grant android.scopedstorage.cts " + perm);
+            executeShellCommand("pm grant --user %d android.scopedstorage.cts %s",
+                    currentUserId, perm);
         }
     }
 
     private void revokePermissions(String... perms) throws Exception {
+        int currentUserId = getCurrentUserId();
         for (String perm : perms) {
-            executeShellCommand("pm revoke android.scopedstorage.cts " + perm);
+            executeShellCommand("pm revoke --user %d android.scopedstorage.cts %s",
+                    currentUserId, perm);
         }
     }
 
diff --git a/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/ScopedStorageInstantAppHostTest.java b/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/ScopedStorageInstantAppHostTest.java
index c97b41f..50fd029 100644
--- a/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/ScopedStorageInstantAppHostTest.java
+++ b/hostsidetests/scopedstorage/host/src/android/scopedstorage/cts/host/ScopedStorageInstantAppHostTest.java
@@ -16,12 +16,11 @@
 
 package android.scopedstorage.cts.host;
 
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 
 import android.platform.test.annotations.AppModeInstant;
 
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -30,14 +29,14 @@
  * Runs the ScopedStorageTest tests for an instant app.
  */
 @RunWith(DeviceJUnit4ClassRunner.class)
-public class ScopedStorageInstantAppHostTest extends BaseHostJUnit4Test {
+public class ScopedStorageInstantAppHostTest extends BaseHostTestCase {
     /**
      * Runs the given phase of Test by calling into the device.
      * Throws an exception if the test phase fails.
      */
     protected void runDeviceTest(String phase) throws Exception {
-        assertTrue(runDeviceTests("android.scopedstorage.cts",
-                "android.scopedstorage.cts.ScopedStorageTest", phase));
+        assertThat(runDeviceTests("android.scopedstorage.cts",
+                "android.scopedstorage.cts.ScopedStorageTest", phase)).isTrue();
     }
 
     @Test
diff --git a/hostsidetests/scopedstorage/legacy/src/android/scopedstorage/cts/legacy/LegacyStorageTest.java b/hostsidetests/scopedstorage/legacy/src/android/scopedstorage/cts/legacy/LegacyStorageTest.java
index 4596cab..071469a 100644
--- a/hostsidetests/scopedstorage/legacy/src/android/scopedstorage/cts/legacy/LegacyStorageTest.java
+++ b/hostsidetests/scopedstorage/legacy/src/android/scopedstorage/cts/legacy/LegacyStorageTest.java
@@ -109,6 +109,7 @@
      * test runs.
      */
     static final String NONCE = String.valueOf(System.nanoTime());
+    static final String CONTENT_PROVIDER_URL = "content://android.tradefed.contentprovider";
 
     static final String IMAGE_FILE_NAME = "LegacyStorageTest_file_" + NONCE + ".jpg";
     static final String VIDEO_FILE_NAME = "LegacyStorageTest_file_" + NONCE + ".mp4";
@@ -132,7 +133,7 @@
 
     @After
     public void teardown() throws Exception {
-        executeShellCommand("rm " + getShellFile());
+        deleteFileInExternalDir(getShellFile());
         MediaStore.scanFile(getContentResolver(), getShellFile());
     }
 
@@ -221,7 +222,7 @@
         final File existingFile = getShellFile();
 
         try {
-            executeShellCommand("touch " + existingFile);
+            createFileInExternalDir(existingFile);
             MediaStore.scanFile(getContentResolver(), existingFile);
             Os.open(existingFile.getPath(), OsConstants.O_RDONLY, /*mode*/ 0);
             fail("Opening file for read expected to fail: " + existingFile);
@@ -274,7 +275,7 @@
         // can open file for read
         FileDescriptor fd = null;
         try {
-            executeShellCommand("touch " + existingFile);
+            createFileInExternalDir(existingFile);
             MediaStore.scanFile(getContentResolver(), existingFile);
             fd = Os.open(existingFile.getPath(), OsConstants.O_RDONLY, /*mode*/ 0);
         } finally {
@@ -316,7 +317,7 @@
         pollForPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, /*granted*/ false);
         final File shellFile = getShellFile();
 
-        executeShellCommand("touch " + getShellFile());
+        createFileInExternalDir(shellFile);
         MediaStore.scanFile(getContentResolver(), getShellFile());
         // can list a non-media file created by other package.
         assertThat(Arrays.asList(shellFile.getParentFile().list()))
@@ -384,7 +385,7 @@
                 new File(TestUtils.getExternalMediaDir(),
                         "LegacyFileAccessTest2");
         try {
-            executeShellCommand("touch " + shellFile1);
+            createFileInExternalDir(shellFile1);
             MediaStore.scanFile(getContentResolver(), shellFile1);
             // app can't rename shell file.
             assertCantRenameFile(shellFile1, shellFile2);
@@ -419,7 +420,7 @@
                 new File(TestUtils.getExternalMediaDir(),
                         "LegacyFileAccessTest2");
         try {
-            executeShellCommand("touch " + shellFile1);
+            createFileInExternalDir(shellFile1);
             MediaStore.scanFile(getContentResolver(), shellFile1);
             // app can't rename shell file.
             assertCantRenameFile(shellFile1, shellFile2);
@@ -821,4 +822,14 @@
         return new File(TestUtils.getExternalStorageDir(),
                 "LegacyAccessHostTest_shell");
     }
+
+    private void createFileInExternalDir(File file) throws Exception {
+        Log.d(TAG, "Creating file " + file + " in the external Directory");
+        getContentResolver().openFile(Uri.parse(CONTENT_PROVIDER_URL + file.getPath()), "w", null);
+    }
+
+    private void deleteFileInExternalDir(File file) throws Exception {
+        Log.d(TAG, "Deleting file " + file + " from the external Directory");
+        getContentResolver().delete(Uri.parse(CONTENT_PROVIDER_URL + file.getPath()), null, null);
+    }
 }
diff --git a/hostsidetests/scopedstorage/libs/ScopedStorageTestLib/src/android/scopedstorage/cts/lib/TestUtils.java b/hostsidetests/scopedstorage/libs/ScopedStorageTestLib/src/android/scopedstorage/cts/lib/TestUtils.java
index 9237046..636972a 100644
--- a/hostsidetests/scopedstorage/libs/ScopedStorageTestLib/src/android/scopedstorage/cts/lib/TestUtils.java
+++ b/hostsidetests/scopedstorage/libs/ScopedStorageTestLib/src/android/scopedstorage/cts/lib/TestUtils.java
@@ -170,7 +170,8 @@
     /**
      * Executes a shell command.
      */
-    public static String executeShellCommand(String command) throws IOException {
+    public static String executeShellCommand(String pattern, Object...args) throws IOException {
+        String command = String.format(pattern, args);
         int attempt = 0;
         while (attempt++ < 5) {
             try {
@@ -752,7 +753,7 @@
      */
     public static void assertDirectoryContains(@NonNull File dir, File... expectedContent) {
         assertThat(dir.isDirectory()).isTrue();
-        assertThat(Arrays.asList(dir.listFiles())).containsAllIn(expectedContent);
+        assertThat(Arrays.asList(dir.listFiles())).containsAtLeastElementsIn(expectedContent);
     }
 
     public static File getExternalStorageDir() {
diff --git a/hostsidetests/scopedstorage/src/android/scopedstorage/cts/ScopedStorageTest.java b/hostsidetests/scopedstorage/src/android/scopedstorage/cts/ScopedStorageTest.java
index abf72f0..eaab320 100644
--- a/hostsidetests/scopedstorage/src/android/scopedstorage/cts/ScopedStorageTest.java
+++ b/hostsidetests/scopedstorage/src/android/scopedstorage/cts/ScopedStorageTest.java
@@ -164,7 +164,9 @@
 @RunWith(AndroidJUnit4.class)
 public class ScopedStorageTest {
     static final String TAG = "ScopedStorageTest";
+    static final String CONTENT_PROVIDER_URL = "content://android.tradefed.contentprovider";
     static final String THIS_PACKAGE_NAME = getContext().getPackageName();
+    static final int USER_SYSTEM = 0;
 
     /**
      * To help avoid flaky tests, give ourselves a unique nonce to be used for
@@ -766,7 +768,7 @@
         final File videoFile = new File(getMusicDir(), VIDEO_FILE_NAME);
         try {
             // TEST_APP_A with storage permission should not see pdf file in DCIM
-            executeShellCommand("touch " + pdfFile.getAbsolutePath());
+            createFileUsingTradefedContentProvider(pdfFile);
             assertThat(pdfFile.exists()).isTrue();
             assertThat(MediaStore.scanFile(getContentResolver(), pdfFile)).isNotNull();
 
@@ -774,14 +776,14 @@
             assertThat(listAs(TEST_APP_A, getDcimDir().getPath()))
                     .doesNotContain(NONMEDIA_FILE_NAME);
 
-            executeShellCommand("touch " + videoFile.getAbsolutePath());
+            createFileUsingTradefedContentProvider(videoFile);
             // We don't insert files to db for files created by shell.
             assertThat(MediaStore.scanFile(getContentResolver(), videoFile)).isNotNull();
             // TEST_APP_A with storage permission should see video file in Music directory.
             assertThat(listAs(TEST_APP_A, getMusicDir().getPath())).contains(VIDEO_FILE_NAME);
         } finally {
-            executeShellCommand("rm " + pdfFile.getAbsolutePath());
-            executeShellCommand("rm " + videoFile.getAbsolutePath());
+            deleteFileUsingTradefedContentProvider(pdfFile);
+            deleteFileUsingTradefedContentProvider(videoFile);
             MediaStore.scanFile(getContentResolver(), pdfFile);
             MediaStore.scanFile(getContentResolver(), videoFile);
             uninstallAppNoThrow(TEST_APP_A);
@@ -2094,15 +2096,15 @@
             assertAccess(doesntExistPdf, false, false, false);
 
             // We can check only exists for another app's files on root.
-            // Use shell to create root file because TEST_APP_A is in
+            // Use content provider to create root file because TEST_APP_A is in
             // scoped storage.
-            executeShellCommand("touch " + shellPdfAtRoot.getAbsolutePath());
+            createFileUsingTradefedContentProvider(shellPdfAtRoot);
             MediaStore.scanFile(getContentResolver(), shellPdfAtRoot);
             assertFileAccess_existsOnly(shellPdfAtRoot);
         } finally {
             deleteFileAsNoThrow(TEST_APP_A, otherAppPdf.getAbsolutePath());
             deleteFileAsNoThrow(TEST_APP_A, otherAppImage.getAbsolutePath());
-            executeShellCommand("rm " + shellPdfAtRoot.getAbsolutePath());
+            deleteFileUsingTradefedContentProvider(shellPdfAtRoot);
             MediaStore.scanFile(getContentResolver(), shellPdfAtRoot);
             myAppPdf.delete();
             uninstallApp(TEST_APP_A);
@@ -2150,13 +2152,13 @@
             assertDirectoryAccess(new File(getExternalStorageDir(), "Android"), true, false);
             assertDirectoryAccess(new File(getExternalStorageDir(), "doesnt/exist"), false, false);
 
-            executeShellCommand("mkdir " + topLevelDir.getAbsolutePath());
+            createDirUsingTradefedContentProvider(topLevelDir);
             assertDirectoryAccess(topLevelDir, true, false);
 
             assertCannotReadOrWrite(new File("/storage/emulated"));
         } finally {
             uninstallApp(TEST_APP_A); // Uninstalling deletes external app dirs
-            executeShellCommand("rmdir " + topLevelDir.getAbsolutePath());
+            deleteDirUsingTradefedContentProvider(topLevelDir);
         }
     }
 
@@ -2212,13 +2214,11 @@
         final File podcastsDir = getPodcastsDir();
         try {
             if (podcastsDir.exists()) {
-                // Apps can't delete top level directories, not even default directories, so we let
-                // shell do the deed for us.
-                executeShellCommand("rm -r " + podcastsDir);
+                deleteDirUsingTradefedContentProvider(podcastsDir);
             }
             assertThat(podcastsDir.mkdir()).isTrue();
         } finally {
-            executeShellCommand("mkdir " + podcastsDir);
+            createDirUsingTradefedContentProvider(podcastsDir);
         }
     }
 
@@ -2234,7 +2234,7 @@
         try {
             installApp(TEST_APP_A);
             assertCreateFilesAs(TEST_APP_A, otherAppImg, otherAppMusic, otherAppPdf);
-            executeShellCommand("touch " + otherTopLevelFile);
+            createFileUsingTradefedContentProvider(otherTopLevelFile);
             MediaStore.scanFile(getContentResolver(), otherTopLevelFile);
 
             // We can list other apps' files
@@ -2247,7 +2247,7 @@
             // We can also list all top level directories
             assertDirectoryContains(getExternalStorageDir(), getDefaultTopLevelDirs());
         } finally {
-            executeShellCommand("rm " + otherTopLevelFile);
+            deleteFileUsingTradefedContentProvider(otherTopLevelFile);
             MediaStore.scanFile(getContentResolver(), otherTopLevelFile);
             deleteFilesAs(TEST_APP_A, otherAppImg, otherAppMusic, otherAppPdf);
             uninstallApp(TEST_APP_A);
@@ -2490,6 +2490,8 @@
     @Test
     public void testWallpaperApisNoPermission() throws Exception {
         WallpaperManager wallpaperManager = WallpaperManager.getInstance(getContext());
+        assumeTrue("Test skipped as wallpaper is not supported.",
+                wallpaperManager.isWallpaperSupported());
         assertThrows(SecurityException.class, () -> wallpaperManager.getFastDrawable());
         assertThrows(SecurityException.class, () -> wallpaperManager.peekFastDrawable());
         assertThrows(SecurityException.class,
@@ -2696,7 +2698,7 @@
         try {
             installApp(TEST_APP_A);
             assertCreateFilesAs(TEST_APP_A, otherAppImg, otherAppMusic, otherAppPdf);
-            executeShellCommand("touch " + otherTopLevelFile);
+            createFileUsingTradefedContentProvider(otherTopLevelFile);
 
             // We can list other apps' files
             assertDirectoryContains(otherAppPdf.getParentFile(), otherAppPdf);
@@ -2708,7 +2710,7 @@
             // We can also list all top level directories
             assertDirectoryContains(getExternalStorageDir(), getDefaultTopLevelDirs());
         } finally {
-            executeShellCommand("rm " + otherTopLevelFile);
+            deleteFileUsingTradefedContentProvider(otherTopLevelFile);
             deleteFilesAs(TEST_APP_A, otherAppImg, otherAppMusic, otherAppPdf);
             uninstallApp(TEST_APP_A);
         }
@@ -2738,6 +2740,8 @@
 
     @Test
     public void testRenameFromShell() throws Exception {
+        // This test is for shell and shell always runs as USER_SYSTEM
+        assumeTrue("Test is applicable only for System User.", getCurrentUser() == USER_SYSTEM);
         final File imageFile = new File(getPicturesDir(), IMAGE_FILE_NAME);
         final File dir = new File(getMoviesDir(), TEST_DIRECTORY_NAME);
         final File renamedDir = new File(getMusicDir(), TEST_DIRECTORY_NAME);
@@ -3144,4 +3148,38 @@
             assertThrows(ErrnoException.class, () -> { Os.access(file.getAbsolutePath(), mask); });
         }
     }
+
+    private void createFileUsingTradefedContentProvider(File file) throws Exception {
+        // Files/Dirs are created using content provider. Owner of the Filse/Dirs is
+        // android.tradefed.contentprovider.
+        Log.d(TAG, "Creating file " + file);
+        getContentResolver().openFile(Uri.parse(CONTENT_PROVIDER_URL + file.getPath()), "w", null);
+    }
+
+    private void createDirUsingTradefedContentProvider(File file) throws Exception {
+        // Files/Dirs are created using content provider. Owner of the Files/Dirs is
+        // android.tradefed.contentprovider.
+        Log.d(TAG, "Creating Dir " + file);
+        // Create a tmp file in the target directory, this would also create the required
+        // directory, then delete the tmp file. It would leave only new directory.
+        getContentResolver()
+            .openFile(Uri.parse(CONTENT_PROVIDER_URL + file.getPath() + "/tmp.txt"), "w", null);
+        getContentResolver()
+            .delete(Uri.parse(CONTENT_PROVIDER_URL + file.getPath() + "/tmp.txt"), null, null);
+    }
+
+    private void deleteFileUsingTradefedContentProvider(File file) throws Exception {
+        Log.d(TAG, "Deleting file " + file);
+        getContentResolver().delete(Uri.parse(CONTENT_PROVIDER_URL + file.getPath()), null, null);
+    }
+
+    private void deleteDirUsingTradefedContentProvider(File file) throws Exception {
+        Log.d(TAG, "Deleting Dir " + file);
+        getContentResolver().delete(Uri.parse(CONTENT_PROVIDER_URL + file.getPath()), null, null);
+    }
+
+    private int getCurrentUser() throws Exception {
+        String userId = executeShellCommand("am get-current-user");
+        return Integer.parseInt(userId.trim());
+    }
 }
diff --git a/hostsidetests/seccomp/Android.bp b/hostsidetests/seccomp/Android.bp
index 273b95d..5280d2a 100644
--- a/hostsidetests/seccomp/Android.bp
+++ b/hostsidetests/seccomp/Android.bp
@@ -18,7 +18,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
diff --git a/hostsidetests/seccomp/app/Android.bp b/hostsidetests/seccomp/app/Android.bp
index e2444bd..55fb375 100644
--- a/hostsidetests/seccomp/app/Android.bp
+++ b/hostsidetests/seccomp/app/Android.bp
@@ -30,7 +30,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/seccomp/app/jni/Android.bp b/hostsidetests/seccomp/app/jni/Android.bp
index 3dc4f1c..b528c53 100644
--- a/hostsidetests/seccomp/app/jni/Android.bp
+++ b/hostsidetests/seccomp/app/jni/Android.bp
@@ -20,6 +20,7 @@
         "android_seccomp_cts_app_SeccompDeviceTest.cpp",
     ],
     sdk_version: "current",
+    header_libs: ["jni_headers"],
     static_libs: ["cpufeatures"],
     cflags: [
         "-Wall",
diff --git a/hostsidetests/seccomp/app/src/android/seccomp/cts/app/SeccompDeviceTest.java b/hostsidetests/seccomp/app/src/android/seccomp/cts/app/SeccompDeviceTest.java
index a1ab899..20cf791 100644
--- a/hostsidetests/seccomp/app/src/android/seccomp/cts/app/SeccompDeviceTest.java
+++ b/hostsidetests/seccomp/app/src/android/seccomp/cts/app/SeccompDeviceTest.java
@@ -198,12 +198,8 @@
             return "x86_64";
         } else if (CpuFeatures.isX86Cpu()) {
             return "x86";
-        } else if (CpuFeatures.isMips64Cpu()) {
-            return "mips64";
-        } else if (CpuFeatures.isMipsCpu()) {
-            return "mips";
         } else {
-            Assert.fail("Unsupported OS");
+            Assert.fail("Unsupported architecture");
             return null;
         }
     }
diff --git a/hostsidetests/security/Android.mk b/hostsidetests/security/Android.mk
index f28255f..0a6373a 100644
--- a/hostsidetests/security/Android.mk
+++ b/hostsidetests/security/Android.mk
@@ -21,7 +21,7 @@
 LOCAL_MODULE_TAGS := optional
 
 # tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 # Must match the package name in CtsTestCaseList.mk
 LOCAL_MODULE := CtsSecurityHostTestCases
@@ -72,6 +72,8 @@
 	mkdir -p $(dir $@)
 	$< $(PRIVATE_SELINUX_GENERAL_POLICY) $@
 
+LOCAL_TARGET_REQUIRED_MODULES := CtsDeviceInfo
+
 include $(BUILD_CTS_HOST_JAVA_LIBRARY)
 
 include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/hostsidetests/security/AndroidTest.xml b/hostsidetests/security/AndroidTest.xml
index 0f03245..fd39c91 100755
--- a/hostsidetests/security/AndroidTest.xml
+++ b/hostsidetests/security/AndroidTest.xml
@@ -20,6 +20,16 @@
     <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
     <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
 
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.DeviceInfoCollector">
+        <option name="apk" value="CtsDeviceInfo.apk"/>
+        <option name="package" value="com.android.compatibility.common.deviceinfo"/>
+        <!-- Keep path in sync with SELinuxHostTest.DEVICE_INFO_DEVICE_DIR -->
+        <option name="src-dir" value="/sdcard/device-info-files/"/>
+        <option name="throw-error" value="true"/>
+        <option name="force-collect-device-info" value="true"/>
+        <option name="apk-instrumentation-filter" value="com.android.compatibility.common.deviceinfo.VintfDeviceInfo" />
+    </target_preparer>
+
     <test class="com.android.compatibility.common.tradefed.testtype.JarHostTest" >
         <option name="jar" value="CtsSecurityHostTestCases.jar" />
         <option name="runtime-hint" value="8m40s" />
diff --git a/hostsidetests/security/src/android/security/cts/KernelConfigTest.java b/hostsidetests/security/src/android/security/cts/KernelConfigTest.java
index 733c09f..6741b82 100644
--- a/hostsidetests/security/src/android/security/cts/KernelConfigTest.java
+++ b/hostsidetests/security/src/android/security/cts/KernelConfigTest.java
@@ -174,14 +174,25 @@
                     (configSet.contains("CONFIG_ARM64_SW_TTBR0_PAN=y") ||
                     configSet.contains("CONFIG_ARM64_PAN=y")));
         } else if (CpuFeatures.isArm32(mDevice)) {
-            assertTrue("Linux kernel must have PAN emulation enabled: CONFIG_CPU_SW_DOMAIN_PAN=y",
-                    configSet.contains("CONFIG_CPU_SW_DOMAIN_PAN=y"));
+            assertTrue("Linux kernel must have PAN emulation enabled: " +
+                    "CONFIG_CPU_SW_DOMAIN_PAN=y or CONFIG_CPU_TTBR0_PAN=y",
+                    (configSet.contains("CONFIG_CPU_SW_DOMAIN_PAN=y") ||
+                    configSet.contains("CONFIG_CPU_TTBR0_PAN=y")));
         }
     }
 
     private String getHardware() throws Exception {
         String hardware = "DEFAULT";
         String[] pathList = new String[]{"/proc/cpuinfo", "/sys/devices/soc0/soc_id"};
+        String mitigationInfoMeltdown =
+                mDevice.pullFileContents("/sys/devices/system/cpu/vulnerabilities/meltdown");
+        String mitigationInfoSpectreV2 =
+                mDevice.pullFileContents("/sys/devices/system/cpu/vulnerabilities/spectre_v2");
+
+        if (mitigationInfoMeltdown != null && mitigationInfoSpectreV2 != null &&
+            !mitigationInfoMeltdown.contains("Vulnerable") &&
+            !mitigationInfoSpectreV2.contains("Vulnerable"))
+                return "VULN_SAFE";
 
         for (String nodeInfo : pathList) {
             if (!mDevice.doesFileExist(nodeInfo))
@@ -216,6 +227,7 @@
 
     private Map<String, String[]> hardwareMitigations = new HashMap<String, String[]>() {
     {
+        put("VULN_SAFE", null);
         put("EXYNOS990", null);
         put("EXYNOS980", null);
         put("EXYNOS850", null);
@@ -232,12 +244,20 @@
         put("Kirin970", new String[]{"CONFIG_HARDEN_BRANCH_PREDICTOR=y"});
         put("Kirin810", null);
         put("Kirin710", new String[]{"CONFIG_HARDEN_BRANCH_PREDICTOR=y"});
+        put("MT6889Z/CZA", new String[]{"CONFIG_HARDEN_BRANCH_PREDICTOR=y"});
+        put("MT6889Z/CIZA", new String[]{"CONFIG_HARDEN_BRANCH_PREDICTOR=y"});
+        put("mt6873", new String[]{"CONFIG_HARDEN_BRANCH_PREDICTOR=y"});
+        put("MT6853V/TZA", new String[]{"CONFIG_HARDEN_BRANCH_PREDICTOR=y"});
+        put("MT6853V/TNZA", new String[]{"CONFIG_HARDEN_BRANCH_PREDICTOR=y"});
         put("SDMMAGPIE", new String[]{"CONFIG_HARDEN_BRANCH_PREDICTOR=y"});
         put("SM6150", new String[]{"CONFIG_HARDEN_BRANCH_PREDICTOR=y"});
         put("SM7150", new String[]{"CONFIG_HARDEN_BRANCH_PREDICTOR=y"});
+        put("SM7250", null);
         put("LITO", null);
+        put("LAGOON", null);
         put("SM8150", new String[]{"CONFIG_HARDEN_BRANCH_PREDICTOR=y"});
         put("SM8150P", new String[]{"CONFIG_HARDEN_BRANCH_PREDICTOR=y"});
+        put("SM8250", null);
         put("KONA", null);
         put("SDM429", null);
         put("SDM439", null);
diff --git a/hostsidetests/security/src/android/security/cts/SELinuxHostTest.java b/hostsidetests/security/src/android/security/cts/SELinuxHostTest.java
index de90629..382c931 100644
--- a/hostsidetests/security/src/android/security/cts/SELinuxHostTest.java
+++ b/hostsidetests/security/src/android/security/cts/SELinuxHostTest.java
@@ -19,14 +19,17 @@
 import android.platform.test.annotations.RestrictedBuildTest;
 
 import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
+import com.android.compatibility.common.tradefed.targetprep.DeviceInfoCollector;
 import com.android.compatibility.common.util.PropertyUtil;
 import com.android.tradefed.build.IBuildInfo;
 import com.android.tradefed.device.CollectingOutputReceiver;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.log.LogUtil.CLog;
 import com.android.tradefed.testtype.DeviceTestCase;
 import com.android.tradefed.testtype.IBuildReceiver;
 import com.android.tradefed.testtype.IDeviceTest;
+import com.android.tradefed.util.FileUtil;
 
 import com.android.compatibility.common.util.CddTest;
 
@@ -57,6 +60,8 @@
 import javax.xml.parsers.DocumentBuilderFactory;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
+import org.json.JSONObject;
+
 
 /**
  * Host-side SELinux tests.
@@ -67,10 +72,22 @@
  */
 public class SELinuxHostTest extends DeviceTestCase implements IBuildReceiver, IDeviceTest {
 
+    // Keep in sync with AndroidTest.xml
+    private static final String DEVICE_INFO_DEVICE_DIR = "/sdcard/device-info-files/";
+    // Keep in sync with com.android.compatibility.common.deviceinfo.VintfDeviceInfo
+    private static final String VINTF_DEVICE_CLASS = "VintfDeviceInfo";
+    // Keep in sync with
+    // com.android.compatibility.common.deviceinfo.DeviceInfo#testCollectDeviceInfo()
+    private static final String DEVICE_INFO_SUFFIX = ".deviceinfo.json";
+    private static final String VINTF_DEVICE_JSON = VINTF_DEVICE_CLASS + DEVICE_INFO_SUFFIX;
+    // Keep in sync with com.android.compatibility.common.deviceinfo.VintfDeviceInfo
+    private static final String SEPOLICY_VERSION_JSON_KEY = "sepolicy_version";
+
     private static final Map<ITestDevice, File> cachedDevicePolicyFiles = new HashMap<>(1);
     private static final Map<ITestDevice, File> cachedDevicePlatFcFiles = new HashMap<>(1);
     private static final Map<ITestDevice, File> cachedDeviceNonplatFcFiles = new HashMap<>(1);
     private static final Map<ITestDevice, File> cachedDeviceVendorManifest = new HashMap<>(1);
+    private static final Map<ITestDevice, File> cachedDeviceVintfJson = new HashMap<>(1);
     private static final Map<ITestDevice, File> cachedDeviceSystemPolicy = new HashMap<>(1);
 
     private File sepolicyAnalyze;
@@ -268,9 +285,76 @@
     // NOTE: cts/tools/selinux depends on this method. Rename/change with caution.
     /**
      * Returns the major number of sepolicy version of device's vendor implementation.
-     * TODO(b/37999212): Use VINTF object API instead of parsing vendor manifest.
      */
-    public static int getVendorSepolicyVersion(ITestDevice device) throws Exception {
+    public static int getVendorSepolicyVersion(IBuildInfo build, ITestDevice device)
+            throws Exception {
+
+        // Try different methods to get vendor SEPolicy version in the following order:
+        // 1. Retrieve from IBuildInfo as stored by DeviceInfoCollector (relies on #2)
+        // 2. If it fails, retrieve from device info JSON file stored on the device
+        //    (relies on android.os.VintfObject)
+        // 3. If it fails, retrieve from raw VINTF device manifest files by guessing its path on
+        //    the device
+        // Usually, the method #1 should work. If it doesn't, fallback to method #2 and #3. If
+        // none works, throw the error from method #1.
+        Exception buildInfoEx;
+        try {
+            return getVendorSepolicyVersionFromBuildInfo(build);
+        } catch (Exception ex) {
+            CLog.e("getVendorSepolicyVersionFromBuildInfo failed: ", ex);
+            buildInfoEx = ex;
+        }
+        try {
+            return getVendorSepolicyVersionFromDeviceJson(device);
+        } catch (Exception ex) {
+            CLog.e("getVendorSepolicyVersionFromDeviceJson failed: ", ex);
+        }
+        try {
+            return getVendorSepolicyVersionFromManifests(device);
+        } catch (Exception ex) {
+            CLog.e("getVendorSepolicyVersionFromManifests failed: ", ex);
+            throw buildInfoEx;
+        }
+    }
+
+    /**
+     * Retrieve the major number of sepolicy version from VINTF device info stored in the given
+     * IBuildInfo by {@link DeviceInfoCollector}.
+     */
+    private static int getVendorSepolicyVersionFromBuildInfo(IBuildInfo build) throws Exception {
+        File deviceInfoDir = build.getFile(DeviceInfoCollector.DEVICE_INFO_DIR);
+        File vintfJson = deviceInfoDir.toPath().resolve(VINTF_DEVICE_JSON).toFile();
+        return getVendorSepolicyVersionFromJsonFile(vintfJson);
+    }
+
+    /**
+     * Retrieve the major number of sepolicy version from VINTF device info stored on the device by
+     * VintfDeviceInfo.
+     */
+    private static int getVendorSepolicyVersionFromDeviceJson(ITestDevice device) throws Exception {
+        File vintfJson = getDeviceFile(device, cachedDeviceVintfJson,
+                DEVICE_INFO_DEVICE_DIR + VINTF_DEVICE_JSON, VINTF_DEVICE_JSON);
+        return getVendorSepolicyVersionFromJsonFile(vintfJson);
+    }
+
+    /**
+     * Retrieve the major number of sepolicy version from the given JSON string that contains VINTF
+     * device info.
+     */
+    private static int getVendorSepolicyVersionFromJsonFile(File vintfJson) throws Exception {
+        String content = FileUtil.readStringFromFile(vintfJson);
+        JSONObject object = new JSONObject(content);
+        String version = object.getString(SEPOLICY_VERSION_JSON_KEY);
+        return getVendorSepolicyVersionFromMajorMinor(version);
+    }
+
+    /**
+     * Deprecated.
+     * Retrieve the major number of sepolicy version from raw device manifest XML files.
+     * Note that this is depends on locations of VINTF devices files at Android 10 and do not
+     * search new paths, hence this may not work on devices launching Android 11 and later.
+     */
+    private static int getVendorSepolicyVersionFromManifests(ITestDevice device) throws Exception {
         String deviceManifestPath =
                 (device.doesFileExist("/vendor/etc/vintf/manifest.xml")) ?
                 "/vendor/etc/vintf/manifest.xml" :
@@ -284,7 +368,14 @@
         Element root = doc.getDocumentElement();
         Element sepolicy = (Element) root.getElementsByTagName("sepolicy").item(0);
         Element version = (Element) sepolicy.getElementsByTagName("version").item(0);
-        String sepolicyVersion = version.getTextContent().split("\\.")[0];
+        return getVendorSepolicyVersionFromMajorMinor(version.getTextContent());
+    }
+
+    /**
+     * Get the major number from an SEPolicy version string, e.g. "27.0" => 27.
+     */
+    private static int getVendorSepolicyVersionFromMajorMinor(String version) {
+        String sepolicyVersion = version.split("\\.")[0];
         return Integer.parseInt(sepolicyVersion);
     }
 
@@ -419,27 +510,6 @@
     }
 
     /**
-     * Asserts that no vendor domains are exempted from the prohibition on Binder use.
-     *
-     * <p>NOTE: binder_in_vendor_violators attribute is only there to help bring up Treble devices.
-     * It offers a convenient way to temporarily bypass the prohibition on Binder use in vendor
-     * domains. This attribute must not be used on production Treble devices.
-     */
-    public void testNoExemptionsForBinderInVendorBan() throws Exception {
-        if (!isFullTrebleDevice()) {
-            return;
-        }
-
-        Set<String> types =
-            sepolicyAnalyzeGetTypesAssociatedWithAttribute("binder_in_vendor_violators");
-        if (!types.isEmpty()) {
-            List<String> sortedTypes = new ArrayList<>(types);
-            Collections.sort(sortedTypes);
-            fail("Policy exempts vendor domains from ban on Binder: " + sortedTypes);
-        }
-    }
-
-    /**
      * Asserts that no HAL server domains are exempted from the prohibition of socket use with the
      * only exceptions for the automotive device type.
      */
diff --git a/hostsidetests/securitybulletin/Android.bp b/hostsidetests/securitybulletin/Android.bp
index f17395e..5da0687 100644
--- a/hostsidetests/securitybulletin/Android.bp
+++ b/hostsidetests/securitybulletin/Android.bp
@@ -20,7 +20,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "sts",
     ],
@@ -50,7 +49,6 @@
     },
     test_suites: [
         "cts",
-        "vts10",
         "sts",
     ],
     cflags: [
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2016-2471/Android.bp b/hostsidetests/securitybulletin/securityPatch/CVE-2016-2471/Android.bp
index 26635d9..53f06a5 100644
--- a/hostsidetests/securitybulletin/securityPatch/CVE-2016-2471/Android.bp
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2016-2471/Android.bp
@@ -15,6 +15,7 @@
 cc_test {
     name: "CVE-2016-2471",
     defaults: ["cts_hostsidetests_securitybulletin_defaults"],
+    header_libs: ["jni_headers"],
     srcs: ["poc.c"],
     ldflags: [
         "-fPIE",
diff --git a/hostsidetests/securitybulletin/securityPatch/CVE-2016-3747/poc.cpp b/hostsidetests/securitybulletin/securityPatch/CVE-2016-3747/poc.cpp
index 38a0afa..fcdcdcb 100644
--- a/hostsidetests/securitybulletin/securityPatch/CVE-2016-3747/poc.cpp
+++ b/hostsidetests/securitybulletin/securityPatch/CVE-2016-3747/poc.cpp
@@ -18,7 +18,6 @@
 
 #include <OMX_Component.h>
 #include <binder/MemoryDealer.h>
-#include <jni.h>
 #include <log/log.h>
 #include <media/IOMX.h>
 #include <media/OMXBuffer.h>
diff --git a/hostsidetests/securitybulletin/securityPatch/includes/omxUtils.h b/hostsidetests/securitybulletin/securityPatch/includes/omxUtils.h
index 5bc204a..cd8b057 100644
--- a/hostsidetests/securitybulletin/securityPatch/includes/omxUtils.h
+++ b/hostsidetests/securitybulletin/securityPatch/includes/omxUtils.h
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#include <jni.h>
+
 #include <fcntl.h>
 #include <unistd.h>
 #include <sys/types.h>
diff --git a/hostsidetests/securitybulletin/test-apps/launchanywhere/Android.bp b/hostsidetests/securitybulletin/test-apps/launchanywhere/Android.bp
index 0e619a8..73aa36e 100644
--- a/hostsidetests/securitybulletin/test-apps/launchanywhere/Android.bp
+++ b/hostsidetests/securitybulletin/test-apps/launchanywhere/Android.bp
@@ -22,7 +22,7 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
+        "general-tests",
         "sts",
     ],
     optimize: {
diff --git a/hostsidetests/settings/Android.bp b/hostsidetests/settings/Android.bp
index dccd1c9..164beee 100644
--- a/hostsidetests/settings/Android.bp
+++ b/hostsidetests/settings/Android.bp
@@ -29,6 +29,5 @@
         "arcts",
         "cts",
         "general-tests",
-        "vts10",
     ],
 }
diff --git a/hostsidetests/settings/app/DeviceOwnerApp/Android.bp b/hostsidetests/settings/app/DeviceOwnerApp/Android.bp
index 2c21f16..5fd8e6b 100644
--- a/hostsidetests/settings/app/DeviceOwnerApp/Android.bp
+++ b/hostsidetests/settings/app/DeviceOwnerApp/Android.bp
@@ -24,9 +24,9 @@
         local_include_dirs: ["src"],
     },
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "junit",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     static_libs: [
         "compatibility-device-util-axt",
@@ -38,7 +38,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/shortcuts/deviceside/Android.bp b/hostsidetests/shortcuts/deviceside/Android.bp
index df7acb7..1981e4a 100644
--- a/hostsidetests/shortcuts/deviceside/Android.bp
+++ b/hostsidetests/shortcuts/deviceside/Android.bp
@@ -4,6 +4,6 @@
         "hostsidetests-shortcuts-deviceside-common",
         "ShortcutManagerTestUtils",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     sdk_version: "test_current",
 }
diff --git a/hostsidetests/shortcuts/deviceside/backup/launcher1/Android.bp b/hostsidetests/shortcuts/deviceside/backup/launcher1/Android.bp
index 008ac13..98df20f 100644
--- a/hostsidetests/shortcuts/deviceside/backup/launcher1/Android.bp
+++ b/hostsidetests/shortcuts/deviceside/backup/launcher1/Android.bp
@@ -22,7 +22,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/hostsidetests/shortcuts/deviceside/backup/launcher2/Android.bp b/hostsidetests/shortcuts/deviceside/backup/launcher2/Android.bp
index 38b57c4..e6f48a2 100644
--- a/hostsidetests/shortcuts/deviceside/backup/launcher2/Android.bp
+++ b/hostsidetests/shortcuts/deviceside/backup/launcher2/Android.bp
@@ -22,7 +22,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/hostsidetests/shortcuts/deviceside/backup/launcher3/Android.bp b/hostsidetests/shortcuts/deviceside/backup/launcher3/Android.bp
index 15466fa..ab286df 100644
--- a/hostsidetests/shortcuts/deviceside/backup/launcher3/Android.bp
+++ b/hostsidetests/shortcuts/deviceside/backup/launcher3/Android.bp
@@ -22,7 +22,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/hostsidetests/shortcuts/deviceside/backup/launcher4new/Android.bp b/hostsidetests/shortcuts/deviceside/backup/launcher4new/Android.bp
index da08d5b..aa3228f 100644
--- a/hostsidetests/shortcuts/deviceside/backup/launcher4new/Android.bp
+++ b/hostsidetests/shortcuts/deviceside/backup/launcher4new/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: [
diff --git a/hostsidetests/shortcuts/deviceside/backup/launcher4old/Android.bp b/hostsidetests/shortcuts/deviceside/backup/launcher4old/Android.bp
index a362f7f..96672d6 100644
--- a/hostsidetests/shortcuts/deviceside/backup/launcher4old/Android.bp
+++ b/hostsidetests/shortcuts/deviceside/backup/launcher4old/Android.bp
@@ -22,7 +22,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: [
diff --git a/hostsidetests/shortcuts/deviceside/backup/publisher1/Android.bp b/hostsidetests/shortcuts/deviceside/backup/publisher1/Android.bp
index e2b91f5..4a82860 100644
--- a/hostsidetests/shortcuts/deviceside/backup/publisher1/Android.bp
+++ b/hostsidetests/shortcuts/deviceside/backup/publisher1/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: [
diff --git a/hostsidetests/shortcuts/deviceside/backup/publisher2/Android.bp b/hostsidetests/shortcuts/deviceside/backup/publisher2/Android.bp
index 2a0e687..d64693f 100644
--- a/hostsidetests/shortcuts/deviceside/backup/publisher2/Android.bp
+++ b/hostsidetests/shortcuts/deviceside/backup/publisher2/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: [
diff --git a/hostsidetests/shortcuts/deviceside/backup/publisher3/Android.bp b/hostsidetests/shortcuts/deviceside/backup/publisher3/Android.bp
index 9cefd3c..f5eaff7 100644
--- a/hostsidetests/shortcuts/deviceside/backup/publisher3/Android.bp
+++ b/hostsidetests/shortcuts/deviceside/backup/publisher3/Android.bp
@@ -22,7 +22,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/hostsidetests/shortcuts/deviceside/backup/publisher4new/Android.bp b/hostsidetests/shortcuts/deviceside/backup/publisher4new/Android.bp
index 63cca81..7abb9de 100644
--- a/hostsidetests/shortcuts/deviceside/backup/publisher4new/Android.bp
+++ b/hostsidetests/shortcuts/deviceside/backup/publisher4new/Android.bp
@@ -22,7 +22,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: [
diff --git a/hostsidetests/shortcuts/deviceside/backup/publisher4new_nobackup/Android.bp b/hostsidetests/shortcuts/deviceside/backup/publisher4new_nobackup/Android.bp
index 8d43503..28e0a5c 100644
--- a/hostsidetests/shortcuts/deviceside/backup/publisher4new_nobackup/Android.bp
+++ b/hostsidetests/shortcuts/deviceside/backup/publisher4new_nobackup/Android.bp
@@ -22,7 +22,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: [
diff --git a/hostsidetests/shortcuts/deviceside/backup/publisher4new_nomanifest/Android.bp b/hostsidetests/shortcuts/deviceside/backup/publisher4new_nomanifest/Android.bp
index 8d1b6d8..85c6815 100644
--- a/hostsidetests/shortcuts/deviceside/backup/publisher4new_nomanifest/Android.bp
+++ b/hostsidetests/shortcuts/deviceside/backup/publisher4new_nomanifest/Android.bp
@@ -22,7 +22,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: [
diff --git a/hostsidetests/shortcuts/deviceside/backup/publisher4new_wrongkey/Android.bp b/hostsidetests/shortcuts/deviceside/backup/publisher4new_wrongkey/Android.bp
index 24812de..0837f42 100644
--- a/hostsidetests/shortcuts/deviceside/backup/publisher4new_wrongkey/Android.bp
+++ b/hostsidetests/shortcuts/deviceside/backup/publisher4new_wrongkey/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: [
diff --git a/hostsidetests/shortcuts/deviceside/backup/publisher4old/Android.bp b/hostsidetests/shortcuts/deviceside/backup/publisher4old/Android.bp
index 2eb6984..96630fc 100644
--- a/hostsidetests/shortcuts/deviceside/backup/publisher4old/Android.bp
+++ b/hostsidetests/shortcuts/deviceside/backup/publisher4old/Android.bp
@@ -22,7 +22,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: [
diff --git a/hostsidetests/shortcuts/deviceside/backup/publisher4old_nomanifest/Android.bp b/hostsidetests/shortcuts/deviceside/backup/publisher4old_nomanifest/Android.bp
index 32d27dd..d48db7b 100644
--- a/hostsidetests/shortcuts/deviceside/backup/publisher4old_nomanifest/Android.bp
+++ b/hostsidetests/shortcuts/deviceside/backup/publisher4old_nomanifest/Android.bp
@@ -22,7 +22,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: [
diff --git a/hostsidetests/shortcuts/deviceside/common/Android.bp b/hostsidetests/shortcuts/deviceside/common/Android.bp
index ea69333..a94a29a 100644
--- a/hostsidetests/shortcuts/deviceside/common/Android.bp
+++ b/hostsidetests/shortcuts/deviceside/common/Android.bp
@@ -2,7 +2,7 @@
     name: "hostsidetests-shortcuts-deviceside-common",
     srcs: ["src/**/*.java"],
     libs: [
-        "android.test.base.stubs",
+        "android.test.base",
         "ShortcutManagerTestUtils",
         "compatibility-device-util-axt",
     ],
diff --git a/hostsidetests/shortcuts/deviceside/multiuser/Android.bp b/hostsidetests/shortcuts/deviceside/multiuser/Android.bp
index 7619b6c..dcbdabd 100644
--- a/hostsidetests/shortcuts/deviceside/multiuser/Android.bp
+++ b/hostsidetests/shortcuts/deviceside/multiuser/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: [
diff --git a/hostsidetests/shortcuts/deviceside/upgrade/Android.bp b/hostsidetests/shortcuts/deviceside/upgrade/Android.bp
index 658845a..d664097 100644
--- a/hostsidetests/shortcuts/deviceside/upgrade/Android.bp
+++ b/hostsidetests/shortcuts/deviceside/upgrade/Android.bp
@@ -24,7 +24,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: [
@@ -41,7 +40,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src/**/*.java"],
diff --git a/hostsidetests/shortcuts/hostside/Android.bp b/hostsidetests/shortcuts/hostside/Android.bp
index 646953e..b6ff84f 100644
--- a/hostsidetests/shortcuts/hostside/Android.bp
+++ b/hostsidetests/shortcuts/hostside/Android.bp
@@ -24,7 +24,9 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
+    required: [
+        "CtsBackupHostTestCases",
+    ],
 }
diff --git a/hostsidetests/signedconfig/app/Android.bp b/hostsidetests/signedconfig/app/Android.bp
index 3fe178a..e47f9b7 100644
--- a/hostsidetests/signedconfig/app/Android.bp
+++ b/hostsidetests/signedconfig/app/Android.bp
@@ -31,7 +31,6 @@
     sdk_version: "current",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -42,7 +41,6 @@
     manifest: "version1_instant_AndroidManifest.xml",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -53,7 +51,6 @@
     manifest: "version2_AndroidManifest.xml",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -64,7 +61,6 @@
     manifest: "version2_instant_AndroidManifest.xml",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -75,7 +71,6 @@
     manifest: "version1_package2_AndroidManifest.xml",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -86,7 +81,6 @@
     manifest: "version2_package2_AndroidManifest.xml",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -97,7 +91,6 @@
     manifest: "version1_badsignature_AndroidManifest.xml",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -108,7 +101,6 @@
     manifest: "version1_badb64_config_AndroidManifest.xml",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -119,7 +111,6 @@
     manifest: "version1_badb64_signature_AndroidManifest.xml",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -130,7 +121,6 @@
     manifest: "version3_configv1_AndroidManifest.xml",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -141,7 +131,6 @@
     manifest: "version1_debug_key_AndroidManifest.xml",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/signedconfig/app/build_signedconfig_apk.mk b/hostsidetests/signedconfig/app/build_signedconfig_apk.mk
index 1eb6a66..a467eaa 100644
--- a/hostsidetests/signedconfig/app/build_signedconfig_apk.mk
+++ b/hostsidetests/signedconfig/app/build_signedconfig_apk.mk
@@ -17,7 +17,7 @@
 LOCAL_MODULE_PATH = $(TARGET_OUT_DATA_APPS)
 LOCAL_PROGUARD_ENABLED := disabled
 LOCAL_DEX_PREOPT := false
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 include $(BUILD_PACKAGE)
diff --git a/hostsidetests/signedconfig/hostside/Android.bp b/hostsidetests/signedconfig/hostside/Android.bp
index 5eda91c..ebb4aaa 100644
--- a/hostsidetests/signedconfig/hostside/Android.bp
+++ b/hostsidetests/signedconfig/hostside/Android.bp
@@ -27,7 +27,6 @@
     static_libs: ["hamcrest-library"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/signedconfig/hostside/src/com/android/cts/signedconfig/SignedConfigHostTest.java b/hostsidetests/signedconfig/hostside/src/com/android/cts/signedconfig/SignedConfigHostTest.java
index b888d4c..dbc4736 100644
--- a/hostsidetests/signedconfig/hostside/src/com/android/cts/signedconfig/SignedConfigHostTest.java
+++ b/hostsidetests/signedconfig/hostside/src/com/android/cts/signedconfig/SignedConfigHostTest.java
@@ -17,7 +17,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.hamcrest.Matchers.endsWith;
+import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.not;
 
 import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
@@ -262,8 +262,8 @@
     }
 
     @Test
-    public void testDebugKeyValidOnDebugBuild() throws Exception {
-        Assume.assumeThat(getDevice().getBuildFlavor(), not(endsWith("-user")));
+    public void testDebugKeyValidOnDebuggableBuild() throws Exception {
+        Assume.assumeThat(getDevice().getProperty("ro.debuggable"), is("1"));
         installPackage(TEST_APP_APK_NAME_V1_DEBUG_KEY);
         waitUntilSettingMatches(SETTING_SIGNED_CONFIG_VERSION, "1");
         assertThat(getDevice().getSetting("global", SETTING_BLACKLIST_EXEMPTIONS)).isEqualTo(
@@ -271,8 +271,8 @@
     }
 
     @Test
-    public void testDebugKeyNotValidOnUserBuild() throws Exception {
-        Assume.assumeThat(getDevice().getBuildFlavor(), endsWith("-user"));
+    public void testDebugKeyNotValidOnNonDebuggableBuild() throws Exception {
+        Assume.assumeThat(getDevice().getProperty("ro.debuggable"), not(is("1")));
         installPackage(TEST_APP_APK_NAME_V1_DEBUG_KEY);
         waitForDevice(5);
         assertThat(getDevice().getSetting("global", SETTING_SIGNED_CONFIG_VERSION))
diff --git a/hostsidetests/stagedinstall/Android.bp b/hostsidetests/stagedinstall/Android.bp
index 870c01e..3e87531 100644
--- a/hostsidetests/stagedinstall/Android.bp
+++ b/hostsidetests/stagedinstall/Android.bp
@@ -15,22 +15,20 @@
 java_test_host {
     name: "CtsStagedInstallHostTestCases",
     defaults: ["cts_defaults"],
-
     srcs:  ["src/**/*.java"],
-
     libs: [
         "cts-tradefed",
+        "cts-shim-host-lib",
         "tradefed",
         "truth-prebuilt",
         "hamcrest",
         "hamcrest-library",
     ],
-
+    static_libs: ["cts-install-lib-host"],
     data:   [
         ":StagedInstallTest",
         ":deapexer.zip",
     ],
-
     test_suites: [
         "cts",
         "general-tests",
@@ -40,11 +38,8 @@
 
 android_test_helper_app {
     name: "StagedInstallTest",
-
     srcs:  ["app/src/**/*.java"],
-
     manifest : "app/AndroidManifest.xml",
-
     java_resources:  [
         ":ApexKeyRotationTestV2_SignedBob",
         ":ApexKeyRotationTestV2_SignedBobRot",
diff --git a/hostsidetests/stagedinstall/AndroidTest.xml b/hostsidetests/stagedinstall/AndroidTest.xml
index 3acf716..1e02c04 100644
--- a/hostsidetests/stagedinstall/AndroidTest.xml
+++ b/hostsidetests/stagedinstall/AndroidTest.xml
@@ -38,4 +38,8 @@
         <option name="class" value="com.android.tests.stagedinstall.host.StagedInstallTest" />
         <option name="class" value="com.android.tests.stagedinstall.host.ApexShimValidationTest" />
     </test>
+
+    <!-- Controller that will skip the module if a native bridge situation is detected -->
+    <!-- For example: module wants to run arm and device is x86 -->
+    <object type="module_controller" class="com.android.tradefed.testtype.suite.module.NativeBridgeModuleController" />
 </configuration>
diff --git a/hostsidetests/stagedinstall/OWNERS b/hostsidetests/stagedinstall/OWNERS
index 2dd1076..1bccb47 100644
--- a/hostsidetests/stagedinstall/OWNERS
+++ b/hostsidetests/stagedinstall/OWNERS
@@ -4,3 +4,4 @@
 narayan@google.com
 patb@google.com
 ioffe@google.com
+olilan@google.com
diff --git a/hostsidetests/stagedinstall/app/src/com/android/tests/stagedinstall/ApexShimValidationTest.java b/hostsidetests/stagedinstall/app/src/com/android/tests/stagedinstall/ApexShimValidationTest.java
index 2abb723..38ae802 100644
--- a/hostsidetests/stagedinstall/app/src/com/android/tests/stagedinstall/ApexShimValidationTest.java
+++ b/hostsidetests/stagedinstall/app/src/com/android/tests/stagedinstall/ApexShimValidationTest.java
@@ -16,6 +16,7 @@
 
 package com.android.tests.stagedinstall;
 
+import static com.android.cts.shim.lib.ShimPackage.SHIM_APEX_PACKAGE_NAME;
 import static com.android.tests.stagedinstall.PackageInstallerSessionInfoSubject.assertThat;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -48,8 +49,6 @@
 @RunWith(JUnit4.class)
 public class ApexShimValidationTest {
 
-    private static final String SHIM_APEX_PACKAGE_NAME = "com.android.apex.cts.shim";
-
     @Before
     public void adoptShellPermissions() {
         InstrumentationRegistry
diff --git a/hostsidetests/stagedinstall/app/src/com/android/tests/stagedinstall/PackageInstallerSessionInfoSubject.java b/hostsidetests/stagedinstall/app/src/com/android/tests/stagedinstall/PackageInstallerSessionInfoSubject.java
index e78e5f3..fa0504d 100644
--- a/hostsidetests/stagedinstall/app/src/com/android/tests/stagedinstall/PackageInstallerSessionInfoSubject.java
+++ b/hostsidetests/stagedinstall/app/src/com/android/tests/stagedinstall/PackageInstallerSessionInfoSubject.java
@@ -24,12 +24,13 @@
 
 import javax.annotation.Nullable;
 
-final class PackageInstallerSessionInfoSubject extends
-        Subject<PackageInstallerSessionInfoSubject, PackageInstaller.SessionInfo> {
+final class PackageInstallerSessionInfoSubject extends Subject {
+    private final PackageInstaller.SessionInfo mActual;
 
     private PackageInstallerSessionInfoSubject(FailureMetadata failureMetadata,
             @Nullable PackageInstaller.SessionInfo subject) {
         super(failureMetadata, subject);
+        mActual = subject;
     }
 
     private static Subject.Factory<PackageInstallerSessionInfoSubject,
@@ -50,18 +51,15 @@
     }
 
     public void isStagedSessionReady() {
-        check().withMessage(failureMessage("in state READY")).that(
-                getSubject().isStagedSessionReady()).isTrue();
+        check(failureMessage("in state READY")).that(mActual.isStagedSessionReady()).isTrue();
     }
 
     public void isStagedSessionApplied() {
-        check().withMessage(failureMessage("in state APPLIED")).that(
-                getSubject().isStagedSessionApplied()).isTrue();
+        check(failureMessage("in state APPLIED")).that(mActual.isStagedSessionApplied()).isTrue();
     }
 
     public void isStagedSessionFailed() {
-        check().withMessage(failureMessage("in state FAILED")).that(
-                getSubject().isStagedSessionFailed()).isTrue();
+        check(failureMessage("in state FAILED")).that(mActual.isStagedSessionFailed()).isTrue();
     }
 
     private String failureMessage(String suffix) {
@@ -69,12 +67,11 @@
     }
 
     private String subjectAsString() {
-        PackageInstaller.SessionInfo session = getSubject();
-        return "{" + "appPackageName = " + session.getAppPackageName() + "; "
-                + "sessionId = " + session.getSessionId() + "; "
-                + "isStagedSessionReady = " + session.isStagedSessionReady() + "; "
-                + "isStagedSessionApplied = " + session.isStagedSessionApplied() + "; "
-                + "isStagedSessionFailed = " + session.isStagedSessionFailed() + "; "
-                + "stagedSessionErrorMessage = " + session.getStagedSessionErrorMessage() + "}";
+        return "{" + "appPackageName = " + mActual.getAppPackageName() + "; "
+                + "sessionId = " + mActual.getSessionId() + "; "
+                + "isStagedSessionReady = " + mActual.isStagedSessionReady() + "; "
+                + "isStagedSessionApplied = " + mActual.isStagedSessionApplied() + "; "
+                + "isStagedSessionFailed = " + mActual.isStagedSessionFailed() + "; "
+                + "stagedSessionErrorMessage = " + mActual.getStagedSessionErrorMessage() + "}";
     }
 }
diff --git a/hostsidetests/stagedinstall/app/src/com/android/tests/stagedinstall/StagedInstallTest.java b/hostsidetests/stagedinstall/app/src/com/android/tests/stagedinstall/StagedInstallTest.java
index 93064e6..3087fe1 100644
--- a/hostsidetests/stagedinstall/app/src/com/android/tests/stagedinstall/StagedInstallTest.java
+++ b/hostsidetests/stagedinstall/app/src/com/android/tests/stagedinstall/StagedInstallTest.java
@@ -17,6 +17,10 @@
 package com.android.tests.stagedinstall;
 
 import static com.android.cts.install.lib.InstallUtils.getPackageInstaller;
+import static com.android.cts.shim.lib.ShimPackage.DIFFERENT_APEX_PACKAGE_NAME;
+import static com.android.cts.shim.lib.ShimPackage.NOT_PRE_INSTALL_APEX_PACKAGE_NAME;
+import static com.android.cts.shim.lib.ShimPackage.SHIM_APEX_PACKAGE_NAME;
+import static com.android.cts.shim.lib.ShimPackage.SHIM_PACKAGE_NAME;
 import static com.android.tests.stagedinstall.PackageInstallerSessionInfoSubject.assertThat;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -33,7 +37,6 @@
 import android.content.pm.PackageManager;
 import android.os.Handler;
 import android.os.HandlerThread;
-import android.os.storage.StorageManager;
 import android.util.Log;
 
 import androidx.test.platform.app.InstrumentationRegistry;
@@ -104,61 +107,55 @@
     private static final Duration WAIT_FOR_SESSION_REMOVED_TTL = Duration.ofSeconds(10);
     private static final Duration SLEEP_DURATION = Duration.ofMillis(200);
 
-    private static final String SHIM_PACKAGE_NAME = "com.android.apex.cts.shim";
-    private static final String APK_SHIM_PACKAGE_NAME = "com.android.cts.ctsshim";
-    private static final String NOT_PREINSTALL_APEX_PACKAGE_NAME =
-            "com.android.apex.cts.shim_not_pre_installed";
-    private static final String DIFFERENT_APEX_PACKAGE_NAME = "com.android.apex.cts.shim.different";
-
     private static final TestApp TESTAPP_SAME_NAME_AS_APEX = new TestApp(
-            "TestAppSamePackageNameAsApex", SHIM_PACKAGE_NAME, 1, /*isApex*/ false,
+            "TestAppSamePackageNameAsApex", SHIM_APEX_PACKAGE_NAME, 1, /*isApex*/ false,
             "StagedInstallTestAppSamePackageNameAsApex.apk");
     private static final TestApp Apex2DifferentCertificate = new TestApp(
-            "Apex2DifferentCertificate", SHIM_PACKAGE_NAME, 2, /*isApex*/true,
+            "Apex2DifferentCertificate", SHIM_APEX_PACKAGE_NAME, 2, /*isApex*/true,
             "com.android.apex.cts.shim.v2_different_certificate.apex");
     private static final TestApp Apex2DifferentPackageName = new TestApp(
             "Apex2DifferentPackageName", DIFFERENT_APEX_PACKAGE_NAME, 2, /*isApex*/true,
             "com.android.apex.cts.shim.v2_different_package_name.apex");
     private static final TestApp Apex2SignedBob = new TestApp(
-            "Apex2SignedBob", SHIM_PACKAGE_NAME, 2, /*isApex*/true,
+            "Apex2SignedBob", SHIM_APEX_PACKAGE_NAME, 2, /*isApex*/true,
             "com.android.apex.cts.shim.v2_signed_bob.apex");
     private static final TestApp Apex2SignedBobRot = new TestApp(
-            "Apex2SignedBobRot", SHIM_PACKAGE_NAME, 2, /*isApex*/true,
+            "Apex2SignedBobRot", SHIM_APEX_PACKAGE_NAME, 2, /*isApex*/true,
             "com.android.apex.cts.shim.v2_signed_bob_rot.apex");
     private static final TestApp Apex2SignedBobRotRollback = new TestApp(
-            "Apex2SignedBobRotRollback", SHIM_PACKAGE_NAME, 2, /*isApex*/true,
+            "Apex2SignedBobRotRollback", SHIM_APEX_PACKAGE_NAME, 2, /*isApex*/true,
             "com.android.apex.cts.shim.v2_signed_bob_rot_rollback.apex");
     private static final TestApp ApexNoHashtree2 = new TestApp(
-            "Apex2", SHIM_PACKAGE_NAME, 2, /*isApex*/true,
+            "Apex2", SHIM_APEX_PACKAGE_NAME, 2, /*isApex*/true,
             "com.android.apex.cts.shim.v2_no_hashtree.apex");
     private static final TestApp ApexWrongSha2 = new TestApp(
-            "ApexWrongSha2", SHIM_PACKAGE_NAME, 2, /*isApex*/true,
+            "ApexWrongSha2", SHIM_APEX_PACKAGE_NAME, 2, /*isApex*/true,
             "com.android.apex.cts.shim.v2_wrong_sha.apex");
     private static final TestApp Apex2WithoutApkInApex = new TestApp(
-            "Apex2WithoutApkInApex", SHIM_PACKAGE_NAME, 2, /*isApex*/true,
+            "Apex2WithoutApkInApex", SHIM_APEX_PACKAGE_NAME, 2, /*isApex*/true,
             "com.android.apex.cts.shim.v2_without_apk_in_apex.apex");
     private static final TestApp Apex3SignedBob = new TestApp(
-            "Apex3SignedBob", SHIM_PACKAGE_NAME, 3, /*isApex*/true,
+            "Apex3SignedBob", SHIM_APEX_PACKAGE_NAME, 3, /*isApex*/true,
             "com.android.apex.cts.shim.v3_signed_bob.apex");
     private static final TestApp Apex3SignedBobRot = new TestApp(
-            "Apex3SignedBobRot", SHIM_PACKAGE_NAME, 3, /*isApex*/true,
+            "Apex3SignedBobRot", SHIM_APEX_PACKAGE_NAME, 3, /*isApex*/true,
             "com.android.apex.cts.shim.v3_signed_bob_rot.apex");
     private static final TestApp ApexNotPreInstalled = new TestApp(
-            "ApexNotPreInstalled", NOT_PREINSTALL_APEX_PACKAGE_NAME, 3, /*isApex*/true,
+            "ApexNotPreInstalled", NOT_PRE_INSTALL_APEX_PACKAGE_NAME, 3, /*isApex*/true,
             "com.android.apex.cts.shim_not_pre_installed.apex");
     private static final TestApp Apex2SdkTargetP = new TestApp(
-            "StagedInstallTestApexV2_SdkTargetP", SHIM_PACKAGE_NAME, 2,
+            "StagedInstallTestApexV2_SdkTargetP", SHIM_APEX_PACKAGE_NAME, 2,
             /*isApex*/true, "com.android.apex.cts.shim.v2_sdk_target_p.apex");
     private static final TestApp Apex2ApkInApexSdkTargetP = new TestApp(
-            "StagedInstallTestApexV2_ApkInApexSdkTargetP", SHIM_PACKAGE_NAME, 2,
+            "StagedInstallTestApexV2_ApkInApexSdkTargetP", SHIM_APEX_PACKAGE_NAME, 2,
             /*isApex*/true, "com.android.apex.cts.shim.v2_apk_in_apex_sdk_target_p.apex");
     private static final TestApp CorruptedApex_b146895998 = new TestApp(
             "StagedInstallTestCorruptedApex_b146895998", "", 1, true, "corrupted_b146895998.apex");
     private static final TestApp Apex2NoApkSignature = new TestApp(
-            "StagedInstallTestApexV2_NoApkSignature", SHIM_PACKAGE_NAME, 1,
+            "StagedInstallTestApexV2_NoApkSignature", SHIM_APEX_PACKAGE_NAME, 1,
             /*isApex*/true, "com.android.apex.cts.shim.v2_unsigned_apk_container.apex");
     private static final TestApp Apex2UnsignedPayload = new TestApp(
-            "StagedInstallTestApexV2_UnsignedPayload", SHIM_PACKAGE_NAME, 1,
+            "StagedInstallTestApexV2_UnsignedPayload", SHIM_APEX_PACKAGE_NAME, 1,
             /*isApex*/true, "com.android.apex.cts.shim.v2_unsigned_payload.apex");
 
     @Before
@@ -281,10 +278,10 @@
         int sessionId = stageSingleApk(TestApp.A1).assertSuccessful().getSessionId();
         assertThat(getInstalledVersion(TestApp.A)).isEqualTo(-1);
         waitForIsReadyBroadcast(sessionId);
-        PackageInstaller.SessionInfo session = getStagedSessionInfo(sessionId);
+        PackageInstaller.SessionInfo session = InstallUtils.getStagedSessionInfo(sessionId);
         assertSessionReady(sessionId);
         abandonSession(sessionId);
-        assertThat(getStagedSessionInfo(sessionId)).isNull();
+        InstallUtils.assertStagedSessionIsAbandoned(sessionId);
         // Allow the session to be removed from PackageInstaller
         Duration spentWaiting = Duration.ZERO;
         while (spentWaiting.compareTo(WAIT_FOR_SESSION_REMOVED_TTL) < 0) {
@@ -314,7 +311,7 @@
         int sessionId = stageSingleApk(TestApp.A1).assertSuccessful().getSessionId();
         assertThat(getInstalledVersion(TestApp.A)).isEqualTo(-1);
         abandonSession(sessionId);
-        assertThat(getStagedSessionInfo(sessionId)).isNull();
+        InstallUtils.assertStagedSessionIsAbandoned(sessionId);
     }
 
     @Test
@@ -324,7 +321,7 @@
 
     @Test
     public void testStageAnotherSessionImmediatelyAfterAbandon() throws Exception {
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
         int sessionId = stageSingleApk(TestApp.Apex2).assertSuccessful().getSessionId();
         abandonSession(sessionId);
         stageSingleApk(TestApp.Apex2).assertSuccessful();
@@ -332,7 +329,7 @@
 
     @Test
     public void testStageAnotherSessionImmediatelyAfterAbandonMultiPackage() throws Exception {
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
         int sessionId = stageMultipleApks(TestApp.Apex2, TestApp.A1, TestApp.B1)
                 .assertSuccessful().getSessionId();
         abandonSession(sessionId);
@@ -342,13 +339,13 @@
     @Test
     public void testNoSessionUpdatedBroadcastSentForStagedSessionAbandon() throws Exception {
         assertThat(getInstalledVersion(TestApp.A)).isEqualTo(-1);
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
         // Using an apex in hopes that pre-reboot verification will take longer to complete
         // and we will manage to abandon it before session becomes ready.
         int sessionId = stageMultipleApks(TestApp.A1, TestApp.Apex2).assertSuccessful()
                 .getSessionId();
         abandonSession(sessionId);
-        assertThat(getStagedSessionInfo(sessionId)).isNull();
+        InstallUtils.assertStagedSessionIsAbandoned(sessionId);
         assertNoSessionUpdatedBroadcastSent();
     }
 
@@ -458,13 +455,13 @@
 
     @Test
     public void testInstallStagedApex_Commit() throws Exception {
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
         int sessionId = stageSingleApk(TestApp.Apex2).assertSuccessful().getSessionId();
         waitForIsReadyBroadcast(sessionId);
         assertSessionReady(sessionId);
         storeSessionId(sessionId);
         // Version shouldn't change before reboot.
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
         assertNoSessionCommitBroadcastSent();
     }
 
@@ -472,13 +469,13 @@
     public void testInstallStagedApex_VerifyPostReboot() throws Exception {
         int sessionId = retrieveLastSessionId();
         assertSessionApplied(sessionId);
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(2);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
         assertNoSessionCommitBroadcastSent();
     }
 
     @Test
     public void testInstallStagedApexAndApk_Commit() throws Exception {
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
         assertThat(getInstalledVersion(TestApp.A)).isEqualTo(-1);
         int sessionId = stageMultipleApks(TestApp.Apex2, TestApp.A1)
                 .assertSuccessful().getSessionId();
@@ -486,7 +483,7 @@
         assertSessionReady(sessionId);
         storeSessionId(sessionId);
         // Version shouldn't change before reboot.
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
         assertThat(getInstalledVersion(TestApp.A)).isEqualTo(-1);
         assertNoSessionCommitBroadcastSent();
     }
@@ -495,7 +492,7 @@
     public void testInstallStagedApexAndApk_VerifyPostReboot() throws Exception {
         int sessionId = retrieveLastSessionId();
         assertSessionApplied(sessionId);
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(2);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
         assertThat(getInstalledVersion(TestApp.A)).isEqualTo(1);
         assertNoSessionCommitBroadcastSent();
     }
@@ -517,7 +514,7 @@
 
     @Test
     public void testInstallStagedNonPreInstalledApex_Fails() throws Exception {
-        assertThat(getInstalledVersion(NOT_PREINSTALL_APEX_PACKAGE_NAME)).isEqualTo(-1);
+        assertThat(getInstalledVersion(NOT_PRE_INSTALL_APEX_PACKAGE_NAME)).isEqualTo(-1);
         int sessionId = stageSingleApk(ApexNotPreInstalled).assertSuccessful().getSessionId();
         PackageInstaller.SessionInfo sessionInfo = waitForBroadcast(sessionId);
         assertThat(sessionInfo).isStagedSessionFailed();
@@ -526,7 +523,7 @@
     @Test
     public void testInstallStagedDifferentPackageNameWithInstalledApex_Fails() throws Exception {
         assertThat(getInstalledVersion(DIFFERENT_APEX_PACKAGE_NAME)).isEqualTo(-1);
-        assertThat(getInstalledVersion(SHIM_PACKAGE_NAME)).isEqualTo(1);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
         int sessionId = stageSingleApk(Apex2DifferentPackageName).assertSuccessful().getSessionId();
         PackageInstaller.SessionInfo sessionInfo = waitForBroadcast(sessionId);
         assertThat(sessionInfo.getStagedSessionErrorMessage()).contains(
@@ -535,7 +532,7 @@
 
     @Test
     public void testStageApkWithSameNameAsApexShouldFail_Commit() throws Exception {
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
         int sessionId = stageSingleApk(TESTAPP_SAME_NAME_AS_APEX).assertSuccessful().getSessionId();
         waitForIsReadyBroadcast(sessionId);
         assertSessionReady(sessionId);
@@ -546,16 +543,16 @@
     public void testStageApkWithSameNameAsApexShouldFail_VerifyPostReboot() throws Exception {
         int sessionId = retrieveLastSessionId();
         assertSessionFailed(sessionId);
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
     }
 
     @Test
     public void testNonStagedInstallApkWithSameNameAsApexShouldFail() throws Exception {
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
         InstallUtils.commitExpectingFailure(AssertionError.class,
                 "is an APEX package and can't be installed as an APK",
                 Install.single(TESTAPP_SAME_NAME_AS_APEX));
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
     }
 
     @Test
@@ -570,8 +567,8 @@
     public void testInstallV2Apex_VerifyPostReboot() throws Exception {
         int sessionId = retrieveLastSessionId();
         assertSessionApplied(sessionId);
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(2);
-        assertThat(getInstalledVersion(APK_SHIM_PACKAGE_NAME)).isNotEqualTo(-1);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
+        assertThat(getInstalledVersion(SHIM_PACKAGE_NAME)).isNotEqualTo(-1);
     }
 
     @Test
@@ -586,7 +583,7 @@
     public void testInstallV2SignedBobApex_VerifyPostReboot() throws Exception {
         int sessionId = retrieveLastSessionId();
         assertSessionApplied(sessionId);
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(2);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
     }
 
     @Test
@@ -601,7 +598,7 @@
     public void testInstallV3Apex_VerifyPostReboot() throws Exception {
         int sessionId = retrieveLastSessionId();
         assertSessionApplied(sessionId);
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(3);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(3);
     }
 
     @Test
@@ -616,13 +613,13 @@
     public void testInstallV3SignedBobApex_VerifyPostReboot() throws Exception {
         int sessionId = retrieveLastSessionId();
         assertSessionApplied(sessionId);
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(2);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
     }
 
     @Test
     public void testStagedInstallDowngradeApex_DowngradeNotRequested_Fails_Commit()
             throws Exception {
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(3);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(3);
         int sessionId = stageSingleApk(TestApp.Apex2).assertSuccessful().getSessionId();
         PackageInstaller.SessionInfo sessionInfo = waitForBroadcast(sessionId);
         assertThat(sessionInfo).isStagedSessionFailed();
@@ -637,13 +634,13 @@
         int sessionId = retrieveLastSessionId();
         assertSessionFailed(sessionId);
         // INSTALL_REQUEST_DOWNGRADE wasn't set, so apex shouldn't be downgraded.
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(3);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(3);
     }
 
     @Test
     public void testStagedInstallDowngradeApex_DowngradeRequested_DebugBuild_Commit()
             throws Exception {
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(3);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(3);
         int sessionId = stageDowngradeSingleApk(TestApp.Apex2).assertSuccessful().getSessionId();
         waitForIsReadyBroadcast(sessionId);
         assertSessionReady(sessionId);
@@ -656,13 +653,13 @@
         int sessionId = retrieveLastSessionId();
         assertSessionApplied(sessionId);
         // Apex should be downgraded.
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(2);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
     }
 
     @Test
     public void testStagedInstallDowngradeApex_DowngradeRequested_UserBuild_Fails_Commit()
             throws Exception {
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(3);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(3);
         int sessionId = stageDowngradeSingleApk(TestApp.Apex2).assertSuccessful().getSessionId();
         PackageInstaller.SessionInfo sessionInfo = waitForBroadcast(sessionId);
         assertThat(sessionInfo).isStagedSessionFailed();
@@ -677,13 +674,13 @@
         int sessionId = retrieveLastSessionId();
         assertSessionFailed(sessionId);
         // Apex shouldn't be downgraded.
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(3);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(3);
     }
 
     @Test
     public void testStagedInstallDowngradeApexToSystemVersion_DebugBuild_Commit()
             throws Exception {
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(2);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
         int sessionId = stageDowngradeSingleApk(TestApp.Apex1).assertSuccessful().getSessionId();
         waitForIsReadyBroadcast(sessionId);
         assertSessionReady(sessionId);
@@ -696,7 +693,7 @@
         int sessionId = retrieveLastSessionId();
         assertSessionApplied(sessionId);
         // Apex should be downgraded.
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
     }
 
     @Test
@@ -708,7 +705,7 @@
 
     @Test
     public void testFailsInvalidApexInstall_Commit() throws Exception {
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
         int sessionId = stageSingleApk(ApexWrongSha2).assertSuccessful()
                 .getSessionId();
         waitForIsFailedBroadcast(sessionId);
@@ -784,7 +781,7 @@
 
     @Test
     public void testInstallStagedApexWithoutApexSuffix_Commit() throws Exception {
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
 
         int sessionId = stageSingleApk("com.android.apex.cts.shim.v2.apex", "package")
                 .assertSuccessful().getSessionId();
@@ -792,14 +789,14 @@
         assertSessionReady(sessionId);
         storeSessionId(sessionId);
         // Version shouldn't change before reboot.
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
     }
 
     @Test
     public void testInstallStagedApexWithoutApexSuffix_VerifyPostReboot() throws Exception {
         int sessionId = retrieveLastSessionId();
         assertSessionApplied(sessionId);
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(2);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
     }
 
     @Test
@@ -837,13 +834,13 @@
 
     @Test
     public void testUpdateWithDifferentKey_VerifyPostReboot() throws Exception {
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(2);
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
     }
 
     // Once updated with a new rotated key (bob), further updates with old key (alice) should fail
     @Test
     public void testUntrustedOldKeyIsRejected() throws Exception {
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(2);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
         int sessionId = stageSingleApk(TestApp.Apex3).assertSuccessful().getSessionId();
         waitForIsFailedBroadcast(sessionId);
     }
@@ -851,41 +848,41 @@
     // Should be able to update with an old key which is trusted
     @Test
     public void testTrustedOldKeyIsAccepted_Commit() throws Exception {
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
         int sessionId = stageSingleApk(Apex2SignedBobRotRollback).assertSuccessful().getSessionId();
         waitForIsReadyBroadcast(sessionId);
     }
 
     @Test
     public void testTrustedOldKeyIsAccepted_CommitPostReboot() throws Exception {
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(2);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
         int sessionId = stageSingleApk(TestApp.Apex3).assertSuccessful().getSessionId();
         waitForIsReadyBroadcast(sessionId);
     }
 
     @Test
     public void testTrustedOldKeyIsAccepted_VerifyPostReboot() throws Exception {
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(3);
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(3);
     }
 
     // Once updated with a new rotated key (bob), further updates with new key (bob) should pass
     @Test
     public void testAfterRotationNewKeyCanUpdateFurther_CommitPostReboot() throws Exception {
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(2);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
         int sessionId = stageSingleApk(Apex3SignedBobRot).assertSuccessful().getSessionId();
         waitForIsReadyBroadcast(sessionId);
     }
 
     @Test
     public void testAfterRotationNewKeyCanUpdateFurther_VerifyPostReboot() throws Exception {
-        assertThat(InstallUtils.getInstalledVersion(TestApp.Apex)).isEqualTo(3);
+        assertThat(InstallUtils.getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(3);
     }
 
     // Once updated with a new rotated key (bob), further updates can be done with key only
     @Test
     public void testAfterRotationNewKeyCanUpdateFurtherWithoutLineage()
             throws Exception {
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(2);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
         int sessionId = stageSingleApk(Apex3SignedBob).assertSuccessful().getSessionId();
         waitForIsReadyBroadcast(sessionId);
     }
@@ -1021,8 +1018,9 @@
 
     @Test
     public void testSamegradeSystemApex_Commit() throws Exception {
-        final PackageInfo shim = InstrumentationRegistry.getInstrumentation().getContext()
-                .getPackageManager().getPackageInfo(SHIM_PACKAGE_NAME, PackageManager.MATCH_APEX);
+        final PackageInfo shim =
+                InstrumentationRegistry.getInstrumentation().getContext().getPackageManager()
+                        .getPackageInfo(SHIM_APEX_PACKAGE_NAME, PackageManager.MATCH_APEX);
         assertThat(shim.getLongVersionCode()).isEqualTo(1);
         assertThat(shim.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM).isEqualTo(
                 ApplicationInfo.FLAG_SYSTEM);
@@ -1037,8 +1035,9 @@
     public void testSamegradeSystemApex_VerifyPostReboot() throws Exception {
         int sessionId = retrieveLastSessionId();
         assertSessionApplied(sessionId);
-        final PackageInfo shim = InstrumentationRegistry.getInstrumentation().getContext()
-                .getPackageManager().getPackageInfo(SHIM_PACKAGE_NAME, PackageManager.MATCH_APEX);
+        final PackageInfo shim =
+                InstrumentationRegistry.getInstrumentation().getContext().getPackageManager()
+                        .getPackageInfo(SHIM_APEX_PACKAGE_NAME, PackageManager.MATCH_APEX);
         assertThat(shim.getLongVersionCode()).isEqualTo(1);
         // Check that APEX on /data wins.
         assertThat(shim.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM).isEqualTo(0);
@@ -1063,20 +1062,20 @@
 
     @Test
     public void testInstallStagedNoHashtreeApex_Commit() throws Exception {
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
         int sessionId = stageSingleApk(ApexNoHashtree2).assertSuccessful().getSessionId();
         waitForIsReadyBroadcast(sessionId);
         assertSessionReady(sessionId);
         storeSessionId(sessionId);
         // Version shouldn't change before reboot.
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
     }
 
     @Test
     public void testInstallStagedNoHashtreeApex_VerifyPostReboot() throws Exception {
         int sessionId = retrieveLastSessionId();
         assertSessionApplied(sessionId);
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(2);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
         // Read all files under /apex/com.android.apex.cts.shim to somewhat verify that hashtree
         // is not corrupted
         Files.walkFileTree(Paths.get("/apex/com.android.apex.cts.shim"),
@@ -1102,8 +1101,8 @@
 
     @Test
     public void testInstallStagedApex_SameGrade_NewOneWins_Commit() throws Exception {
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(2);
-        assertThat(getInstalledVersion(APK_SHIM_PACKAGE_NAME)).isNotEqualTo(-1);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
+        assertThat(getInstalledVersion(SHIM_PACKAGE_NAME)).isNotEqualTo(-1);
         int sessionId = Install.single(Apex2WithoutApkInApex).setStaged().commit();
         assertSessionReady(sessionId);
         storeSessionId(sessionId);
@@ -1113,8 +1112,8 @@
     public void testInstallStagedApex_SameGrade_NewOneWins_VerifyPostReboot() throws Exception {
         int sessionId = retrieveLastSessionId();
         assertSessionApplied(sessionId);
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(2);
-        assertThat(getInstalledVersion(APK_SHIM_PACKAGE_NAME)).isEqualTo(-1);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(2);
+        assertThat(getInstalledVersion(SHIM_PACKAGE_NAME)).isEqualTo(-1);
     }
 
     /**
@@ -1143,7 +1142,7 @@
     public void testApexFailsToInstallIfApkInApexFailsToScan_VerifyPostReboot() throws Exception {
         int sessionId = retrieveLastSessionId();
         assertSessionFailed(sessionId);
-        assertThat(getInstalledVersion(TestApp.Apex)).isEqualTo(1);
+        assertThat(getInstalledVersion(SHIM_APEX_PACKAGE_NAME)).isEqualTo(1);
     }
 
     @Test
@@ -1367,19 +1366,6 @@
         getPackageInstaller().abandonSession(sessionId);
     }
 
-    /**
-     * Returns the session by session Id, or null if no session is found.
-     */
-    private static PackageInstaller.SessionInfo getStagedSessionInfo(int sessionId) {
-        PackageInstaller packageInstaller = getPackageInstaller();
-        for (PackageInstaller.SessionInfo session : packageInstaller.getStagedSessions()) {
-            if (session.getSessionId() == sessionId) {
-                return session;
-            }
-        }
-        return null;
-    }
-
     private static PackageInstaller.SessionInfo getSessionInfo(int sessionId) {
         return getPackageInstaller().getSessionInfo(sessionId);
     }
@@ -1438,11 +1424,4 @@
                         TimeUnit.SECONDS);
         assertThat(info).isNull();
     }
-
-    @Test
-    public void isCheckpointSupported() {
-        Context context = InstrumentationRegistry.getInstrumentation().getContext();
-        StorageManager sm = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
-        assertThat(sm.isCheckpointSupported()).isTrue();
-    }
 }
diff --git a/hostsidetests/stagedinstall/src/com/android/tests/stagedinstall/host/ApexShimValidationTest.java b/hostsidetests/stagedinstall/src/com/android/tests/stagedinstall/host/ApexShimValidationTest.java
index 2034faa..dba49e9 100644
--- a/hostsidetests/stagedinstall/src/com/android/tests/stagedinstall/host/ApexShimValidationTest.java
+++ b/hostsidetests/stagedinstall/src/com/android/tests/stagedinstall/host/ApexShimValidationTest.java
@@ -16,11 +16,16 @@
 
 package com.android.tests.stagedinstall.host;
 
+import static com.android.cts.shim.lib.ShimPackage.PRIVILEGED_SHIM_PACKAGE_NAME;
+import static com.android.cts.shim.lib.ShimPackage.SHIM_APEX_PACKAGE_NAME;
+import static com.android.cts.shim.lib.ShimPackage.SHIM_PACKAGE_NAME;
+
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
 
-import static org.junit.Assume.assumeThat;
+import static org.junit.Assume.assumeTrue;
 
+import android.cts.install.lib.host.InstallUtilsHost;
 import android.platform.test.annotations.LargeTest;
 
 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
@@ -32,7 +37,6 @@
 import com.android.tradefed.util.RunUtil;
 import com.android.tradefed.util.ZipUtil;
 
-import org.hamcrest.CoreMatchers;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -63,7 +67,8 @@
 @RunWith(DeviceJUnit4ClassRunner.class)
 public class ApexShimValidationTest extends BaseHostJUnit4Test {
 
-    private static final String SHIM_APEX_PACKAGE_NAME = "com.android.apex.cts.shim";
+    private final InstallUtilsHost mHostUtils = new InstallUtilsHost(this);
+
     private static final String SHIM_APK_CODE_PATH_PREFIX = "/apex/" + SHIM_APEX_PACKAGE_NAME + "/";
     private static final String STAGED_INSTALL_TEST_FILE_NAME = "StagedInstallTest.apk";
     private static final String APEX_FILE_SUFFIX = ".apex";
@@ -75,7 +80,7 @@
     private static final long DEFAULT_RUN_TIMEOUT_MS = 30 * 1000L;
 
     private static final List<String> ALLOWED_SHIM_PACKAGE_NAMES = Arrays.asList(
-            "com.android.cts.ctsshim", "com.android.cts.priv.ctsshim");
+            SHIM_PACKAGE_NAME, PRIVILEGED_SHIM_PACKAGE_NAME);
 
     private File mDeapexingDir;
     private File mDeapexerZip;
@@ -104,8 +109,7 @@
 
     @Before
     public void setUp() throws Exception {
-        final String updatable = getDevice().getProperty("ro.apex.updatable");
-        assumeThat("Device doesn't support updating APEX", updatable, CoreMatchers.equalTo("true"));
+        assumeTrue("Device doesn't support updating APEX", mHostUtils.isApexUpdateSupported());
         cleanUp();
         mDeapexerZip = getTestInformation().getDependencyFile(DEAPEXER_ZIP_FILE_NAME, false);
         mAllApexesZip = getTestInformation().getDependencyFile(STAGED_INSTALL_TEST_FILE_NAME,
diff --git a/hostsidetests/stagedinstall/src/com/android/tests/stagedinstall/host/StagedInstallTest.java b/hostsidetests/stagedinstall/src/com/android/tests/stagedinstall/host/StagedInstallTest.java
index 864a581..41e410d 100644
--- a/hostsidetests/stagedinstall/src/com/android/tests/stagedinstall/host/StagedInstallTest.java
+++ b/hostsidetests/stagedinstall/src/com/android/tests/stagedinstall/host/StagedInstallTest.java
@@ -16,6 +16,8 @@
 
 package com.android.tests.stagedinstall.host;
 
+import static com.android.cts.shim.lib.ShimPackage.SHIM_APEX_PACKAGE_NAME;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.hamcrest.CoreMatchers.endsWith;
@@ -25,6 +27,7 @@
 import static org.junit.Assume.assumeThat;
 import static org.junit.Assume.assumeTrue;
 
+import android.cts.install.lib.host.InstallUtilsHost;
 import android.platform.test.annotations.LargeTest;
 
 import com.android.ddmlib.Log;
@@ -46,13 +49,13 @@
 
     private static final String TAG = "StagedInstallTest";
 
-    private static final String SHIM_APEX_PACKAGE_NAME = "com.android.apex.cts.shim";
-
     private static final String PACKAGE_NAME = "com.android.tests.stagedinstall";
 
     private static final String BROADCAST_RECEIVER_COMPONENT = PACKAGE_NAME + "/"
             + PACKAGE_NAME + ".LauncherActivity";
 
+    private final InstallUtilsHost mHostUtils = new InstallUtilsHost(this);
+
     private String mDefaultLauncher = null;
 
     @Rule
@@ -84,14 +87,14 @@
     @Before
     public void setUp() throws Exception {
         cleanUp();
-        uninstallShimApexIfNecessary();
+        mHostUtils.uninstallShimApexIfNecessary();
         storeDefaultLauncher();
     }
 
     @After
     public void tearDown() throws Exception {
         cleanUp();
-        uninstallShimApexIfNecessary();
+        mHostUtils.uninstallShimApexIfNecessary();
         setDefaultLauncher(mDefaultLauncher);
     }
 
@@ -133,19 +136,19 @@
 
     @Test
     public void testStageAnotherSessionImmediatelyAfterAbandon() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
         runPhase("testStageAnotherSessionImmediatelyAfterAbandon");
     }
 
     @Test
     public void testStageAnotherSessionImmediatelyAfterAbandonMultiPackage() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
         runPhase("testStageAnotherSessionImmediatelyAfterAbandonMultiPackage");
     }
 
     @Test
     public void testNoSessionUpdatedBroadcastSentForStagedSessionAbandon() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
         runPhase("testNoSessionUpdatedBroadcastSentForStagedSessionAbandon");
     }
 
@@ -168,7 +171,9 @@
 
     @Test
     public void testGetActiveStagedSessions() throws Exception {
-        assumeTrue(isCheckpointSupported());
+        assumeTrue("Device does not support file-system checkpoint",
+                mHostUtils.isCheckpointSupported());
+
         runPhase("testGetActiveStagedSessions");
     }
 
@@ -188,7 +193,9 @@
 
     @Test
     public void testGetActiveStagedSessions_MultiApkSession() throws Exception {
-        assumeTrue(isCheckpointSupported());
+        assumeTrue("Device does not support file-system checkpoint",
+                mHostUtils.isCheckpointSupported());
+
         runPhase("testGetActiveStagedSessions_MultiApkSession");
     }
 
@@ -217,16 +224,18 @@
 
     @Test
     public void testShimApexShouldPreInstalledIfUpdatingApexIsSupported() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
-        final ITestDevice.ApexInfo shimApex = getShimApex();
+        final ITestDevice.ApexInfo shimApex = mHostUtils.getShimApex().orElseThrow(
+                () -> new AssertionError("Can't find " + SHIM_APEX_PACKAGE_NAME)
+        );
         assertThat(shimApex.versionCode).isEqualTo(1);
     }
 
     @Test
     @LargeTest
     public void testInstallStagedApex() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         setDefaultLauncher(BROADCAST_RECEIVER_COMPONENT);
         runPhase("testInstallStagedApex_Commit");
@@ -237,7 +246,7 @@
     @Test
     // Don't mark as @LargeTest since we want at least one test to install apex during pre-submit.
     public void testInstallStagedApexAndApk() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         setDefaultLauncher(BROADCAST_RECEIVER_COMPONENT);
         runPhase("testInstallStagedApexAndApk_Commit");
@@ -247,21 +256,21 @@
 
     @Test
     public void testsFailsNonStagedApexInstall() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         runPhase("testsFailsNonStagedApexInstall");
     }
 
     @Test
     public void testInstallStagedNonPreInstalledApex_Fails() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         runPhase("testInstallStagedNonPreInstalledApex_Fails");
     }
 
     @Test
     public void testInstallStagedDifferentPackageNameWithInstalledApex_Fails() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         runPhase("testInstallStagedDifferentPackageNameWithInstalledApex_Fails");
     }
@@ -269,7 +278,7 @@
     @Test
     @LargeTest
     public void testStageApkWithSameNameAsApexShouldFail() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         runPhase("testStageApkWithSameNameAsApexShouldFail_Commit");
         getDevice().reboot();
@@ -278,14 +287,14 @@
 
     @Test
     public void testNonStagedInstallApkWithSameNameAsApexShouldFail() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
         runPhase("testNonStagedInstallApkWithSameNameAsApexShouldFail");
     }
 
     @Test
     @LargeTest
     public void testStagedInstallDowngradeApex_DowngradeNotRequested_Fails() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         installV3Apex();
         runPhase("testStagedInstallDowngradeApex_DowngradeNotRequested_Fails_Commit");
@@ -297,7 +306,7 @@
     @LargeTest
     public void testStagedInstallDowngradeApex_DowngradeRequested_DebugBuild() throws Exception {
         assumeThat(getDevice().getBuildFlavor(), not(endsWith("-user")));
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         installV3Apex();
         runPhase("testStagedInstallDowngradeApex_DowngradeRequested_DebugBuild_Commit");
@@ -311,7 +320,7 @@
             throws Exception {
         assumeThat(getDevice().getBuildFlavor(), endsWith("-user"));
         assumeFalse("Device is debuggable", isDebuggable());
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         installV3Apex();
         runPhase("testStagedInstallDowngradeApex_DowngradeRequested_UserBuild_Fails_Commit");
@@ -324,7 +333,7 @@
     @LargeTest
     public void testStagedInstallDowngradeApexToSystemVersion_DebugBuild() throws Exception {
         assumeThat(getDevice().getBuildFlavor(), not(endsWith("-user")));
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         installV2Apex();
         runPhase("testStagedInstallDowngradeApexToSystemVersion_DebugBuild_Commit");
@@ -335,7 +344,7 @@
     @Test
     @LargeTest
     public void testInstallStagedApex_SameGrade() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
         installV3Apex();
         installV3Apex();
     }
@@ -343,7 +352,7 @@
     @Test
     @LargeTest
     public void testInstallStagedApex_SameGrade_NewOneWins() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         installV2Apex();
 
@@ -354,7 +363,7 @@
 
     @Test
     public void testInstallApex_DeviceDoesNotSupportApex_Fails() throws Exception {
-        assumeFalse("Device supports updating APEX", isUpdatingApexSupported());
+        assumeFalse("Device supports updating APEX", mHostUtils.isApexUpdateSupported());
 
         runPhase("testInstallApex_DeviceDoesNotSupportApex_Fails");
     }
@@ -379,7 +388,7 @@
 
     @Test
     public void testFailsInvalidApexInstall() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
         runPhase("testFailsInvalidApexInstall_Commit");
         runPhase("testFailsInvalidApexInstall_AbandonSessionIsNoop");
     }
@@ -392,7 +401,7 @@
     @Test
     @LargeTest
     public void testInstallStagedApexWithoutApexSuffix() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         runPhase("testInstallStagedApexWithoutApexSuffix_Commit");
         getDevice().reboot();
@@ -401,7 +410,7 @@
 
     @Test
     public void testRejectsApexDifferentCertificate() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         runPhase("testRejectsApexDifferentCertificate");
     }
@@ -421,7 +430,7 @@
     // Should not be able to update with a key that has not been rotated.
     @Test
     public void testUpdateWithDifferentKeyButNoRotation() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         runPhase("testUpdateWithDifferentKeyButNoRotation");
     }
@@ -430,7 +439,7 @@
     @Test
     @LargeTest
     public void testUpdateWithDifferentKey() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         runPhase("testUpdateWithDifferentKey_Commit");
         getDevice().reboot();
@@ -442,7 +451,7 @@
     @Test
     @LargeTest
     public void testUntrustedOldKeyIsRejected() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         installV2SignedBobApex();
         runPhase("testUntrustedOldKeyIsRejected");
@@ -452,7 +461,7 @@
     @Test
     @LargeTest
     public void testTrustedOldKeyIsAccepted() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         runPhase("testTrustedOldKeyIsAccepted_Commit");
         getDevice().reboot();
@@ -465,7 +474,7 @@
     @Test
     @LargeTest
     public void testAfterRotationNewKeyCanUpdateFurther() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         installV2SignedBobApex();
         runPhase("testAfterRotationNewKeyCanUpdateFurther_CommitPostReboot");
@@ -476,7 +485,7 @@
     @Test
     @LargeTest
     public void testAfterRotationNewKeyCanUpdateFurtherWithoutLineage() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         installV2SignedBobApex();
         runPhase("testAfterRotationNewKeyCanUpdateFurtherWithoutLineage");
@@ -489,7 +498,9 @@
     // Should fail to stage multiple sessions when check-point is not available
     @Test
     public void testFailStagingMultipleSessionsIfNoCheckPoint() throws Exception {
-        assumeFalse(isCheckpointSupported());
+        assumeFalse("Device supports file-system checkpoint",
+                mHostUtils.isCheckpointSupported());
+
         runPhase("testFailStagingMultipleSessionsIfNoCheckPoint");
     }
 
@@ -501,13 +512,17 @@
     @Test
     public void testAllowNonOverlappingMultipleStagedInstall_MultiPackageSinglePackage_Apk()
             throws Exception {
-        assumeTrue(isCheckpointSupported());
+        assumeTrue("Device does not support file-system checkpoint",
+                mHostUtils.isCheckpointSupported());
+
         runPhase("testAllowNonOverlappingMultipleStagedInstall_MultiPackageSinglePackage_Apk");
     }
 
     @Test
     public void testFailOverlappingMultipleStagedInstall_BothMultiPackage_Apk() throws Exception {
-        assumeTrue(isCheckpointSupported());
+        assumeTrue("Device does not support file-system checkpoint",
+                mHostUtils.isCheckpointSupported());
+
         runPhase("testFailOverlappingMultipleStagedInstall_BothMultiPackage_Apk");
     }
 
@@ -515,7 +530,9 @@
     @Test
     @LargeTest
     public void testMultipleStagedInstall_ApkOnly() throws Exception {
-        assumeTrue(isCheckpointSupported());
+        assumeTrue("Device does not support file-system checkpoint",
+                mHostUtils.isCheckpointSupported());
+
         runPhase("testMultipleStagedInstall_ApkOnly_Commit");
         getDevice().reboot();
         runPhase("testMultipleStagedInstall_ApkOnly_VerifyPostReboot");
@@ -525,7 +542,9 @@
     @Test
     @LargeTest
     public void testInstallMultipleStagedSession_PartialFail_ApkOnly() throws Exception {
-        assumeTrue(isCheckpointSupported());
+        assumeTrue("Device does not support file-system checkpoint",
+                mHostUtils.isCheckpointSupported());
+
         runPhase("testInstallMultipleStagedSession_PartialFail_ApkOnly_Commit");
         getDevice().reboot();
         runPhase("testInstallMultipleStagedSession_PartialFail_ApkOnly_VerifyPostReboot");
@@ -535,7 +554,9 @@
     @Test
     @LargeTest
     public void testFailureReasonPersists_SingleSession() throws Exception {
-        assumeTrue(isCheckpointSupported());
+        assumeTrue("Device does not support file-system checkpoint",
+                mHostUtils.isCheckpointSupported());
+
         runPhase("testFailureReasonPersists_SingleSession_Commit");
         getDevice().reboot();
         runPhase("testFailureReasonPersists_SingleSession_VerifyPostReboot");
@@ -545,7 +566,9 @@
     @Test
     @LargeTest
     public void testFailureReasonPersists_MultiSession() throws Exception {
-        assumeTrue(isCheckpointSupported());
+        assumeTrue("Device does not support file-system checkpoint",
+                mHostUtils.isCheckpointSupported());
+
         runPhase("testFailureReasonPersists_MultipleSession_Commit");
         getDevice().reboot();
         runPhase("testFailureReasonPersists_MultipleSession_VerifyPostReboot");
@@ -554,7 +577,7 @@
     @Test
     @LargeTest
     public void testSamegradeSystemApex() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         runPhase("testSamegradeSystemApex_Commit");
         getDevice().reboot();
@@ -579,7 +602,7 @@
     @Test
     @LargeTest
     public void testInstallStagedNoHashtreeApex() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         runPhase("testInstallStagedNoHashtreeApex_Commit");
         getDevice().reboot();
@@ -591,7 +614,7 @@
      */
     @Test
     public void testApexTargetingOldDevSdkFailsVerification() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         runPhase("testApexTargetingOldDevSdkFailsVerification");
     }
@@ -602,7 +625,7 @@
     @Test
     @LargeTest
     public void testApexFailsToInstallIfApkInApexFailsToScan() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         runPhase("testApexFailsToInstallIfApkInApexFailsToScan_Commit");
         getDevice().reboot();
@@ -611,7 +634,7 @@
 
     @Test
     public void testCorruptedApexFailsVerification_b146895998() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         runPhase("testCorruptedApexFailsVerification_b146895998");
     }
@@ -621,7 +644,7 @@
      */
     @Test
     public void testApexWithUnsignedApkFailsVerification() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         runPhase("testApexWithUnsignedApkFailsVerification");
     }
@@ -631,52 +654,11 @@
      */
     @Test
     public void testApexWithUnsignedPayloadFailsVerification() throws Exception {
-        assumeTrue("Device does not support updating APEX", isUpdatingApexSupported());
+        assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
 
         runPhase("testApexWithUnsignedPayloadFailsVerification");
     }
 
-    private boolean isUpdatingApexSupported() throws Exception {
-        final String updatable = getDevice().getProperty("ro.apex.updatable");
-        return updatable != null && updatable.equals("true");
-    }
-
-    /**
-     * Uninstalls a shim apex only if it's latest version is installed on /data partition (i.e.
-     * it has a version higher than {@code 1}).
-     *
-     * <p>This is purely to optimize tests run time. Since uninstalling an apex requires a reboot,
-     * and only a small subset of tests successfully install an apex, this code avoids ~10
-     * unnecessary reboots.
-     */
-    private void uninstallShimApexIfNecessary() throws Exception {
-        if (!isUpdatingApexSupported()) {
-            // Device doesn't support updating apex. Nothing to uninstall.
-            return;
-        }
-        if (getShimApex().sourceDir.startsWith("/system")) {
-            // System version is active, nothing to uninstall.
-            return;
-        }
-        // Non system version is active, need to uninstall it and reboot the device.
-        Log.i(TAG, "Uninstalling shim apex");
-        final String errorMessage = getDevice().uninstallPackage(SHIM_APEX_PACKAGE_NAME);
-        if (errorMessage != null) {
-            Log.e(TAG, "Failed to uninstall " + SHIM_APEX_PACKAGE_NAME + " : " + errorMessage);
-        } else {
-            getDevice().reboot();
-            final ITestDevice.ApexInfo shim = getShimApex();
-            assertThat(shim.versionCode).isEqualTo(1L);
-            assertThat(shim.sourceDir).startsWith("/system");
-        }
-    }
-
-    private ITestDevice.ApexInfo getShimApex() throws DeviceNotAvailableException {
-        return getDevice().getActiveApexes().stream().filter(
-                apex -> apex.name.equals(SHIM_APEX_PACKAGE_NAME)).findAny().orElseThrow(
-                () -> new AssertionError("Can't find " + SHIM_APEX_PACKAGE_NAME));
-    }
-
     /**
      * Store the component name of the default launcher. This value will be used to reset the
      * default launcher to its correct component upon test completion.
@@ -699,7 +681,9 @@
      */
     private void setDefaultLauncher(String launcherComponent) throws DeviceNotAvailableException {
         assertThat(launcherComponent).isNotEmpty();
-        getDevice().executeShellCommand("cmd package set-home-activity " + launcherComponent);
+        int user = getDevice().getCurrentUser();
+        getDevice().executeShellCommand(
+                "cmd package set-home-activity --user " + user + " " + launcherComponent);
     }
 
     private static final class FailedTestLogHook extends TestWatcher {
@@ -734,15 +718,6 @@
         }
     }
 
-    private boolean isCheckpointSupported() throws Exception {
-        try {
-            runPhase("isCheckpointSupported");
-            return true;
-        } catch (AssertionError ignore) {
-            return false;
-        }
-    }
-
     private boolean isDebuggable() throws Exception {
         return getDevice().getIntProperty("ro.debuggable", 0) == 1;
     }
diff --git a/hostsidetests/statsd/Android.bp b/hostsidetests/statsd/Android.bp
index d418f42..dccd5be 100644
--- a/hostsidetests/statsd/Android.bp
+++ b/hostsidetests/statsd/Android.bp
@@ -22,7 +22,6 @@
         "cts",
         "general-tests",
         "mts",
-        "vts10",
     ],
 
     libs: [
diff --git a/hostsidetests/statsd/AndroidTest.xml b/hostsidetests/statsd/AndroidTest.xml
index 6e97754..451ad73 100644
--- a/hostsidetests/statsd/AndroidTest.xml
+++ b/hostsidetests/statsd/AndroidTest.xml
@@ -23,9 +23,6 @@
     <test class="com.android.compatibility.common.tradefed.testtype.JarHostTest" >
         <option name="jar" value="CtsStatsdHostTestCases.jar" />
     </test>
-    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
-        <option name="run-command" value="setprop persist.traced.enable 1" />
-    </target_preparer>
 
     <object type="module_controller" class="com.android.tradefed.testtype.suite.module.MainlineTestModuleController">
         <option name="mainline-module-package-name" value="com.google.android.os.statsd" />
diff --git a/hostsidetests/statsd/OWNERS b/hostsidetests/statsd/OWNERS
index 438932b..5e51cc4 100644
--- a/hostsidetests/statsd/OWNERS
+++ b/hostsidetests/statsd/OWNERS
@@ -1,6 +1,7 @@
 # Bug component: 366902
-joeo@google.com
+jeffreyhuang@google.com
 muhammadq@google.com
 singhtejinder@google.com
+tsaichristine@google.com
 yaochen@google.com
 yro@google.com
diff --git a/hostsidetests/statsd/apps/statsdapp/Android.bp b/hostsidetests/statsd/apps/statsdapp/Android.bp
index a76c07e..6e0ef51 100644
--- a/hostsidetests/statsd/apps/statsdapp/Android.bp
+++ b/hostsidetests/statsd/apps/statsdapp/Android.bp
@@ -19,6 +19,7 @@
         "-Wall",
         "-Werror",
     ],
+    header_libs: ["jni_headers"],
     shared_libs: ["liblog"],
     stl: "c++_static",
     sdk_version: "current",
@@ -34,7 +35,7 @@
         ":statslog-statsd-cts-java-gen",
     ],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "junit",
         "org.apache.http.legacy",
     ],
diff --git a/hostsidetests/statsd/apps/statsdapp/src/com/android/server/cts/device/statsd/AtomTests.java b/hostsidetests/statsd/apps/statsdapp/src/com/android/server/cts/device/statsd/AtomTests.java
index e4d473b..4eb659c 100644
--- a/hostsidetests/statsd/apps/statsdapp/src/com/android/server/cts/device/statsd/AtomTests.java
+++ b/hostsidetests/statsd/apps/statsdapp/src/com/android/server/cts/device/statsd/AtomTests.java
@@ -201,6 +201,10 @@
         APP_OPS_ENUM_MAP.put(AppOpsManager.OPSTR_AUTO_REVOKE_PERMISSIONS_IF_UNUSED, 97);
         APP_OPS_ENUM_MAP.put(AppOpsManager.OPSTR_AUTO_REVOKE_MANAGED_BY_INSTALLER, 98);
         APP_OPS_ENUM_MAP.put(AppOpsManager.OPSTR_NO_ISOLATED_STORAGE, 99);
+        APP_OPS_ENUM_MAP.put(AppOpsManager.OPSTR_PHONE_CALL_MICROPHONE, 100);
+        APP_OPS_ENUM_MAP.put(AppOpsManager.OPSTR_PHONE_CALL_CAMERA, 101);
+        APP_OPS_ENUM_MAP.put(AppOpsManager.OPSTR_RECORD_AUDIO_HOTWORD, 102);
+        APP_OPS_ENUM_MAP.put(AppOpsManager.OPSTR_MANAGE_ONGOING_CALLS, 103);
     }
 
     @Test
diff --git a/hostsidetests/statsd/src/android/cts/statsd/atom/AtomTestCase.java b/hostsidetests/statsd/src/android/cts/statsd/atom/AtomTestCase.java
index 01cb9e6..8ce54f3 100644
--- a/hostsidetests/statsd/src/android/cts/statsd/atom/AtomTestCase.java
+++ b/hostsidetests/statsd/src/android/cts/statsd/atom/AtomTestCase.java
@@ -128,7 +128,7 @@
     public static final int PHONE_TYPE_CDMA = 2;
     public static final int PHONE_TYPE_CDMA_LTE = 6;
 
-    protected static final int WAIT_TIME_SHORT = 500;
+    protected static final int WAIT_TIME_SHORT = 1000;
     protected static final int WAIT_TIME_LONG = 2_000;
 
     protected static final long SCREEN_STATE_CHANGE_TIMEOUT = 4000;
@@ -209,6 +209,12 @@
         builder.setDurationMs(10000);
         builder.setAllowUserBuildTracing(true);
 
+        TraceConfig.IncidentReportConfig incident = TraceConfig.IncidentReportConfig
+            .newBuilder()
+            .setDestinationPackage("foo.bar.baz")
+            .build();
+        builder.setIncidentReportConfig(incident);
+
         // To avoid being hit with guardrails firing in multiple test runs back
         // to back, we set a unique session key for each config.
         Random random = new Random();
@@ -266,6 +272,7 @@
           .addAllowedLogSource("AID_RADIO")
           .addAllowedLogSource("AID_ROOT")
           .addAllowedLogSource("AID_STATSD")
+          .addAllowedLogSource("com.android.systemui")
           .addAllowedLogSource(DeviceAtomTestCase.DEVICE_SIDE_TEST_PACKAGE)
           .addDefaultPullPackages("AID_RADIO")
           .addDefaultPullPackages("AID_SYSTEM")
diff --git a/hostsidetests/statsd/src/android/cts/statsd/atom/DeviceAtomTestCase.java b/hostsidetests/statsd/src/android/cts/statsd/atom/DeviceAtomTestCase.java
index 453f628..035160f 100644
--- a/hostsidetests/statsd/src/android/cts/statsd/atom/DeviceAtomTestCase.java
+++ b/hostsidetests/statsd/src/android/cts/statsd/atom/DeviceAtomTestCase.java
@@ -55,6 +55,7 @@
         super.setUp();
         getDevice().uninstallPackage(DEVICE_SIDE_TEST_PACKAGE);
         installTestApp();
+        Thread.sleep(1000);
     }
 
     @Override
diff --git a/hostsidetests/statsd/src/android/cts/statsd/atom/GarageModeAtomTests.java b/hostsidetests/statsd/src/android/cts/statsd/atom/GarageModeAtomTests.java
new file mode 100644
index 0000000..ee86f01c
--- /dev/null
+++ b/hostsidetests/statsd/src/android/cts/statsd/atom/GarageModeAtomTests.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2020 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.cts.statsd.atom;
+
+import com.android.os.AtomsProto.Atom;
+import com.android.os.StatsLog.EventMetricData;
+
+import java.util.List;
+
+/**
+ * Verifies that Automotive's Garage Mode reports its status.
+ * Statsd atom tests are done via adb (hostside).
+ */
+public class GarageModeAtomTests extends AtomTestCase {
+
+    private static final String TAG = "Statsd.GarageModeAtomTests";
+    private static final int SHORT_SLEEP = 100; // Milliseconds
+    private static final int TRY_LIMIT = WAIT_TIME_SHORT / SHORT_SLEEP;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    public void testGarageModeOnOff() throws Exception {
+        if (!hasFeature(FEATURE_AUTOMOTIVE, true)) {
+            return;
+        }
+
+        final int atomTag = Atom.GARAGE_MODE_INFO_FIELD_NUMBER;
+        createAndUploadConfig(atomTag);
+
+        // Flush any old metrics
+        List<EventMetricData> data = getEventMetricDataList();
+
+        turnOnGarageMode();
+        waitForGarageModeState(true);
+
+        turnOffGarageMode();
+        waitForGarageModeState(false);
+    }
+
+    private void turnOnGarageMode() throws Exception {
+        getDevice().executeShellCommand("cmd car_service garage-mode on");
+    }
+    private void turnOffGarageMode() throws Exception {
+        getDevice().executeShellCommand("cmd car_service garage-mode off");
+    }
+
+    private void waitForGarageModeState(boolean requiredState) throws Exception {
+        for (int tryCount = 0; tryCount < TRY_LIMIT; tryCount++) {
+            List<EventMetricData> data = getEventMetricDataList();
+            for (EventMetricData d : data) {
+                boolean isGarageMode = d.getAtom().getGarageModeInfo().getIsGarageMode();
+                if (isGarageMode == requiredState) {
+                    return;
+                }
+            }
+            Thread.sleep(SHORT_SLEEP);
+        }
+        assertTrue("Did not receive an atom with Garage Mode "
+                   + (requiredState ? "ON" : "OFF"), false);
+    }
+}
diff --git a/hostsidetests/statsd/src/android/cts/statsd/atom/UidAtomTests.java b/hostsidetests/statsd/src/android/cts/statsd/atom/UidAtomTests.java
index 566dc08..87be4c9 100644
--- a/hostsidetests/statsd/src/android/cts/statsd/atom/UidAtomTests.java
+++ b/hostsidetests/statsd/src/android/cts/statsd/atom/UidAtomTests.java
@@ -28,6 +28,7 @@
 
 import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
 import com.android.compatibility.common.util.PropertyUtil;
+import com.android.internal.os.StatsdConfigProto.FieldValueMatcher;
 import com.android.internal.os.StatsdConfigProto.StatsdConfig;
 import com.android.os.AtomsProto;
 import com.android.os.AtomsProto.ANROccurred;
@@ -73,6 +74,7 @@
 import com.android.os.AtomsProto.SettingSnapshot;
 import com.android.os.AtomsProto.SyncStateChanged;
 import com.android.os.AtomsProto.TestAtomReported;
+import com.android.os.AtomsProto.UiEventReported;
 import com.android.os.AtomsProto.VibratorStateChanged;
 import com.android.os.AtomsProto.WakelockStateChanged;
 import com.android.os.AtomsProto.WakeupAlarmOccurred;
@@ -93,6 +95,7 @@
 import java.util.List;
 import java.util.Set;
 import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /**
  * Statsd atom tests that are done via app, for atoms that report a uid.
@@ -421,6 +424,12 @@
             return;
         }
 
+        String kernelVersion = getDevice().executeShellCommand("uname -r");
+        if (kernelVersion.contains("3.18")) {
+            LogUtil.CLog.d("Skipping calculated power blame uid test.");
+            return;
+        }
+
         StatsdConfig.Builder config = createConfigBuilder();
         addGaugeAtomWithDimensions(config,
                 Atom.DEVICE_CALCULATED_POWER_BLAME_UID_FIELD_NUMBER, null);
@@ -731,15 +740,15 @@
             return;
         }
 
-        final int atomTag = Atom.PICTURE_IN_PICTURE_STATE_CHANGED_FIELD_NUMBER;
-
-        Set<Integer> entered = new HashSet<>(
-                Arrays.asList(PictureInPictureStateChanged.State.ENTERED_VALUE));
-
-        // Add state sets to the list in order.
-        List<Set<Integer>> stateSet = Arrays.asList(entered);
-
-        createAndUploadConfig(atomTag, false);
+        StatsdConfig.Builder conf = createConfigBuilder();
+        // PictureInPictureStateChanged atom is used prior to rvc-qpr
+        addAtomEvent(conf, Atom.PICTURE_IN_PICTURE_STATE_CHANGED_FIELD_NUMBER,
+                /*useAttribution=*/false);
+        // Picture-in-picture logs' been migrated to UiEvent since rvc-qpr
+        FieldValueMatcher.Builder pkgMatcher = createFvm(UiEventReported.PACKAGE_NAME_FIELD_NUMBER)
+                .setEqString(DEVICE_SIDE_TEST_PACKAGE);
+        addAtomEvent(conf, Atom.UI_EVENT_REPORTED_FIELD_NUMBER, Arrays.asList(pkgMatcher));
+        uploadConfig(conf);
 
         LogUtil.CLog.d("Playing video in Picture-in-Picture mode");
         runActivity("VideoPlayerActivity", "action", "action.play_video_picture_in_picture_mode");
@@ -747,9 +756,34 @@
         // Sorted list of events in order in which they occurred.
         List<EventMetricData> data = getEventMetricDataList();
 
-        // Assert that the events happened in the expected order.
-        assertStatesOccurred(stateSet, data, WAIT_TIME_LONG,
-                atom -> atom.getPictureInPictureStateChanged().getState().getNumber());
+        // Filter out the PictureInPictureStateChanged and UiEventReported atom
+        List<EventMetricData> pictureInPictureStateChangedData = data.stream()
+                .filter(e -> e.getAtom().hasPictureInPictureStateChanged())
+                .collect(Collectors.toList());
+        List<EventMetricData> uiEventReportedData = data.stream()
+                .filter(e -> e.getAtom().hasUiEventReported())
+                .collect(Collectors.toList());
+
+        if (!pictureInPictureStateChangedData.isEmpty()) {
+            LogUtil.CLog.d("Assert using PictureInPictureStateChanged");
+            Set<Integer> entered = new HashSet<>(
+                    Arrays.asList(PictureInPictureStateChanged.State.ENTERED_VALUE));
+            List<Set<Integer>> stateSet = Arrays.asList(entered);
+            assertStatesOccurred(stateSet, data, WAIT_TIME_LONG,
+                    atom -> atom.getPictureInPictureStateChanged().getState().getNumber());
+        } else if (!uiEventReportedData.isEmpty()) {
+            LogUtil.CLog.d("Assert using UiEventReported");
+            // See PipUiEventEnum for definitions
+            final int enterPipEventId = 603;
+            // Assert that log for entering PiP happens exactly once, we do not use
+            // assertStateOccurred here since PiP may log something else when activity finishes.
+            List<EventMetricData> entered = uiEventReportedData.stream()
+                    .filter(e -> e.getAtom().getUiEventReported().getEventId() == enterPipEventId)
+                    .collect(Collectors.toList());
+            assertThat(entered).hasSize(1);
+        } else {
+            fail("No logging event from PictureInPictureStateChanged nor UiEventReported");
+        }
     }
 
     public void testScheduledJobState() throws Exception {
diff --git a/hostsidetests/sustainedperf/Android.mk b/hostsidetests/sustainedperf/Android.mk
index 2ff7b8a..3187415 100644
--- a/hostsidetests/sustainedperf/Android.mk
+++ b/hostsidetests/sustainedperf/Android.mk
@@ -21,7 +21,7 @@
 LOCAL_MODULE_TAGS := tests
 
 # tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_MODULE := CtsSustainedPerformanceHostTestCases
 LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed compatibility-host-util
diff --git a/hostsidetests/sustainedperf/app/Android.mk b/hostsidetests/sustainedperf/app/Android.mk
index 6fd630b..473621a 100644
--- a/hostsidetests/sustainedperf/app/Android.mk
+++ b/hostsidetests/sustainedperf/app/Android.mk
@@ -28,7 +28,7 @@
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
 # tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_PACKAGE_NAME := CtsSustainedPerformanceDeviceTestApp
 
diff --git a/hostsidetests/sustainedperf/dhrystone/Android.mk b/hostsidetests/sustainedperf/dhrystone/Android.mk
index f87770e..d86378e 100644
--- a/hostsidetests/sustainedperf/dhrystone/Android.mk
+++ b/hostsidetests/sustainedperf/dhrystone/Android.mk
@@ -15,5 +15,5 @@
 LOCAL_MULTILIB := both
 LOCAL_MODULE_STEM_32 := $(LOCAL_MODULE)32
 LOCAL_MODULE_STEM_64 := $(LOCAL_MODULE)64
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 include $(BUILD_EXECUTABLE)
diff --git a/hostsidetests/sustainedperf/shadertoy_android/Android.mk b/hostsidetests/sustainedperf/shadertoy_android/Android.mk
index 7f7172a..59cc55f 100644
--- a/hostsidetests/sustainedperf/shadertoy_android/Android.mk
+++ b/hostsidetests/sustainedperf/shadertoy_android/Android.mk
@@ -34,6 +34,6 @@
 LOCAL_MIN_SDK_VERSION := 5
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 include $(BUILD_PACKAGE)
 include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/hostsidetests/sustainedperf/shadertoy_android/jni/Android.bp b/hostsidetests/sustainedperf/shadertoy_android/jni/Android.bp
new file mode 100644
index 0000000..a9da55c
--- /dev/null
+++ b/hostsidetests/sustainedperf/shadertoy_android/jni/Android.bp
@@ -0,0 +1,40 @@
+// 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.
+//
+
+cc_test_library {
+    name: "libgltest",
+    srcs: [
+        "shaders.cpp",
+        "shadertoy_renderer.cpp",
+        "shadertoy_shader.cpp",
+        "hooks_android.cpp",
+        "utils.cpp",
+    ],
+    cflags: [
+        "-Wall",
+        "-Werror",
+        "-Wno-unused-variable",
+    ],
+    gtest: false,
+    header_libs: ["jni_headers"],
+    sdk_version: "21",
+    stl: "c++_static",
+    shared_libs: [
+        "libdl",
+        "liblog",
+        "libGLESv3",
+        "libEGL",
+    ],
+}
diff --git a/hostsidetests/sustainedperf/shadertoy_android/jni/Android.mk b/hostsidetests/sustainedperf/shadertoy_android/jni/Android.mk
deleted file mode 100644
index 79ab5fe..0000000
--- a/hostsidetests/sustainedperf/shadertoy_android/jni/Android.mk
+++ /dev/null
@@ -1,34 +0,0 @@
-# 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.

-#

-

-LOCAL_PATH:= $(call my-dir)

-

-include $(CLEAR_VARS)

-

-LOCAL_MODULE    := libgltest

-

-LOCAL_SRC_FILES := shaders.cpp \

-                   shadertoy_renderer.cpp \

-                   shadertoy_shader.cpp \

-                   hooks_android.cpp \

-                   utils.cpp

-

-LOCAL_CFLAGS := -Wall -Werror -Wno-unused-variable

-

-LOCAL_SDK_VERSION := 21

-LOCAL_NDK_STL_VARIANT := c++_static

-

-LOCAL_LDLIBS    := -llog -lGLESv3 -lEGL -ldl

-include $(BUILD_SHARED_LIBRARY)

diff --git a/hostsidetests/systemui/Android.bp b/hostsidetests/systemui/Android.bp
index 2b07a41..506b789 100644
--- a/hostsidetests/systemui/Android.bp
+++ b/hostsidetests/systemui/Android.bp
@@ -24,7 +24,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/systemui/app/Android.bp b/hostsidetests/systemui/app/Android.bp
index da1e472..fba1c1b 100644
--- a/hostsidetests/systemui/app/Android.bp
+++ b/hostsidetests/systemui/app/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/systemui/audiorecorder_app_audiorecord/Android.bp b/hostsidetests/systemui/audiorecorder_app_audiorecord/Android.bp
index 055c937..306a25e 100644
--- a/hostsidetests/systemui/audiorecorder_app_audiorecord/Android.bp
+++ b/hostsidetests/systemui/audiorecorder_app_audiorecord/Android.bp
@@ -20,7 +20,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/systemui/audiorecorder_app_mediarecorder/Android.bp b/hostsidetests/systemui/audiorecorder_app_mediarecorder/Android.bp
index 2f45522..e97729a 100644
--- a/hostsidetests/systemui/audiorecorder_app_mediarecorder/Android.bp
+++ b/hostsidetests/systemui/audiorecorder_app_mediarecorder/Android.bp
@@ -20,7 +20,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/tagging/Android.bp b/hostsidetests/tagging/Android.bp
index 71f166c..7fc561f 100644
--- a/hostsidetests/tagging/Android.bp
+++ b/hostsidetests/tagging/Android.bp
@@ -1,3 +1,33 @@
+// Full truth table of whether tagging should be enabled. Note that a report from statsd is not
+// available if the kernel or manifest flag is disabled, as the zygote never probes compat (i.e.
+// mPlatformCompat.isChangeEnabled(NATIVE_HEAP_POINTER_TAGGING) never gets run). Also note that
+// disabling a compat feature is only supported on userdebug builds.
+//
+// +==================================================================================+
+// | #  | Kernel  | Manifest | SDK   | Forced   | Userdebug || Has     | Report from |
+// |    | Support | Flag     | Level | Compat   | Build     || Tagging | statsd?     |
+// | -- | ------- | -------- | ----- | -------- | --------- || ------- | ----------- |
+// | 1  | No      | -        | -     | -        | -         || No      | No          |
+// | 2  | Yes     | Off      | -     | -        | -         || No      | No          |
+// | 3  | Yes     | None/On  | 29    | Off/None | -         || No      | Yes         |
+// | 4  | Yes     | None/On  | 29/30 | On       | -         || Yes     | Yes         |
+// | 5  | Yes     | None/On  | 30    | None     | -         || Yes     | Yes         |
+// | 6  | Yes     | None/On  | 30    | Off      | Yes       || No      | Yes         |
+// | 7  | Yes     | None/On  | 30    | Off      | No        || Yes     | Yes         |
+// +==================================================================================+
+//
+// And coverage of this truth table comes from:
+//  #1. All tests on a device with an unsupported kernel.
+//  #2. TaggingManifestDisabledTest.*
+//  #3. Tagging(ManifestEnabled)?Sdk29.testDefault
+//  #4. Tagging(ManifestEnabled)?Sdk(29|30).testCompatFeatureEnabled
+//  #5. Tagging(ManifestEnabled)?Sdk30.testDefault
+//  #6. Tagging(ManifestEnabled)?Sdk30.testCompatFeatureDisabledUserdebugBuild
+//  #7. Tagging(ManifestEnabled)?Sdk30.testCompatFeatureDisabledUserBuild
+//
+// MTE tests are done at SDK level 30. The level doesn't really matter; there is
+// no manifest flag for MTE, and the compat feature is always disabled.
+
 java_test_host {
     name: "CtsTaggingHostTestCases",
     defaults: ["cts_defaults"],
@@ -6,11 +36,25 @@
         "cts-tradefed",
         "tradefed",
     ],
-    static_libs:["CompatChangeGatingTestBase"],
+    static_libs: ["CompatChangeGatingTestBase"],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
         "general-tests",
-        "vts10",
     ],
 }
+
+java_defaults {
+    name: "cts_tagging_app_defaults",
+    defaults: ["cts_defaults"],
+    compile_multilib: "both",
+    static_libs: [
+        "tagging-common-devicesidelib",
+        "ctstestrunner-axt",
+        "androidx.test.rules",
+        "androidx.test.core",
+        "androidx.test.ext.junit",
+    ],
+    jni_libs: ["libtagging-common-devicesidelib-jni"],
+    sdk_version: "current",
+}
diff --git a/hostsidetests/tagging/common/Android.bp b/hostsidetests/tagging/common/Android.bp
index 2fb8785..3a2a0dd 100644
--- a/hostsidetests/tagging/common/Android.bp
+++ b/hostsidetests/tagging/common/Android.bp
@@ -18,7 +18,7 @@
 
 java_library {
     name: "tagging-common-devicesidelib",
-    srcs: ["src/**/*.java"],
+    srcs: ["src/**/Utils.java"],
     sdk_version: "current",
 }
 
@@ -29,6 +29,21 @@
         "-Wall",
         "-Werror",
     ],
+    header_libs: ["jni_headers"],
     sdk_version: "current",
     gtest: false,
 }
+
+android_test_helper_app {
+    name: "DeviceKernelHelpers",
+    defaults: ["cts_defaults"],
+    compile_multilib: "both",
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+    static_libs: ["tagging-common-devicesidelib"],
+    jni_libs: ["libtagging-common-devicesidelib-jni"],
+    srcs: ["src/**/DeviceKernelHelpers.java"],
+    sdk_version: "current",
+}
diff --git a/hostsidetests/tagging/common/AndroidManifest.xml b/hostsidetests/tagging/common/AndroidManifest.xml
new file mode 100644
index 0000000..41d0459
--- /dev/null
+++ b/hostsidetests/tagging/common/AndroidManifest.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.cts.tagging.support">
+
+    <uses-sdk android:targetSdkVersion="30" />
+
+    <application android:debuggable="true"
+                 android:allowNativeHeapPointerTagging="true">
+        <activity android:name=".DeviceKernelHelpers">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+    <instrumentation
+        android:name="android.test.InstrumentationTestRunner"
+        android:targetPackage="android.cts.tagging.support" />
+</manifest>
+
diff --git a/hostsidetests/tagging/common/jni/android_cts_tagging_Utils.cpp b/hostsidetests/tagging/common/jni/android_cts_tagging_Utils.cpp
index 3a99929..45bedd9 100644
--- a/hostsidetests/tagging/common/jni/android_cts_tagging_Utils.cpp
+++ b/hostsidetests/tagging/common/jni/android_cts_tagging_Utils.cpp
@@ -45,3 +45,13 @@
   return 0;
 #endif
 }
+
+extern "C" __attribute__((no_sanitize("address", "hwaddress")))
+JNIEXPORT void JNICALL
+Java_android_cts_tagging_Utils_accessMistaggedPointer(JNIEnv *) {
+  int* p = new int[4];
+  int* mistagged_p = reinterpret_cast<int*>(reinterpret_cast<uintptr_t>(p) + (1ULL << 56));
+  volatile int load = *mistagged_p;
+  (void)load;
+  delete[] p;
+}
diff --git a/hostsidetests/tagging/common/src/android/cts/tagging/Utils.java b/hostsidetests/tagging/common/src/android/cts/tagging/Utils.java
index 013842d..2897c9c 100644
--- a/hostsidetests/tagging/common/src/android/cts/tagging/Utils.java
+++ b/hostsidetests/tagging/common/src/android/cts/tagging/Utils.java
@@ -22,4 +22,5 @@
     }
     public static native boolean kernelSupportsTaggedPointers();
     public static native int nativeHeapPointerTag();
+    public static native void accessMistaggedPointer();
 }
diff --git a/hostsidetests/tagging/common/src/android/cts/tagging/support/DeviceKernelHelpers.java b/hostsidetests/tagging/common/src/android/cts/tagging/support/DeviceKernelHelpers.java
new file mode 100644
index 0000000..2453192
--- /dev/null
+++ b/hostsidetests/tagging/common/src/android/cts/tagging/support/DeviceKernelHelpers.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2020 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.cts.tagging.support;
+
+import android.app.Activity;
+import android.cts.tagging.Utils;
+import android.os.Bundle;
+import android.util.Log;
+
+public class DeviceKernelHelpers extends Activity {
+    private static final String TAG = DeviceKernelHelpers.class.getSimpleName();
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+
+        if (Utils.kernelSupportsTaggedPointers()) {
+            Log.i(TAG, "Kernel supports tagged pointers: true");
+        } else {
+            Log.i(TAG, "Kernel supports tagged pointers: false");
+        }
+    }
+}
diff --git a/hostsidetests/tagging/disabled/Android.bp b/hostsidetests/tagging/disabled/Android.bp
deleted file mode 100644
index d8f8454..0000000
--- a/hostsidetests/tagging/disabled/Android.bp
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (C) 2020 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.
-
-android_test_helper_app {
-    name: "CtsHostsideTaggingDisabledApp",
-    defaults: ["cts_defaults"],
-    compile_multilib: "both",
-    test_suites: [
-        "cts",
-        "vts10",
-        "general-tests",
-    ],
-    static_libs: [
-	"tagging-common-devicesidelib",
-        "ctstestrunner-axt",
-        "androidx.test.rules",
-        "androidx.test.core",
-        "androidx.test.ext.junit",
-    ],
-    jni_libs: [
-        "libtagging-common-devicesidelib-jni",
-    ],
-    srcs: ["src/**/*.java"],
-    sdk_version: "current",
-}
diff --git a/hostsidetests/tagging/disabled/AndroidManifest.xml b/hostsidetests/tagging/disabled/AndroidManifest.xml
deleted file mode 100644
index a544e4c..0000000
--- a/hostsidetests/tagging/disabled/AndroidManifest.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 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.cts.tagging.disabled">
-
-    <uses-sdk android:targetSdkVersion="29" />
-
-    <application android:debuggable="true"
-                 android:allowNativeHeapPointerTagging="false">
-        <uses-library android:name="android.test.runner" />
-    </application>
-
-    <instrumentation
-        android:name="androidx.test.runner.AndroidJUnitRunner"
-        android:targetPackage="android.cts.tagging.disabled" />
-</manifest>
-
diff --git a/hostsidetests/tagging/disabled/src/android/cts/tagging/disabled/TaggingTest.java b/hostsidetests/tagging/disabled/src/android/cts/tagging/disabled/TaggingTest.java
deleted file mode 100644
index 644cf8c..0000000
--- a/hostsidetests/tagging/disabled/src/android/cts/tagging/disabled/TaggingTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2020 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.cts.tagging.disabled;
-
-import android.os.Build;
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-
-import android.cts.tagging.Utils;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class TaggingTest {
-
-    @Test
-    public void testHeapTaggingEnabled() {
-      // Skip the test if not Arm64.
-      if (Build.CPU_ABI.startsWith("arm64")) {
-        int tag = Utils.nativeHeapPointerTag();
-        if (Utils.kernelSupportsTaggedPointers()) {
-          assertNotEquals(0, tag);
-        } else {
-          assertEquals(0, tag);
-        }
-      }
-    }
-
-    @Test
-    public void testHeapTaggingDisabled() {
-      assertEquals(0, Utils.nativeHeapPointerTag());
-    }
-}
diff --git a/hostsidetests/tagging/enabled/Android.bp b/hostsidetests/tagging/enabled/Android.bp
deleted file mode 100644
index d6a7714..0000000
--- a/hostsidetests/tagging/enabled/Android.bp
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (C) 2020 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.
-
-android_test_helper_app {
-    name: "CtsHostsideTaggingEnabledApp",
-    defaults: ["cts_defaults"],
-    compile_multilib: "both",
-    test_suites: [
-        "cts",
-        "vts10",
-        "general-tests",
-    ],
-    static_libs: [
-	"tagging-common-devicesidelib",
-        "ctstestrunner-axt",
-        "androidx.test.rules",
-        "androidx.test.core",
-        "androidx.test.ext.junit",
-    ],
-    jni_libs: [
-        "libtagging-common-devicesidelib-jni",
-    ],
-    srcs: ["src/**/*.java"],
-    sdk_version: "current",
-}
diff --git a/hostsidetests/tagging/enabled/AndroidManifest.xml b/hostsidetests/tagging/enabled/AndroidManifest.xml
deleted file mode 100644
index 47d7b0c..0000000
--- a/hostsidetests/tagging/enabled/AndroidManifest.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 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.cts.tagging.enabled">
-
-    <uses-sdk android:targetSdkVersion="29" />
-
-    <application android:debuggable="true"
-                 android:allowNativeHeapPointerTagging="true">
-        <uses-library android:name="android.test.runner" />
-    </application>
-
-    <instrumentation
-        android:name="androidx.test.runner.AndroidJUnitRunner"
-        android:targetPackage="android.cts.tagging.enabled" />
-</manifest>
-
diff --git a/hostsidetests/tagging/enabled/src/android/cts/tagging/enabled/TaggingTest.java b/hostsidetests/tagging/enabled/src/android/cts/tagging/enabled/TaggingTest.java
deleted file mode 100644
index 03dc89f..0000000
--- a/hostsidetests/tagging/enabled/src/android/cts/tagging/enabled/TaggingTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2020 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.cts.tagging.enabled;
-
-import android.os.Build;
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-
-import android.cts.tagging.Utils;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class TaggingTest {
-
-    @Test
-    public void testHeapTaggingEnabled() {
-      // Skip the test if not Arm64.
-      if (Build.CPU_ABI.startsWith("arm64")) {
-        int tag = Utils.nativeHeapPointerTag();
-        if (Utils.kernelSupportsTaggedPointers()) {
-          assertNotEquals(0, tag);
-        } else {
-          assertEquals(0, tag);
-        }
-      }
-    }
-
-    @Test
-    public void testHeapTaggingDisabled() {
-      assertEquals(0, Utils.nativeHeapPointerTag());
-    }
-}
diff --git a/hostsidetests/tagging/manifest_disabled/Android.bp b/hostsidetests/tagging/manifest_disabled/Android.bp
new file mode 100644
index 0000000..5c10e2d
--- /dev/null
+++ b/hostsidetests/tagging/manifest_disabled/Android.bp
@@ -0,0 +1,23 @@
+// Copyright (C) 2020 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.
+
+android_test_helper_app {
+    name: "CtsHostsideTaggingManifestDisabledApp",
+    defaults: ["cts_tagging_app_defaults"],
+    srcs: ["src/**/*.java"],
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+}
diff --git a/hostsidetests/tagging/manifest_disabled/AndroidManifest.xml b/hostsidetests/tagging/manifest_disabled/AndroidManifest.xml
new file mode 100644
index 0000000..6c05e1d
--- /dev/null
+++ b/hostsidetests/tagging/manifest_disabled/AndroidManifest.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.cts.tagging.disabled">
+
+    <uses-sdk android:targetSdkVersion="30" />
+
+    <application android:debuggable="true"
+                 android:allowNativeHeapPointerTagging="false">
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation
+        android:name="androidx.test.runner.AndroidJUnitRunner"
+        android:targetPackage="android.cts.tagging.disabled" />
+</manifest>
+
diff --git a/hostsidetests/tagging/manifest_disabled/src/android/cts/tagging/disabled/TaggingTest.java b/hostsidetests/tagging/manifest_disabled/src/android/cts/tagging/disabled/TaggingTest.java
new file mode 100644
index 0000000..efc641e
--- /dev/null
+++ b/hostsidetests/tagging/manifest_disabled/src/android/cts/tagging/disabled/TaggingTest.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2020 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.cts.tagging.disabled;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import android.cts.tagging.Utils;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class TaggingTest {
+
+    @Test
+    public void testHeapTaggingEnabled() {
+        assertNotEquals(0, Utils.nativeHeapPointerTag());
+    }
+
+    @Test
+    public void testHeapTaggingDisabled() {
+        assertEquals(0, Utils.nativeHeapPointerTag());
+    }
+}
diff --git a/hostsidetests/tagging/manifest_enabled_sdk_29/Android.bp b/hostsidetests/tagging/manifest_enabled_sdk_29/Android.bp
new file mode 100644
index 0000000..157f16a
--- /dev/null
+++ b/hostsidetests/tagging/manifest_enabled_sdk_29/Android.bp
@@ -0,0 +1,23 @@
+// Copyright (C) 2020 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.
+
+android_test_helper_app {
+    name: "CtsHostsideTaggingManifestEnabledSdk29App",
+    defaults: ["cts_tagging_app_defaults"],
+    srcs: ["src/**/*.java"],
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+}
diff --git a/hostsidetests/tagging/manifest_enabled_sdk_29/AndroidManifest.xml b/hostsidetests/tagging/manifest_enabled_sdk_29/AndroidManifest.xml
new file mode 100644
index 0000000..2f5f619
--- /dev/null
+++ b/hostsidetests/tagging/manifest_enabled_sdk_29/AndroidManifest.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.cts.tagging.sdk29.manifest_enabled">
+
+    <uses-sdk android:targetSdkVersion="29" />
+
+    <application android:debuggable="true"
+                 android:allowNativeHeapPointerTagging="true">
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation
+        android:name="androidx.test.runner.AndroidJUnitRunner"
+        android:targetPackage="android.cts.tagging.sdk29.manifest_enabled" />
+</manifest>
+
diff --git a/hostsidetests/tagging/manifest_enabled_sdk_29/src/android/cts/tagging/sdk29/manifest_enabled/TaggingTest.java b/hostsidetests/tagging/manifest_enabled_sdk_29/src/android/cts/tagging/sdk29/manifest_enabled/TaggingTest.java
new file mode 100644
index 0000000..9ecad68
--- /dev/null
+++ b/hostsidetests/tagging/manifest_enabled_sdk_29/src/android/cts/tagging/sdk29/manifest_enabled/TaggingTest.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2020 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.cts.tagging.sdk29.manifest_enabled;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import android.cts.tagging.Utils;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class TaggingTest {
+
+    @Test
+    public void testHeapTaggingEnabled() {
+        assertNotEquals(0, Utils.nativeHeapPointerTag());
+    }
+
+    @Test
+    public void testHeapTaggingDisabled() {
+        assertEquals(0, Utils.nativeHeapPointerTag());
+    }
+}
diff --git a/hostsidetests/tagging/manifest_enabled_sdk_30/Android.bp b/hostsidetests/tagging/manifest_enabled_sdk_30/Android.bp
new file mode 100644
index 0000000..0fdeb36
--- /dev/null
+++ b/hostsidetests/tagging/manifest_enabled_sdk_30/Android.bp
@@ -0,0 +1,23 @@
+// Copyright (C) 2020 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.
+
+android_test_helper_app {
+    name: "CtsHostsideTaggingManifestEnabledSdk30App",
+    defaults: ["cts_tagging_app_defaults"],
+    srcs: ["src/**/*.java"],
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+}
diff --git a/hostsidetests/tagging/manifest_enabled_sdk_30/AndroidManifest.xml b/hostsidetests/tagging/manifest_enabled_sdk_30/AndroidManifest.xml
new file mode 100644
index 0000000..dae0c0f
--- /dev/null
+++ b/hostsidetests/tagging/manifest_enabled_sdk_30/AndroidManifest.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.cts.tagging.sdk30.manifest_enabled">
+
+    <uses-sdk android:targetSdkVersion="30" />
+
+     <!-- Note, do not set debuggable:true. Pre-release platforms allow for
+          debuggable apps to disable compat features, even if it's a `user`
+          build. By using a non-debuggable app, we replicate a proper release-
+          build device. -->
+    <application android:allowNativeHeapPointerTagging="true">
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation
+        android:name="androidx.test.runner.AndroidJUnitRunner"
+        android:targetPackage="android.cts.tagging.sdk30.manifest_enabled" />
+</manifest>
+
diff --git a/hostsidetests/tagging/manifest_enabled_sdk_30/src/android/cts/tagging/sdk30/manifest_enabled/TaggingTest.java b/hostsidetests/tagging/manifest_enabled_sdk_30/src/android/cts/tagging/sdk30/manifest_enabled/TaggingTest.java
new file mode 100644
index 0000000..348131d
--- /dev/null
+++ b/hostsidetests/tagging/manifest_enabled_sdk_30/src/android/cts/tagging/sdk30/manifest_enabled/TaggingTest.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2020 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.cts.tagging.sdk30.manifest_enabled;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import android.cts.tagging.Utils;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class TaggingTest {
+
+    @Test
+    public void testHeapTaggingEnabled() {
+        assertNotEquals(0, Utils.nativeHeapPointerTag());
+    }
+
+    @Test
+    public void testHeapTaggingDisabled() {
+        assertEquals(0, Utils.nativeHeapPointerTag());
+    }
+}
diff --git a/hostsidetests/tagging/none/Android.bp b/hostsidetests/tagging/none/Android.bp
deleted file mode 100644
index 4314775..0000000
--- a/hostsidetests/tagging/none/Android.bp
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (C) 2020 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.
-
-android_test_helper_app {
-    name: "CtsHostsideTaggingNoneApp",
-    defaults: ["cts_defaults"],
-    compile_multilib: "both",
-    test_suites: [
-        "cts",
-        "vts10",
-        "general-tests",
-    ],
-    static_libs: [
-	"tagging-common-devicesidelib",
-        "ctstestrunner-axt",
-        "androidx.test.rules",
-        "androidx.test.core",
-        "androidx.test.ext.junit",
-    ],
-    jni_libs: [
-        "libtagging-common-devicesidelib-jni",
-    ],
-    srcs: ["src/**/*.java"],
-    sdk_version: "current",
-}
diff --git a/hostsidetests/tagging/none/AndroidManifest.xml b/hostsidetests/tagging/none/AndroidManifest.xml
deleted file mode 100644
index 0141359..0000000
--- a/hostsidetests/tagging/none/AndroidManifest.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 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.cts.tagging.none">
-
-    <uses-sdk android:targetSdkVersion="29" />
-
-    <application android:debuggable="true">
-        <uses-library android:name="android.test.runner" />
-    </application>
-
-    <instrumentation
-        android:name="androidx.test.runner.AndroidJUnitRunner"
-        android:targetPackage="android.cts.tagging.none" />
-</manifest>
-
diff --git a/hostsidetests/tagging/none/src/android/cts/tagging/none/TaggingTest.java b/hostsidetests/tagging/none/src/android/cts/tagging/none/TaggingTest.java
deleted file mode 100644
index 2b1f0f3..0000000
--- a/hostsidetests/tagging/none/src/android/cts/tagging/none/TaggingTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2020 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.cts.tagging.none;
-
-import android.os.Build;
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-
-import android.cts.tagging.Utils;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class TaggingTest {
-
-    @Test
-    public void testHeapTaggingEnabled() {
-      // Skip the test if not Arm64.
-      if (Build.CPU_ABI.startsWith("arm64")) {
-        int tag = Utils.nativeHeapPointerTag();
-        if (Utils.kernelSupportsTaggedPointers()) {
-          assertNotEquals(0, tag);
-        } else {
-          assertEquals(0, tag);
-        }
-      }
-    }
-
-    @Test
-    public void testHeapTaggingDisabled() {
-      assertEquals(0, Utils.nativeHeapPointerTag());
-    }
-}
diff --git a/hostsidetests/tagging/sdk_29/Android.bp b/hostsidetests/tagging/sdk_29/Android.bp
new file mode 100644
index 0000000..2ee016e
--- /dev/null
+++ b/hostsidetests/tagging/sdk_29/Android.bp
@@ -0,0 +1,23 @@
+// Copyright (C) 2020 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.
+
+android_test_helper_app {
+    name: "CtsHostsideTaggingSdk29App",
+    defaults: ["cts_tagging_app_defaults"],
+    srcs: ["src/**/*.java"],
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+}
diff --git a/hostsidetests/tagging/sdk_29/AndroidManifest.xml b/hostsidetests/tagging/sdk_29/AndroidManifest.xml
new file mode 100644
index 0000000..0538f73
--- /dev/null
+++ b/hostsidetests/tagging/sdk_29/AndroidManifest.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.cts.tagging.sdk29">
+
+    <uses-sdk android:targetSdkVersion="29" />
+
+    <application android:debuggable="true">
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation
+        android:name="androidx.test.runner.AndroidJUnitRunner"
+        android:targetPackage="android.cts.tagging.sdk29" />
+</manifest>
+
diff --git a/hostsidetests/tagging/sdk_29/src/android/cts/tagging/sdk29/TaggingTest.java b/hostsidetests/tagging/sdk_29/src/android/cts/tagging/sdk29/TaggingTest.java
new file mode 100644
index 0000000..3119ff6
--- /dev/null
+++ b/hostsidetests/tagging/sdk_29/src/android/cts/tagging/sdk29/TaggingTest.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2020 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.cts.tagging.sdk29;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import android.cts.tagging.Utils;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class TaggingTest {
+
+    @Test
+    public void testHeapTaggingEnabled() {
+        assertNotEquals(0, Utils.nativeHeapPointerTag());
+    }
+
+    @Test
+    public void testHeapTaggingDisabled() {
+        assertEquals(0, Utils.nativeHeapPointerTag());
+    }
+}
diff --git a/hostsidetests/tagging/sdk_30/Android.bp b/hostsidetests/tagging/sdk_30/Android.bp
new file mode 100644
index 0000000..0d13db1
--- /dev/null
+++ b/hostsidetests/tagging/sdk_30/Android.bp
@@ -0,0 +1,24 @@
+// Copyright (C) 2020 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.
+
+android_test_helper_app {
+    name: "CtsHostsideTaggingSdk30App",
+    defaults: ["cts_tagging_app_defaults"],
+    srcs: ["src/**/*.java"],
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+    static_libs: ["compatibility-device-util-axt"],
+}
diff --git a/hostsidetests/tagging/sdk_30/AndroidManifest.xml b/hostsidetests/tagging/sdk_30/AndroidManifest.xml
new file mode 100644
index 0000000..f53a22a
--- /dev/null
+++ b/hostsidetests/tagging/sdk_30/AndroidManifest.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.cts.tagging.sdk30">
+
+    <uses-sdk android:targetSdkVersion="30" />
+    <uses-permission android:name="android.permission.READ_LOGS"/>
+
+    <!-- Note, do not set debuggable:true. Pre-release platforms allow for
+         debuggable apps to disable compat features, even if it's a `user`
+         build. By using a non-debuggable app, we replicate a proper release-
+         build device. -->
+    <application>
+        <uses-library android:name="android.test.runner" />
+        <activity android:name=".CrashActivity" android:process=":CrashProcess" />
+    </application>
+
+    <instrumentation
+        android:name="androidx.test.runner.AndroidJUnitRunner"
+        android:targetPackage="android.cts.tagging.sdk30" />
+</manifest>
+
diff --git a/hostsidetests/tagging/sdk_30/src/android/cts/tagging/sdk30/CrashActivity.java b/hostsidetests/tagging/sdk_30/src/android/cts/tagging/sdk30/CrashActivity.java
new file mode 100644
index 0000000..1e3a421
--- /dev/null
+++ b/hostsidetests/tagging/sdk_30/src/android/cts/tagging/sdk30/CrashActivity.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2017 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.cts.tagging.sdk30;
+
+import android.app.Activity;
+import android.cts.tagging.Utils;
+import android.os.Bundle;
+
+public class CrashActivity extends Activity {
+    @Override
+    public void onCreate(Bundle bundle) {
+        super.onCreate(bundle);
+        Utils.accessMistaggedPointer();
+    }
+}
diff --git a/hostsidetests/tagging/sdk_30/src/android/cts/tagging/sdk30/TaggingTest.java b/hostsidetests/tagging/sdk_30/src/android/cts/tagging/sdk30/TaggingTest.java
new file mode 100644
index 0000000..7341238
--- /dev/null
+++ b/hostsidetests/tagging/sdk_30/src/android/cts/tagging/sdk30/TaggingTest.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2020 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.cts.tagging.sdk30;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertTrue;
+
+import android.content.Context;
+import android.content.Intent;
+import android.cts.tagging.Utils;
+import android.os.Build;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.runner.RunWith;
+import org.junit.Test;
+
+import com.android.compatibility.common.util.DropBoxReceiver;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class TaggingTest {
+    private static final String NATIVE_CRASH_TAG = "data_app_native_crash";
+
+    private Context mContext;
+
+    @Before
+    public void setUp() {
+        mContext = InstrumentationRegistry.getTargetContext();
+    }
+
+    @Test
+    public void testHeapTaggingEnabled() {
+        assertNotEquals(0, Utils.nativeHeapPointerTag());
+    }
+
+    @Test
+    public void testHeapTaggingDisabled() {
+        assertEquals(0, Utils.nativeHeapPointerTag());
+    }
+
+    @Test
+    public void testMemoryTagChecksEnabled() throws Exception {
+        final DropBoxReceiver receiver =
+                new DropBoxReceiver(
+                        mContext,
+                        NATIVE_CRASH_TAG,
+                        mContext.getPackageName() + ":CrashProcess",
+                        "backtrace:");
+        Intent intent = new Intent();
+        intent.setClass(mContext, CrashActivity.class);
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        mContext.startActivity(intent);
+
+        assertTrue(receiver.await());
+    }
+
+    @Test
+    public void testMemoryTagChecksDisabled() {
+        Utils.accessMistaggedPointer();
+    }
+}
diff --git a/hostsidetests/tagging/src/com/android/cts/tagging/TaggingBaseTest.java b/hostsidetests/tagging/src/com/android/cts/tagging/TaggingBaseTest.java
index 294ec00..c5c9595 100644
--- a/hostsidetests/tagging/src/com/android/cts/tagging/TaggingBaseTest.java
+++ b/hostsidetests/tagging/src/com/android/cts/tagging/TaggingBaseTest.java
@@ -18,42 +18,75 @@
 
 import android.compat.cts.CompatChangeGatingTestCase;
 
-import java.io.FileWriter;
+import com.android.tradefed.device.ITestDevice;
+
+import com.google.common.collect.ImmutableSet;
+
+import java.util.Scanner;
 
 public class TaggingBaseTest extends CompatChangeGatingTestCase {
+    private static final String DEVICE_KERNEL_HELPER_CLASS_NAME = "DeviceKernelHelpers";
+    private static final String DEVICE_KERNEL_HELPER_APK_NAME = "DeviceKernelHelpers.apk";
+    private static final String DEVICE_KERNEL_HELPER_PKG_NAME = "android.cts.tagging.support";
+    private static final String KERNEL_HELPER_START_COMMAND =
+            String.format(
+                    "am start -W -a android.intent.action.MAIN -n %s/.%s",
+                    DEVICE_KERNEL_HELPER_PKG_NAME, DEVICE_KERNEL_HELPER_CLASS_NAME);
 
     protected static final long NATIVE_HEAP_POINTER_TAGGING_CHANGE_ID = 135754954;
+    protected static final String DEVICE_TEST_CLASS_NAME = ".TaggingTest";
+    protected static final String DEVICE_TAGGING_DISABLED_TEST_NAME = "testHeapTaggingDisabled";
+    protected static final String DEVICE_TAGGING_ENABLED_TEST_NAME = "testHeapTaggingEnabled";
 
-    protected boolean supportsTaggedPointers = false;
-
-    private boolean supportsTaggedPointers() throws Exception {
-        String kernelVersion = runCommand("uname -rm");
-        if (!kernelVersion.contains("aarch64")) {
-            return false;
-        }
-
-        String kernelVersionSplit[] = kernelVersion.split("\\.");
-        if (kernelVersionSplit.length < 2) {
-            return false;
-        }
-
-        int major = Integer.parseInt(kernelVersionSplit[0]);
-        if (major > 4) {
-            return true;
-        } else if (major < 4) {
-            return false;
-        }
-
-        // Major version is 4. Check that the minor is >= 14.
-        int minor = Integer.parseInt(kernelVersionSplit[1]);
-        if (minor < 14) {
-            return false;
-        }
-        return true;
-    }
+    // Initialized in setUp(), holds whether the device that this test is running on was determined
+    // to have both requirements for tagged pointers: the correct architecture (aarch64) and the
+    // full set of kernel patches (as indicated by a successful prctl(PR_GET_TAGGED_ADDR_CTRL)).
+    protected boolean deviceSupportsTaggedPointers = false;
+    // Initialized in setUp(), contains a set of pointer tagging changes that should be reported by
+    // statsd. This set contains the compat change ID for heap tagging iff the device supports
+    // tagged pointers (and is blank otherwise), as the kernel and manifest check in the zygote
+    // happens before mPlatformCompat.isChangeEnabled(), and thus there's never a statsd entry for
+    // the feature (in either the enabled or disabled state).
+    protected ImmutableSet reportedChangeSet = ImmutableSet.of();
+    // Initialized in setUp(), contains DEVICE_TAGGING_ENABLED_TEST_NAME iff the device supports
+    // tagged pointers, and DEVICE_TAGGING_DISABLED_TEST_NAME otherwise.
+    protected String testForWhenSoftwareWantsTagging = DEVICE_TAGGING_DISABLED_TEST_NAME;
 
     @Override
     protected void setUp() throws Exception {
-        supportsTaggedPointers = supportsTaggedPointers();
+        installPackage(DEVICE_KERNEL_HELPER_APK_NAME, true);
+
+        ITestDevice device = getDevice();
+        device.executeAdbCommand("logcat", "-c");
+        device.executeShellCommand(KERNEL_HELPER_START_COMMAND);
+        String logs =
+                device.executeAdbCommand(
+                        "logcat",
+                        "-v",
+                        "brief",
+                        "-d",
+                        DEVICE_KERNEL_HELPER_CLASS_NAME + ":I",
+                        "*:S");
+
+        boolean foundKernelHelperResult = false;
+        Scanner in = new Scanner(logs);
+        while (in.hasNextLine()) {
+            String line = in.nextLine();
+            if (line.contains("Kernel supports tagged pointers")) {
+                foundKernelHelperResult = true;
+                deviceSupportsTaggedPointers = line.contains("true");
+                break;
+            }
+        }
+        in.close();
+        uninstallPackage(DEVICE_KERNEL_HELPER_PKG_NAME, true);
+        if (!foundKernelHelperResult) {
+            throw new Exception("Failed to get a result from the kernel helper.");
+        }
+
+        if (deviceSupportsTaggedPointers) {
+            reportedChangeSet = ImmutableSet.of(NATIVE_HEAP_POINTER_TAGGING_CHANGE_ID);
+            testForWhenSoftwareWantsTagging = DEVICE_TAGGING_ENABLED_TEST_NAME;
+        }
     }
 }
diff --git a/hostsidetests/tagging/src/com/android/cts/tagging/TaggingDefaultTest.java b/hostsidetests/tagging/src/com/android/cts/tagging/TaggingDefaultTest.java
deleted file mode 100644
index 266c60b..0000000
--- a/hostsidetests/tagging/src/com/android/cts/tagging/TaggingDefaultTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.tagging;
-
-import com.android.cts.tagging.TaggingBaseTest;
-
-import com.google.common.collect.ImmutableSet;
-
-public class TaggingDefaultTest extends TaggingBaseTest {
-
-    protected static final String TEST_APK = "CtsHostsideTaggingNoneApp.apk";
-    protected static final String TEST_PKG = "android.cts.tagging.none";
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        installPackage(TEST_APK, true);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        uninstallPackage(TEST_PKG, true);
-    }
-
-    public void testCompatFeatureEnabled() throws Exception {
-        if (supportsTaggedPointers) {
-            runDeviceCompatTest(TEST_PKG, ".TaggingTest", "testHeapTaggingEnabled",
-                /*enabledChanges*/ImmutableSet.of(NATIVE_HEAP_POINTER_TAGGING_CHANGE_ID),
-                /*disabledChanges*/ ImmutableSet.of());
-        } else {
-            // Ensure that even if the compat flag is set to true, tagged pointers don't
-            // get enabled on incompatible devices. Ensure that we don't check the statsd
-            // report of the feature status, as it won't be present on kernel-unsupported
-            // devices.
-            runDeviceCompatTestReported(TEST_PKG, ".TaggingTest", "testHeapTaggingDisabled",
-                /*enabledChanges*/ImmutableSet.of(NATIVE_HEAP_POINTER_TAGGING_CHANGE_ID),
-                /*disabledChanges*/ ImmutableSet.of(),
-                /*reportedEnabledChanges*/ ImmutableSet.of(),
-                /*reportedDisabledChanges*/ ImmutableSet.of());
-        }
-    }
-
-    public void testCompatFeatureDisabled() throws Exception {
-        if (!supportsTaggedPointers) {
-            return;
-        }
-        runDeviceCompatTest(TEST_PKG, ".TaggingTest", "testHeapTaggingDisabled",
-                /*enabledChanges*/ImmutableSet.of(),
-                /*disabledChanges*/ ImmutableSet.of(NATIVE_HEAP_POINTER_TAGGING_CHANGE_ID));
-    }
-}
diff --git a/hostsidetests/tagging/src/com/android/cts/tagging/TaggingDisabledTest.java b/hostsidetests/tagging/src/com/android/cts/tagging/TaggingDisabledTest.java
deleted file mode 100644
index fcbd905..0000000
--- a/hostsidetests/tagging/src/com/android/cts/tagging/TaggingDisabledTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.tagging;
-
-import com.android.cts.tagging.TaggingBaseTest;
-
-import com.google.common.collect.ImmutableSet;
-
-public class TaggingDisabledTest extends TaggingBaseTest {
-
-    protected static final String TEST_APK = "CtsHostsideTaggingDisabledApp.apk";
-    protected static final String TEST_PKG = "android.cts.tagging.disabled";
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        installPackage(TEST_APK, true);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        uninstallPackage(TEST_PKG, true);
-    }
-
-    public void testCompatFeatureEnabled() throws Exception {
-        // Checking for supportsTaggedPointers is unnecessary here, as we don't
-        // validate against reportDisabledChanges.
-        runDeviceCompatTestReported(TEST_PKG, ".TaggingTest", "testHeapTaggingDisabled",
-                /*enabledChanges*/ImmutableSet.of(NATIVE_HEAP_POINTER_TAGGING_CHANGE_ID),
-                /*disabledChanges*/ ImmutableSet.of(),
-                /*reportedEnabledChanges*/ ImmutableSet.of(),
-                /*reportedDisabledChanges*/ ImmutableSet.of());
-    }
-
-    public void testCompatFeatureDisabled() throws Exception {
-        // Checking for supportsTaggedPointers is unnecessary here, as we don't
-        // validate against reportDisabledChanges.
-        runDeviceCompatTestReported(TEST_PKG, ".TaggingTest", "testHeapTaggingDisabled",
-                /*enabledChanges*/ImmutableSet.of(),
-                /*disabledChanges*/ ImmutableSet.of(NATIVE_HEAP_POINTER_TAGGING_CHANGE_ID),
-                /*reportedEnabledChanges*/ ImmutableSet.of(),
-                /*reportedDisabledChanges*/ ImmutableSet.of());
-    }
-}
diff --git a/hostsidetests/tagging/src/com/android/cts/tagging/TaggingEnabledTest.java b/hostsidetests/tagging/src/com/android/cts/tagging/TaggingEnabledTest.java
deleted file mode 100644
index a578e50..0000000
--- a/hostsidetests/tagging/src/com/android/cts/tagging/TaggingEnabledTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.cts.tagging;
-
-import com.android.cts.tagging.TaggingBaseTest;
-
-import com.google.common.collect.ImmutableSet;
-
-public class TaggingEnabledTest extends TaggingBaseTest {
-
-    protected static final String TEST_APK = "CtsHostsideTaggingEnabledApp.apk";
-    protected static final String TEST_PKG = "android.cts.tagging.enabled";
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        installPackage(TEST_APK, true);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        uninstallPackage(TEST_PKG, true);
-    }
-
-    public void testCompatFeatureEnabled() throws Exception {
-        if (!supportsTaggedPointers) {
-            return;
-        }
-        runDeviceCompatTest(TEST_PKG, ".TaggingTest", "testHeapTaggingEnabled",
-                /*enabledChanges*/ImmutableSet.of(NATIVE_HEAP_POINTER_TAGGING_CHANGE_ID),
-                /*disabledChanges*/ ImmutableSet.of());
-    }
-
-    public void testCompatFeatureDisabled() throws Exception {
-        if (!supportsTaggedPointers) {
-            return;
-        }
-        runDeviceCompatTest(TEST_PKG, ".TaggingTest", "testHeapTaggingDisabled",
-                /*enabledChanges*/ImmutableSet.of(),
-                /*disabledChanges*/ ImmutableSet.of(NATIVE_HEAP_POINTER_TAGGING_CHANGE_ID));
-    }
-}
diff --git a/hostsidetests/tagging/src/com/android/cts/tagging/TaggingManifestDisabledTest.java b/hostsidetests/tagging/src/com/android/cts/tagging/TaggingManifestDisabledTest.java
new file mode 100644
index 0000000..97406c8
--- /dev/null
+++ b/hostsidetests/tagging/src/com/android/cts/tagging/TaggingManifestDisabledTest.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.tagging;
+
+import com.google.common.collect.ImmutableSet;
+
+public class TaggingManifestDisabledTest extends TaggingBaseTest {
+
+    protected static final String TEST_APK = "CtsHostsideTaggingManifestDisabledApp.apk";
+    protected static final String TEST_PKG = "android.cts.tagging.disabled";
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        installPackage(TEST_APK, true);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        uninstallPackage(TEST_PKG, true);
+    }
+
+    public void testDefault() throws Exception {
+        runDeviceCompatTestReported(
+                TEST_PKG,
+                DEVICE_TEST_CLASS_NAME,
+                DEVICE_TAGGING_DISABLED_TEST_NAME,
+                /*enabledChanges*/ ImmutableSet.of(),
+                /*disabledChanges*/ ImmutableSet.of(),
+                /*reportedEnabledChanges*/ ImmutableSet.of(),
+                // No statsd report for manifest-disabled apps, see truth table in
+                // /cts/tagging/Android.bp for more information.
+                /*reportedDisabledChanges*/ ImmutableSet.of());
+    }
+
+    public void testCompatFeatureEnabled() throws Exception {
+        // Trying to force the compat feature on should fail if the manifest specifically turns the
+        // feature off.
+        runDeviceCompatTestReported(
+                TEST_PKG,
+                DEVICE_TEST_CLASS_NAME,
+                DEVICE_TAGGING_DISABLED_TEST_NAME,
+                /*enabledChanges*/ ImmutableSet.of(NATIVE_HEAP_POINTER_TAGGING_CHANGE_ID),
+                /*disabledChanges*/ ImmutableSet.of(),
+                /*reportedEnabledChanges*/ ImmutableSet.of(),
+                // No statsd report for manifest-disabled apps, see truth table in
+                // /cts/tagging/Android.bp for more information.
+                /*reportedDisabledChanges*/ ImmutableSet.of());
+    }
+}
diff --git a/hostsidetests/tagging/src/com/android/cts/tagging/TaggingManifestEnabledSdk29Test.java b/hostsidetests/tagging/src/com/android/cts/tagging/TaggingManifestEnabledSdk29Test.java
new file mode 100644
index 0000000..eff9f22
--- /dev/null
+++ b/hostsidetests/tagging/src/com/android/cts/tagging/TaggingManifestEnabledSdk29Test.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.tagging;
+
+import com.google.common.collect.ImmutableSet;
+
+public class TaggingManifestEnabledSdk29Test extends TaggingBaseTest {
+
+    protected static final String TEST_APK = "CtsHostsideTaggingManifestEnabledSdk29App.apk";
+    protected static final String TEST_PKG = "android.cts.tagging.sdk29.manifest_enabled";
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        installPackage(TEST_APK, true);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        uninstallPackage(TEST_PKG, true);
+    }
+
+    public void testDefault() throws Exception {
+        // Even though the manifest enables tagged pointers, the targetSdkVersion still needs to be
+        // >= 30.
+        runDeviceCompatTestReported(
+                TEST_PKG,
+                DEVICE_TEST_CLASS_NAME,
+                DEVICE_TAGGING_DISABLED_TEST_NAME,
+                /*enabledChanges*/ ImmutableSet.of(),
+                /*disabledChanges*/ ImmutableSet.of(),
+                /*reportedEnabledChanges*/ ImmutableSet.of(),
+                /*reportedDisabledChanges*/ reportedChangeSet);
+    }
+
+    public void testCompatFeatureEnabled() throws Exception {
+        runDeviceCompatTestReported(
+                TEST_PKG,
+                DEVICE_TEST_CLASS_NAME,
+                testForWhenSoftwareWantsTagging,
+                /*enabledChanges*/ ImmutableSet.of(NATIVE_HEAP_POINTER_TAGGING_CHANGE_ID),
+                /*disabledChanges*/ ImmutableSet.of(),
+                /*reportedEnabledChanges*/ reportedChangeSet,
+                /*reportedDisabledChanges*/ ImmutableSet.of());
+    }
+}
diff --git a/hostsidetests/tagging/src/com/android/cts/tagging/TaggingManifestEnabledSdk30Test.java b/hostsidetests/tagging/src/com/android/cts/tagging/TaggingManifestEnabledSdk30Test.java
new file mode 100644
index 0000000..8834daa
--- /dev/null
+++ b/hostsidetests/tagging/src/com/android/cts/tagging/TaggingManifestEnabledSdk30Test.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.tagging;
+
+import com.google.common.collect.ImmutableSet;
+
+public class TaggingManifestEnabledSdk30Test extends TaggingBaseTest {
+
+    protected static final String TEST_APK = "CtsHostsideTaggingManifestEnabledSdk30App.apk";
+    protected static final String TEST_PKG = "android.cts.tagging.sdk30.manifest_enabled";
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        installPackage(TEST_APK, true);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        uninstallPackage(TEST_PKG, true);
+    }
+
+    public void testDefault() throws Exception {
+        runDeviceCompatTestReported(
+                TEST_PKG,
+                DEVICE_TEST_CLASS_NAME,
+                testForWhenSoftwareWantsTagging,
+                /*enabledChanges*/ ImmutableSet.of(),
+                /*disabledChanges*/ ImmutableSet.of(),
+                /*reportedEnabledChanges*/ reportedChangeSet,
+                /*reportedDisabledChanges*/ ImmutableSet.of());
+    }
+
+    public void testCompatFeatureEnabled() throws Exception {
+        runDeviceCompatTestReported(
+                TEST_PKG,
+                DEVICE_TEST_CLASS_NAME,
+                testForWhenSoftwareWantsTagging,
+                /*enabledChanges*/ ImmutableSet.of(NATIVE_HEAP_POINTER_TAGGING_CHANGE_ID),
+                /*disabledChanges*/ ImmutableSet.of(),
+                /*reportedEnabledChanges*/ reportedChangeSet,
+                /*reportedDisabledChanges*/ ImmutableSet.of());
+    }
+
+    public void testCompatFeatureDisabledUserdebugBuild() throws Exception {
+        // Userdebug build - check that we can force disable the compat feature at runtime.
+        if (!getDevice().getBuildFlavor().contains("userdebug")) {
+            return;
+        }
+        runDeviceCompatTestReported(
+                TEST_PKG,
+                DEVICE_TEST_CLASS_NAME,
+                DEVICE_TAGGING_DISABLED_TEST_NAME,
+                /*enabledChanges*/ ImmutableSet.of(),
+                /*disabledChanges*/ ImmutableSet.of(NATIVE_HEAP_POINTER_TAGGING_CHANGE_ID),
+                /*reportedEnabledChanges*/ ImmutableSet.of(),
+                /*reportedDisabledChanges*/ reportedChangeSet);
+    }
+
+    public void testCompatFeatureDisabledUserBuild() throws Exception {
+        // Non-userdebug build - we're not allowed to disable compat features. Check to ensure that
+        // even if we try that we still get pointer tagging.
+        if (getDevice().getBuildFlavor().contains("userdebug")) {
+            return;
+        }
+        runDeviceCompatTestReported(
+                TEST_PKG,
+                DEVICE_TEST_CLASS_NAME,
+                testForWhenSoftwareWantsTagging,
+                /*enabledChanges*/ ImmutableSet.of(),
+                /*disabledChanges*/ ImmutableSet.of(NATIVE_HEAP_POINTER_TAGGING_CHANGE_ID),
+                /*reportedEnabledChanges*/ reportedChangeSet,
+                /*reportedDisabledChanges*/ ImmutableSet.of());
+    }
+}
diff --git a/hostsidetests/tagging/src/com/android/cts/tagging/TaggingSdk29Test.java b/hostsidetests/tagging/src/com/android/cts/tagging/TaggingSdk29Test.java
new file mode 100644
index 0000000..776433e
--- /dev/null
+++ b/hostsidetests/tagging/src/com/android/cts/tagging/TaggingSdk29Test.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.tagging;
+
+import com.google.common.collect.ImmutableSet;
+
+public class TaggingSdk29Test extends TaggingBaseTest {
+
+    protected static final String TEST_APK = "CtsHostsideTaggingSdk29App.apk";
+    protected static final String TEST_PKG = "android.cts.tagging.sdk29";
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        installPackage(TEST_APK, true);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        uninstallPackage(TEST_PKG, true);
+    }
+
+    public void testDefault() throws Exception {
+        runDeviceCompatTestReported(
+                TEST_PKG,
+                DEVICE_TEST_CLASS_NAME,
+                DEVICE_TAGGING_DISABLED_TEST_NAME,
+                /*enabledChanges*/ ImmutableSet.of(),
+                /*disabledChanges*/ ImmutableSet.of(),
+                /*reportedEnabledChanges*/ ImmutableSet.of(),
+                /*reportedDisabledChanges*/ reportedChangeSet);
+    }
+
+    public void testCompatFeatureEnabled() throws Exception {
+        runDeviceCompatTestReported(
+                TEST_PKG,
+                DEVICE_TEST_CLASS_NAME,
+                testForWhenSoftwareWantsTagging,
+                /*enabledChanges*/ ImmutableSet.of(NATIVE_HEAP_POINTER_TAGGING_CHANGE_ID),
+                /*disabledChanges*/ ImmutableSet.of(),
+                /*reportedEnabledChanges*/ reportedChangeSet,
+                /*reportedDisabledChanges*/ ImmutableSet.of());
+    }
+}
diff --git a/hostsidetests/tagging/src/com/android/cts/tagging/TaggingSdk30Test.java b/hostsidetests/tagging/src/com/android/cts/tagging/TaggingSdk30Test.java
new file mode 100644
index 0000000..9e5a1f9
--- /dev/null
+++ b/hostsidetests/tagging/src/com/android/cts/tagging/TaggingSdk30Test.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.tagging;
+
+import com.google.common.collect.ImmutableSet;
+
+public class TaggingSdk30Test extends TaggingBaseTest {
+
+    protected static final String TEST_APK = "CtsHostsideTaggingSdk30App.apk";
+    protected static final String TEST_PKG = "android.cts.tagging.sdk30";
+    private static final String TEST_RUNNER = "androidx.test.runner.AndroidJUnitRunner";
+
+    private static final long NATIVE_MEMORY_TAGGING_CHANGE_ID = 135772972;
+
+    private boolean supportsMemoryTagging;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        installPackage(TEST_APK, true);
+        supportsMemoryTagging = !runCommand("grep 'Features.* mte' /proc/cpuinfo").isEmpty();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        uninstallPackage(TEST_PKG, true);
+    }
+
+    public void testHeapTaggingDefault() throws Exception {
+        runDeviceCompatTestReported(
+                TEST_PKG,
+                DEVICE_TEST_CLASS_NAME,
+                testForWhenSoftwareWantsTagging,
+                /*enabledChanges*/ ImmutableSet.of(),
+                /*disabledChanges*/ ImmutableSet.of(),
+                /*reportedEnabledChanges*/ reportedChangeSet,
+                /*reportedDisabledChanges*/ ImmutableSet.of());
+    }
+
+    public void testHeapTaggingCompatFeatureEnabled() throws Exception {
+        runDeviceCompatTestReported(
+                TEST_PKG,
+                DEVICE_TEST_CLASS_NAME,
+                testForWhenSoftwareWantsTagging,
+                /*enabledChanges*/ ImmutableSet.of(NATIVE_HEAP_POINTER_TAGGING_CHANGE_ID),
+                /*disabledChanges*/ ImmutableSet.of(),
+                /*reportedEnabledChanges*/ reportedChangeSet,
+                /*reportedDisabledChanges*/ ImmutableSet.of());
+    }
+
+    public void testCompatFeatureDisabledUserdebugBuild() throws Exception {
+        // Userdebug build - check that we can force disable the compat feature at runtime.
+        if (!getDevice().getBuildFlavor().contains("userdebug")) {
+            return;
+        }
+        runDeviceCompatTestReported(
+                TEST_PKG,
+                DEVICE_TEST_CLASS_NAME,
+                DEVICE_TAGGING_DISABLED_TEST_NAME,
+                /*enabledChanges*/ ImmutableSet.of(),
+                /*disabledChanges*/ ImmutableSet.of(NATIVE_HEAP_POINTER_TAGGING_CHANGE_ID),
+                /*reportedEnabledChanges*/ ImmutableSet.of(),
+                /*reportedDisabledChanges*/ reportedChangeSet);
+    }
+
+    public void testCompatFeatureDisabledUserBuild() throws Exception {
+        // Non-userdebug build - we're not allowed to disable compat features. Check to ensure that
+        // even if we try that we still get pointer tagging.
+        if (getDevice().getBuildFlavor().contains("userdebug")) {
+            return;
+        }
+        runDeviceCompatTestReported(
+                TEST_PKG,
+                DEVICE_TEST_CLASS_NAME,
+                testForWhenSoftwareWantsTagging,
+                /*enabledChanges*/ ImmutableSet.of(),
+                /*disabledChanges*/ ImmutableSet.of(NATIVE_HEAP_POINTER_TAGGING_CHANGE_ID),
+                /*reportedEnabledChanges*/ reportedChangeSet,
+                /*reportedDisabledChanges*/ ImmutableSet.of());
+    }
+
+    public void testMemoryTagChecksCompatFeatureEnabled() throws Exception {
+        if (!supportsMemoryTagging) {
+            return;
+        }
+        runDeviceCompatTest(TEST_PKG, ".TaggingTest", "testMemoryTagChecksEnabled",
+                /*enabledChanges*/ ImmutableSet.of(NATIVE_MEMORY_TAGGING_CHANGE_ID),
+                /*disabledChanges*/ImmutableSet.of());
+    }
+
+    public void testMemoryTagChecksCompatFeatureDisabled() throws Exception {
+        if (!supportsMemoryTagging) {
+            return;
+        }
+        runDeviceCompatTest(TEST_PKG, ".TaggingTest", "testMemoryTagChecksDisabled",
+                /*enabledChanges*/ImmutableSet.of(),
+                /*disabledChanges*/ ImmutableSet.of(NATIVE_MEMORY_TAGGING_CHANGE_ID));
+    }
+}
diff --git a/hostsidetests/telephonyprovider/Android.bp b/hostsidetests/telephonyprovider/Android.bp
index e3502f1..e2f6b22 100644
--- a/hostsidetests/telephonyprovider/Android.bp
+++ b/hostsidetests/telephonyprovider/Android.bp
@@ -20,7 +20,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
diff --git a/hostsidetests/telephonyprovider/devicetest/Android.bp b/hostsidetests/telephonyprovider/devicetest/Android.bp
index 5208101..8a70b2e 100644
--- a/hostsidetests/telephonyprovider/devicetest/Android.bp
+++ b/hostsidetests/telephonyprovider/devicetest/Android.bp
@@ -30,7 +30,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/testharness/Android.bp b/hostsidetests/testharness/Android.bp
index 999ef00..975d996 100644
--- a/hostsidetests/testharness/Android.bp
+++ b/hostsidetests/testharness/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
diff --git a/hostsidetests/testharness/app/Android.bp b/hostsidetests/testharness/app/Android.bp
index ef369b6..c8ea847 100644
--- a/hostsidetests/testharness/app/Android.bp
+++ b/hostsidetests/testharness/app/Android.bp
@@ -31,7 +31,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/theme/Android.mk b/hostsidetests/theme/Android.mk
index 0a3d2de..037c2e3 100644
--- a/hostsidetests/theme/Android.mk
+++ b/hostsidetests/theme/Android.mk
@@ -39,7 +39,7 @@
 LOCAL_SDK_VERSION := current
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 include $(BUILD_CTS_HOST_JAVA_LIBRARY)
 
diff --git a/hostsidetests/theme/app/Android.bp b/hostsidetests/theme/app/Android.bp
index 0d21169..c534e9e 100644
--- a/hostsidetests/theme/app/Android.bp
+++ b/hostsidetests/theme/app/Android.bp
@@ -22,7 +22,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/theme/assets/S/140dpi.zip b/hostsidetests/theme/assets/S/140dpi.zip
new file mode 100644
index 0000000..48de32b
--- /dev/null
+++ b/hostsidetests/theme/assets/S/140dpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/S/180dpi.zip b/hostsidetests/theme/assets/S/180dpi.zip
new file mode 100644
index 0000000..4def986
--- /dev/null
+++ b/hostsidetests/theme/assets/S/180dpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/S/200dpi.zip b/hostsidetests/theme/assets/S/200dpi.zip
new file mode 100644
index 0000000..fe2495e
--- /dev/null
+++ b/hostsidetests/theme/assets/S/200dpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/S/220dpi.zip b/hostsidetests/theme/assets/S/220dpi.zip
new file mode 100644
index 0000000..a2c2ea2
--- /dev/null
+++ b/hostsidetests/theme/assets/S/220dpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/S/260dpi.zip b/hostsidetests/theme/assets/S/260dpi.zip
new file mode 100644
index 0000000..74890a2
--- /dev/null
+++ b/hostsidetests/theme/assets/S/260dpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/S/280dpi.zip b/hostsidetests/theme/assets/S/280dpi.zip
new file mode 100644
index 0000000..83fd290
--- /dev/null
+++ b/hostsidetests/theme/assets/S/280dpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/S/300dpi.zip b/hostsidetests/theme/assets/S/300dpi.zip
new file mode 100644
index 0000000..25334d8
--- /dev/null
+++ b/hostsidetests/theme/assets/S/300dpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/S/340dpi.zip b/hostsidetests/theme/assets/S/340dpi.zip
new file mode 100644
index 0000000..2092326
--- /dev/null
+++ b/hostsidetests/theme/assets/S/340dpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/S/360dpi.zip b/hostsidetests/theme/assets/S/360dpi.zip
new file mode 100644
index 0000000..c13ad5c
--- /dev/null
+++ b/hostsidetests/theme/assets/S/360dpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/S/400dpi.zip b/hostsidetests/theme/assets/S/400dpi.zip
new file mode 100644
index 0000000..1df1a95
--- /dev/null
+++ b/hostsidetests/theme/assets/S/400dpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/S/420dpi.zip b/hostsidetests/theme/assets/S/420dpi.zip
new file mode 100644
index 0000000..d58d418
--- /dev/null
+++ b/hostsidetests/theme/assets/S/420dpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/S/440dpi.zip b/hostsidetests/theme/assets/S/440dpi.zip
new file mode 100644
index 0000000..535102f
--- /dev/null
+++ b/hostsidetests/theme/assets/S/440dpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/S/560dpi.zip b/hostsidetests/theme/assets/S/560dpi.zip
new file mode 100644
index 0000000..20f1c7b
--- /dev/null
+++ b/hostsidetests/theme/assets/S/560dpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/S/hdpi.zip b/hostsidetests/theme/assets/S/hdpi.zip
new file mode 100644
index 0000000..582989d
--- /dev/null
+++ b/hostsidetests/theme/assets/S/hdpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/S/ldpi.zip b/hostsidetests/theme/assets/S/ldpi.zip
new file mode 100644
index 0000000..3035146
--- /dev/null
+++ b/hostsidetests/theme/assets/S/ldpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/S/mdpi.zip b/hostsidetests/theme/assets/S/mdpi.zip
new file mode 100644
index 0000000..a831e7b
--- /dev/null
+++ b/hostsidetests/theme/assets/S/mdpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/S/tvdpi.zip b/hostsidetests/theme/assets/S/tvdpi.zip
new file mode 100644
index 0000000..bd4bf75
--- /dev/null
+++ b/hostsidetests/theme/assets/S/tvdpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/S/xhdpi.zip b/hostsidetests/theme/assets/S/xhdpi.zip
new file mode 100644
index 0000000..0dd72e2
--- /dev/null
+++ b/hostsidetests/theme/assets/S/xhdpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/S/xxhdpi.zip b/hostsidetests/theme/assets/S/xxhdpi.zip
new file mode 100644
index 0000000..64fc846
--- /dev/null
+++ b/hostsidetests/theme/assets/S/xxhdpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/S/xxxhdpi.zip b/hostsidetests/theme/assets/S/xxxhdpi.zip
new file mode 100644
index 0000000..87beb9a
--- /dev/null
+++ b/hostsidetests/theme/assets/S/xxxhdpi.zip
Binary files differ
diff --git a/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java b/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java
index 2fcbb5b..0c9662b 100644
--- a/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java
+++ b/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java
@@ -64,7 +64,6 @@
 
     private static final String CLEAR_GENERATED_CMD = "rm -rf %s/*.png";
     private static final String STOP_CMD = String.format("am force-stop %s", APP_PACKAGE_NAME);
-    private static final String HARDWARE_TYPE_CMD = "dumpsys | grep android.hardware.type";
     private static final String DENSITY_PROP_DEVICE = "ro.sf.lcd_density";
     private static final String DENSITY_PROP_EMULATOR = "qemu.sf.lcd_density";
 
@@ -125,7 +124,7 @@
                 fail("Failed to unzip assets: " + zipFile);
             }
         } else {
-            if (checkHardwareTypeSkipTest(mDevice.executeShellCommand(HARDWARE_TYPE_CMD).trim())) {
+            if (checkHardwareTypeSkipTest()) {
                 Log.logAndDisplay(LogLevel.WARN, LOG_TAG,
                         "Could not obtain resources for skipped themes test: " + zipFile);
             } else {
@@ -149,11 +148,10 @@
     }
 
     public void testThemes() throws Exception {
-        if (checkHardwareTypeSkipTest(mDevice.executeShellCommand(HARDWARE_TYPE_CMD).trim())) {
+        if (checkHardwareTypeSkipTest()) {
             Log.logAndDisplay(LogLevel.INFO, LOG_TAG, "Skipped themes test for watch / TV / automotive");
             return;
         }
-
         if (mReferences.isEmpty()) {
             Log.logAndDisplay(LogLevel.INFO, LOG_TAG,
                     "Skipped themes test due to missing reference images");
@@ -303,10 +301,17 @@
         return Integer.parseInt(device.getProperty(densityProp));
     }
 
-    private static boolean checkHardwareTypeSkipTest(String hardwareTypeString) {
-        return hardwareTypeString.contains("android.hardware.type.watch")
-                || hardwareTypeString.contains("android.hardware.type.television")
-                || hardwareTypeString.contains("android.hardware.type.automotive");
+    private boolean checkHardwareTypeSkipTest() {
+        try {
+         if( mDevice.hasFeature("feature:android.hardware.type.watch")
+                 || mDevice.hasFeature("featute:android.hardware.type.television")
+                 || mDevice.hasFeature("feature:android.hardware.type.automotive")) {
+             return true;
+         }
+        } catch (DeviceNotAvailableException ex) {
+             return false;
+        }
+        return false;
     }
 
     private static boolean isEmulator(ITestDevice device) {
diff --git a/hostsidetests/trustedvoice/Android.bp b/hostsidetests/trustedvoice/Android.bp
index 2a333d5..f20218c 100644
--- a/hostsidetests/trustedvoice/Android.bp
+++ b/hostsidetests/trustedvoice/Android.bp
@@ -25,7 +25,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/trustedvoice/app/Android.bp b/hostsidetests/trustedvoice/app/Android.bp
index 3c4cc76..27ab221 100644
--- a/hostsidetests/trustedvoice/app/Android.bp
+++ b/hostsidetests/trustedvoice/app/Android.bp
@@ -19,7 +19,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/hostsidetests/tv/Android.bp b/hostsidetests/tv/Android.bp
index 6b9bd6a..7495491 100644
--- a/hostsidetests/tv/Android.bp
+++ b/hostsidetests/tv/Android.bp
@@ -25,7 +25,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/tv/app/Android.bp b/hostsidetests/tv/app/Android.bp
index 9617442..e929820 100644
--- a/hostsidetests/tv/app/Android.bp
+++ b/hostsidetests/tv/app/Android.bp
@@ -32,7 +32,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/tv/app2/Android.bp b/hostsidetests/tv/app2/Android.bp
index cea1a4b..f8af26c 100644
--- a/hostsidetests/tv/app2/Android.bp
+++ b/hostsidetests/tv/app2/Android.bp
@@ -20,11 +20,10 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src/**/*.java"],
-    libs: ["android.test.runner.stubs"],
+    libs: ["android.test.runner"],
     static_libs: [
         "compatibility-device-util-axt",
         "ctstestrunner-axt",
diff --git a/hostsidetests/tzdata/Android.bp b/hostsidetests/tzdata/Android.bp
index 0027228..75f5424 100644
--- a/hostsidetests/tzdata/Android.bp
+++ b/hostsidetests/tzdata/Android.bp
@@ -26,7 +26,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/tzdata/src/com/android/cts/tzdata/TzDataCheckTest.java b/hostsidetests/tzdata/src/com/android/cts/tzdata/TzDataCheckTest.java
index e86809b..551a0e4 100644
--- a/hostsidetests/tzdata/src/com/android/cts/tzdata/TzDataCheckTest.java
+++ b/hostsidetests/tzdata/src/com/android/cts/tzdata/TzDataCheckTest.java
@@ -18,7 +18,7 @@
 
 import static org.junit.Assert.assertArrayEquals;
 
-import libcore.timezone.TzDataSetVersion;
+import com.android.i18n.timezone.TzDataSetVersion;
 import libcore.timezone.testing.ZoneInfoTestHelper;
 
 import com.android.timezone.distro.DistroVersion;
diff --git a/hostsidetests/ui/Android.mk b/hostsidetests/ui/Android.mk
index 5450454..61bb6d3 100644
--- a/hostsidetests/ui/Android.mk
+++ b/hostsidetests/ui/Android.mk
@@ -24,13 +24,8 @@
 
 LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed compatibility-host-util
 
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-
-$(COMPATIBILITY_TESTCASES_OUT_cts)/CtsUiHostTestCases.jar : $(COMPATIBILITY_TESTCASES_OUT_cts)/com.replica.replicaisland.apk
-
-LOCAL_CTS_TEST_PACKAGE := android.ui.cts
-
 # *Not* tagged as a cts test artifact intentionally: b/109660132
+#$(COMPATIBILITY_TESTCASES_OUT_cts)/CtsUiHostTestCases.jar : $(COMPATIBILITY_TESTCASES_OUT_cts)/com.replica.replicaisland.apk
 LOCAL_COMPATIBILITY_SUITE := general-tests
 
 include $(BUILD_CTS_HOST_JAVA_LIBRARY)
diff --git a/hostsidetests/ui/appA/Android.bp b/hostsidetests/ui/appA/Android.bp
index 47c62ac..5497378 100644
--- a/hostsidetests/ui/appA/Android.bp
+++ b/hostsidetests/ui/appA/Android.bp
@@ -24,7 +24,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/ui/appB/Android.bp b/hostsidetests/ui/appB/Android.bp
index 9bf6165..255b3de 100644
--- a/hostsidetests/ui/appB/Android.bp
+++ b/hostsidetests/ui/appB/Android.bp
@@ -24,7 +24,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/ui/control/Android.bp b/hostsidetests/ui/control/Android.bp
index d1c0344..96d16ce 100644
--- a/hostsidetests/ui/control/Android.bp
+++ b/hostsidetests/ui/control/Android.bp
@@ -20,14 +20,13 @@
         "ctstestrunner-axt",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/hostsidetests/usage/Android.bp b/hostsidetests/usage/Android.bp
index e5aacfd..f7e59d2 100644
--- a/hostsidetests/usage/Android.bp
+++ b/hostsidetests/usage/Android.bp
@@ -24,7 +24,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/usage/app/Android.bp b/hostsidetests/usage/app/Android.bp
index 57e6fc7..55e4ac2 100644
--- a/hostsidetests/usage/app/Android.bp
+++ b/hostsidetests/usage/app/Android.bp
@@ -20,7 +20,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -35,7 +34,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     aaptflags: [
diff --git a/hostsidetests/usb/Android.bp b/hostsidetests/usb/Android.bp
index 250732b..1bd848b 100644
--- a/hostsidetests/usb/Android.bp
+++ b/hostsidetests/usb/Android.bp
@@ -24,7 +24,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/usb/SerialTestApp/Android.bp b/hostsidetests/usb/SerialTestApp/Android.bp
index c1e053e..2c4a864 100644
--- a/hostsidetests/usb/SerialTestApp/Android.bp
+++ b/hostsidetests/usb/SerialTestApp/Android.bp
@@ -19,14 +19,13 @@
         "ctstestrunner-axt",
         "compatibility-device-util-axt",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: ["src/**/*.java"],
     sdk_version: "test_current",
     min_sdk_version: "27",
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/userspacereboot/src/com/android/cts/userspacereboot/host/UserspaceRebootHostTest.java b/hostsidetests/userspacereboot/src/com/android/cts/userspacereboot/host/UserspaceRebootHostTest.java
index 0da168b..f47e8d7 100644
--- a/hostsidetests/userspacereboot/src/com/android/cts/userspacereboot/host/UserspaceRebootHostTest.java
+++ b/hostsidetests/userspacereboot/src/com/android/cts/userspacereboot/host/UserspaceRebootHostTest.java
@@ -68,7 +68,10 @@
 
     private void installApk(String apkFileName) throws Exception {
         CompatibilityBuildHelper helper = new CompatibilityBuildHelper(getBuild());
-        getDevice().installPackage(helper.getTestFile(apkFileName), false, true);
+        getDevice().installPackage(helper.getTestFile(apkFileName), false, true,
+                getDevice().isAppEnumerationSupported()
+                        ? new String[]{"--force-queryable"}
+                        : new String[]{});
     }
 
     /**
diff --git a/hostsidetests/userspacereboot/testapps/BasicTestApp/AndroidManifest.xml b/hostsidetests/userspacereboot/testapps/BasicTestApp/AndroidManifest.xml
index c5536b5..97ffde6 100644
--- a/hostsidetests/userspacereboot/testapps/BasicTestApp/AndroidManifest.xml
+++ b/hostsidetests/userspacereboot/testapps/BasicTestApp/AndroidManifest.xml
@@ -19,7 +19,7 @@
           package="com.android.cts.userspacereboot.basic" >
 
     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
-    <application android:forceQueryable="true">
+    <application>
         <activity android:name=".LauncherActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
diff --git a/hostsidetests/webkit/Android.bp b/hostsidetests/webkit/Android.bp
index ea5c9f77..53fadbd 100644
--- a/hostsidetests/webkit/Android.bp
+++ b/hostsidetests/webkit/Android.bp
@@ -24,7 +24,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/webkit/app/Android.bp b/hostsidetests/webkit/app/Android.bp
index 11871b9..831bbb7 100644
--- a/hostsidetests/webkit/app/Android.bp
+++ b/hostsidetests/webkit/app/Android.bp
@@ -26,14 +26,13 @@
         "ctstestrunner-axt",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/hostsidetests/wifibroadcasts/Android.bp b/hostsidetests/wifibroadcasts/Android.bp
index a721c78..42a3b4f 100644
--- a/hostsidetests/wifibroadcasts/Android.bp
+++ b/hostsidetests/wifibroadcasts/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
diff --git a/hostsidetests/wifibroadcasts/OWNERS b/hostsidetests/wifibroadcasts/OWNERS
index efeabf1..28faebd 100644
--- a/hostsidetests/wifibroadcasts/OWNERS
+++ b/hostsidetests/wifibroadcasts/OWNERS
@@ -1,2 +1,5 @@
 # Bug component: 33618
-mplass@google.com
\ No newline at end of file
+dysu@google.com
+etancohen@google.com
+rpius@google.com
+satk@google.com
diff --git a/hostsidetests/wifibroadcasts/app/Android.bp b/hostsidetests/wifibroadcasts/app/Android.bp
index 1ea4a6e..2dc0b0f 100644
--- a/hostsidetests/wifibroadcasts/app/Android.bp
+++ b/hostsidetests/wifibroadcasts/app/Android.bp
@@ -24,7 +24,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/libs/deviceutillegacy/Android.bp b/libs/deviceutillegacy/Android.bp
index 220b2ab..ddd07f0 100644
--- a/libs/deviceutillegacy/Android.bp
+++ b/libs/deviceutillegacy/Android.bp
@@ -20,7 +20,7 @@
         "junit",
     ],
 
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
 
     srcs: ["src/**/*.java"],
 
diff --git a/libs/install/Android.bp b/libs/install/Android.bp
index e7bf788..4ca412a 100644
--- a/libs/install/Android.bp
+++ b/libs/install/Android.bp
@@ -92,8 +92,13 @@
 
 java_library {
     name: "cts-install-lib-java",
-    srcs: ["src/**/*.java"],
-    static_libs: ["androidx.test.rules", "compatibility-device-util-axt", "truth-prebuilt"],
+    srcs: ["src/**/lib/*.java"],
+    static_libs: [
+        "androidx.test.rules",
+        "compatibility-device-util-axt",
+        "cts-shim-lib",
+        "truth-prebuilt"
+    ],
     sdk_version: "test_current",
     java_resources: [
         ":TestAppAv1",
@@ -118,3 +123,9 @@
         "cts-install-lib-java",
     ],
 }
+
+java_library_host {
+    name: "cts-install-lib-host",
+    srcs: ["src/**/host/InstallUtilsHost.java"],
+    libs: ["tradefed", "cts-shim-host-lib",],
+}
diff --git a/libs/install/src/android/cts/install/lib/host/InstallUtilsHost.java b/libs/install/src/android/cts/install/lib/host/InstallUtilsHost.java
new file mode 100644
index 0000000..f6de85b
--- /dev/null
+++ b/libs/install/src/android/cts/install/lib/host/InstallUtilsHost.java
@@ -0,0 +1,232 @@
+/*
+ * Copyright (C) 2020 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.cts.install.lib.host;
+
+import static com.android.cts.shim.lib.ShimPackage.SHIM_APEX_PACKAGE_NAME;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import com.android.ddmlib.Log;
+import com.android.tradefed.build.BuildInfoKey;
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
+import com.android.tradefed.util.CommandResult;
+import com.android.tradefed.util.CommandStatus;
+import com.android.tradefed.util.FileUtil;
+import com.android.tradefed.util.IRunUtil;
+import com.android.tradefed.util.RunUtil;
+import com.android.tradefed.util.SystemUtil;
+
+import com.google.common.base.Stopwatch;
+
+import java.io.File;
+import java.io.IOException;
+import java.time.Duration;
+import java.util.Optional;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Utilities to facilitate installation in tests on host side.
+ */
+public class InstallUtilsHost {
+    private static final String TAG = InstallUtilsHost.class.getSimpleName();
+    private static final String APEX_INFO_EXTRACT_REGEX =
+            ".*package:\\sname='(\\S+)\\'\\sversionCode='(\\d+)'\\s.*";
+
+    private final IRunUtil mRunUtil = new RunUtil();
+    private final BaseHostJUnit4Test mTest;
+
+    public InstallUtilsHost(BaseHostJUnit4Test test) {
+        mTest = test;
+    }
+
+    /**
+     * Return {@code true} if and only if device supports updating apex.
+     */
+    public boolean isApexUpdateSupported() throws Exception {
+        return mTest.getDevice().getBooleanProperty("ro.apex.updatable", false);
+    }
+
+    /**
+     * Return {@code true} if and only if device supports file system checkpoint.
+     */
+    public boolean isCheckpointSupported() throws Exception {
+        CommandResult result = mTest.getDevice().executeShellV2Command("sm supports-checkpoint");
+        assertWithMessage("Failed to check if file system checkpoint is supported : %s",
+                result.getStderr()).that(result.getStatus()).isEqualTo(CommandStatus.SUCCESS);
+        return "true".equals(result.getStdout().trim());
+    }
+
+    /**
+     * Uninstalls a shim apex only if it's latest version is installed on /data partition (i.e.
+     * it has a version higher than {@code 1}).
+     *
+     * <p>This is purely to optimize tests run time. Since uninstalling an apex requires a reboot,
+     * and only a small subset of tests successfully install an apex, this code avoids ~10
+     * unnecessary reboots.
+     */
+    public void uninstallShimApexIfNecessary() throws Exception {
+        if (!isApexUpdateSupported()) {
+            // Device doesn't support updating apex. Nothing to uninstall.
+            return;
+        }
+        final ITestDevice.ApexInfo shimApex = getShimApex().orElseThrow(
+                () -> new AssertionError("Can't find " + SHIM_APEX_PACKAGE_NAME));
+        if (shimApex.sourceDir.startsWith("/system")) {
+            // System version is active, nothing to uninstall.
+            return;
+        }
+        // Non system version is active, need to uninstall it and reboot the device.
+        Log.i(TAG, "Uninstalling shim apex");
+        final String errorMessage = mTest.getDevice().uninstallPackage(SHIM_APEX_PACKAGE_NAME);
+        if (errorMessage != null) {
+            Log.e(TAG, "Failed to uninstall " + SHIM_APEX_PACKAGE_NAME + " : " + errorMessage);
+        } else {
+            mTest.getDevice().reboot();
+            final ITestDevice.ApexInfo shim = getShimApex().orElseThrow(
+                    () -> new AssertionError("Can't find " + SHIM_APEX_PACKAGE_NAME));
+            assertThat(shim.versionCode).isEqualTo(1L);
+            assertThat(shim.sourceDir).startsWith("/system");
+        }
+    }
+
+    /**
+     * Returns the active shim apex as optional.
+     */
+    public Optional<ITestDevice.ApexInfo> getShimApex() throws DeviceNotAvailableException {
+        return mTest.getDevice().getActiveApexes().stream().filter(
+                apex -> apex.name.equals(SHIM_APEX_PACKAGE_NAME)).findAny();
+    }
+
+    /**
+     * Retrieve package name and version code from test apex file.
+     *
+     * @param apex input apex file to retrieve the info from
+     */
+    public ITestDevice.ApexInfo getApexInfo(File apex) {
+        String aaptOutput = runCmd(String.format("aapt dump badging %s", apex.getAbsolutePath()));
+        String[] lines = aaptOutput.split("\n");
+        Pattern p = Pattern.compile(APEX_INFO_EXTRACT_REGEX);
+        for (String l : lines) {
+            Matcher m = p.matcher(l);
+            if (m.matches()) {
+                return new ITestDevice.ApexInfo(m.group(1), Long.parseLong(m.group(2)));
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Installs packages using staged install flow and waits for pre-reboot verification to complete
+     */
+    public String installStagedPackage(File pkg) throws Exception {
+        return mTest.getDevice().installPackage(pkg, false, "--staged");
+    }
+
+    /**
+     * Install multiple package at the same time
+     */
+    public void installApexes(String... filenames) throws Exception {
+        String[] args = new String[filenames.length + 1];
+        args[0] = "install-multi-package";
+        for (int i = 0; i < filenames.length; i++) {
+            args[i + 1] = getTestFile(filenames[i]).getAbsolutePath();
+        }
+        String stdout = mTest.getDevice().executeAdbCommand(args);
+        assertThat(stdout).isNotNull();
+    }
+
+    /**
+     * Waits for given {@code timeout} for {@code filePath} to be deleted.
+     */
+    public void waitForFileDeleted(String filePath, Duration timeout) throws Exception {
+        Stopwatch stopwatch = Stopwatch.createStarted();
+        while (true) {
+            if (!mTest.getDevice().doesFileExist(filePath)) {
+                return;
+            }
+            if (stopwatch.elapsed().compareTo(timeout) > 0) {
+                break;
+            }
+            Thread.sleep(500);
+        }
+        throw new AssertionError("Timed out waiting for " + filePath + " to be deleted");
+    }
+
+    /**
+     * Get the test file.
+     *
+     * @param testFileName name of the file
+     */
+    public File getTestFile(String testFileName) throws IOException {
+        File testFile = null;
+
+        String testcasesPath = System.getenv(
+                SystemUtil.EnvVariable.ANDROID_HOST_OUT_TESTCASES.toString());
+        if (testcasesPath != null) {
+            testFile = searchTestFile(new File(testcasesPath), testFileName);
+        }
+        if (testFile != null) {
+            return testFile;
+        }
+
+        File hostLinkedDir = mTest.getBuild().getFile(
+                BuildInfoKey.BuildInfoFileKey.HOST_LINKED_DIR);
+        if (hostLinkedDir != null) {
+            testFile = searchTestFile(hostLinkedDir, testFileName);
+        }
+        if (testFile != null) {
+            return testFile;
+        }
+
+        // Find the file in the buildinfo.
+        File buildInfoFile = mTest.getBuild().getFile(testFileName);
+        if (buildInfoFile != null) {
+            return buildInfoFile;
+        }
+
+        throw new IOException("Cannot find " + testFileName);
+    }
+
+    /**
+     * Searches the file with the given name under the given directory, returns null if not found.
+     */
+    private File searchTestFile(File baseSearchFile, String testFileName) {
+        if (baseSearchFile != null && baseSearchFile.isDirectory()) {
+            File testFile = FileUtil.findFile(baseSearchFile, testFileName);
+            if (testFile != null && testFile.isFile()) {
+                return testFile;
+            }
+        }
+        return null;
+    }
+
+    private String runCmd(String cmd) {
+        Log.d("About to run command: %s", cmd);
+        CommandResult result = mRunUtil.runTimedCmd(1000 * 60 * 5, cmd.split("\\s+"));
+        assertThat(result).isNotNull();
+        assertWithMessage(String.format("Command %s failed", cmd)).that(result.getStatus())
+                .isEqualTo(CommandStatus.SUCCESS);
+        Log.d("output:\n%s", result.getStdout());
+        return result.getStdout();
+    }
+
+
+}
diff --git a/libs/install/src/com/android/cts/install/lib/InstallUtils.java b/libs/install/src/com/android/cts/install/lib/InstallUtils.java
index 9a8cfbd..7f92c62 100644
--- a/libs/install/src/com/android/cts/install/lib/InstallUtils.java
+++ b/libs/install/src/com/android/cts/install/lib/InstallUtils.java
@@ -340,7 +340,28 @@
             }
         }
         return true;
+    }
 
+    /**
+     * Returns the session by session Id, or null if no session is found.
+     */
+    public static PackageInstaller.SessionInfo getStagedSessionInfo(int sessionId) {
+        PackageInstaller packageInstaller = getPackageInstaller();
+        for (PackageInstaller.SessionInfo session : packageInstaller.getStagedSessions()) {
+            if (session.getSessionId() == sessionId) {
+                return session;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Assert that the given staged session is abandoned. The method assumes that the given session
+     * is staged.
+     * @param sessionId of the staged session
+     */
+    public static void assertStagedSessionIsAbandoned(int sessionId) {
+        assertThat(getStagedSessionInfo(sessionId)).isNull();
     }
 
     /**
diff --git a/libs/install/src/com/android/cts/install/lib/TestApp.java b/libs/install/src/com/android/cts/install/lib/TestApp.java
index cb77517..7434040 100644
--- a/libs/install/src/com/android/cts/install/lib/TestApp.java
+++ b/libs/install/src/com/android/cts/install/lib/TestApp.java
@@ -16,6 +16,8 @@
 
 package com.android.cts.install.lib;
 
+import static com.android.cts.shim.lib.ShimPackage.SHIM_APEX_PACKAGE_NAME;
+
 import android.content.pm.VersionedPackage;
 
 import java.io.File;
@@ -28,11 +30,10 @@
  * Collection of dummy apps used in tests.
  */
 public class TestApp {
+
     public static final String A = "com.android.cts.install.lib.testapp.A";
     public static final String B = "com.android.cts.install.lib.testapp.B";
     public static final String C = "com.android.cts.install.lib.testapp.C";
-    public static final String Apex = "com.android.apex.cts.shim";
-    public static final String NotPreInstalledApex = "com.android.apex.cts.shim_not_pre_installed";
 
     // Apk collection
     public static final TestApp A1 = new TestApp("Av1", A, 1, /*isApex*/false,
@@ -57,12 +58,12 @@
             "TestAppCv1.apk");
 
     // Apex collection
-    public static final TestApp Apex1 = new TestApp("Apex1", Apex, 1, /*isApex*/true,
-            "com.android.apex.cts.shim.v1.apex");
-    public static final TestApp Apex2 = new TestApp("Apex2", Apex, 2, /*isApex*/true,
-            "com.android.apex.cts.shim.v2.apex");
-    public static final TestApp Apex3 = new TestApp("Apex3", Apex, 3, /*isApex*/true,
-            "com.android.apex.cts.shim.v3.apex");
+    public static final TestApp Apex1 = new TestApp("Apex1", SHIM_APEX_PACKAGE_NAME, 1,
+            /*isApex*/true, "com.android.apex.cts.shim.v1.apex");
+    public static final TestApp Apex2 = new TestApp("Apex2", SHIM_APEX_PACKAGE_NAME, 2,
+            /*isApex*/true, "com.android.apex.cts.shim.v2.apex");
+    public static final TestApp Apex3 = new TestApp("Apex3", SHIM_APEX_PACKAGE_NAME, 3,
+            /*isApex*/true, "com.android.apex.cts.shim.v3.apex");
 
     private final String mName;
     private final String mPackageName;
diff --git a/libs/rollback/src/com/android/cts/rollback/lib/RollbackInfoSubject.java b/libs/rollback/src/com/android/cts/rollback/lib/RollbackInfoSubject.java
index 684f0ec..1903cc4 100644
--- a/libs/rollback/src/com/android/cts/rollback/lib/RollbackInfoSubject.java
+++ b/libs/rollback/src/com/android/cts/rollback/lib/RollbackInfoSubject.java
@@ -32,7 +32,9 @@
 /**
  * Subject for asserting things about RollbackInfo instances.
  */
-public final class RollbackInfoSubject extends Subject<RollbackInfoSubject, RollbackInfo> {
+public final class RollbackInfoSubject extends Subject {
+    private final RollbackInfo mActual;
+
     /**
      * Asserts something about RollbackInfo.
      */
@@ -57,27 +59,28 @@
 
     private RollbackInfoSubject(FailureMetadata failureMetadata, RollbackInfo subject) {
         super(failureMetadata, subject);
+        mActual = subject;
     }
 
     /**
      * Asserts that the RollbackInfo has given rollbackId.
      */
     public void hasRollbackId(int rollbackId) {
-        check().that(getSubject().getRollbackId()).isEqualTo(rollbackId);
+        check("getRollbackId()").that(mActual.getRollbackId()).isEqualTo(rollbackId);
     }
 
     /**
      * Asserts that the RollbackInfo is for a staged rollback.
      */
     public void isStaged() {
-        check().that(getSubject().isStaged()).isTrue();
+        check("isStaged()").that(mActual.isStaged()).isTrue();
     }
 
     /**
      * Asserts that the RollbackInfo is not for a staged rollback.
      */
     public void isNotStaged() {
-        check().that(getSubject().isStaged()).isFalse();
+        check("isStaged()").that(mActual.isStaged()).isFalse();
     }
 
     /**
@@ -86,10 +89,10 @@
      */
     public void packagesContainsExactly(Rollback... expected) {
         List<Rollback> actualPackages = new ArrayList<>();
-        for (PackageRollbackInfo info : getSubject().getPackages()) {
+        for (PackageRollbackInfo info : mActual.getPackages()) {
             actualPackages.add(new Rollback(info));
         }
-        check().that(actualPackages).containsExactly((Object[]) expected);
+        check("actualPackages").that(actualPackages).containsExactly((Object[]) expected);
     }
 
     /**
@@ -102,6 +105,7 @@
             expectedVps.add(cause.getVersionedPackage());
         }
 
-        check().that(getSubject().getCausePackages()).containsExactlyElementsIn(expectedVps);
+        check("getCausePackages()").that(mActual.getCausePackages())
+                .containsExactlyElementsIn(expectedVps);
     }
 }
diff --git a/libs/shim/Android.bp b/libs/shim/Android.bp
new file mode 100644
index 0000000..908cd8e
--- /dev/null
+++ b/libs/shim/Android.bp
@@ -0,0 +1,28 @@
+//
+// Copyright (C) 2020 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.
+//
+
+java_library {
+    name: "cts-shim-lib",
+    host_supported: true,
+    srcs: ["src/**/*.java"],
+    sdk_version: "current",
+}
+
+// Compatibility version of host library
+java_library_host {
+    name: "cts-shim-host-lib",
+    static_libs: ["cts-shim-lib"],
+}
diff --git a/libs/shim/src/com/android/cts/shim/lib/ShimPackage.java b/libs/shim/src/com/android/cts/shim/lib/ShimPackage.java
new file mode 100644
index 0000000..a357941
--- /dev/null
+++ b/libs/shim/src/com/android/cts/shim/lib/ShimPackage.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.cts.shim.lib;
+
+/**
+ * The constants about shim package.
+ */
+public class ShimPackage {
+
+    /**
+     * Package name of the privileged CTS shim apk
+     */
+    public static final String PRIVILEGED_SHIM_PACKAGE_NAME = "com.android.cts.priv.ctsshim";
+
+    /**
+     * Package name of the system CTS shim apk
+     */
+    public static final String SHIM_PACKAGE_NAME = "com.android.cts.ctsshim";
+
+    /**
+     * Package name of the system CTS shim apex
+     */
+    public static final String SHIM_APEX_PACKAGE_NAME = "com.android.apex.cts.shim";
+
+    /**
+     * Package name of the non pre-installed CTS shim apex
+     */
+    public static final String NOT_PRE_INSTALL_APEX_PACKAGE_NAME =
+            "com.android.apex.cts.shim_not_pre_installed";
+
+    /**
+     * Package name of the CTS shim apex that has the different package name
+     */
+    public static final String DIFFERENT_APEX_PACKAGE_NAME = "com.android.apex.cts.shim.different";
+}
diff --git a/libs/testserver/src/android/webkit/cts/CtsTestServer.java b/libs/testserver/src/android/webkit/cts/CtsTestServer.java
index 64f0507..3e781c3 100644
--- a/libs/testserver/src/android/webkit/cts/CtsTestServer.java
+++ b/libs/testserver/src/android/webkit/cts/CtsTestServer.java
@@ -50,6 +50,7 @@
 import java.io.BufferedOutputStream;
 import java.io.ByteArrayInputStream;
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -632,6 +633,9 @@
                     throw new IOException();
                   }
                   in = mResources.openRawResource(id);
+                } else if (path.startsWith(
+                          Environment.getExternalStorageDirectory().getAbsolutePath())) {
+                    in = new FileInputStream(path);
                 } else {
                   in = mAssets.open(path);
                 }
diff --git a/suite/Android.mk b/suite/Android.mk
deleted file mode 100644
index c141484..0000000
--- a/suite/Android.mk
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# Copyright (C) 2012 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-include $(call all-subdir-makefiles)
diff --git a/suite/audio_quality/test_description/processing/check_spectrum.py b/suite/audio_quality/test_description/processing/check_spectrum.py
index 598da96..3d10e34 100644
--- a/suite/audio_quality/test_description/processing/check_spectrum.py
+++ b/suite/audio_quality/test_description/processing/check_spectrum.py
@@ -82,7 +82,7 @@
     output = []
     outputData = []
     outputTypes = []
-    # basic sanity check
+    # basic validate
     inputError = False
     if (inputTypes[0] != TYPE_MONO) and (inputTypes[0] != TYPE_STEREO):
         inputError = True
diff --git a/suite/audio_quality/test_description/processing/check_spectrum_playback.py b/suite/audio_quality/test_description/processing/check_spectrum_playback.py
index 54cf91f..caef332 100644
--- a/suite/audio_quality/test_description/processing/check_spectrum_playback.py
+++ b/suite/audio_quality/test_description/processing/check_spectrum_playback.py
@@ -70,7 +70,7 @@
     output = []
     outputData = []
     outputTypes = []
-    # basic sanity check
+    # basic validate
     inputError = False
     if (inputTypes[0] != TYPE_MONO):
         inputError = True
diff --git a/suite/audio_quality/test_description/processing/gen_random.py b/suite/audio_quality/test_description/processing/gen_random.py
index 305526a..5548242 100644
--- a/suite/audio_quality/test_description/processing/gen_random.py
+++ b/suite/audio_quality/test_description/processing/gen_random.py
@@ -63,7 +63,7 @@
     output = []
     outputData = []
     outputTypes = []
-    # basic sanity check
+    # basic validate
     inputError = False
     if (inputTypes[0] != TYPE_I64):
         inputError = True
diff --git a/suite/audio_quality/test_description/processing/playback_sample.py b/suite/audio_quality/test_description/processing/playback_sample.py
index 79e8d53..d9c462a 100644
--- a/suite/audio_quality/test_description/processing/playback_sample.py
+++ b/suite/audio_quality/test_description/processing/playback_sample.py
@@ -26,7 +26,7 @@
     output = []
     outputData = []
     outputTypes = []
-    # basic sanity check
+    # basic validate
     inputError = False
     if (inputTypes[0] != TYPE_MONO):
         inputError = True
diff --git a/suite/audio_quality/test_description/processing/playback_thd.py b/suite/audio_quality/test_description/processing/playback_thd.py
index 7242ef8..af490bc 100644
--- a/suite/audio_quality/test_description/processing/playback_thd.py
+++ b/suite/audio_quality/test_description/processing/playback_thd.py
@@ -30,7 +30,7 @@
     output = []
     outputData = []
     outputTypes = []
-    # basic sanity check
+    # basic validate
     inputError = False
     if (inputTypes[0] != TYPE_MONO):
         inputError = True
diff --git a/suite/audio_quality/test_description/processing/recording_thd.py b/suite/audio_quality/test_description/processing/recording_thd.py
index 46d82b5..c0251b5 100644
--- a/suite/audio_quality/test_description/processing/recording_thd.py
+++ b/suite/audio_quality/test_description/processing/recording_thd.py
@@ -37,7 +37,7 @@
     output = []
     outputData = []
     outputTypes = []
-    # basic sanity check
+    # basic validate
     inputError = False
     if (inputTypes[0] != TYPE_MONO):
         inputError = True
diff --git a/test_defs.sh b/test_defs.sh
index cc92685..1d9cf57 100644
--- a/test_defs.sh
+++ b/test_defs.sh
@@ -21,7 +21,6 @@
 
 COMMON_JARS="
     ddmlib-prebuilt\
-    hosttestlib\
     tradefed"
 
 checkFile() {
diff --git a/tests/AlarmManager/Android.bp b/tests/AlarmManager/Android.bp
index 204f5a3..ba40a70 100644
--- a/tests/AlarmManager/Android.bp
+++ b/tests/AlarmManager/Android.bp
@@ -26,7 +26,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     platform_apis: true,
diff --git a/tests/AlarmManager/app/Android.bp b/tests/AlarmManager/app/Android.bp
index faf64a7..5a10973 100644
--- a/tests/AlarmManager/app/Android.bp
+++ b/tests/AlarmManager/app/Android.bp
@@ -18,7 +18,6 @@
     sdk_version: "current",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src/**/*.java"],
diff --git a/tests/AlarmManager/src/android/alarmmanager/cts/TimeChangeTests.java b/tests/AlarmManager/src/android/alarmmanager/cts/TimeChangeTests.java
index ed35dbe..c64b4d1 100644
--- a/tests/AlarmManager/src/android/alarmmanager/cts/TimeChangeTests.java
+++ b/tests/AlarmManager/src/android/alarmmanager/cts/TimeChangeTests.java
@@ -60,6 +60,7 @@
     private long mTestStartRtc;
     private long mTestStartElapsed;
     private boolean mTimeChanged;
+    private boolean mAutoTimeEnabled;
 
     final CountDownLatch mAlarmLatch = new CountDownLatch(1);
 
@@ -84,6 +85,11 @@
         mTimeChanged = true;
     }
 
+    private boolean isAutoTimeEnabled() {
+        String auto_time = SystemUtil.runShellCommand("settings get global auto_time");
+        return auto_time.trim().equals("1");
+    }
+
     @Before
     public void setUp() {
         final Intent alarmIntent = new Intent(ACTION_ALARM)
@@ -96,6 +102,9 @@
         BatteryUtils.runDumpsysBatteryUnplug();
         mTestStartRtc = System.currentTimeMillis();
         mTestStartElapsed = SystemClock.elapsedRealtime();
+        mAutoTimeEnabled = isAutoTimeEnabled();
+        // Disable auto time as tests might fail if the system restores time while they are running
+        SystemUtil.runShellCommand("settings put global auto_time 0");
     }
 
     @Test
@@ -137,5 +146,9 @@
             final long expectedCorrectRtc = mTestStartRtc + testDuration;
             setTime(expectedCorrectRtc);
         }
+        if (mAutoTimeEnabled) {
+            // Restore auto time
+            SystemUtil.runShellCommand("settings put global auto_time 1");
+        }
     }
 }
diff --git a/tests/Android.mk b/tests/Android.mk
deleted file mode 100644
index 46a8ec2..0000000
--- a/tests/Android.mk
+++ /dev/null
@@ -1,16 +0,0 @@
-# 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.
-
-# Build the test APK using its own makefile, and any other CTS-related packages
-include $(call all-subdir-makefiles)
diff --git a/tests/BlobStore/Android.bp b/tests/BlobStore/Android.bp
index fcf1e72..22d8791 100644
--- a/tests/BlobStore/Android.bp
+++ b/tests/BlobStore/Android.bp
@@ -30,7 +30,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current"
@@ -50,7 +49,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests"
     ],
     manifest: "helper-app/AndroidManifest.xml",
@@ -71,7 +69,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "helper-app/AndroidManifest.xml",
@@ -96,7 +93,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "helper-app/AndroidManifest.xml",
diff --git a/tests/BlobStore/AndroidTest.xml b/tests/BlobStore/AndroidTest.xml
index 45c066b..d5c3548 100644
--- a/tests/BlobStore/AndroidTest.xml
+++ b/tests/BlobStore/AndroidTest.xml
@@ -32,6 +32,12 @@
         <option name="teardown-command" value="cmd blob_store idle-maintenance" />
     </target_preparer>
 
+    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
+      <!-- Disable hidden API checking, see b/166236554 -->
+        <option name="run-command" value="settings put global hidden_api_policy 1" />
+        <option name="teardown-command" value="settings delete global hidden_api_policy" />
+    </target_preparer>
+
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="com.android.cts.blob" />
     </test>
diff --git a/tests/BlobStore/src/com/android/cts/blob/BlobStoreManagerTest.java b/tests/BlobStore/src/com/android/cts/blob/BlobStoreManagerTest.java
index c7b47ad..9f21efe 100644
--- a/tests/BlobStore/src/com/android/cts/blob/BlobStoreManagerTest.java
+++ b/tests/BlobStore/src/com/android/cts/blob/BlobStoreManagerTest.java
@@ -83,7 +83,7 @@
 @RunWith(BlobStoreTestRunner.class)
 public class BlobStoreManagerTest {
 
-    private static final long TIMEOUT_COMMIT_CALLBACK_SEC = 5;
+    private static final long TIMEOUT_COMMIT_CALLBACK_SEC = 10;
 
     private static final long TIMEOUT_BIND_SERVICE_SEC = 2;
 
diff --git a/tests/DropBoxManager/Android.bp b/tests/DropBoxManager/Android.bp
index 7c121ad..f13b0fe 100644
--- a/tests/DropBoxManager/Android.bp
+++ b/tests/DropBoxManager/Android.bp
@@ -23,7 +23,6 @@
     srcs: ["src/**/*.java"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     platform_apis: true,
diff --git a/tests/JobScheduler/Android.bp b/tests/JobScheduler/Android.bp
index 6bceb85..e747694 100644
--- a/tests/JobScheduler/Android.bp
+++ b/tests/JobScheduler/Android.bp
@@ -21,7 +21,7 @@
         "androidx.test.rules",
         "cts-wm-util",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: [
         "src/**/*.java",
         "JobTestApp/src/**/*.java",
@@ -29,7 +29,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     // sdk_version: "current",
diff --git a/tests/JobScheduler/AndroidTest.xml b/tests/JobScheduler/AndroidTest.xml
index 6c487be..d81ead1 100644
--- a/tests/JobScheduler/AndroidTest.xml
+++ b/tests/JobScheduler/AndroidTest.xml
@@ -19,6 +19,7 @@
     <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
     <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
     <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
+    <option name="config-descriptor:metadata" key="token" value="SIM_CARD" />
     <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
         <option name="cleanup-apks" value="true" />
         <option name="test-file-name" value="CtsJobSchedulerTestCases.apk" />
diff --git a/tests/JobScheduler/JobTestApp/Android.bp b/tests/JobScheduler/JobTestApp/Android.bp
index 5db7c14..6985b18 100644
--- a/tests/JobScheduler/JobTestApp/Android.bp
+++ b/tests/JobScheduler/JobTestApp/Android.bp
@@ -19,7 +19,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/tests/JobScheduler/JobTestApp/src/android/jobscheduler/cts/jobtestapp/TestActivity.java b/tests/JobScheduler/JobTestApp/src/android/jobscheduler/cts/jobtestapp/TestActivity.java
index 0368f05..1bb500d 100644
--- a/tests/JobScheduler/JobTestApp/src/android/jobscheduler/cts/jobtestapp/TestActivity.java
+++ b/tests/JobScheduler/JobTestApp/src/android/jobscheduler/cts/jobtestapp/TestActivity.java
@@ -27,7 +27,7 @@
 import android.util.Log;
 
 /**
- * Just a dummy activity to keep the test app process in the foreground state when desired.
+ * Just a no-op activity to keep the test app process in the foreground state when desired.
  */
 public class TestActivity extends Activity {
     private static final String TAG = TestActivity.class.getSimpleName();
diff --git a/tests/JobScheduler/src/android/jobscheduler/cts/IdleConstraintTest.java b/tests/JobScheduler/src/android/jobscheduler/cts/IdleConstraintTest.java
index e75d109..7177bf5 100644
--- a/tests/JobScheduler/src/android/jobscheduler/cts/IdleConstraintTest.java
+++ b/tests/JobScheduler/src/android/jobscheduler/cts/IdleConstraintTest.java
@@ -176,9 +176,14 @@
      * Check if dock state is supported.
      */
     private boolean isDockStateSupported() {
-        // Car does not support dock state.
-        return !getContext().getPackageManager().hasSystemFeature(
+        final boolean isCar = getContext().getPackageManager().hasSystemFeature(
                 PackageManager.FEATURE_AUTOMOTIVE);
+
+        final boolean isLeanback = getContext().getPackageManager().hasSystemFeature(
+                PackageManager.FEATURE_LEANBACK_ONLY);
+
+        // Car and Leanback do not support dock state.
+        return !isCar && !isLeanback;
     }
 
     /**
diff --git a/tests/JobScheduler/src/android/jobscheduler/cts/JobThrottlingTest.java b/tests/JobScheduler/src/android/jobscheduler/cts/JobThrottlingTest.java
index b6d6120..548128c 100644
--- a/tests/JobScheduler/src/android/jobscheduler/cts/JobThrottlingTest.java
+++ b/tests/JobScheduler/src/android/jobscheduler/cts/JobThrottlingTest.java
@@ -105,6 +105,7 @@
     private String mInitialDisplayTimeout;
     private String mInitialRestrictedBucketEnabled;
     private boolean mAutomotiveDevice;
+    private boolean mLeanbackOnly;
 
     private TestAppInterface mTestAppInterface;
 
@@ -171,7 +172,10 @@
         // In automotive device, always-on screen and endless battery charging are assumed.
         mAutomotiveDevice =
                 mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE);
-        if (mAutomotiveDevice) {
+        // In leanback devices, it is assumed that there is no battery.
+        mLeanbackOnly =
+                mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK_ONLY);
+        if (mAutomotiveDevice || mLeanbackOnly) {
             setScreenState(true);
             // TODO(b/159176758): make sure that initial power supply is on.
             BatteryUtils.runDumpsysBatterySetPluggedIn(true);
@@ -296,6 +300,7 @@
     public void testJobsInRestrictedBucket_ParoleSession() throws Exception {
         assumeTrue("app standby not enabled", mAppStandbyEnabled);
         assumeFalse("not testable in automotive device", mAutomotiveDevice);
+        assumeFalse("not testable in leanback device", mLeanbackOnly);
 
         setRestrictedBucketEnabled(true);
 
@@ -322,6 +327,7 @@
     public void testJobsInRestrictedBucket_NoRequiredNetwork() throws Exception {
         assumeTrue("app standby not enabled", mAppStandbyEnabled);
         assumeFalse("not testable in automotive device", mAutomotiveDevice);
+        assumeFalse("not testable in leanback device", mLeanbackOnly);
 
         setRestrictedBucketEnabled(true);
 
@@ -360,6 +366,8 @@
     public void testJobsInRestrictedBucket_WithRequiredNetwork() throws Exception {
         assumeTrue("app standby not enabled", mAppStandbyEnabled);
         assumeFalse("not testable in automotive device", mAutomotiveDevice);
+        assumeFalse("not testable in leanback device", mLeanbackOnly);
+
         assumeTrue(mHasWifi);
         ensureSavedWifiNetwork(mWifiManager);
 
@@ -410,6 +418,7 @@
     public void testJobsInNeverApp() throws Exception {
         assumeTrue("app standby not enabled", mAppStandbyEnabled);
         assumeFalse("not testable in automotive device", mAutomotiveDevice);
+        assumeFalse("not testable in leanback device", mLeanbackOnly);
 
         BatteryUtils.runDumpsysBatteryUnplug();
         setTestPackageStandbyBucket(Bucket.NEVER);
@@ -421,6 +430,7 @@
     @Test
     public void testUidActiveBypassesStandby() throws Exception {
         assumeFalse("not testable in automotive device", mAutomotiveDevice);
+        assumeFalse("not testable in leanback device", mLeanbackOnly);
 
         BatteryUtils.runDumpsysBatteryUnplug();
         setTestPackageStandbyBucket(Bucket.NEVER);
@@ -434,6 +444,8 @@
     @Test
     public void testBatterySaverOff() throws Exception {
         assumeFalse("not testable in automotive device", mAutomotiveDevice);
+        assumeFalse("not testable in leanback device", mLeanbackOnly);
+
         BatteryUtils.assumeBatterySaverFeature();
 
         BatteryUtils.runDumpsysBatteryUnplug();
@@ -446,6 +458,8 @@
     @Test
     public void testBatterySaverOn() throws Exception {
         assumeFalse("not testable in automotive device", mAutomotiveDevice);
+        assumeFalse("not testable in leanback device", mLeanbackOnly);
+
         BatteryUtils.assumeBatterySaverFeature();
 
         BatteryUtils.runDumpsysBatteryUnplug();
@@ -458,6 +472,8 @@
     @Test
     public void testUidActiveBypassesBatterySaverOn() throws Exception {
         assumeFalse("not testable in automotive device", mAutomotiveDevice);
+        assumeFalse("not testable in leanback device", mLeanbackOnly);
+
         BatteryUtils.assumeBatterySaverFeature();
 
         BatteryUtils.runDumpsysBatteryUnplug();
@@ -471,6 +487,8 @@
     @Test
     public void testBatterySaverOnThenUidActive() throws Exception {
         assumeFalse("not testable in automotive device", mAutomotiveDevice);
+        assumeFalse("not testable in leanback device", mLeanbackOnly);
+
         BatteryUtils.assumeBatterySaverFeature();
 
         // Enable battery saver, and schedule a job. It shouldn't run.
@@ -496,6 +514,7 @@
             toggleDeviceIdleState(false);
         }
         mTestAppInterface.cleanup();
+        BatteryUtils.runDumpsysBatterySaverOff();
         BatteryUtils.runDumpsysBatteryReset();
         BatteryUtils.enableBatterySaver(false);
         removeTestAppFromTempWhitelist();
diff --git a/tests/JobSchedulerSharedUid/Android.bp b/tests/JobSchedulerSharedUid/Android.bp
index 34d063b..b08b072 100644
--- a/tests/JobSchedulerSharedUid/Android.bp
+++ b/tests/JobSchedulerSharedUid/Android.bp
@@ -20,7 +20,7 @@
         "ub-uiautomator",
         "androidx.test.rules",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: [
         "src/**/*.java",
         "JobSharedUidTestApp/src/**/*.java",
@@ -30,7 +30,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     //sdk_version: "current"
diff --git a/tests/JobSchedulerSharedUid/JobSharedUidTestApp/Android.bp b/tests/JobSchedulerSharedUid/JobSharedUidTestApp/Android.bp
index 184e83e..a849c0a 100644
--- a/tests/JobSchedulerSharedUid/JobSharedUidTestApp/Android.bp
+++ b/tests/JobSchedulerSharedUid/JobSharedUidTestApp/Android.bp
@@ -19,7 +19,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/tests/JobSchedulerSharedUid/JobSharedUidTestApp/src/android/jobscheduler/cts/jobtestapp/TestActivity.java b/tests/JobSchedulerSharedUid/JobSharedUidTestApp/src/android/jobscheduler/cts/jobtestapp/TestActivity.java
index 77107c2..595f6a6 100644
--- a/tests/JobSchedulerSharedUid/JobSharedUidTestApp/src/android/jobscheduler/cts/jobtestapp/TestActivity.java
+++ b/tests/JobSchedulerSharedUid/JobSharedUidTestApp/src/android/jobscheduler/cts/jobtestapp/TestActivity.java
@@ -27,7 +27,7 @@
 import android.util.Log;
 
 /**
- * Just a dummy activity to keep the test app process in the foreground state when desired.
+ * Just a no-op activity to keep the test app process in the foreground state when desired.
  */
 public class TestActivity extends Activity {
     private static final String TAG = TestActivity.class.getSimpleName();
diff --git a/tests/JobSchedulerSharedUid/jobperm/Android.bp b/tests/JobSchedulerSharedUid/jobperm/Android.bp
index 3c6294f..1032247 100644
--- a/tests/JobSchedulerSharedUid/jobperm/Android.bp
+++ b/tests/JobSchedulerSharedUid/jobperm/Android.bp
@@ -23,7 +23,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     platform_apis: true,
diff --git a/tests/JobSchedulerSharedUid/shareduid/Android.bp b/tests/JobSchedulerSharedUid/shareduid/Android.bp
index 73bb119..b3a23dc 100644
--- a/tests/JobSchedulerSharedUid/shareduid/Android.bp
+++ b/tests/JobSchedulerSharedUid/shareduid/Android.bp
@@ -20,7 +20,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/ProcessTest/Android.bp b/tests/ProcessTest/Android.bp
index 166c3f2..81e1efe 100644
--- a/tests/ProcessTest/Android.bp
+++ b/tests/ProcessTest/Android.bp
@@ -24,7 +24,7 @@
     ],
     srcs: ["**/*.java"],
     static_libs: ["junit"],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     dex_preopt: {
         enabled: false,
     },
diff --git a/tests/acceleration/Android.bp b/tests/acceleration/Android.bp
index 4e19779..a5e4027 100644
--- a/tests/acceleration/Android.bp
+++ b/tests/acceleration/Android.bp
@@ -26,14 +26,13 @@
         "compatibility-device-util-axt",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/accessibility/Android.bp b/tests/accessibility/Android.bp
index 276fb7d..1512068 100644
--- a/tests/accessibility/Android.bp
+++ b/tests/accessibility/Android.bp
@@ -30,11 +30,10 @@
         "hamcrest-library",
         "CtsAccessibilityCommon",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/accessibilityservice/Android.bp b/tests/accessibilityservice/Android.bp
index 3401363..0f7db14 100644
--- a/tests/accessibilityservice/Android.bp
+++ b/tests/accessibilityservice/Android.bp
@@ -25,14 +25,13 @@
         "CtsInputMethodServiceCommon",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityGestureDetectorTest.java b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityGestureDetectorTest.java
old mode 100644
new mode 100755
index 760084b..37a4997
--- a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityGestureDetectorTest.java
+++ b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityGestureDetectorTest.java
@@ -25,6 +25,7 @@
 import static android.accessibilityservice.cts.utils.GestureUtils.startingAt;
 import static android.app.UiAutomation.FLAG_DONT_SUPPRESS_ACCESSIBILITY_SERVICES;
 
+import static org.junit.Assume.assumeTrue;
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.timeout;
 import static org.mockito.Mockito.verify;
@@ -160,6 +161,9 @@
     @Test
     @AppModeFull
     public void testRecognizeGesturePathOnVirtualDisplay() throws Exception {
+        assumeTrue(sInstrumentation.getContext().getPackageManager()
+                .hasSystemFeature(PackageManager.FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS));
+
         if (!mHasTouchScreen || !mScreenBigEnough) {
             return;
         }
@@ -397,6 +401,8 @@
     @Test
     @AppModeFull
     public void testVerifyGestureTouchEventOnVirtualDisplay() throws Exception {
+        assumeTrue(sInstrumentation.getContext().getPackageManager()
+                .hasSystemFeature(PackageManager.FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS));
         if (!mHasTouchScreen || !mScreenBigEnough) {
             return;
         }
@@ -467,6 +473,8 @@
     @Test
     @AppModeFull
     public void testDispatchGesture_privateDisplay_gestureCancelled() throws Exception{
+        assumeTrue(sInstrumentation.getContext().getPackageManager()
+            .hasSystemFeature(PackageManager.FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS));
         if (!mHasTouchScreen || !mScreenBigEnough) {
             return;
         }
diff --git a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTakeScreenshotTest.java b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTakeScreenshotTest.java
index c6b8ea9..6342713 100644
--- a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTakeScreenshotTest.java
+++ b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTakeScreenshotTest.java
@@ -18,6 +18,7 @@
 
 import static android.accessibilityservice.cts.utils.AccessibilityEventFilterUtils.filterWindowsChangedWithChangeTypes;
 import static android.accessibilityservice.cts.utils.ActivityLaunchUtils.launchActivityOnSpecifiedDisplayAndWaitForItToBeOnscreen;
+import static android.accessibilityservice.cts.utils.ActivityLaunchUtils.supportsMultiDisplay;
 import static android.accessibilityservice.cts.utils.DisplayUtils.VirtualDisplaySession;
 import static android.accessibilityservice.cts.utils.AsyncUtils.DEFAULT_TIMEOUT_MS;
 import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
@@ -26,6 +27,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
 import static org.mockito.Mockito.timeout;
 import static org.mockito.Mockito.verify;
 
@@ -158,6 +160,7 @@
 
     @Test
     public void testTakeScreenshotOnVirtualDisplay_GetScreenshotResult() throws Exception {
+        assumeTrue(supportsMultiDisplay(sInstrumentation.getContext()));
         try (VirtualDisplaySession displaySession = new VirtualDisplaySession()) {
             final int virtualDisplayId =
                     displaySession.createDisplayWithDefaultDisplayMetricsAndWait(mContext,
diff --git a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTextTraversalTest.java b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTextTraversalTest.java
index 512c35a..c524c2a 100644
--- a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTextTraversalTest.java
+++ b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTextTraversalTest.java
@@ -3801,7 +3801,9 @@
         final int textLength = editText.getText().length();
         arguments.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, textLength);
         arguments.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, textLength);
-        assertTrue(text.performAction(AccessibilityNodeInfo.ACTION_SET_SELECTION, arguments));
+        // Don't check the return value, because the copy action could move the selection and the
+        // operation will fail if the selection is already at the end.
+        text.performAction(AccessibilityNodeInfo.ACTION_SET_SELECTION, arguments);
 
         // Verify the selection position.
         assertEquals(textLength, Selection.getSelectionStart(editText.getText()));
diff --git a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryTest.java b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryTest.java
index b32d5b8..7663cdb 100644
--- a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryTest.java
+++ b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryTest.java
@@ -25,6 +25,8 @@
 import static android.accessibilityservice.cts.utils.AsyncUtils.DEFAULT_TIMEOUT_MS;
 import static android.accessibilityservice.cts.utils.DisplayUtils.getStatusBarHeight;
 import static android.accessibilityservice.cts.utils.DisplayUtils.VirtualDisplaySession;
+import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
+import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
 import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE;
 import static android.view.accessibility.AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED;
 import static android.view.accessibility.AccessibilityEvent.TYPE_VIEW_CLICKED;
@@ -61,11 +63,8 @@
 import android.app.ActivityTaskManager;
 import android.app.Instrumentation;
 import android.app.UiAutomation;
-import android.app.UiAutomation.AccessibilityEventFilter;
 import android.content.pm.PackageManager;
-import android.content.res.Resources;
 import android.graphics.Rect;
-import android.os.Bundle;
 import android.platform.test.annotations.AppModeFull;
 import android.test.suitebuilder.annotation.MediumTest;
 import android.util.SparseArray;
@@ -83,6 +82,8 @@
 import androidx.test.rule.ActivityTestRule;
 import androidx.test.runner.AndroidJUnit4;
 
+import com.android.compatibility.common.util.TestUtils;
+
 import org.hamcrest.Description;
 import org.hamcrest.TypeSafeMatcher;
 import org.junit.AfterClass;
@@ -151,16 +152,6 @@
                 sInstrumentation, sUiAutomation, mActivityRule);
     }
 
-    private final AccessibilityEventFilter mDividerPresentFilter = (event) ->
-            (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED
-                    || event.getEventType() == TYPE_WINDOWS_CHANGED)
-                    && isDividerWindowPresent();
-
-    private final AccessibilityEventFilter mDividerAbsentFilter = (event) ->
-            (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED
-                    || event.getEventType() == TYPE_WINDOWS_CHANGED)
-                    && !isDividerWindowPresent();
-
     @MediumTest
     @Test
     public void testFindByText() throws Throwable {
@@ -574,29 +565,46 @@
 
     @MediumTest
     @Test
-    public void testWindowDockAndUndock_dividerWindowAppearsAndDisappears() throws Exception {
-        if (!ActivityTaskManager.supportsSplitScreenMultiWindow(sInstrumentation.getContext())) {
-            // Skipping test: no multi-window support
-            return;
-        }
+    public void testToggleSplitScreen() throws Exception {
+        assumeTrue(
+                "Skipping test: no multi-window support",
+                ActivityTaskManager.supportsSplitScreenMultiWindow(sInstrumentation.getContext()));
 
-        if (sInstrumentation.getContext().getPackageManager()
-                .hasSystemFeature(PackageManager.FEATURE_LEANBACK)) {
-            // Android TV doesn't support the divider window
-            return;
-        }
+        final int initialWindowingMode =
+                mActivity.getResources().getConfiguration().windowConfiguration.getWindowingMode();
 
-        setAccessInteractiveWindowsFlag();
-        assertFalse(isDividerWindowPresent());
-
-        Runnable toggleSplitScreenRunnable = () -> assertTrue(sUiAutomation.performGlobalAction(
+        assertTrue(
+                sUiAutomation.performGlobalAction(
                         AccessibilityService.GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN));
 
-        sUiAutomation.executeAndWaitForEvent(toggleSplitScreenRunnable, mDividerPresentFilter,
-                DEFAULT_TIMEOUT_MS);
+        TestUtils.waitUntil(
+                "waiting until activity becomes split screen windowing mode",
+                () -> {
+                    final int windowingMode =
+                            mActivity
+                                    .getResources()
+                                    .getConfiguration()
+                                    .windowConfiguration
+                                    .getWindowingMode();
+                    return windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY
+                            || windowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
+                });
 
-        sUiAutomation.executeAndWaitForEvent(toggleSplitScreenRunnable, mDividerAbsentFilter,
-                DEFAULT_TIMEOUT_MS);
+        assertTrue(
+                sUiAutomation.performGlobalAction(
+                        AccessibilityService.GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN));
+
+        TestUtils.waitUntil(
+                "waiting until activity goes back to default screen windowing mode",
+                () -> {
+                    final int windowingMode =
+                            mActivity
+                                    .getResources()
+                                    .getConfiguration()
+                                    .windowConfiguration
+                                    .getWindowingMode();
+                    return windowingMode == initialWindowingMode;
+                });
     }
 
     @Test
@@ -706,21 +714,6 @@
                 .get();
     }
 
-    private boolean isDividerWindowPresent() {
-        final List<AccessibilityWindowInfo> windows = sUiAutomation.getWindows();
-        final int windowCount = windows.size();
-        for (int i = 0; i < windowCount; i++) {
-            final AccessibilityWindowInfo window = windows.get(i);
-            final AccessibilityNodeInfo rootNode = window.getRoot();
-            if (window.getType() == AccessibilityWindowInfo.TYPE_SPLIT_SCREEN_DIVIDER &&
-                    rootNode != null &&
-                    rootNode.isVisibleToUser()) {
-                return true;
-            }
-        }
-        return false;
-    }
-
     private void assertSingleAccessibilityFocus() {
         List<AccessibilityWindowInfo> windows = sUiAutomation.getWindows();
         AccessibilityWindowInfo focused = null;
diff --git a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowReportingTest.java b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowReportingTest.java
index 2638c91..416d5ca 100644
--- a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowReportingTest.java
+++ b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowReportingTest.java
@@ -51,8 +51,8 @@
 import android.app.Activity;
 import android.app.Instrumentation;
 import android.app.UiAutomation;
+import android.graphics.Rect;
 import android.os.SystemClock;
-import android.util.DisplayMetrics;
 import android.view.Display;
 import android.view.Gravity;
 import android.view.InputDevice;
@@ -127,6 +127,11 @@
         mActivityTitle = getActivityTitle(sInstrumentation, mActivity);
     }
 
+    private static boolean perDisplayFocusEnabled() {
+        return sInstrumentation.getTargetContext().getResources()
+                .getBoolean(android.R.bool.config_perDisplayFocusEnabled);
+    }
+
     @Test
     public void testUpdatedWindowTitle_generatesEventAndIsReturnedByGetTitle() {
         final String updatedTitle = "Updated Title";
@@ -262,15 +267,23 @@
                             sUiAutomation,
                             AccessibilityEmbeddedDisplayTest.EmbeddedDisplayActivity.class,
                             virtualDisplayId);
+
+            final CharSequence activityTitle = getActivityTitle(sInstrumentation,
+                    activityOnVirtualDisplay);
+
             // Window manager changed the behavior of focused window at a virtual display. A window
             // at virtual display needs to be touched then it becomes to be focused one. Adding this
             // touch event on the activity window of the virtual display to pass this test case.
             sUiAutomation.executeAndWaitForEvent(
                     () -> {
-                        final DisplayMetrics displayMetrics =
-                                mActivity.getResources().getDisplayMetrics();
-                        final int xOnScreen = displayMetrics.widthPixels / 2;
-                        final int yOnScreen = displayMetrics.heightPixels / 2;
+                        final Rect areaOfActivityWindowOnVirtualDisplay = new Rect();
+                        findWindowByTitleAndDisplay(sUiAutomation, activityTitle, virtualDisplayId)
+                                .getBoundsInScreen(areaOfActivityWindowOnVirtualDisplay);
+
+                        final int xOnScreen =
+                            areaOfActivityWindowOnVirtualDisplay.centerX();
+                        final int yOnScreen =
+                            areaOfActivityWindowOnVirtualDisplay.centerY();
                         final long downEventTime = SystemClock.uptimeMillis();
                         final MotionEvent downEvent = MotionEvent.obtain(downEventTime,
                                 downEventTime, MotionEvent.ACTION_DOWN, xOnScreen, yOnScreen, 0);
@@ -289,16 +302,19 @@
                             WINDOWS_CHANGE_ACTIVE),
                     TIMEOUT_ASYNC_PROCESSING);
 
-            final CharSequence activityTitle = getActivityTitle(sInstrumentation,
-                    activityOnVirtualDisplay);
             // Make sure activityWindow on virtual display is focused.
             AccessibilityWindowInfo activityWindowOnVirtualDisplay =
                 findWindowByTitleAndDisplay(sUiAutomation, activityTitle, virtualDisplayId);
             // Windows may have changed - refresh.
             activityWindow = findWindowByTitle(sUiAutomation, mActivityTitle);
             try {
-                assertFalse(activityWindow.isActive());
-                assertFalse(activityWindow.isFocused());
+                if (!perDisplayFocusEnabled()) {
+                    assertFalse(activityWindow.isActive());
+                    assertFalse(activityWindow.isFocused());
+                } else {
+                    assertTrue(activityWindow.isActive());
+                    assertTrue(activityWindow.isFocused());
+                }
                 assertTrue(activityWindowOnVirtualDisplay.isActive());
                 assertTrue(activityWindowOnVirtualDisplay.isFocused());
             } finally {
diff --git a/tests/accessibilityservice/testsdk29/Android.bp b/tests/accessibilityservice/testsdk29/Android.bp
index 63a31ac..973bd71 100644
--- a/tests/accessibilityservice/testsdk29/Android.bp
+++ b/tests/accessibilityservice/testsdk29/Android.bp
@@ -28,7 +28,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/admin/Android.bp b/tests/admin/Android.bp
index 0a15eb2..a9bf3c3 100644
--- a/tests/admin/Android.bp
+++ b/tests/admin/Android.bp
@@ -22,14 +22,13 @@
         "testng",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     instrumentation_for: "CtsAdminApp",
diff --git a/tests/admin/app/Android.bp b/tests/admin/app/Android.bp
index c507559..23f2cef 100644
--- a/tests/admin/app/Android.bp
+++ b/tests/admin/app/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/tests/app/ActivityManagerApi29Test/Android.bp b/tests/app/ActivityManagerApi29Test/Android.bp
index 58c3233..b724d98 100644
--- a/tests/app/ActivityManagerApi29Test/Android.bp
+++ b/tests/app/ActivityManagerApi29Test/Android.bp
@@ -19,7 +19,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/tests/app/Android.bp b/tests/app/Android.bp
index bc5b110..15d8131 100644
--- a/tests/app/Android.bp
+++ b/tests/app/Android.bp
@@ -16,9 +16,9 @@
     name: "CtsAppTestCases",
     defaults: ["cts_defaults"],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     static_libs: [
         "compatibility-device-util-axt",
@@ -40,7 +40,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     instrumentation_for: "CtsAppTestStubs",
@@ -52,9 +51,9 @@
     name: "CtsDownloadManagerApi28",
     defaults: ["cts_defaults"],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     static_libs: [
         "compatibility-device-util-axt",
@@ -74,7 +73,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
@@ -87,9 +85,9 @@
     name: "CtsDownloadManagerInstaller",
     defaults: ["cts_defaults"],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     static_libs: [
         "compatibility-device-util-axt",
@@ -109,7 +107,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
@@ -122,9 +119,9 @@
     name: "CtsAppExitTestCases",
     defaults: ["cts_defaults"],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     static_libs: [
         "ub-uiautomator",
@@ -139,7 +136,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "AppExitTest/AndroidManifest.xml",
diff --git a/tests/app/AppExitTest/src/android/app/cts/ActivityManagerAppExitInfoTest.java b/tests/app/AppExitTest/src/android/app/cts/ActivityManagerAppExitInfoTest.java
index e7d7394..c3fcf4c 100644
--- a/tests/app/AppExitTest/src/android/app/cts/ActivityManagerAppExitInfoTest.java
+++ b/tests/app/AppExitTest/src/android/app/cts/ActivityManagerAppExitInfoTest.java
@@ -978,7 +978,7 @@
 
     private void prepareTestUser() throws Exception {
         // Create the test user
-        mOtherUserId = createUser("TestUser_" + SystemClock.uptimeMillis(), true);
+        mOtherUserId = createUser("TestUser_" + SystemClock.uptimeMillis(), false);
         mOtherUserHandle = UserHandle.of(mOtherUserId);
         // Start the other user
         assertTrue(startUser(mOtherUserId, true));
diff --git a/tests/app/BadProviderStubs/Android.bp b/tests/app/BadProviderStubs/Android.bp
index 6b52583..4bb23ed 100644
--- a/tests/app/BadProviderStubs/Android.bp
+++ b/tests/app/BadProviderStubs/Android.bp
@@ -22,7 +22,6 @@
     sdk_version: "current",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     optimize: {
diff --git a/tests/app/CantSaveState1/Android.bp b/tests/app/CantSaveState1/Android.bp
index a87272f..d33f966 100644
--- a/tests/app/CantSaveState1/Android.bp
+++ b/tests/app/CantSaveState1/Android.bp
@@ -19,7 +19,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/tests/app/CantSaveState2/Android.bp b/tests/app/CantSaveState2/Android.bp
index 2877a0d..b3a26b8 100644
--- a/tests/app/CantSaveState2/Android.bp
+++ b/tests/app/CantSaveState2/Android.bp
@@ -19,7 +19,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/tests/app/NotificationDelegator/Android.bp b/tests/app/NotificationDelegator/Android.bp
index 8f13154..7398d69 100644
--- a/tests/app/NotificationDelegator/Android.bp
+++ b/tests/app/NotificationDelegator/Android.bp
@@ -19,7 +19,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/tests/app/StorageDelegator/Android.bp b/tests/app/StorageDelegator/Android.bp
index 90ea7b6..588988c 100644
--- a/tests/app/StorageDelegator/Android.bp
+++ b/tests/app/StorageDelegator/Android.bp
@@ -25,7 +25,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/app/app/Android.bp b/tests/app/app/Android.bp
index 3838155..19e3fcc 100644
--- a/tests/app/app/Android.bp
+++ b/tests/app/app/Android.bp
@@ -16,11 +16,11 @@
     name: "CtsAppTestStubs",
     defaults: ["cts_support_defaults"],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "telephony-common",
         "voip-common",
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     static_libs: [
         "compatibility-device-util-axt",
@@ -28,6 +28,7 @@
         "ctstestserver",
         "mockito-target-minus-junit4",
         "androidx.legacy_legacy-support-v4",
+        "androidx.test.core",
     ],
     srcs: [
         "src/**/*.java",
@@ -36,7 +37,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     platform_apis: true,
@@ -46,11 +46,11 @@
     name: "CtsAppTestStubsApp1",
     defaults: ["cts_support_defaults"],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "telephony-common",
         "voip-common",
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     static_libs: [
         "compatibility-device-util-axt",
@@ -58,6 +58,7 @@
         "ctstestserver",
         "mockito-target-minus-junit4",
         "androidx.legacy_legacy-support-v4",
+        "androidx.test.core",
     ],
     srcs: [
         "src/**/*.java",
@@ -66,7 +67,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     platform_apis: true,
@@ -79,11 +79,11 @@
     name: "CtsAppTestStubsApp2",
     defaults: ["cts_support_defaults"],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "telephony-common",
         "voip-common",
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     static_libs: [
         "compatibility-device-util-axt",
@@ -91,6 +91,7 @@
         "ctstestserver",
         "mockito-target-minus-junit4",
         "androidx.legacy_legacy-support-v4",
+        "androidx.test.core",
     ],
     srcs: [
         "src/**/*.java",
@@ -99,7 +100,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     platform_apis: true,
@@ -112,11 +112,11 @@
     name: "CtsAppTestStubsApp3",
     defaults: ["cts_support_defaults"],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "telephony-common",
         "voip-common",
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     static_libs: [
         "compatibility-device-util-axt",
@@ -124,6 +124,7 @@
         "ctstestserver",
         "mockito-target-minus-junit4",
         "androidx.legacy_legacy-support-v4",
+        "androidx.test.core",
     ],
     srcs: [
         "src/**/*.java",
@@ -132,7 +133,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     platform_apis: true,
diff --git a/tests/app/app/src/android/app/stubs/DialogStubActivity.java b/tests/app/app/src/android/app/stubs/DialogStubActivity.java
index 1db5a84..1aeaa0e 100644
--- a/tests/app/app/src/android/app/stubs/DialogStubActivity.java
+++ b/tests/app/app/src/android/app/stubs/DialogStubActivity.java
@@ -37,7 +37,7 @@
 import android.widget.DatePicker;
 import android.widget.TimePicker;
 
-import androidx.test.rule.ActivityTestRule;
+import androidx.test.core.app.ActivityScenario;
 
 /*
  * Stub class for  Dialog, AlertDialog, DatePickerDialog, TimePickerDialog etc.
@@ -317,11 +317,12 @@
 
     private static final String TEST_DIALOG_NUMBER_EXTRA = "testDialogNumber";
 
-    public static <T extends Activity> T startDialogActivity(
-            ActivityTestRule<T> rule, int dialogNumber) {
+    public static ActivityScenario<DialogStubActivity> startDialogActivity(
+            Context context, int dialogNumber) {
         Intent intent = new Intent(Intent.ACTION_MAIN);
         intent.putExtra(TEST_DIALOG_NUMBER_EXTRA, dialogNumber);
-        return rule.launchActivity(intent);
+        intent.setClass(context, DialogStubActivity.class);
+        return ActivityScenario.launch(intent);
     }
 
     @Override
diff --git a/tests/app/app/src/android/app/stubs/OrientationTestUtils.java b/tests/app/app/src/android/app/stubs/OrientationTestUtils.java
index e9c9813..410c98d 100644
--- a/tests/app/app/src/android/app/stubs/OrientationTestUtils.java
+++ b/tests/app/app/src/android/app/stubs/OrientationTestUtils.java
@@ -16,14 +16,16 @@
 
 package android.app.stubs;
 
+import static org.junit.Assert.assertTrue;
+
 import android.app.Activity;
 import android.content.pm.ActivityInfo;
+import android.view.DisplayInfo;
+
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 
-import static org.junit.Assert.assertTrue;
-
 public class OrientationTestUtils {
     /**
      * Change the activity's orientation to something different and then switch back. This is used
@@ -49,19 +51,36 @@
     }
 
     /**
-     * Returns original orientation and toggled orientation.
-     * @param activity whose orienetaion will be returned
-     * @return The first element is original orientation adn the second element is toggled
+     * Returns display original orientation and toggled orientation.
+     * @param activity context to get the display info
+     * @return The first element is original orientation and the second element is toggled
      *     orientation.
      */
     private static int[] getOrientations(final Activity activity) {
-        final int originalOrientation = activity.getResources().getConfiguration().orientation;
+        // Check the display dimension to get the current device orientation.
+        final DisplayInfo displayInfo = new DisplayInfo();
+        activity.getDisplay().getDisplayInfo(displayInfo);
+        final int originalOrientation = displayInfo.logicalWidth > displayInfo.logicalHeight
+                ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
+                : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
         final int newOrientation = originalOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
-            ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
-            : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
+                ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
+                : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
         return new int[] { originalOrientation, newOrientation };
     }
 
+    /** Checks whether the display dimension is close to square. */
+    public static boolean isCloseToSquareDisplay(final Activity activity) {
+        final float closeToSquareMaxAspectRatio = activity.getResources().getFloat(
+                com.android.internal.R.dimen.config_closeToSquareDisplayMaxAspectRatio);
+        final DisplayInfo displayInfo = new DisplayInfo();
+        activity.getDisplay().getDisplayInfo(displayInfo);
+        final int w = displayInfo.logicalWidth;
+        final int h = displayInfo.logicalHeight;
+        final float aspectRatio = Math.max(w, h) / (float) Math.min(w, h);
+        return aspectRatio <= closeToSquareMaxAspectRatio;
+    }
+
     /**
      * Observer used in stub activities to wait for some event.
      */
diff --git a/tests/app/src/android/app/cts/AlarmManagerTest.java b/tests/app/src/android/app/cts/AlarmManagerTest.java
index 559bb8a..789d938 100644
--- a/tests/app/src/android/app/cts/AlarmManagerTest.java
+++ b/tests/app/src/android/app/cts/AlarmManagerTest.java
@@ -176,7 +176,7 @@
         mMockAlarmReceiver.setAlarmedFalse();
         mWakeupTime = -1000;
         mAm.set(AlarmManager.RTC, mWakeupTime, mSender);
-        new PollingCheck(TIME_DELAY) {
+        new PollingCheck(2 * TIME_DELAY) {
             @Override
             protected boolean check() {
                 return mMockAlarmReceiver.alarmed;
diff --git a/tests/app/src/android/app/cts/AlertDialogTest.java b/tests/app/src/android/app/cts/AlertDialogTest.java
index 618a2a9..4710ac2 100644
--- a/tests/app/src/android/app/cts/AlertDialogTest.java
+++ b/tests/app/src/android/app/cts/AlertDialogTest.java
@@ -29,15 +29,15 @@
 import android.view.KeyEvent;
 import android.widget.Button;
 
+import androidx.test.core.app.ActivityScenario;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
 import androidx.test.platform.app.InstrumentationRegistry;
-import androidx.test.rule.ActivityTestRule;
 
 import com.android.compatibility.common.util.PollingCheck;
 
+import org.junit.After;
 import org.junit.Before;
-import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -48,22 +48,31 @@
 @RunWith(AndroidJUnit4.class)
 public class AlertDialogTest {
     private Instrumentation mInstrumentation;
+    private ActivityScenario<DialogStubActivity> mScenario;
     private DialogStubActivity mActivity;
     private Button mPositiveButton;
     private Button mNegativeButton;
     private Button mNeutralButton;
 
-    @Rule
-    public ActivityTestRule<DialogStubActivity> mActivityRule =
-            new ActivityTestRule<>(DialogStubActivity.class, true, false);
-
     @Before
     public void setUp() throws Exception {
         mInstrumentation = InstrumentationRegistry.getInstrumentation();
     }
 
+    @After
+    public void tearDown() {
+        if (mScenario != null) {
+            mScenario.close();
+            mScenario = null;
+        }
+    }
+
     protected void startDialogActivity(int dialogNumber) {
-        mActivity = DialogStubActivity.startDialogActivity(mActivityRule, dialogNumber);
+        mScenario = DialogStubActivity.startDialogActivity(
+                mInstrumentation.getTargetContext(), dialogNumber);
+        mScenario.onActivity(activity -> {
+            mActivity = activity;
+        });
 
         PollingCheck.waitFor(mActivity.getDialog()::isShowing);
         PollingCheck.waitFor(mActivity.getDialog().getWindow().getDecorView()::hasWindowFocus);
@@ -162,7 +171,7 @@
     }
 
     private void performClick(final Button button) throws Throwable {
-        mActivityRule.runOnUiThread(() -> button.performClick());
+        mScenario.onActivity(activity -> button.performClick());
     }
 
     @Test
diff --git a/tests/app/src/android/app/cts/AppTaskTests.java b/tests/app/src/android/app/cts/AppTaskTests.java
index 22b0cf0..366ebbf 100644
--- a/tests/app/src/android/app/cts/AppTaskTests.java
+++ b/tests/app/src/android/app/cts/AppTaskTests.java
@@ -16,6 +16,7 @@
 
 package android.app.cts;
 
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.content.Context.ACTIVITY_SERVICE;
 import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
 import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
@@ -27,6 +28,7 @@
 
 import android.app.Activity;
 import android.app.ActivityManager;
+import android.app.ActivityOptions;
 import android.app.Instrumentation;
 import android.app.stubs.MockActivity;
 import android.app.stubs.MockListActivity;
@@ -134,7 +136,16 @@
     @Test
     public void testMoveToFront() throws Exception {
         final Activity a1 = mActivityRule.launchActivity(null);
-        final Activity a2 = mActivityRule.launchActivity(null);
+
+        // Launch fullscreen activity as an another task to hide the first activity
+        final Intent intent = new Intent();
+        intent.setComponent(new ComponentName(mTargetContext, MockActivity.class));
+        intent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_NEW_DOCUMENT
+                    | FLAG_ACTIVITY_MULTIPLE_TASK);
+        final ActivityOptions options = ActivityOptions.makeBasic();
+        options.setLaunchWindowingMode(WINDOWING_MODE_FULLSCREEN);
+        mInstrumentation.startActivitySync(intent, options.toBundle());
+
         final BooleanValue targetResumed = new BooleanValue();
         mLifecycleMonitor.addLifecycleCallback(new ActivityLifecycleCallback() {
             public void onActivityLifecycleChanged(Activity activity, Stage stage) {
diff --git a/tests/app/src/android/app/cts/DialogTest.java b/tests/app/src/android/app/cts/DialogTest.java
index d1b537e..7f6631a 100755
--- a/tests/app/src/android/app/cts/DialogTest.java
+++ b/tests/app/src/android/app/cts/DialogTest.java
@@ -21,12 +21,12 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeFalse;
 import static org.junit.Assert.fail;
 
 import android.app.Dialog;
 import android.app.Instrumentation;
 import android.app.stubs.DialogStubActivity;
-import android.app.stubs.OrientationTestUtils;
 import android.app.stubs.R;
 import android.app.stubs.TestDialog;
 import android.content.Context;
@@ -59,15 +59,15 @@
 
 
 import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ActivityScenario;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.platform.app.InstrumentationRegistry;
-import androidx.test.rule.ActivityTestRule;
 
 
 import com.android.compatibility.common.util.PollingCheck;
 
+import org.junit.After;
 import org.junit.Before;
-import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -89,12 +89,9 @@
 
     private Instrumentation mInstrumentation;
     private Context mContext;
+    private ActivityScenario<DialogStubActivity> mScenario;
     private DialogStubActivity mActivity;
 
-    @Rule
-    public ActivityTestRule<DialogStubActivity> mActivityRule =
-            new ActivityTestRule<>(DialogStubActivity.class, false, false);
-
     @Before
     public void setup() throws Throwable {
         mInstrumentation = InstrumentationRegistry.getInstrumentation();
@@ -102,8 +99,20 @@
         mInstrumentation.waitForIdleSync();
     }
 
+    @After
+    public void tearDown() {
+        if (mScenario != null) {
+            mScenario.close();
+            mScenario = null;
+        }
+    }
+
     private void startDialogActivity(int dialogNumber) {
-        mActivity = DialogStubActivity.startDialogActivity(mActivityRule, dialogNumber);
+        mScenario = DialogStubActivity.startDialogActivity(
+                mInstrumentation.getTargetContext(), dialogNumber);
+        mScenario.onActivity(activity -> {
+            mActivity = activity;
+        });
         PollingCheck.waitFor(mActivity.getDialog().getWindow().getDecorView()::hasWindowFocus);
     }
 
@@ -224,11 +233,9 @@
             // expected
         }
 
-        mActivityRule.runOnUiThread(new Runnable() {
-            public void run() {
-                Dialog dialog = new Dialog(mContext);
-                assertNull(dialog.getOwnerActivity());
-            }
+        mScenario.onActivity(activity -> {
+            Dialog dialog = new Dialog(mContext);
+            assertNull(dialog.getOwnerActivity());
         });
         mInstrumentation.waitForIdleSync();
     }
@@ -239,20 +246,16 @@
         final Dialog d = mActivity.getDialog();
         final View decor = d.getWindow().getDecorView();
 
-        mActivityRule.runOnUiThread(new Runnable() {
-            public void run() {
-                d.hide();
-            }
+        mScenario.onActivity(activity -> {
+            d.hide();
         });
         mInstrumentation.waitForIdleSync();
 
         assertEquals(View.GONE, decor.getVisibility());
         assertFalse(d.isShowing());
 
-        mActivityRule.runOnUiThread(new Runnable() {
-            public void run() {
+        mScenario.onActivity(activity -> {
                 d.show();
-            }
         });
         mInstrumentation.waitForIdleSync();
 
@@ -267,16 +270,9 @@
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
         final TestDialog d = (TestDialog) mActivity.getDialog();
 
-        //skip if the device doesn't support both of portrait and landscape orientation screens.
-        final PackageManager pm = mContext.getPackageManager();
-        if(!(pm.hasSystemFeature(PackageManager.FEATURE_SCREEN_LANDSCAPE)
-                && pm.hasSystemFeature(PackageManager.FEATURE_SCREEN_PORTRAIT))){
-            return;
-        }
-
         d.onSaveInstanceStateObserver.startObserving();
         TestDialog.onRestoreInstanceStateObserver.startObserving();
-        OrientationTestUtils.toggleOrientation(mActivity);
+        mScenario.recreate();
         d.onSaveInstanceStateObserver.await();
         TestDialog.onRestoreInstanceStateObserver.await();
     }
@@ -287,11 +283,9 @@
         final TestDialog d = (TestDialog) mActivity.getDialog();
         assertNull(d.getCurrentFocus());
 
-        mActivityRule.runOnUiThread(new Runnable() {
-            public void run() {
-                d.takeKeyEvents(true);
-                d.setContentView(R.layout.alert_dialog_text_entry);
-            }
+        mScenario.onActivity(activity -> {
+            d.takeKeyEvents(true);
+            d.setContentView(R.layout.alert_dialog_text_entry);
         });
         mInstrumentation.waitForIdleSync();
 
@@ -307,10 +301,8 @@
         assertNotNull(d);
 
         // set content view to a four elements layout
-        mActivityRule.runOnUiThread(new Runnable() {
-            public void run() {
-                d.setContentView(R.layout.alert_dialog_text_entry);
-            }
+        mScenario.onActivity(activity -> {
+            d.setContentView(R.layout.alert_dialog_text_entry);
         });
         mInstrumentation.waitForIdleSync();
 
@@ -323,10 +315,8 @@
         final LayoutInflater inflate1 = d.getLayoutInflater();
 
         // set content view to a two elements layout
-        mActivityRule.runOnUiThread(new Runnable() {
-            public void run() {
-                d.setContentView(inflate1.inflate(R.layout.alert_dialog_text_entry_2, null));
-            }
+        mScenario.onActivity(activity -> {
+            d.setContentView(inflate1.inflate(R.layout.alert_dialog_text_entry_2, null));
         });
         mInstrumentation.waitForIdleSync();
 
@@ -340,10 +330,8 @@
         final LayoutInflater inflate2 = mActivity.getLayoutInflater();
 
         // set content view to a four elements layout
-        mActivityRule.runOnUiThread(new Runnable() {
-            public void run() {
-                d.setContentView(inflate2.inflate(R.layout.alert_dialog_text_entry, null), lp);
-            }
+        mScenario.onActivity(activity -> {
+            d.setContentView(inflate2.inflate(R.layout.alert_dialog_text_entry, null), lp);
         });
         mInstrumentation.waitForIdleSync();
 
@@ -359,10 +347,8 @@
         lp2.width = ViewGroup.LayoutParams.WRAP_CONTENT;
 
         // add a check box view
-        mActivityRule.runOnUiThread(new Runnable() {
-            public void run() {
-                d.addContentView(inflate3.inflate(R.layout.checkbox_layout, null), lp2);
-            }
+        mScenario.onActivity(activity -> {
+            d.addContentView(inflate3.inflate(R.layout.checkbox_layout, null), lp2);
         });
         mInstrumentation.waitForIdleSync();
 
@@ -381,10 +367,8 @@
         assertNotNull(d);
 
         // set content view to a four elements layout
-        mActivityRule.runOnUiThread(new Runnable() {
-            public void run() {
-                d.setContentView(R.layout.alert_dialog_text_entry);
-            }
+        mScenario.onActivity(activity -> {
+            d.setContentView(R.layout.alert_dialog_text_entry);
         });
         mInstrumentation.waitForIdleSync();
 
@@ -473,6 +457,9 @@
 
     @Test
     public void testTouchEvent() {
+        // Watch activities cover the entire screen, so there is no way to touch outside.
+        assumeFalse(mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH));
+
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
         final TestDialog d = (TestDialog) mActivity.getDialog();
 
@@ -503,11 +490,6 @@
         assertTrue(d.isShowing());
         touchMotionEvent.recycle();
 
-        if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH)) {
-            // Watch activities cover the entire screen, so there is no way to touch outside.
-            return;
-        }
-
         // Send a touch event outside the dialog window. Expect the dialog to be dismissed
         // because closeOnTouchOutside is true.
         d.setCanceledOnTouchOutside(true);
@@ -564,10 +546,8 @@
 
         final WindowManager.LayoutParams lp = d.getWindow().getAttributes();
         lp.setTitle("test OnWindowAttributesChanged");
-        mActivityRule.runOnUiThread(new Runnable() {
-            public void run() {
-                d.getWindow().setAttributes(lp);
-            }
+        mScenario.onActivity(activity -> {
+            d.getWindow().setAttributes(lp);
         });
         mInstrumentation.waitForIdleSync();
 
@@ -583,10 +563,8 @@
 
         assertFalse(d.isOnContentChangedCalled);
 
-        mActivityRule.runOnUiThread(new Runnable() {
-            public void run() {
-                d.setContentView(R.layout.alert_dialog_text_entry);
-            }
+        mScenario.onActivity(activity -> {
+            d.setContentView(R.layout.alert_dialog_text_entry);
         });
         mInstrumentation.waitForIdleSync();
 
@@ -601,10 +579,8 @@
         d.isOnWindowFocusChangedCalled = false;
 
         // show a new dialog, the new dialog get focus
-        mActivityRule.runOnUiThread(new Runnable() {
-            public void run() {
-                mActivity.showDialog(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
-            }
+        mScenario.onActivity(activity -> {
+            mActivity.showDialog(DialogStubActivity.TEST_DIALOG_WITHOUT_THEME);
         });
 
         PollingCheck.waitFor(() -> d.isOnWindowFocusChangedCalled);
@@ -668,14 +644,12 @@
         parent.addView(v);
         assertFalse(v.isShowContextMenuCalled);
         // Register for context menu and open it
-        mActivityRule.runOnUiThread(new Runnable() {
-            public void run() {
-                d.addContentView(parent, new LinearLayout.LayoutParams(
-                        ViewGroup.LayoutParams.MATCH_PARENT,
-                        ViewGroup.LayoutParams.WRAP_CONTENT));
-                d.registerForContextMenu(v);
-                d.openContextMenu(v);
-            }
+        mScenario.onActivity(activity -> {
+            d.addContentView(parent, new LinearLayout.LayoutParams(
+                    ViewGroup.LayoutParams.MATCH_PARENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT));
+            d.registerForContextMenu(v);
+            d.openContextMenu(v);
         });
         PollingCheck.waitFor(d::contextMenuHasWindowFocus);
         PollingCheck.waitFor(() -> v.isShowContextMenuCalled);
@@ -692,27 +666,21 @@
         v.isShowContextMenuCalled = false;
         d.isOnCreateContextMenuCalled = false;
         // Unregister for context menu, and try to open it
-        mActivityRule.runOnUiThread(new Runnable() {
-            public void run() {
-                d.unregisterForContextMenu(v);
-            }
+        mScenario.onActivity(activity -> {
+            d.unregisterForContextMenu(v);
         });
 
-        mActivityRule.runOnUiThread(new Runnable() {
-            public void run() {
-                d.openContextMenu(v);
-            }
+        mScenario.onActivity(activity -> {
+            d.openContextMenu(v);
         });
 
         assertTrue(v.isShowContextMenuCalled);
         assertFalse(d.isOnCreateContextMenuCalled);
 
         // Register for context menu and open it again
-        mActivityRule.runOnUiThread(new Runnable() {
-            public void run() {
-                d.registerForContextMenu(v);
-                d.openContextMenu(v);
-            }
+        mScenario.onActivity(activity -> {
+            d.registerForContextMenu(v);
+            d.openContextMenu(v);
         });
         PollingCheck.waitFor(d::contextMenuHasWindowFocus);
 
@@ -754,10 +722,8 @@
     }
 
     private void takeKeyEvents(final Dialog d, final boolean get) throws Throwable {
-        mActivityRule.runOnUiThread(new Runnable() {
-            public void run() {
-                d.takeKeyEvents(get);
-            }
+        mScenario.onActivity(activity -> {
+            d.takeKeyEvents(get);
         });
     }
 
@@ -771,11 +737,9 @@
     @Test
     public void testSetFeatureDrawableResource() throws Throwable {
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
-        mActivityRule.runOnUiThread(new Runnable() {
-            public void run() {
-                mActivity.getDialog().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON,
-                        R.drawable.robot);
-            }
+        mScenario.onActivity(activity -> {
+            mActivity.getDialog().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON,
+                    R.drawable.robot);
         });
         mInstrumentation.waitForIdleSync();
     }
@@ -783,11 +747,9 @@
     @Test
     public void testSetFeatureDrawableUri() throws Throwable {
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
-        mActivityRule.runOnUiThread(new Runnable() {
-            public void run() {
-                mActivity.getDialog().setFeatureDrawableUri(Window.FEATURE_LEFT_ICON,
-                        Uri.parse("http://www.google.com"));
-            }
+        mScenario.onActivity(activity -> {
+            mActivity.getDialog().setFeatureDrawableUri(Window.FEATURE_LEFT_ICON,
+                    Uri.parse("http://www.google.com"));
         });
         mInstrumentation.waitForIdleSync();
     }
@@ -795,11 +757,9 @@
     @Test
     public void testSetFeatureDrawable() throws Throwable {
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
-        mActivityRule.runOnUiThread(new Runnable() {
-            public void run() {
-                mActivity.getDialog().setFeatureDrawable(Window.FEATURE_LEFT_ICON, 
-                        new MockDrawable());
-            }
+        mScenario.onActivity(activity -> {
+            mActivity.getDialog().setFeatureDrawable(Window.FEATURE_LEFT_ICON,
+                    new MockDrawable());
         });
         mInstrumentation.waitForIdleSync();
     }
@@ -807,10 +767,8 @@
     @Test
     public void testSetFeatureDrawableAlpha() throws Throwable {
         startDialogActivity(DialogStubActivity.TEST_ONSTART_AND_ONSTOP);
-        mActivityRule.runOnUiThread(new Runnable() {
-            public void run() {
-                mActivity.getDialog().setFeatureDrawableAlpha(Window.FEATURE_LEFT_ICON, 0);
-            }
+        mScenario.onActivity(activity -> {
+            mActivity.getDialog().setFeatureDrawableAlpha(Window.FEATURE_LEFT_ICON, 0);
         });
         mInstrumentation.waitForIdleSync();
     }
@@ -987,19 +945,15 @@
     }
 
     private void dialogDismiss(final Dialog d) throws Throwable {
-        mActivityRule.runOnUiThread(new Runnable() {
-            public void run() {
-                d.dismiss();
-            }
+        mScenario.onActivity(activity -> {
+            d.dismiss();
         });
         mInstrumentation.waitForIdleSync();
     }
 
     private void dialogCancel(final Dialog d) throws Throwable {
-        mActivityRule.runOnUiThread(new Runnable() {
-            public void run() {
-                d.cancel();
-            }
+        mScenario.onActivity(activity -> {
+            d.cancel();
         });
         mInstrumentation.waitForIdleSync();
     }
diff --git a/tests/app/src/android/app/cts/DisplayTest.java b/tests/app/src/android/app/cts/DisplayTest.java
index 4bb6c40..329c55d 100644
--- a/tests/app/src/android/app/cts/DisplayTest.java
+++ b/tests/app/src/android/app/cts/DisplayTest.java
@@ -16,13 +16,14 @@
 
 package android.app.cts;
 
+import static com.android.compatibility.common.util.PackageUtil.supportsRotation;
+
 import android.app.Instrumentation;
 import android.app.stubs.DisplayTestActivity;
 import android.app.stubs.OrientationTestUtils;
 import android.graphics.Point;
 import android.test.ActivityInstrumentationTestCase2;
 import android.view.Display;
-import static com.android.compatibility.common.util.PackageUtil.supportsRotation;
 
 /**
  * Tests to verify functionality of {@link Display}.
@@ -65,11 +66,11 @@
         mActivity.configurationChangeObserver.startObserving();
         OrientationTestUtils.switchOrientation(mActivity);
 
-        final boolean squareDisplay = (origSize.x == origSize.y);
-      
+        final boolean closeToSquareDisplay = OrientationTestUtils.isCloseToSquareDisplay(mActivity);
+
         // Don't wait for the configuration to change if the
         // the display is square. In many cases it won't.
-        if (!squareDisplay) {
+        if (!closeToSquareDisplay) {
             mActivity.configurationChangeObserver.await();
         }
 
@@ -82,7 +83,7 @@
         updatedDisplay.getSize(updatedSize);
 
         // For square screens the following assertions do not make sense and will always fail.
-        if (!squareDisplay) {
+        if (!closeToSquareDisplay) {
             // Ensure that the width and height of the original instance no longer are the same. Note
             // that this will be false if the device width and height are identical.
             // Note there are cases where width and height may not all be updated, such as on docked
diff --git a/tests/app/src/android/app/cts/InstrumentationTest.java b/tests/app/src/android/app/cts/InstrumentationTest.java
index d80d5fe..0d7b395 100644
--- a/tests/app/src/android/app/cts/InstrumentationTest.java
+++ b/tests/app/src/android/app/cts/InstrumentationTest.java
@@ -30,7 +30,7 @@
 import android.content.IntentFilter;
 import android.content.pm.ActivityInfo;
 import android.content.res.Configuration;
-import android.graphics.Point;
+import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Bundle;
@@ -348,10 +348,9 @@
         // We assume that the Activity is empty so there won't be anything in the middle
         // to handle the touch.  Consequently the Activity should receive onTouchEvent
         // because nothing else handled it.
-        Point size = new Point();
-        mActivity.getWindowManager().getDefaultDisplay().getSize(size);
-        final int x = size.x / 2;
-        final int y = size.y / 2;
+        final Rect bounds = mActivity.getWindowManager().getCurrentWindowMetrics().getBounds();
+        final int x = bounds.centerX();
+        final int y = bounds.centerY();
         long now = SystemClock.uptimeMillis();
         MotionEvent orig = MotionEvent.obtain(now, now, MotionEvent.ACTION_DOWN,
                 x, y, 0);
diff --git a/tests/app/src/android/app/cts/NotificationManagerTest.java b/tests/app/src/android/app/cts/NotificationManagerTest.java
index 22c604b..4979e66 100644
--- a/tests/app/src/android/app/cts/NotificationManagerTest.java
+++ b/tests/app/src/android/app/cts/NotificationManagerTest.java
@@ -190,6 +190,9 @@
         mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
         mRuleIds = new ArrayList<>();
 
+        // ensure listener access isn't allowed before test runs (other tests could put
+        // TestListener in an unexpected state)
+        toggleListenerAccess(false);
         toggleNotificationPolicyAccess(mContext.getPackageName(),
                 InstrumentationRegistry.getInstrumentation(), true);
         mNotificationManager.setInterruptionFilter(INTERRUPTION_FILTER_ALL);
@@ -300,6 +303,19 @@
         }
     }
 
+    private void deleteSingleContact(Uri uri) {
+        final ArrayList<ContentProviderOperation> operationList =
+                new ArrayList<ContentProviderOperation>();
+        operationList.add(ContentProviderOperation.newDelete(uri).build());
+        try {
+            mContext.getContentResolver().applyBatch(ContactsContract.AUTHORITY, operationList);
+        } catch (RemoteException e) {
+            Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
+        } catch (OperationApplicationException e) {
+            Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
+        }
+    }
+
     private Uri lookupContact(String phone) {
         Cursor c = null;
         try {
@@ -611,8 +627,8 @@
 
         NotificationManager nm = mContext.getSystemService(NotificationManager.class);
         assertEquals("Notification Policy Access Grant is "
-                        + nm.isNotificationPolicyAccessGranted() + " not " + on, on,
-                nm.isNotificationPolicyAccessGranted());
+                + nm.isNotificationPolicyAccessGranted() + " not " + on + " for "
+                + packageName,  on, nm.isNotificationPolicyAccessGranted());
     }
 
     private void suspendPackage(String packageName,
@@ -2068,7 +2084,8 @@
 
             // ensure volume is not muted/0 to start test
             mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 1, 0);
-            mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, 1, 0);
+            // exception for presidential alert
+            //mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, 1, 0);
             mAudioManager.setStreamVolume(AudioManager.STREAM_SYSTEM, 1, 0);
             mAudioManager.setStreamVolume(AudioManager.STREAM_RING, 1, 0);
 
@@ -2088,12 +2105,14 @@
                     mAudioManager.isStreamMute(AudioManager.STREAM_MUSIC));
             assertTrue("System stream should be muted",
                     mAudioManager.isStreamMute(AudioManager.STREAM_SYSTEM));
-            assertTrue("Alarm stream should be muted",
-                    mAudioManager.isStreamMute(AudioManager.STREAM_ALARM));
+            // exception for presidential alert
+            //assertTrue("Alarm stream should be muted",
+            //        mAudioManager.isStreamMute(AudioManager.STREAM_ALARM));
 
             // Test requires that the phone's default state has no channels that can bypass dnd
-            assertTrue("Ringer stream should be muted",
-                    mAudioManager.isStreamMute(AudioManager.STREAM_RING));
+            // which we can't currently guarantee (b/169267379)
+            // assertTrue("Ringer stream should be muted",
+            //        mAudioManager.isStreamMute(AudioManager.STREAM_RING));
         } finally {
             mNotificationManager.setInterruptionFilter(originalFilter);
             mNotificationManager.setNotificationPolicy(origPolicy);
@@ -2133,8 +2152,9 @@
                     mAudioManager.isStreamMute(AudioManager.STREAM_ALARM));
 
             // Test requires that the phone's default state has no channels that can bypass dnd
-            assertTrue("Ringer stream should be muted",
-                    mAudioManager.isStreamMute(AudioManager.STREAM_RING));
+            // which we can't currently guarantee (b/169267379)
+            // assertTrue("Ringer stream should be muted",
+            //  mAudioManager.isStreamMute(AudioManager.STREAM_RING));
         } finally {
             mNotificationManager.setInterruptionFilter(originalFilter);
             mNotificationManager.setNotificationPolicy(origPolicy);
@@ -2419,7 +2439,7 @@
 
         // wait for the activity to launch and finish
         mContext.startActivity(activityIntent);
-        Thread.sleep(1000);
+        Thread.sleep(mActivityManager.isLowRamDevice() ? 1500 : 1000);
 
         // send notification
         Notification n = new Notification.Builder(mContext, "channel")
@@ -2641,6 +2661,7 @@
         toggleNotificationPolicyAccess(mContext.getPackageName(),
                 InstrumentationRegistry.getInstrumentation(), true);
         Policy origPolicy = mNotificationManager.getNotificationPolicy();
+        Uri aliceUri = null;
         try {
             NotificationManager.Policy currPolicy = mNotificationManager.getNotificationPolicy();
             NotificationManager.Policy newPolicy = new NotificationManager.Policy(
@@ -2660,13 +2681,17 @@
 
             final Bundle peopleExtras = new Bundle();
             ArrayList<Person> personList = new ArrayList<>();
-            personList.add(
-                    new Person.Builder().setUri(lookupContact(ALICE_PHONE).toString()).build());
+            aliceUri = lookupContact(ALICE_PHONE);
+            personList.add(new Person.Builder().setUri(aliceUri.toString()).build());
             peopleExtras.putParcelableArrayList(Notification.EXTRA_PEOPLE_LIST, personList);
             SystemUtil.runWithShellPermissionIdentity(() ->
                     assertTrue(mNotificationManager.matchesCallFilter(peopleExtras)));
         } finally {
             mNotificationManager.setNotificationPolicy(origPolicy);
+            if (aliceUri != null) {
+                // delete the contact
+                deleteSingleContact(aliceUri);
+            }
         }
 
     }
diff --git a/tests/app/src/android/app/cts/StatusBarManagerTest.java b/tests/app/src/android/app/cts/StatusBarManagerTest.java
index 241ee12..fc2f16e 100644
--- a/tests/app/src/android/app/cts/StatusBarManagerTest.java
+++ b/tests/app/src/android/app/cts/StatusBarManagerTest.java
@@ -20,11 +20,13 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeFalse;
 
 import android.Manifest;
 import android.app.StatusBarManager;
 import android.app.StatusBarManager.DisableInfo;
 import android.content.Context;
+import android.content.pm.PackageManager;
 
 import org.junit.After;
 import org.junit.Before;
@@ -42,6 +44,10 @@
     private StatusBarManager mStatusBarManager;
     private Context mContext;
 
+    private boolean isWatch() {
+        return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH);
+    }
+
     /**
      * Setup
      * @throws Exception
@@ -49,6 +55,7 @@
     @Before
     public void setUp() throws Exception {
         mContext = InstrumentationRegistry.getContext();
+        assumeFalse("Status bar service not supported", isWatch());
         mStatusBarManager = (StatusBarManager) mContext.getSystemService(
                 Context.STATUS_BAR_SERVICE);
         getInstrumentation().getUiAutomation()
@@ -57,7 +64,10 @@
 
     @After
     public void tearDown() {
-        mStatusBarManager.setDisabledForSetup(false);
+
+        if (mStatusBarManager != null) {
+            mStatusBarManager.setDisabledForSetup(false);
+        }
         getInstrumentation().getUiAutomation().dropShellPermissionIdentity();
     }
 
diff --git a/tests/app/src/android/app/cts/WallpaperManagerTest.java b/tests/app/src/android/app/cts/WallpaperManagerTest.java
index b80b2dc..a8a73ca 100644
--- a/tests/app/src/android/app/cts/WallpaperManagerTest.java
+++ b/tests/app/src/android/app/cts/WallpaperManagerTest.java
@@ -305,7 +305,7 @@
 
             // Check that the secondary color is almost blue
             Color secondary = colors.getSecondaryColor();
-            final float delta = 0.1f;
+            final float delta = 0.15f;
             Assert.assertEquals("red", 0f, secondary.red(), delta);
             Assert.assertEquals("green", 0f, secondary.green(), delta);
             Assert.assertEquals("blue", 1f, secondary.blue(), delta);
diff --git a/tests/apppredictionservice/Android.bp b/tests/apppredictionservice/Android.bp
index 64696ac..b09de20 100644
--- a/tests/apppredictionservice/Android.bp
+++ b/tests/apppredictionservice/Android.bp
@@ -25,7 +25,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/aslr/Android.bp b/tests/aslr/Android.bp
index 63190f1..ca0049d 100644
--- a/tests/aslr/Android.bp
+++ b/tests/aslr/Android.bp
@@ -37,7 +37,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/autofillservice/Android.bp b/tests/autofillservice/Android.bp
index b7bda52..d04f23b 100644
--- a/tests/autofillservice/Android.bp
+++ b/tests/autofillservice/Android.bp
@@ -33,7 +33,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/autofillservice/src/android/autofillservice/cts/CustomDescriptionUnitTest.java b/tests/autofillservice/src/android/autofillservice/cts/CustomDescriptionUnitTest.java
index 8432d16..dd3c5b9 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/CustomDescriptionUnitTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/CustomDescriptionUnitTest.java
@@ -104,7 +104,7 @@
         final SparseArray<InternalOnClickAction> actions = customDescription.getActions();
         assertThat(actions.size()).isEqualTo(1);
         assertThat(actions.keyAt(0)).isEqualTo(42);
-        assertThat(actions.valueAt(0)).isSameAs(mValidAction);
+        assertThat(actions.valueAt(0)).isSameInstanceAs(mValidAction);
     }
 
     @Test
diff --git a/tests/autofillservice/src/android/autofillservice/cts/CustomDescriptionWithLinkTestCase.java b/tests/autofillservice/src/android/autofillservice/cts/CustomDescriptionWithLinkTestCase.java
index 5806234..c0a4629 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/CustomDescriptionWithLinkTestCase.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/CustomDescriptionWithLinkTestCase.java
@@ -226,7 +226,13 @@
     @Test
     public final void testTapLink_launchTrampolineActivityThenTapBackAndStartNewSession()
             throws Exception {
+        // Reset AutofillOptions to avoid cts package was added to augmented autofill allowlist.
+        Helper.resetApplicationAutofillOptions(sContext);
+
         tapLinkLaunchTrampolineActivityThenTapBackAndStartNewSessionTest();
+
+        // Clear AutofillOptions.
+        Helper.clearApplicationAutofillOptions(sContext);
     }
 
     protected abstract void tapLinkLaunchTrampolineActivityThenTapBackAndStartNewSessionTest()
diff --git a/tests/autofillservice/src/android/autofillservice/cts/DisableAutofillTest.java b/tests/autofillservice/src/android/autofillservice/cts/DisableAutofillTest.java
index f86c752..af2837b 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/DisableAutofillTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/DisableAutofillTest.java
@@ -27,6 +27,8 @@
 
 import com.android.compatibility.common.util.RetryableException;
 
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
@@ -170,6 +172,18 @@
         return SystemClock.elapsedRealtime() - before;
     }
 
+    @After
+    public void clearAutofillOptions() throws Exception {
+        // Clear AutofillOptions.
+        Helper.clearApplicationAutofillOptions(sContext);
+    }
+
+    @Before
+    public void resetAutofillOptions() throws Exception {
+        // Reset AutofillOptions to avoid cts package was added to augmented autofill allowlist.
+        Helper.resetApplicationAutofillOptions(sContext);
+    }
+
     @Test
     public void testDisableApp() throws Exception {
         // Set service.
diff --git a/tests/autofillservice/src/android/autofillservice/cts/FatActivity.java b/tests/autofillservice/src/android/autofillservice/cts/FatActivity.java
index 8a53f4a..8a47447 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/FatActivity.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/FatActivity.java
@@ -123,7 +123,7 @@
         mViewWithAutofillHints = (MyView) findViewByAutofillHint(this, "importantAmI");
         assertThat(mViewWithAutofillHints).isNotNull();
 
-        // Sanity check for importantForAutofill modes
+        // Validation check for importantForAutofill modes
         assertThat(mRoot.getImportantForAutofill()).isEqualTo(IMPORTANT_FOR_AUTOFILL_AUTO);
         assertThat(mInput.getImportantForAutofill()).isEqualTo(IMPORTANT_FOR_AUTOFILL_YES);
         assertThat(mCaptcha.getImportantForAutofill()).isEqualTo(IMPORTANT_FOR_AUTOFILL_NO);
diff --git a/tests/autofillservice/src/android/autofillservice/cts/Helper.java b/tests/autofillservice/src/android/autofillservice/cts/Helper.java
index d71006e..102ef03 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/Helper.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/Helper.java
@@ -37,6 +37,7 @@
 import android.app.assist.AssistStructure;
 import android.app.assist.AssistStructure.ViewNode;
 import android.app.assist.AssistStructure.WindowNode;
+import android.content.AutofillOptions;
 import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -1573,6 +1574,22 @@
         Settings.Secure.putInt(cr, SELECTED_INPUT_METHOD_SUBTYPE, subtype);
     }
 
+    /**
+     * Reset AutofillOptions to avoid cts package was added to augmented autofill allowlist.
+     */
+    public static void resetApplicationAutofillOptions(@NonNull Context context) {
+        AutofillOptions options = AutofillOptions.forWhitelistingItself();
+        options.augmentedAutofillEnabled = false;
+        context.getApplicationContext().setAutofillOptions(options);
+    }
+
+    /**
+     * Clear AutofillOptions.
+     */
+    public static void clearApplicationAutofillOptions(@NonNull Context context) {
+        context.getApplicationContext().setAutofillOptions(null);
+    }
+
     private Helper() {
         throw new UnsupportedOperationException("contain static methods only");
     }
diff --git a/tests/autofillservice/src/android/autofillservice/cts/InstrumentedAutoFillService.java b/tests/autofillservice/src/android/autofillservice/cts/InstrumentedAutoFillService.java
index 43c7355..9e246df 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/InstrumentedAutoFillService.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/InstrumentedAutoFillService.java
@@ -124,7 +124,7 @@
      */
     public static List<Event> getFillEvents(int expectedSize) throws Exception {
         final List<Event> events = getFillEventHistory(expectedSize).getEvents();
-        // Sanity check
+        // Validation check
         if (expectedSize > 0 && events == null || events.size() != expectedSize) {
             throw new IllegalStateException("INTERNAL ERROR: events should have " + expectedSize
                     + ", but it is: " + events);
diff --git a/tests/autofillservice/src/android/autofillservice/cts/LoginActivityTest.java b/tests/autofillservice/src/android/autofillservice/cts/LoginActivityTest.java
index d95c83a..141fb2f 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/LoginActivityTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/LoginActivityTest.java
@@ -250,7 +250,7 @@
                 .build());
         mActivity.syncRunOnUiThread(() -> child.requestFocus());
 
-        // Sanity check.
+        // Validation check.
         mUiBot.assertNoDatasetsEver();
 
         // Wait for onFill() before proceeding, otherwise the fields might be changed before
@@ -346,8 +346,7 @@
                 .setPresentation(createPresentation("THE DUDE"))
                 .build());
 
-        mActivity.forceAutofillOnUsername();
-        mUiBot.waitForIdleSync();
+        mUiBot.waitForWindowChange(() -> mActivity.forceAutofillOnUsername());
 
         final FillRequest secondRequest = sReplier.getNextFillRequest();
         assertHasFlags(secondRequest.flags, FLAG_MANUAL_REQUEST);
@@ -422,7 +421,7 @@
         // Check the results.
         mActivity.assertAutoFilled();
 
-        // Sanity checks.
+        // Validation checks.
 
         // Make sure input was sanitized.
         final FillRequest request = sReplier.getNextFillRequest();
@@ -558,7 +557,7 @@
                 passwordPickerBoundaries2, passwordPickerBoundaries1).that(
                 passwordPickerBoundaries2).isEqualTo(passwordPickerBoundaries1);
 
-        // Final sanity check
+        // Final validation check
         callback.assertNumberUnhandledEvents(0);
     }
 
@@ -1408,7 +1407,7 @@
             mActivity.onUsername(View::requestFocus);
         }
 
-        // Sanity check.
+        // Validation check.
         mUiBot.assertNoDatasetsEver();
 
         // Wait for onFill() before proceeding, otherwise the fields might be changed before
@@ -1469,7 +1468,7 @@
         // Trigger auto-fill.
         mActivity.onUsername(View::requestFocus);
 
-        // Sanity check.
+        // Validation check.
         mUiBot.assertNoDatasetsEver();
 
         // Wait for onFill() before proceeding, otherwise the fields might be changed before
@@ -1547,7 +1546,7 @@
         }
         mUiBot.waitForIdle();
 
-        // Sanity check.
+        // Validation check.
         mUiBot.assertNoDatasetsEver();
 
         // Wait for onFill() before proceeding, otherwise the fields might be changed before
@@ -1643,7 +1642,7 @@
         // Trigger auto-fill.
         mActivity.onUsername(View::requestFocus);
 
-        // Sanity check.
+        // Validation check.
         mUiBot.assertNoDatasetsEver();
 
         // Wait for onFill() before proceeding, otherwise the fields might be changed before
@@ -1708,7 +1707,7 @@
         // Trigger auto-fill.
         mActivity.onUsername(View::requestFocus);
 
-        // Sanity check.
+        // Validation check.
         mUiBot.assertNoDatasetsEver();
 
         // Wait for onFill() before proceeding, otherwise the fields might be changed before
@@ -1839,7 +1838,7 @@
         // Trigger auto-fill.
         mActivity.onUsername(View::requestFocus);
 
-        // Sanity check.
+        // Validation check.
         mUiBot.assertNoDatasetsEver();
 
         // Wait for onFill() before proceeding, otherwise the fields might be changed before
@@ -1876,7 +1875,7 @@
         // Trigger auto-fill.
         mActivity.onUsername(View::requestFocus);
 
-        // Sanity check.
+        // Validation check.
         mUiBot.assertNoDatasetsEver();
 
         // Wait for onFill() before proceeding, otherwise the fields might be changed before
@@ -2379,7 +2378,7 @@
 
                 sReplier.getNextFillRequest();
 
-                // Sanity check.
+                // Validation check.
                 mUiBot.assertNoDatasetsEver();
 
                 // Set credentials...
@@ -2529,7 +2528,7 @@
     public void testSetupComplete() throws Exception {
         enableService();
 
-        // Sanity check.
+        // Validation check.
         final AutofillManager afm = mActivity.getAutofillManager();
         Helper.assertAutofillEnabled(afm, true);
 
diff --git a/tests/autofillservice/src/android/autofillservice/cts/MultiWindowLoginActivityTest.java b/tests/autofillservice/src/android/autofillservice/cts/MultiWindowLoginActivityTest.java
index e7f26e2..408ee46 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/MultiWindowLoginActivityTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/MultiWindowLoginActivityTest.java
@@ -90,10 +90,9 @@
     /**
      * Put activity in TOP, will be followed by amStartActivity()
      */
-    protected void splitWindow(Activity activity) throws Exception {
+    protected void splitWindow(Activity activity) {
         mAtm.setTaskWindowingModeSplitScreenPrimary(activity.getTaskId(),
                 SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT, true, false, null, true);
-        mUiBot.waitForWindowSplit();
     }
 
     protected void amStartActivity(Class<? extends Activity> activity2) {
diff --git a/tests/autofillservice/src/android/autofillservice/cts/MyAutofillCallback.java b/tests/autofillservice/src/android/autofillservice/cts/MyAutofillCallback.java
index 7a09dbf..c38538b 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/MyAutofillCallback.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/MyAutofillCallback.java
@@ -112,7 +112,7 @@
         assertWithMessage("Invalid type on event %s", event).that(event.event)
                 .isEqualTo(EVENT_INPUT_SHOWN);
         assertWithMessage("Invalid view on event %s", event).that(event.view)
-            .isSameAs(expectedView);
+            .isSameInstanceAs(expectedView);
         return event;
     }
 
@@ -144,7 +144,7 @@
         assertWithMessage("Invalid type on event %s", event).that(event.event)
                 .isEqualTo(EVENT_INPUT_HIDDEN);
         assertWithMessage("Invalid view on event %s", event).that(event.view)
-                .isSameAs(expectedView);
+                .isSameInstanceAs(expectedView);
         return event;
     }
 
@@ -166,7 +166,7 @@
         assertWithMessage("Invalid type on event %s", event).that(event.event)
                 .isEqualTo(EVENT_INPUT_UNAVAILABLE);
         assertWithMessage("Invalid view on event %s", event).that(event.view)
-                .isSameAs(expectedView);
+                .isSameInstanceAs(expectedView);
         return event;
     }
 
diff --git a/tests/autofillservice/src/android/autofillservice/cts/OptionalSaveActivityTest.java b/tests/autofillservice/src/android/autofillservice/cts/OptionalSaveActivityTest.java
index c9cec8b..fb4f49d 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/OptionalSaveActivityTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/OptionalSaveActivityTest.java
@@ -117,7 +117,7 @@
         // Trigger auto-fill.
         mActivity.syncRunOnUiThread(() -> mActivity.mAddress1.requestFocus());
 
-        // Sanity check.
+        // Validation check.
         mUiBot.assertNoDatasetsEver();
 
         // Wait for onFill() before proceeding, otherwise the fields might be changed before
@@ -174,7 +174,7 @@
         // Trigger auto-fill.
         mActivity.syncRunOnUiThread(() -> mActivity.mAddress1.requestFocus());
 
-        // Sanity check.
+        // Validation check.
         mUiBot.assertNoDatasetsEver();
 
         // Wait for onFill() before proceeding, otherwise the fields might be changed before
diff --git a/tests/autofillservice/src/android/autofillservice/cts/UiBot.java b/tests/autofillservice/src/android/autofillservice/cts/UiBot.java
index 88173d3..8f927e9 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/UiBot.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/UiBot.java
@@ -53,6 +53,7 @@
 import android.support.test.uiautomator.BySelector;
 import android.support.test.uiautomator.Direction;
 import android.support.test.uiautomator.SearchCondition;
+import android.support.test.uiautomator.StaleObjectException;
 import android.support.test.uiautomator.UiDevice;
 import android.support.test.uiautomator.UiObject2;
 import android.support.test.uiautomator.UiObjectNotFoundException;
@@ -144,6 +145,8 @@
 
     private static final boolean DUMP_ON_ERROR = true;
 
+    private static final int MAX_UIOBJECT_RETRY_COUNT = 3;
+
     /** Pass to {@link #setScreenOrientation(int)} to change the display to portrait mode */
     public static int PORTRAIT = 0;
 
@@ -293,7 +296,7 @@
     public UiObject2 assertDatasetsContains(String...names) throws Exception {
         final UiObject2 picker = findDatasetPicker(UI_DATASET_PICKER_TIMEOUT);
         assertWithMessage("wrong dataset names").that(getChildrenAsText(picker))
-                .containsAllIn(Arrays.asList(names)).inOrder();
+                .containsAtLeastElementsIn(Arrays.asList(names)).inOrder();
         return picker;
     }
 
@@ -1053,10 +1056,23 @@
     }
 
     private UiObject2 findDatasetPicker(Timeout timeout) throws Exception {
-        final UiObject2 picker = waitForObject(DATASET_PICKER_SELECTOR, timeout);
-
+        // The UI element here is flaky. Sometimes the UI automator returns a StateObject.
+        // Retry is put in place here to make sure that we catch the object.
+        UiObject2 picker = null;
+        int retryCount = 0;
         final String expectedTitle = getString(RESOURCE_STRING_DATASET_PICKER_ACCESSIBILITY_TITLE);
-        assertAccessibilityTitle(picker, expectedTitle);
+        while (retryCount < MAX_UIOBJECT_RETRY_COUNT) {
+            try {
+                picker = waitForObject(DATASET_PICKER_SELECTOR, timeout);
+                assertAccessibilityTitle(picker, expectedTitle);
+                break;
+            } catch (StaleObjectException e) {
+                Log.d(TAG, "Retry grabbing view class");
+            }
+            retryCount++;
+        }
+        assertWithMessage(expectedTitle + " not found").that(retryCount).isLessThan(
+                MAX_UIOBJECT_RETRY_COUNT);
 
         if (picker != null) {
             mOkToCallAssertNoDatasets = true;
@@ -1216,20 +1232,6 @@
     }
 
     /**
-     * Waits until the window was split to show multiple activities.
-     */
-    public void waitForWindowSplit() throws Exception {
-        try {
-            assertShownById(SPLIT_WINDOW_DIVIDER_ID);
-        } catch (Exception e) {
-            final long timeout = Timeouts.ACTIVITY_RESURRECTION.ms();
-            Log.e(TAG, "Did not find window divider " + SPLIT_WINDOW_DIVIDER_ID + "; waiting "
-                    + timeout + "ms instead");
-            SystemClock.sleep(timeout);
-        }
-    }
-
-    /**
      * Finds the first {@link URLSpan} on the current screen.
      */
     public URLSpan findFirstUrlSpanWithText(String str) throws Exception {
diff --git a/tests/autofillservice/src/android/autofillservice/cts/ValidatorTest.java b/tests/autofillservice/src/android/autofillservice/cts/ValidatorTest.java
index aa89fae..8a34153 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/ValidatorTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/ValidatorTest.java
@@ -63,7 +63,7 @@
                     final AutofillId usernameId =
                             findAutofillIdByResourceId(contexts.get(0), ID_USERNAME);
                     final LuhnChecksumValidator validator = new LuhnChecksumValidator(usernameId);
-                    // Sanity check to make sure the validator is properly configured
+                    // Validation check to make sure the validator is properly configured
                     assertValidator(validator, usernameId, username, willSaveBeShown);
                     builder.setValidator(validator);
                 })
diff --git a/tests/autofillservice/src/android/autofillservice/cts/VirtualContainerActivityTest.java b/tests/autofillservice/src/android/autofillservice/cts/VirtualContainerActivityTest.java
index 8cd9a67..4cdf811 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/VirtualContainerActivityTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/VirtualContainerActivityTest.java
@@ -124,7 +124,7 @@
     public void testAutofill_appContext() throws Exception {
         mActivity.mCustomView.setAutofillManager(mActivity.getApplicationContext());
         autofillTest(true);
-        // Sanity check to make sure autofill is enabled in the application context
+        // Validation check to make sure autofill is enabled in the application context
         assertThat(mActivity.getApplicationContext().getSystemService(AutofillManager.class)
                 .isEnabled()).isTrue();
     }
diff --git a/tests/autofillservice/src/android/autofillservice/cts/WebViewActivity.java b/tests/autofillservice/src/android/autofillservice/cts/WebViewActivity.java
index 3253f29..5946442 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/WebViewActivity.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/WebViewActivity.java
@@ -120,7 +120,7 @@
             throw new RetryableException(WEBVIEW_TIMEOUT, "WebView not loaded");
         }
 
-        // Sanity check to make sure autofill was enabled when the WebView was created
+        // Validation check to make sure autofill was enabled when the WebView was created
         assertThat(mWebView.isAutofillEnabled()).isTrue();
 
         // WebView builds its accessibility tree asynchronously and only after being queried the
diff --git a/tests/autofillservice/src/android/autofillservice/cts/WebViewActivityTest.java b/tests/autofillservice/src/android/autofillservice/cts/WebViewActivityTest.java
index 3af85fb..bd3682f 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/WebViewActivityTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/WebViewActivityTest.java
@@ -103,7 +103,7 @@
 
         // Load WebView
         final MyWebView myWebView = mActivity.loadWebView(mUiBot, usesAppContext);
-        // Sanity check to make sure autofill is enabled in the application context
+        // Validation check to make sure autofill is enabled in the application context
         Helper.assertAutofillEnabled(myWebView.getContext(), true);
 
         // Set expectations.
diff --git a/tests/autofillservice/src/android/autofillservice/cts/WebViewMultiScreenLoginActivity.java b/tests/autofillservice/src/android/autofillservice/cts/WebViewMultiScreenLoginActivity.java
index cc4640c..2e3e74c 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/WebViewMultiScreenLoginActivity.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/WebViewMultiScreenLoginActivity.java
@@ -108,7 +108,7 @@
             throw new RetryableException(WEBVIEW_TIMEOUT, "WebView not loaded");
         }
 
-        // Sanity check to make sure autofill was enabled when the WebView was created
+        // Validation check to make sure autofill was enabled when the WebView was created
         assertThat(mWebView.isAutofillEnabled()).isTrue();
 
         // WebView builds its accessibility tree asynchronously and only after being queried the
diff --git a/tests/autofillservice/src/android/autofillservice/cts/WebViewMultiScreenLoginActivityTest.java b/tests/autofillservice/src/android/autofillservice/cts/WebViewMultiScreenLoginActivityTest.java
index b6d94a2..f2071d3 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/WebViewMultiScreenLoginActivityTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/WebViewMultiScreenLoginActivityTest.java
@@ -87,7 +87,7 @@
 
         // Load WebView
         final MyWebView myWebView = mActivity.loadWebView(mUiBot);
-        // Sanity check to make sure autofill is enabled in the application context
+        // Validation check to make sure autofill is enabled in the application context
         Helper.assertAutofillEnabled(myWebView.getContext(), true);
 
         /*
@@ -193,7 +193,7 @@
 
         // Load WebView
         final MyWebView myWebView = mActivity.loadWebView(mUiBot);
-        // Sanity check to make sure autofill is enabled in the application context
+        // Validation check to make sure autofill is enabled in the application context
         Helper.assertAutofillEnabled(myWebView.getContext(), true);
 
         /*
diff --git a/tests/autofillservice/src/android/autofillservice/cts/augmented/ClipboardAccessTest.java b/tests/autofillservice/src/android/autofillservice/cts/augmented/ClipboardAccessTest.java
index 00d36f0..e002d3e 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/augmented/ClipboardAccessTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/augmented/ClipboardAccessTest.java
@@ -46,7 +46,7 @@
 
     @Test
     public void testDoIt() throws Exception {
-        // Sanity check to make sure test is in a state where it cannot write to the clipboard.
+        // Check to make sure test is in a state where it cannot write to the clipboard.
         mClipboardManager.setPrimaryClip(ClipData.newPlainText(null, "Y U SET?"));
         assertWithMessage("should not be able to set clipboard yet")
                 .that(mClipboardManager.getPrimaryClip()).isNull();
diff --git a/tests/autofillservice/src/android/autofillservice/cts/augmented/DisableAutofillTest.java b/tests/autofillservice/src/android/autofillservice/cts/augmented/DisableAutofillTest.java
index bba97bd..366cf60 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/augmented/DisableAutofillTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/augmented/DisableAutofillTest.java
@@ -73,7 +73,7 @@
         autofillExpectation.assertAutoFilled();
         mAugmentedUiBot.assertUiGone();
 
-        // Sanity check - make sure standard autofill was not requested
+        // Validation check - make sure standard autofill was not requested
         sReplier.assertNoUnhandledFillRequests();
     }
 
@@ -127,7 +127,7 @@
         autofillExpectation.assertAutoFilled();
         mAugmentedUiBot.assertUiGone();
 
-        // Sanity check - make sure standard autofill was not requested
+        // Validation check - make sure standard autofill was not requested
         sReplier.assertNoUnhandledFillRequests();
     }
 }
diff --git a/tests/backup/Android.bp b/tests/backup/Android.bp
index 38f1044..b9bb624 100644
--- a/tests/backup/Android.bp
+++ b/tests/backup/Android.bp
@@ -17,9 +17,9 @@
     defaults: ["cts_defaults"],
     compile_multilib: "both",
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     static_libs: [
         "compatibility-device-util-axt",
@@ -33,7 +33,6 @@
     srcs: ["src/**/*.java"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/backup/OWNERS b/tests/backup/OWNERS
index e0e5e22..563154f 100644
--- a/tests/backup/OWNERS
+++ b/tests/backup/OWNERS
@@ -1,9 +1,3 @@
-# Bug component: 41666
-# Use this reviewer by default.
-br-framework-team+reviews@google.com
+# Bug component: 656484
 
-alsutton@google.com
-anniemeng@google.com
-brufino@google.com
-nathch@google.com
-rthakohov@google.com
+include platform/frameworks/base:/services/backup/OWNERS
diff --git a/tests/backup/app/Android.bp b/tests/backup/app/Android.bp
index ccbe771..0040c61 100644
--- a/tests/backup/app/Android.bp
+++ b/tests/backup/app/Android.bp
@@ -24,7 +24,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     platform_apis: true,
@@ -44,7 +43,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     platform_apis: true,
@@ -64,7 +62,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     platform_apis: true,
@@ -84,7 +81,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     platform_apis: true,
diff --git a/tests/backup/src/android/backup/cts/PermissionTest.java b/tests/backup/src/android/backup/cts/PermissionTest.java
index ee40922..4349aeb 100644
--- a/tests/backup/src/android/backup/cts/PermissionTest.java
+++ b/tests/backup/src/android/backup/cts/PermissionTest.java
@@ -94,6 +94,9 @@
      * Test backup and restore of regular runtime permission.
      */
     public void testGrantDeniedRuntimePermission() throws Exception {
+        if (!isBackupSupported()) {
+            return;
+        }
         grantPermission(APP, ACCESS_FINE_LOCATION);
 
         mBackupUtils.backupNowAndAssertSuccess(ANDROID_PACKAGE);
@@ -110,6 +113,9 @@
      * Test backup and restore of pre-M regular runtime permission.
      */
     public void testGrantDeniedRuntimePermission22() throws Exception {
+        if (!isBackupSupported()) {
+            return;
+        }
         setAppOp(APP22, READ_CONTACTS, MODE_IGNORED);
 
         mBackupUtils.backupNowAndAssertSuccess(ANDROID_PACKAGE);
@@ -126,6 +132,9 @@
      * Test backup and restore of foreground runtime permission.
      */
     public void testNoTriStateRuntimePermission() throws Exception {
+        if (!isBackupSupported()) {
+            return;
+        }
         // Set a marker
         grantPermission(APP, WRITE_CONTACTS);
 
@@ -152,6 +161,9 @@
      * Test backup and restore of foreground runtime permission.
      */
     public void testNoTriStateRuntimePermission22() throws Exception {
+        if (!isBackupSupported()) {
+            return;
+        }
         setAppOp(APP22, ACCESS_FINE_LOCATION, MODE_IGNORED);
 
         mBackupUtils.backupNowAndAssertSuccess(ANDROID_PACKAGE);
@@ -165,6 +177,9 @@
      * Test backup and restore of foreground runtime permission.
      */
     public void testGrantForegroundRuntimePermission() throws Exception {
+        if (!isBackupSupported()) {
+            return;
+        }
         grantPermission(APP, ACCESS_FINE_LOCATION);
 
         // revoked is the default state. Hence mark the permission as user set, so the permissions
@@ -186,6 +201,9 @@
      * Test backup and restore of foreground runtime permission.
      */
     public void testGrantForegroundRuntimePermission22() throws Exception {
+        if (!isBackupSupported()) {
+            return;
+        }
         setAppOp(APP22, ACCESS_FINE_LOCATION, MODE_FOREGROUND);
 
         mBackupUtils.backupNowAndAssertSuccess(ANDROID_PACKAGE);
@@ -199,6 +217,9 @@
      * Test backup and restore of foreground runtime permission.
      */
     public void testGrantForegroundAndBackgroundRuntimePermission() throws Exception {
+        if (!isBackupSupported()) {
+            return;
+        }
         grantPermission(APP, ACCESS_FINE_LOCATION);
         grantPermission(APP, ACCESS_BACKGROUND_LOCATION);
 
@@ -217,6 +238,9 @@
      * Test backup and restore of foreground runtime permission.
      */
     public void testGrantForegroundAndBackgroundRuntimePermission22() throws Exception {
+        if (!isBackupSupported()) {
+            return;
+        }
         // Set a marker
         setAppOp(APP22, WRITE_CONTACTS, MODE_IGNORED);
 
@@ -236,6 +260,9 @@
      * Restore if the permission was reviewed
      */
     public void testRestorePermReviewed() throws Exception {
+        if (!isBackupSupported()) {
+            return;
+        }
         clearFlag(APP22, WRITE_CONTACTS, FLAG_PERMISSION_REVIEW_REQUIRED);
 
         mBackupUtils.backupNowAndAssertSuccess(ANDROID_PACKAGE);
@@ -250,6 +277,9 @@
      * Restore if the permission was user set
      */
     public void testRestoreUserSet() throws Exception {
+        if (!isBackupSupported()) {
+            return;
+        }
         setFlag(APP, WRITE_CONTACTS, FLAG_PERMISSION_USER_SET);
 
         mBackupUtils.backupNowAndAssertSuccess(ANDROID_PACKAGE);
@@ -263,6 +293,9 @@
      * Restore if the permission was user fixed
      */
     public void testRestoreUserFixed() throws Exception {
+        if (!isBackupSupported()) {
+            return;
+        }
         setFlag(APP, WRITE_CONTACTS, FLAG_PERMISSION_USER_FIXED);
 
         mBackupUtils.backupNowAndAssertSuccess(ANDROID_PACKAGE);
@@ -276,6 +309,9 @@
      * Restoring of a flag should not grant the permission
      */
     public void testRestoreOfFlagDoesNotGrantPermission() throws Exception {
+        if (!isBackupSupported()) {
+            return;
+        }
         setFlag(APP, WRITE_CONTACTS, FLAG_PERMISSION_USER_FIXED);
 
         mBackupUtils.backupNowAndAssertSuccess(ANDROID_PACKAGE);
@@ -289,6 +325,9 @@
      * Test backup and delayed restore of regular runtime permission.
      */
     public void testDelayedRestore() throws Exception {
+        if (!isBackupSupported()) {
+            return;
+        }
         grantPermission(APP, ACCESS_FINE_LOCATION);
 
         setAppOp(APP22, READ_CONTACTS, MODE_IGNORED);
diff --git a/tests/bugreport/Android.bp b/tests/bugreport/Android.bp
index 40e8975..d008efb 100644
--- a/tests/bugreport/Android.bp
+++ b/tests/bugreport/Android.bp
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-android_test_helper_app {
+android_test {
     name: "CtsBugreportTestCases",
     defaults: ["cts_defaults"],
     static_libs: [
@@ -25,4 +25,8 @@
         ],
     srcs: ["src/**/*.java"],
     sdk_version: "test_current",
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
 }
diff --git a/tests/bugreport/AndroidTest.xml b/tests/bugreport/AndroidTest.xml
index b46682a..bdb66bb 100644
--- a/tests/bugreport/AndroidTest.xml
+++ b/tests/bugreport/AndroidTest.xml
@@ -16,7 +16,7 @@
   -->
 <configuration description="Bugreport Manager tests">
     <option name="test-suite-tag" value="cts" />
-    <option name="config-descriptor:metadata" key="component" value="auto" />
+    <option name="config-descriptor:metadata" key="component" value="framework" />
     <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
     <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
     <option name="config-descriptor:metadata" key="parameter" value="not_secondary_user" />
@@ -26,5 +26,6 @@
     </target_preparer>
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="android.bugreport.cts" />
+        <option name="runtime-hint" value="3m40s" />
     </test>
 </configuration>
diff --git a/tests/bugreport/OWNERS b/tests/bugreport/OWNERS
index 32da65d..6ac6141 100644
--- a/tests/bugreport/OWNERS
+++ b/tests/bugreport/OWNERS
@@ -1,2 +1,3 @@
+# Bug component: 153446
 abkaur@google.com
 nandana@google.com
diff --git a/tests/bugreport/TEST_MAPPING b/tests/bugreport/TEST_MAPPING
new file mode 100644
index 0000000..4244967
--- /dev/null
+++ b/tests/bugreport/TEST_MAPPING
@@ -0,0 +1,17 @@
+{
+  "presubmit": [
+    {
+      "name": "CtsBugreportTestCases",
+      "options": [
+        {
+          "exclude-annotation": "androidx.test.filters.LargeTest"
+        }
+      ]
+    }
+  ],
+  "postsubmit": [
+    {
+      "name": "CtsBugreportTestCases"
+    }
+  ]
+}
diff --git a/tests/bugreport/src/android/bugreport/cts/BugreportManagerTest.java b/tests/bugreport/src/android/bugreport/cts/BugreportManagerTest.java
index 0a9b3f8..bea0dd1 100644
--- a/tests/bugreport/src/android/bugreport/cts/BugreportManagerTest.java
+++ b/tests/bugreport/src/android/bugreport/cts/BugreportManagerTest.java
@@ -29,6 +29,7 @@
 import android.util.Pair;
 
 import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.LargeTest;
 import androidx.test.runner.AndroidJUnit4;
 
 import org.junit.After;
@@ -91,6 +92,7 @@
         assertThat(screenshot).isNull();
     }
 
+    @LargeTest
     @Test
     public void testFullBugreport() throws Exception {
         Pair<String, String> brFiles = triggerBugreport(BugreportParams.BUGREPORT_MODE_FULL);
diff --git a/tests/camera/Android.mk b/tests/camera/Android.mk
index 1c2c67c..1dc75f3 100644
--- a/tests/camera/Android.mk
+++ b/tests/camera/Android.mk
@@ -14,24 +14,6 @@
 
 LOCAL_PATH:= $(call my-dir)
 
-# CtsCameraUtils package
-
-include $(CLEAR_VARS)
-
-LOCAL_STATIC_JAVA_LIBRARIES := compatibility-device-util-axt \
-	mockito-target-minus-junit4 \
-	android-ex-camera2
-
-LOCAL_SRC_FILES := \
-	$(call all-java-files-under, utils/src) \
-	$(call all-renderscript-files-under, utils/src)
-
-LOCAL_MODULE := CtsCameraUtils
-
-LOCAL_SDK_VERSION := test_current
--include cts/error_prone_rules_tests.mk
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
 # Reusable Camera performance test classes and helpers
 include $(CLEAR_VARS)
 
@@ -95,7 +77,7 @@
 	$(call all-renderscript-files-under, src)
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_PACKAGE_NAME := CtsCameraTestCases
 
diff --git a/tests/camera/api25test/Android.mk b/tests/camera/api25test/Android.mk
index c6c9edf..c00b2d5 100644
--- a/tests/camera/api25test/Android.mk
+++ b/tests/camera/api25test/Android.mk
@@ -38,7 +38,7 @@
 LOCAL_JAVA_LIBRARIES := android.test.runner.stubs
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 include $(BUILD_CTS_PACKAGE)
 
diff --git a/tests/camera/libctscamera2jni/Android.mk b/tests/camera/libctscamera2jni/Android.mk
index 798674b..b482853 100644
--- a/tests/camera/libctscamera2jni/Android.mk
+++ b/tests/camera/libctscamera2jni/Android.mk
@@ -25,10 +25,6 @@
 	dng-validate-jni.cpp \
 	dynamic-depth-validate-jni.cpp
 
-LOCAL_C_INCLUDES := \
-	$(JNI_H_INCLUDE) \
-	system/core/include \
-
 # Flags needed by DNG SDK
 LOCAL_CFLAGS := -DUNIX_ENV=1 -DqDNGBigEndian=0 -DqDNGThreadSafe=1 -DqDNGUseLibJPEG=1 -DqDNGUseXMP=0 -DqDNGValidate=1 -DqDNGValidateTarget=1 -DqAndroid=1 -fexceptions -Wsign-compare -Wno-reorder -Wframe-larger-than=20000
 
@@ -38,6 +34,7 @@
 # Flags related to dynamic depth
 LOCAL_CFLAGS += -Wno-ignored-qualifiers -DSTATIC_LIBXML=1
 
+LOCAL_HEADER_LIBRARIES := jni_headers liblog_headers
 LOCAL_STATIC_LIBRARIES := libdng_sdk_validate libjpeg_static_ndk
 # Dynamic depth libraries
 LOCAL_STATIC_LIBRARIES += libdynamic_depth_ndk libimage_io_ndk libbase_ndk libxml2_ndk
diff --git a/tests/camera/src/android/hardware/camera2/cts/CaptureRequestTest.java b/tests/camera/src/android/hardware/camera2/cts/CaptureRequestTest.java
index 90a7dcd..d18da38 100644
--- a/tests/camera/src/android/hardware/camera2/cts/CaptureRequestTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/CaptureRequestTest.java
@@ -2842,7 +2842,7 @@
             if (mStaticInfo.isHardwareLevelAtLeastLimited()) {
                 mCollector.expectRectsAreSimilar(
                         "Request and result crop region should be similar",
-                        activeArraySize, cropRegion,
+                        defaultCropRegion, cropRegion,
                         CROP_REGION_ERROR_PERCENT_DELTA * errorMultiplier);
             }
 
diff --git a/tests/camera/src/android/hardware/camera2/cts/CtsUtilsTest.java b/tests/camera/src/android/hardware/camera2/cts/CtsUtilsTest.java
new file mode 100644
index 0000000..4839b62
--- /dev/null
+++ b/tests/camera/src/android/hardware/camera2/cts/CtsUtilsTest.java
@@ -0,0 +1,246 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.camera2.cts;
+
+import static android.hardware.camera2.cts.CameraTestUtils.*;
+import static junit.framework.Assert.*;
+
+import android.graphics.ImageFormat;
+import android.media.Image;
+import android.media.Image.Plane;
+import android.util.Size;
+
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+
+import org.junit.Test;
+
+/**
+ * <p>
+ * Tests for the CameraTestUtils class. Aims to ensure that failures in other
+ * testcases are failures of the tested APIs, not the CameraTestUtils code.
+ * </p>
+ */
+public class CtsUtilsTest {
+    private static final byte PADBYTE = (byte)0xa5;
+
+    @Test
+    public void testCopyYuv() {
+        final int w = 14;
+        final int h = 10;
+        final FakeImage src = FakeImage.createYuv420(w, h, 14,  8, 10);
+        final FakeImage dst = FakeImage.createYuv420(w, h, 14, 10,  8);
+
+        drawGradient(src.planes[0], w, h);
+        drawGradient(src.planes[1], w/2, h/2);
+        drawGradient(src.planes[2], w/2, h/2);
+
+        CameraTestUtils.imageCopy(src, dst);
+
+        checkPlane("Y", w,   h,   src.planes[0], dst.planes[0]);
+        checkPlane("U", w/2, h/2, src.planes[1], dst.planes[1]);
+        checkPlane("V", w/2, h/2, src.planes[2], dst.planes[2]);
+    }
+
+    @Test
+    public void testCopyPad0to0() {
+        final int w = 21;
+        final int h = 9;
+        final FakeImage src = FakeImage.createRaw(w, h, 21);
+        final FakeImage dst = FakeImage.createRaw(w, h, 21);
+
+        drawGradient(src.planes[0], w, h);
+        CameraTestUtils.imageCopy(src, dst);
+
+        checkPlane("RAW", w, h, src.planes[0], dst.planes[0]);
+    }
+
+    @Test
+    public void testCopyPad3to3() {
+        final int w = 21;
+        final int h = 9;
+        final FakeImage src = FakeImage.createRaw(w, h, 24);
+        final FakeImage dst = FakeImage.createRaw(w, h, 24);
+
+        drawGradient(src.planes[0], w, h);
+        CameraTestUtils.imageCopy(src, dst);
+
+        checkPlane("RAW", w, h, src.planes[0], dst.planes[0]);
+    }
+
+    @Test
+    public void testCopyPad3to0() {
+        final int w = 21;
+        final int h = 9;
+        final FakeImage src = FakeImage.createRaw(w, h, 24);
+        final FakeImage dst = FakeImage.createRaw(w, h, 21);
+
+        drawGradient(src.planes[0], w, h);
+        CameraTestUtils.imageCopy(src, dst);
+
+        checkPlane("RAW", w, h, src.planes[0], dst.planes[0]);
+    }
+
+    @Test
+    public void testCopyPad0to3() {
+        final int w = 21;
+        final int h = 9;
+        final FakeImage src = FakeImage.createRaw(w, h, 21);
+        final FakeImage dst = FakeImage.createRaw(w, h, 24);
+
+        drawGradient(src.planes[0], w, h);
+        CameraTestUtils.imageCopy(src, dst);
+
+        checkPlane("RAW", w, h, src.planes[0], dst.planes[0]);
+    }
+
+    @Test
+    public void testCopyPad5to3() {
+        final int w = 21;
+        final int h = 9;
+        final FakeImage src = FakeImage.createRaw(w, h, 26);
+        final FakeImage dst = FakeImage.createRaw(w, h, 24);
+
+        drawGradient(src.planes[0], w, h);
+        CameraTestUtils.imageCopy(src, dst);
+
+        checkPlane("RAW", w, h, src.planes[0], dst.planes[0]);
+    }
+
+    @Test
+    public void testCopyPad3to5() {
+        final int w = 21;
+        final int h = 9;
+        final FakeImage src = FakeImage.createRaw(w, h, 24);
+        final FakeImage dst = FakeImage.createRaw(w, h, 26);
+
+        drawGradient(src.planes[0], w, h);
+        CameraTestUtils.imageCopy(src, dst);
+
+        checkPlane("RAW", w, h, src.planes[0], dst.planes[0]);
+    }
+
+    private static void checkPlane(String planeName, int w, int h, FakePlane src, FakePlane dst) {
+        final byte[] srcRow = new byte[w];
+        final byte[] dstRow = new byte[w];
+        src.buffer.rewind();
+        dst.buffer.rewind();
+        for (int y=0; y < h; ++y) {
+            src.buffer.position(y * src.rowStride);
+            dst.buffer.position(y * dst.rowStride);
+            src.buffer.get(srcRow, 0, srcRow.length);
+            dst.buffer.get(dstRow, 0, dstRow.length);
+            for (int x=0; x < w; ++x) {
+                if (srcRow[x] != dstRow[x]) {
+                    fail("plane " + planeName + " differs on row " + y + ", col " + x + ": " +
+                            "src=" + srcRow[x] + " dst=" + dstRow[x]);
+                }
+            }
+            String failmsg = planeName + " plane copied incorrectly";
+            assertTrue(failmsg, Arrays.equals(srcRow, dstRow));
+        }
+        assertEquals("src plane " + planeName + " not exhausted", 0, src.buffer.remaining());
+        assertEquals("dst plane " + planeName + " not exhausted", 0, dst.buffer.remaining());
+    }
+
+    private static void drawGradient(FakePlane plane, int w, int h) {
+        final int diagonal = (w-1)*(w-1) + (h-1)*(h-1);
+        final int rowStride = plane.rowStride;
+        final ByteBuffer buffer = plane.buffer;
+        buffer.rewind();
+        for (int y=0; y<h; ++y) {
+            int x = 0;
+            // fill the image area...
+            for (; x < w; ++x) {
+                final byte val;
+                if (x == w/2) {
+                    val = 0; // a vertical black line down the middle
+                } else {
+                    val = (byte)(255 * (x*x + y*y) / diagonal); // radial gradient
+                }
+                buffer.put(val);
+            }
+            // ...and pad the rest of the row stride.
+            if (y < h-1) {
+                for (; x < rowStride; ++x) {
+                    buffer.put(PADBYTE);
+                }
+            }
+        }
+    }
+
+}
+
+class FakeImage extends Image {
+    public final int format;
+    public final int width;
+    public final int height;
+    public final long timestamp = System.nanoTime();
+    public final FakePlane[] planes;
+
+    public FakeImage(int format, int w, int h, FakePlane[] planes) {
+        this.format = format;
+        this.width = w;
+        this.height = h;
+        this.planes = planes;
+    }
+
+    public static FakeImage createYuv420(int w, int h, int yStride, int uStride, int vStride) {
+        return new FakeImage(
+                ImageFormat.YUV_420_888,
+                w, h,
+                new FakePlane[] {
+                        FakePlane.createStrict(w,   h,   yStride),
+                        FakePlane.createStrict(w/2, h/2, uStride),
+                        FakePlane.createStrict(w/2, h/2, vStride),
+                }
+        );
+    }
+
+    public static FakeImage createRaw(int w, int h, int rowStride) {
+        return new FakeImage(
+                ImageFormat.RAW_SENSOR, w, h,
+                new FakePlane[] { FakePlane.createStrict(w, h, rowStride) }
+        );
+    }
+
+    @Override public int getFormat() { return format; }
+    @Override public int getWidth() { return width; }
+    @Override public int getHeight() { return height; }
+    @Override public long getTimestamp() { return timestamp; }
+    @Override public Plane[] getPlanes() { return planes; }
+    @Override public void close() { /* no-op */ }
+}
+
+class FakePlane extends Image.Plane {
+    public final int rowStride;
+    public final ByteBuffer buffer;
+
+    public FakePlane(int nbytes, int rowStride) {
+        buffer = ByteBuffer.allocateDirect(nbytes);
+        this.rowStride = rowStride;
+    }
+
+    public static FakePlane createStrict(int w, int h, int rowStride) {
+        int nbytes = rowStride * (h - 1) + w; // strictest possible size
+        return new FakePlane(nbytes, rowStride);
+    }
+
+    @Override public int getRowStride() { return rowStride; }
+    @Override public int getPixelStride() { return 1; }
+    @Override public ByteBuffer getBuffer() { return buffer; }
+}
diff --git a/tests/camera/src/android/hardware/camera2/cts/DngCreatorTest.java b/tests/camera/src/android/hardware/camera2/cts/DngCreatorTest.java
index 84da4ee..c88974e 100644
--- a/tests/camera/src/android/hardware/camera2/cts/DngCreatorTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/DngCreatorTest.java
@@ -80,7 +80,7 @@
 
     private static final double IMAGE_DIFFERENCE_TOLERANCE = 65;
     private static final int DEFAULT_PATCH_DIMEN = 512;
-    private static final int AE_TIMEOUT_MS = 2000;
+    private static final int AE_TIMEOUT_MS = 3000;
 
     // Constants used for GPS testing.
     private static final double GPS_DIFFERENCE_TOLERANCE = 0.0001;
diff --git a/tests/camera/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java b/tests/camera/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java
index 7bf1f4c..b9fc5a8 100644
--- a/tests/camera/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java
@@ -65,6 +65,7 @@
 
 import static android.hardware.camera2.cts.helpers.AssertHelpers.*;
 import static android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureCallback;
+import static android.hardware.cts.helpers.CameraUtils.matchParametersToCharacteristics;
 
 import static junit.framework.Assert.*;
 
@@ -97,7 +98,6 @@
     private static final long MIN_FRONT_SENSOR_RESOLUTION = VGA.getHeight() * VGA.getWidth();
     private static final long LOW_LATENCY_THRESHOLD_MS = 200;
     private static final float LATENCY_TOLERANCE_FACTOR = 1.1f; // 10% tolerance
-    private static final float FOCAL_LENGTH_TOLERANCE = .01f;
     private static final int MAX_NUM_IMAGES = 5;
     private static final long PREVIEW_RUN_MS = 500;
     private static final long FRAME_DURATION_30FPS_NSEC = (long) 1e9 / 30;
@@ -2315,60 +2315,6 @@
         }
     }
 
-    private boolean matchParametersToCharacteritics(Camera.Parameters params,
-            Camera.CameraInfo info, CameraCharacteristics ch) {
-        Integer facing = ch.get(CameraCharacteristics.LENS_FACING);
-        switch (facing.intValue()) {
-            case CameraMetadata.LENS_FACING_EXTERNAL:
-            case CameraMetadata.LENS_FACING_FRONT:
-                if (info.facing != Camera.CameraInfo.CAMERA_FACING_FRONT) {
-                    return false;
-                }
-                break;
-            case CameraMetadata.LENS_FACING_BACK:
-                if (info.facing != Camera.CameraInfo.CAMERA_FACING_BACK) {
-                    return false;
-                }
-                break;
-            default:
-                return false;
-        }
-
-        Integer orientation = ch.get(CameraCharacteristics.SENSOR_ORIENTATION);
-        if (orientation.intValue() != info.orientation) {
-            return false;
-        }
-
-        StaticMetadata staticMeta = new StaticMetadata(ch);
-        boolean legacyHasFlash = params.getSupportedFlashModes() != null;
-        if (staticMeta.hasFlash() != legacyHasFlash) {
-            return false;
-        }
-
-        List<String> legacyFocusModes = params.getSupportedFocusModes();
-        boolean legacyHasFocuser = !((legacyFocusModes.size() == 1) &&
-                (legacyFocusModes.contains(Camera.Parameters.FOCUS_MODE_FIXED)));
-        if (staticMeta.hasFocuser() != legacyHasFocuser) {
-            return false;
-        }
-
-        if (staticMeta.isVideoStabilizationSupported() != params.isVideoStabilizationSupported()) {
-            return false;
-        }
-
-        float legacyFocalLength = params.getFocalLength();
-        float [] focalLengths = staticMeta.getAvailableFocalLengthsChecked();
-        boolean found = false;
-        for (float focalLength : focalLengths) {
-            if (Math.abs(focalLength - legacyFocalLength) <= FOCAL_LENGTH_TOLERANCE) {
-                found = true;
-                break;
-            }
-        }
-
-        return found;
-    }
-
     /**
      * Check that all devices available through the legacy API are also
      * accessible via Camera2.
@@ -2411,7 +2357,7 @@
             // different try to match devices by using other common traits.
             CameraCharacteristics found = null;
             for (CameraCharacteristics ch : chars) {
-                if (matchParametersToCharacteritics(legacyParams, legacyInfo, ch)) {
+                if (matchParametersToCharacteristics(legacyParams, legacyInfo, ch)) {
                     found = ch;
                     break;
                 }
diff --git a/tests/camera/src/android/hardware/camera2/cts/IdleUidTest.java b/tests/camera/src/android/hardware/camera2/cts/IdleUidTest.java
index 9caf365..b093e6c 100644
--- a/tests/camera/src/android/hardware/camera2/cts/IdleUidTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/IdleUidTest.java
@@ -127,7 +127,7 @@
             if (hasAccess) {
                 fail("Unexpected exception" + e);
             } else {
-                assertThat(e.getReason()).isSameAs(CameraAccessException.CAMERA_DISABLED);
+                assertThat(e.getReason()).isSameInstanceAs(CameraAccessException.CAMERA_DISABLED);
             }
         }
 
diff --git a/tests/camera/src/android/hardware/camera2/cts/ImageWriterTest.java b/tests/camera/src/android/hardware/camera2/cts/ImageWriterTest.java
index 6cfa435..6398e01 100644
--- a/tests/camera/src/android/hardware/camera2/cts/ImageWriterTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/ImageWriterTest.java
@@ -305,6 +305,11 @@
                     "ImageWriter 1st input image should match camera 1st output image",
                     isImageStronglyEqual(inputImage, cameraImage));
 
+            if (DEBUG) {
+                String inputFileName = mDebugFileNameBase + "/" + maxSize + "_image1_input.yuv";
+                dumpFile(inputFileName, getDataFromImage(inputImage));
+            }
+
             // Image should be closed after queueInputImage call
             Plane closedPlane = inputImage.getPlanes()[0];
             ByteBuffer closedBuffer = closedPlane.getBuffer();
@@ -312,12 +317,12 @@
             imageInvalidAccessTestAfterClose(inputImage, closedPlane, closedBuffer);
 
             outputImage = listenerForWriter.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
-            mCollector.expectTrue("ImageWriter 1st output image should match 1st input image",
+            mCollector.expectTrue("ImageWriter 1st output image should match 1st camera image",
                     isImageStronglyEqual(cameraImage, outputImage));
             if (DEBUG) {
-                String img1FileName = mDebugFileNameBase + "/" + maxSize + "_image1_copy.yuv";
+                String img1FileName = mDebugFileNameBase + "/" + maxSize + "_image1_camera.yuv";
                 String outputImg1FileName = mDebugFileNameBase + "/" + maxSize
-                        + "_outputImage2_copy.yuv";
+                        + "_image1_output.yuv";
                 dumpFile(img1FileName, getDataFromImage(cameraImage));
                 dumpFile(outputImg1FileName, getDataFromImage(outputImage));
             }
@@ -335,7 +340,7 @@
             // make a copy of image1 data, as it will be closed after queueInputImage;
             byte[] img1Data = getDataFromImage(cameraImage);
             if (DEBUG) {
-                String img2FileName = mDebugFileNameBase + "/" + maxSize + "_image2.yuv";
+                String img2FileName = mDebugFileNameBase + "/" + maxSize + "_image2_camera.yuv";
                 dumpFile(img2FileName, img1Data);
             }
 
@@ -353,7 +358,7 @@
 
             if (DEBUG) {
                 String outputImgFileName = mDebugFileNameBase + "/" + maxSize +
-                        "_outputImage2.yuv";
+                        "_image2_output.yuv";
                 dumpFile(outputImgFileName, outputImageData);
             }
             // No need to close inputImage, as it is sent to the surface after queueInputImage;
diff --git a/tests/camera/src/android/hardware/camera2/cts/RecordingTest.java b/tests/camera/src/android/hardware/camera2/cts/RecordingTest.java
index bf42ab7..3a57e6e 100644
--- a/tests/camera/src/android/hardware/camera2/cts/RecordingTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/RecordingTest.java
@@ -1264,7 +1264,12 @@
         Size maxVideoSize = SIZE_BOUND_1080P;
         if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_2160P)) {
             maxVideoSize = SIZE_BOUND_2160P;
+        } else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_QHD)) {
+            maxVideoSize = SIZE_BOUND_QHD;
+        } else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_2K)) {
+            maxVideoSize = SIZE_BOUND_2K;
         }
+
         mSupportedVideoSizes =
                 getSupportedVideoSizes(cameraId, mCameraManager, maxVideoSize);
     }
diff --git a/tests/camera/src/android/hardware/cts/CameraTest.java b/tests/camera/src/android/hardware/cts/CameraTest.java
index 27ea0b8..85c05cd 100644
--- a/tests/camera/src/android/hardware/cts/CameraTest.java
+++ b/tests/camera/src/android/hardware/cts/CameraTest.java
@@ -105,8 +105,6 @@
     private static final int AUTOWHITEBALANCE_LOCK = 1;
 
     // For external camera recording
-    private static final int DEFAULT_VIDEO_WIDTH = 176;
-    private static final int DEFAULT_VIDEO_HEIGHT = 144;
     private static final int VIDEO_BIT_RATE_IN_BPS = 128000;
 
     // Some exif tags that are not defined by ExifInterface but supported.
@@ -1286,10 +1284,12 @@
         surfaceHolder = mActivityRule.getActivity().getSurfaceView().getHolder();
         CamcorderProfile profile = null; // Used for built-in camera
         Camera.Size videoSize = null; // Used for external camera
+        int frameRate = -1; // Used for external camera
 
         // Set the preview size.
         if (mIsExternalCamera) {
             videoSize = setupExternalCameraRecord(parameters);
+            frameRate = parameters.getPreviewFrameRate();
         } else {
             profile = CamcorderProfile.get(cameraId, CamcorderProfile.QUALITY_LOW);
             setPreviewSizeByProfile(parameters, profile);
@@ -1301,7 +1301,7 @@
         mCamera.lock();  // Locking again from the same process has no effect.
         try {
             if (mIsExternalCamera) {
-                recordVideoBySize(videoSize, surfaceHolder);
+                recordVideoBySize(videoSize, frameRate, surfaceHolder);
             } else {
                 recordVideo(profile, surfaceHolder);
             }
@@ -1319,7 +1319,7 @@
         }
 
         if (mIsExternalCamera) {
-            recordVideoBySize(videoSize, surfaceHolder);
+            recordVideoBySize(videoSize, frameRate, surfaceHolder);
         } else {
             recordVideo(profile, surfaceHolder);  // should not throw exception
         }
@@ -1332,16 +1332,7 @@
     }
 
     private Camera.Size setupExternalCameraRecord(Parameters parameters) {
-        assertTrue(parameters.getSupportedVideoSizes() != null);
-        assertTrue(parameters.getSupportedVideoSizes().size() > 0);
-
-        Camera.Size videoSize = null;
-        for (Camera.Size sz : parameters.getSupportedVideoSizes()) {
-            if (sz.width >= DEFAULT_VIDEO_WIDTH && sz.height >= DEFAULT_VIDEO_HEIGHT) {
-                videoSize = sz;
-                break;
-            }
-        }
+        Camera.Size videoSize = parameters.getPreferredPreviewSizeForVideo();
         assertNotNull(videoSize);
         parameters.setPreviewSize(videoSize.width, videoSize.height);
         return videoSize;
@@ -1364,7 +1355,7 @@
         }
     }
 
-    private void recordVideoBySize(Camera.Size size,
+    private void recordVideoBySize(Camera.Size size, int frameRate,
             SurfaceHolder holder) throws Exception {
         MediaRecorder recorder = new MediaRecorder();
         try {
@@ -1377,6 +1368,7 @@
             recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
             recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
             recorder.setVideoSize(size.width, size.height);
+            recorder.setVideoFrameRate(frameRate);
             recorder.setOutputFile(mRecordingPath);
             recorder.setPreviewDisplay(holder.getSurface());
             recorder.prepare();
@@ -2877,9 +2869,11 @@
         SurfaceHolder holder = mActivityRule.getActivity().getSurfaceView().getHolder();
         CamcorderProfile profile = null; // for built-in camera
         Camera.Size videoSize = null; // for external camera
+        int frameRate = -1; // for external camera
 
         if (mIsExternalCamera) {
             videoSize = setupExternalCameraRecord(parameters);
+            frameRate = parameters.getPreviewFrameRate();
         } else {
             profile = CamcorderProfile.get(cameraId, CamcorderProfile.QUALITY_LOW);
             setPreviewSizeByProfile(parameters, profile);
@@ -2892,7 +2886,7 @@
             mCamera.setParameters(parameters);
             mCamera.startPreview();
             if (mIsExternalCamera) {
-                recordVideoSimpleBySize(videoSize, holder);
+                recordVideoSimpleBySize(videoSize, frameRate, holder);
             } else {
                 recordVideoSimple(profile, holder);
             }
@@ -2910,7 +2904,7 @@
         terminateMessageLooper();
     }
 
-    private void recordVideoSimpleBySize(Camera.Size size,
+    private void recordVideoSimpleBySize(Camera.Size size, int frameRate,
             SurfaceHolder holder) throws Exception {
         mCamera.unlock();
         MediaRecorder recorder = new MediaRecorder();
@@ -2923,6 +2917,7 @@
             recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
             recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
             recorder.setVideoSize(size.width, size.height);
+            recorder.setVideoFrameRate(frameRate);
             recorder.setOutputFile(mRecordingPath);
             recorder.setPreviewDisplay(holder.getSurface());
             recorder.prepare();
@@ -3368,6 +3363,10 @@
             return;
         }
 
+        if (mIsExternalCamera) {
+            return;
+        }
+
         SurfaceHolder holder = mActivityRule.getActivity().getSurfaceView().getHolder();
 
         for (int profileId: mCamcorderProfileList) {
diff --git a/tests/camera/utils/Android.bp b/tests/camera/utils/Android.bp
new file mode 100644
index 0000000..4309a28
--- /dev/null
+++ b/tests/camera/utils/Android.bp
@@ -0,0 +1,34 @@
+// Copyright (C) 2020 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.
+
+// CtsCameraUtils package
+
+java_library {
+    name: "CtsCameraUtils",
+
+    static_libs: [
+        "compatibility-device-util-axt",
+        "mockito-target-minus-junit4",
+        "android-ex-camera2",
+    ],
+
+    srcs: [
+        "src/**/*.java",
+    ],
+
+    sdk_version: "test_current",
+    defaults: ["cts_error_prone_rules_tests"],
+
+}
+
diff --git a/tests/camera/utils/src/android/hardware/camera2/cts/CameraTestUtils.java b/tests/camera/utils/src/android/hardware/camera2/cts/CameraTestUtils.java
index 9866070..d29297f 100644
--- a/tests/camera/utils/src/android/hardware/camera2/cts/CameraTestUtils.java
+++ b/tests/camera/utils/src/android/hardware/camera2/cts/CameraTestUtils.java
@@ -99,6 +99,8 @@
     private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
     public static final Size SIZE_BOUND_1080P = new Size(1920, 1088);
+    public static final Size SIZE_BOUND_2K = new Size(2048, 1088);
+    public static final Size SIZE_BOUND_QHD = new Size(2560, 1440);
     public static final Size SIZE_BOUND_2160P = new Size(3840, 2160);
     // Only test the preview size that is no larger than 1080p.
     public static final Size PREVIEW_SIZE_BOUND = SIZE_BOUND_1080P;
@@ -1287,6 +1289,7 @@
         for (int i = 0; i < planes.length; i++) {
             buffer = planes[i].getBuffer();
             assertNotNull("Fail to get bytebuffer from plane", buffer);
+            buffer.rewind();
             rowStride = planes[i].getRowStride();
             pixelStride = planes[i].getPixelStride();
             assertTrue("pixel stride " + pixelStride + " is invalid", pixelStride > 0);
@@ -2234,30 +2237,28 @@
                         " is not supported");
             }
 
-            if (srcRowStride == dstRowStride && srcPixStride == dstPixStride) {
+            if (srcRowStride == dstRowStride && srcPixStride == dstPixStride &&
+                    srcPixStride == 1) {
                 // Fast path, just copy the content in the byteBuffer all together.
                 dstBuffer.put(srcBuffer);
             } else {
                 Size effectivePlaneSize = getEffectivePlaneSizeForImage(src, i);
                 int srcRowByteCount = srcRowStride;
                 int dstRowByteCount = dstRowStride;
-                byte[] srcDataRow = new byte[srcRowByteCount];
+                byte[] srcDataRow = new byte[Math.max(srcRowStride, dstRowStride)];
 
-                if (srcPixStride == dstPixStride) {
+                if (srcPixStride == dstPixStride && srcPixStride == 1) {
                     // Row by row copy case
                     for (int row = 0; row < effectivePlaneSize.getHeight(); row++) {
                         if (row == effectivePlaneSize.getHeight() - 1) {
                             // Special case for interleaved planes: need handle the last row
                             // carefully to avoid memory corruption. Check if we have enough bytes
                             // to copy.
-                            int remainingBytes = srcBuffer.remaining();
-                            if (srcRowByteCount > remainingBytes) {
-                                srcRowByteCount = remainingBytes;
-                            }
+                            srcRowByteCount = Math.min(srcRowByteCount, srcBuffer.remaining());
+                            dstRowByteCount = Math.min(dstRowByteCount, dstBuffer.remaining());
                         }
                         srcBuffer.get(srcDataRow, /*offset*/0, srcRowByteCount);
-                        dstBuffer.put(srcDataRow, /*offset*/0,
-                                Math.min(srcRowByteCount, dstRowByteCount));
+                        dstBuffer.put(srcDataRow, /*offset*/0, dstRowByteCount);
                     }
                 } else {
                     // Row by row per pixel copy case
@@ -2379,10 +2380,12 @@
             rhsBuffer = rhsPlanes[i].getBuffer();
             lhsBuffer.rewind();
             rhsBuffer.rewind();
-            // Special case for YUV420_888 buffer with different layout
+            // Special case for YUV420_888 buffer with different layout or
+            // potentially differently interleaved U/V planes.
             if (lhsImg.getFormat() == ImageFormat.YUV_420_888 &&
                     (lhsPlanes[i].getPixelStride() != rhsPlanes[i].getPixelStride() ||
-                     lhsPlanes[i].getRowStride() != rhsPlanes[i].getRowStride())) {
+                     lhsPlanes[i].getRowStride() != rhsPlanes[i].getRowStride() ||
+                     (lhsPlanes[i].getPixelStride() != 1))) {
                 int width = getEffectivePlaneSizeForImage(lhsImg, i).getWidth();
                 int height = getEffectivePlaneSizeForImage(lhsImg, i).getHeight();
                 int rowSizeL = lhsPlanes[i].getRowStride();
diff --git a/tests/camera/utils/src/android/hardware/cts/helpers/CameraUtils.java b/tests/camera/utils/src/android/hardware/cts/helpers/CameraUtils.java
index 2370023..a5104e3 100644
--- a/tests/camera/utils/src/android/hardware/cts/helpers/CameraUtils.java
+++ b/tests/camera/utils/src/android/hardware/cts/helpers/CameraUtils.java
@@ -20,17 +20,21 @@
 import android.hardware.Camera;
 import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CameraManager;
+import android.hardware.camera2.CameraMetadata;
+import android.hardware.camera2.cts.helpers.StaticMetadata;
 import android.os.Bundle;
 
 import androidx.test.InstrumentationRegistry;
 
 import java.util.Comparator;
+import java.util.List;
 import java.util.stream.IntStream;
 
 /**
  * Utility class containing helper functions for the Camera CTS tests.
  */
 public class CameraUtils {
+    private static final float FOCAL_LENGTH_TOLERANCE = .01f;
 
     private static final String CAMERA_ID_INSTR_ARG_KEY = "camera-id";
     private static final Bundle mBundle = InstrumentationRegistry.getArguments();
@@ -67,6 +71,80 @@
     }
 
     /**
+     * Returns {@code true} if the Camera.Parameter and Camera.Info arguments describe a similar
+     * camera as the CameraCharacteristics.
+     *
+     * @param params Camera.Parameters to use for matching.
+     * @param info Camera.CameraInfo to use for matching.
+     * @param ch CameraCharacteristics to use for matching.
+     * @return {@code true} if the arguments describe similar camera devices.
+     */
+    public static boolean matchParametersToCharacteristics(Camera.Parameters params,
+            Camera.CameraInfo info, CameraCharacteristics ch) {
+        Integer facing = ch.get(CameraCharacteristics.LENS_FACING);
+        switch (facing.intValue()) {
+            case CameraMetadata.LENS_FACING_EXTERNAL:
+            case CameraMetadata.LENS_FACING_FRONT:
+                if (info.facing != Camera.CameraInfo.CAMERA_FACING_FRONT) {
+                    return false;
+                }
+                break;
+            case CameraMetadata.LENS_FACING_BACK:
+                if (info.facing != Camera.CameraInfo.CAMERA_FACING_BACK) {
+                    return false;
+                }
+                break;
+            default:
+                return false;
+        }
+
+        Integer orientation = ch.get(CameraCharacteristics.SENSOR_ORIENTATION);
+        if (orientation.intValue() != info.orientation) {
+            return false;
+        }
+
+        StaticMetadata staticMeta = new StaticMetadata(ch);
+        boolean legacyHasFlash = params.getSupportedFlashModes() != null;
+        if (staticMeta.hasFlash() != legacyHasFlash) {
+            return false;
+        }
+
+        boolean isExternal = (ch.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) ==
+                CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL);
+        boolean hasValidMinFocusDistance = staticMeta.areKeysAvailable(
+                CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE);
+        boolean fixedFocusExternal = isExternal && !hasValidMinFocusDistance;
+        boolean hasFocuser = staticMeta.hasFocuser() && !fixedFocusExternal;
+        List<String> legacyFocusModes = params.getSupportedFocusModes();
+        boolean legacyHasFocuser = !((legacyFocusModes.size() == 1) &&
+                (legacyFocusModes.contains(Camera.Parameters.FOCUS_MODE_FIXED)));
+        if (hasFocuser != legacyHasFocuser) {
+            return false;
+        }
+
+        if (staticMeta.isVideoStabilizationSupported() != params.isVideoStabilizationSupported()) {
+            return false;
+        }
+
+        float legacyFocalLength = params.getFocalLength();
+        if (ch.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS) != null) {
+            float [] focalLengths = staticMeta.getAvailableFocalLengthsChecked();
+            boolean found = false;
+            for (float focalLength : focalLengths) {
+                if (Math.abs(focalLength - legacyFocalLength) <= FOCAL_LENGTH_TOLERANCE) {
+                    found = true;
+                    break;
+                }
+            }
+            return found;
+        } else if (legacyFocalLength != -1.0f) {
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
      * Returns {@code true} if this device only supports {@code EXTERNAL} mode operation in the
      * Camera2 API for the given camera ID.
      *
@@ -76,9 +154,37 @@
      */
     public static boolean isExternal(Context context, int cameraId) throws Exception {
         CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
-        String cameraIdStr = manager.getCameraIdListNoLazy()[cameraId];
+
+        Camera camera = null;
+        Camera.Parameters params = null;
+        Camera.CameraInfo info = new Camera.CameraInfo();
+        try {
+            Camera.getCameraInfo(cameraId, info);
+            camera = Camera.open(cameraId);
+            params = camera.getParameters();
+        } finally {
+            if (camera != null) {
+                camera.release();
+            }
+        }
+
+        String [] cameraIdList = manager.getCameraIdListNoLazy();
         CameraCharacteristics characteristics =
-                manager.getCameraCharacteristics(cameraIdStr);
+                manager.getCameraCharacteristics(cameraIdList[cameraId]);
+
+        if (!matchParametersToCharacteristics(params, info, characteristics)) {
+            boolean found = false;
+            for (String id : cameraIdList) {
+                characteristics = manager.getCameraCharacteristics(id);
+                if (matchParametersToCharacteristics(params, info, characteristics)) {
+                    found = true;
+                    break;
+                }
+            }
+            if (!found) {
+                return false;
+            }
+        }
 
         return characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) ==
                 CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL;
diff --git a/tests/contentcaptureservice/Android.bp b/tests/contentcaptureservice/Android.bp
index 6b5d899..83f5cab 100644
--- a/tests/contentcaptureservice/Android.bp
+++ b/tests/contentcaptureservice/Android.bp
@@ -29,7 +29,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/contentcaptureservice/OutsideOfPackageActivity/Android.bp b/tests/contentcaptureservice/OutsideOfPackageActivity/Android.bp
index afbf9af..02188bc 100644
--- a/tests/contentcaptureservice/OutsideOfPackageActivity/Android.bp
+++ b/tests/contentcaptureservice/OutsideOfPackageActivity/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src/**/*.java"],
diff --git a/tests/contentcaptureservice/src/android/contentcaptureservice/cts/unit/ContentCaptureConditionTest.java b/tests/contentcaptureservice/src/android/contentcaptureservice/cts/unit/ContentCaptureConditionTest.java
index 0c9fd40..94c9234 100644
--- a/tests/contentcaptureservice/src/android/contentcaptureservice/cts/unit/ContentCaptureConditionTest.java
+++ b/tests/contentcaptureservice/src/android/contentcaptureservice/cts/unit/ContentCaptureConditionTest.java
@@ -47,7 +47,7 @@
         final ContentCaptureCondition condition =
                 new ContentCaptureCondition(mLocusId, FLAG_IS_REGEX);
         assertThat(condition).isNotNull();
-        assertThat(condition.getLocusId()).isSameAs(mLocusId);
-        assertThat(condition.getFlags()).isSameAs(FLAG_IS_REGEX);
+        assertThat(condition.getLocusId()).isSameInstanceAs(mLocusId);
+        assertThat(condition.getFlags()).isSameInstanceAs(FLAG_IS_REGEX);
     }
 }
diff --git a/tests/contentcaptureservice/src/android/contentcaptureservice/cts/unit/ContentCaptureContextTest.java b/tests/contentcaptureservice/src/android/contentcaptureservice/cts/unit/ContentCaptureContextTest.java
index 47bd20b..59c61c7 100644
--- a/tests/contentcaptureservice/src/android/contentcaptureservice/cts/unit/ContentCaptureContextTest.java
+++ b/tests/contentcaptureservice/src/android/contentcaptureservice/cts/unit/ContentCaptureContextTest.java
@@ -89,7 +89,7 @@
     @Test
     public void testSetGetBundle() {
         final Builder builder = mBuilder.setExtras(mExtras);
-        assertThat(builder).isSameAs(mBuilder);
+        assertThat(builder).isSameInstanceAs(mBuilder);
         final ContentCaptureContext context = builder.build();
         assertThat(context).isNotNull();
         assertExtras(context.getExtras());
@@ -99,7 +99,7 @@
     public void testParcel() {
         final Builder builder = mBuilder
                 .setExtras(mExtras);
-        assertThat(builder).isSameAs(mBuilder);
+        assertThat(builder).isSameInstanceAs(mBuilder);
         final ContentCaptureContext context = builder.build();
         assertEverything(context);
 
diff --git a/tests/contentcaptureservice/src/android/contentcaptureservice/cts/unit/ViewNodeTest.java b/tests/contentcaptureservice/src/android/contentcaptureservice/cts/unit/ViewNodeTest.java
index 67d6670..142424f 100644
--- a/tests/contentcaptureservice/src/android/contentcaptureservice/cts/unit/ViewNodeTest.java
+++ b/tests/contentcaptureservice/src/android/contentcaptureservice/cts/unit/ViewNodeTest.java
@@ -133,7 +133,7 @@
 
         ViewStructureImpl structure = new ViewStructureImpl(view);
         ViewNode node = structure.getNode();
-        assertThat(node.getAutofillId()).isEqualTo(initialId); // sanity check
+        assertThat(node.getAutofillId()).isEqualTo(initialId); // confidence check
 
         assertThrows(NullPointerException.class, () -> structure.setAutofillId(null));
         assertThat(node.getAutofillId()).isEqualTo(initialId); // invariant
@@ -159,7 +159,7 @@
     public void testValidProperties_throughParcel() {
         ViewStructureImpl structure = newSimpleStructure();
         final ViewNode node = structure.getNode();
-        assertSimpleNode(node); // sanity check
+        assertSimpleNode(node); // confidence check
 
         final ViewNode clone = cloneThroughParcel(node);
         assertSimpleNode(clone);
@@ -176,7 +176,7 @@
     public void testComplexText_throughParcel() {
         ViewStructureImpl structure = newStructureWithComplexText();
         final ViewNode node = structure.getNode();
-        assertNodeWithComplexText(node); // sanity check
+        assertNodeWithComplexText(node); // confidence check
 
         ViewNode clone = cloneThroughParcel(node);
         assertNodeWithComplexText(clone);
@@ -406,7 +406,7 @@
 
         try {
             // Write to parcel
-            parcel.setDataPosition(0); // Sanity / paranoid check
+            parcel.setDataPosition(0); // Confidence check
             ViewNode.writeToParcel(parcel, node, 0);
 
             // Read from parcel
diff --git a/tests/contentsuggestions/Android.bp b/tests/contentsuggestions/Android.bp
index 195e91d..cc285ea 100644
--- a/tests/contentsuggestions/Android.bp
+++ b/tests/contentsuggestions/Android.bp
@@ -28,7 +28,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/controls/Android.bp b/tests/controls/Android.bp
index ead4dc8..4b6c4ab 100644
--- a/tests/controls/Android.bp
+++ b/tests/controls/Android.bp
@@ -30,8 +30,8 @@
 
     libs: [
         "android.test.mock",
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
 
     srcs: ["src/**/*.java"],
diff --git a/tests/core/runner-axt/Android.bp b/tests/core/runner-axt/Android.bp
index 797d235..af2a835 100644
--- a/tests/core/runner-axt/Android.bp
+++ b/tests/core/runner-axt/Android.bp
@@ -29,7 +29,7 @@
         "testng",
     ],
 
-    libs: ["android.test.runner.stubs"],
+    libs: ["android.test.runner"],
     sdk_version: "test_current",
 
 }
diff --git a/tests/filesystem/Android.bp b/tests/filesystem/Android.bp
index aa7a15b..7294c91 100644
--- a/tests/filesystem/Android.bp
+++ b/tests/filesystem/Android.bp
@@ -24,7 +24,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/fragment/Android.bp b/tests/fragment/Android.bp
index d629857..ee2fdde 100644
--- a/tests/fragment/Android.bp
+++ b/tests/fragment/Android.bp
@@ -31,14 +31,13 @@
         "compatibility-device-util-axt",
         "ctstestrunner-axt",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
 
     srcs: ["src/**/*.java"],
 
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/tests/fragment/sdk26/Android.bp b/tests/fragment/sdk26/Android.bp
index c6f2b58..69ac907 100644
--- a/tests/fragment/sdk26/Android.bp
+++ b/tests/fragment/sdk26/Android.bp
@@ -27,7 +27,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/tests/framework/Android.mk b/tests/framework/Android.mk
deleted file mode 100644
index 178cb8a..0000000
--- a/tests/framework/Android.mk
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-include $(call all-subdir-makefiles)
diff --git a/tests/framework/base/Android.mk b/tests/framework/base/Android.mk
deleted file mode 100644
index 178cb8a..0000000
--- a/tests/framework/base/Android.mk
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-include $(call all-subdir-makefiles)
diff --git a/tests/framework/base/windowmanager/Android.mk b/tests/framework/base/windowmanager/Android.mk
index ef6a95e..8a7f090 100644
--- a/tests/framework/base/windowmanager/Android.mk
+++ b/tests/framework/base/windowmanager/Android.mk
@@ -44,7 +44,7 @@
     CtsMockInputMethodLib \
     metrics-helper-lib \
 
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_SDK_VERSION := test_current
 
diff --git a/tests/framework/base/windowmanager/AndroidManifest.xml b/tests/framework/base/windowmanager/AndroidManifest.xml
index aabcc6b..ca0ea74 100644
--- a/tests/framework/base/windowmanager/AndroidManifest.xml
+++ b/tests/framework/base/windowmanager/AndroidManifest.xml
@@ -421,6 +421,10 @@
 
         <activity android:name="android.server.wm.ForceRelayoutTestBase$TestActivity"
                   android:exported="true" />
+
+        <activity android:name="android.server.wm.ActivityTransitionTests$LauncherActivity"/>
+
+        <activity android:name="android.server.wm.ActivityTransitionTests$TransitionActivity"/>
     </application>
 
     <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
diff --git a/tests/framework/base/windowmanager/AndroidTest.xml b/tests/framework/base/windowmanager/AndroidTest.xml
index 9425c2d..247a7ce 100644
--- a/tests/framework/base/windowmanager/AndroidTest.xml
+++ b/tests/framework/base/windowmanager/AndroidTest.xml
@@ -55,6 +55,13 @@
         <option name="teardown-command"
                 value="settings put secure android.car.ENABLE_INITIAL_NOTICE_SCREEN_TO_USER 1" />
     </target_preparer>
+
+    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
+      <!-- Disable hidden API checking, see b/166236554 -->
+        <option name="run-command" value="settings put global hidden_api_policy 1" />
+        <option name="teardown-command" value="settings delete global hidden_api_policy" />
+    </target_preparer>
+
     <test class="com.android.tradefed.testtype.AndroidJUnitTest">
         <option name="package" value="android.server.wm.cts"/>
         <option name="runtime-hint" value="1h"/>
diff --git a/tests/framework/base/windowmanager/alertwindowapp/Android.bp b/tests/framework/base/windowmanager/alertwindowapp/Android.bp
index 07069de..f264f40 100644
--- a/tests/framework/base/windowmanager/alertwindowapp/Android.bp
+++ b/tests/framework/base/windowmanager/alertwindowapp/Android.bp
@@ -27,7 +27,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/framework/base/windowmanager/alertwindowappsdk25/Android.bp b/tests/framework/base/windowmanager/alertwindowappsdk25/Android.bp
index e7cbcdb..62fa41c 100644
--- a/tests/framework/base/windowmanager/alertwindowappsdk25/Android.bp
+++ b/tests/framework/base/windowmanager/alertwindowappsdk25/Android.bp
@@ -29,7 +29,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/framework/base/windowmanager/alertwindowservice/Android.bp b/tests/framework/base/windowmanager/alertwindowservice/Android.bp
index 58d8688..82eeadb 100644
--- a/tests/framework/base/windowmanager/alertwindowservice/Android.bp
+++ b/tests/framework/base/windowmanager/alertwindowservice/Android.bp
@@ -25,7 +25,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/tests/framework/base/windowmanager/app/Android.bp b/tests/framework/base/windowmanager/app/Android.bp
index b12f93b..0af9f75 100644
--- a/tests/framework/base/windowmanager/app/Android.bp
+++ b/tests/framework/base/windowmanager/app/Android.bp
@@ -31,7 +31,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/framework/base/windowmanager/app/AndroidManifest.xml b/tests/framework/base/windowmanager/app/AndroidManifest.xml
index e17658a..ff8bb8a 100755
--- a/tests/framework/base/windowmanager/app/AndroidManifest.xml
+++ b/tests/framework/base/windowmanager/app/AndroidManifest.xml
@@ -267,6 +267,22 @@
                   android:exported="true"
                   android:theme="@style/TranslucentTheme"
         />
+        <activity android:name=".TopNonResizableActivity"
+                  android:exported="true"
+                  android:resizeableActivity="false"
+                  android:theme="@style/NoPreview"
+        />
+        <activity android:name=".BottomNonResizableActivity"
+                  android:exported="true"
+                  android:resizeableActivity="false"
+                  android:theme="@style/NoPreview"
+        />
+        <activity android:name=".TranslucentTopNonResizableActivity"
+                  android:process=".top_process"
+                  android:exported="true"
+                  android:resizeableActivity="false"
+                  android:theme="@style/TranslucentTheme"
+        />
         <!-- An animation test with an explicitly opaque theme, overriding device defaults, as the
              animation background being tested is not used in translucent activities. -->
         <activity android:name=".AnimationTestActivity"
diff --git a/tests/framework/base/windowmanager/app/src/android/server/wm/app/AssistantActivity.java b/tests/framework/base/windowmanager/app/src/android/server/wm/app/AssistantActivity.java
index 4a1a9a0..82c3770 100644
--- a/tests/framework/base/windowmanager/app/src/android/server/wm/app/AssistantActivity.java
+++ b/tests/framework/base/windowmanager/app/src/android/server/wm/app/AssistantActivity.java
@@ -17,6 +17,7 @@
 package android.server.wm.app;
 
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
 import static android.server.wm.app.Components.AssistantActivity.EXTRA_ASSISTANT_DISPLAY_ID;
@@ -46,14 +47,13 @@
             final Intent launchIntent = new Intent();
             launchIntent.setComponent(launchActivity)
                     .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+            final ActivityOptions activityOptions = ActivityOptions.makeBasic();
+            activityOptions.setLaunchWindowingMode(WINDOWING_MODE_FULLSCREEN);
             if (getIntent().hasExtra(EXTRA_ASSISTANT_DISPLAY_ID)) {
-                ActivityOptions displayOptions = ActivityOptions.makeBasic();
-                displayOptions.setLaunchDisplayId(Integer.parseInt(getIntent()
+                activityOptions.setLaunchDisplayId(Integer.parseInt(getIntent()
                         .getStringExtra(EXTRA_ASSISTANT_DISPLAY_ID)));
-                startActivity(launchIntent, displayOptions.toBundle());
-            } else {
-                startActivity(launchIntent);
             }
+            startActivity(launchIntent, activityOptions.toBundle());
         }
 
         // Enter pip if requested
@@ -84,6 +84,7 @@
 
         final ActivityOptions options = ActivityOptions.makeBasic();
         options.setLaunchActivityType(ACTIVITY_TYPE_ASSISTANT);
+        options.setLaunchWindowingMode(WINDOWING_MODE_FULLSCREEN);
         caller.startActivity(intent, options.toBundle());
     }
 }
diff --git a/tests/framework/base/windowmanager/app/src/android/server/wm/app/BottomNonResizableActivity.java b/tests/framework/base/windowmanager/app/src/android/server/wm/app/BottomNonResizableActivity.java
new file mode 100644
index 0000000..187beec
--- /dev/null
+++ b/tests/framework/base/windowmanager/app/src/android/server/wm/app/BottomNonResizableActivity.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2020 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.server.wm.app;
+
+public class BottomNonResizableActivity extends BottomActivity {
+}
diff --git a/tests/framework/base/windowmanager/app/src/android/server/wm/app/Components.java b/tests/framework/base/windowmanager/app/src/android/server/wm/app/Components.java
index 108e034..cc7ed6d 100644
--- a/tests/framework/base/windowmanager/app/src/android/server/wm/app/Components.java
+++ b/tests/framework/base/windowmanager/app/src/android/server/wm/app/Components.java
@@ -27,6 +27,7 @@
     public static final ComponentName ANIMATION_TEST_ACTIVITY = component("AnimationTestActivity");
     public static final ComponentName ASSISTANT_ACTIVITY = component("AssistantActivity");
     public static final ComponentName BOTTOM_ACTIVITY = component("BottomActivity");
+    public static final ComponentName BOTTOM_NON_RESIZABLE_ACTIVITY = component("BottomNonResizableActivity");
     public static final ComponentName BOTTOM_LEFT_LAYOUT_ACTIVITY =
             component("BottomLeftLayoutActivity");
     public static final ComponentName BOTTOM_RIGHT_LAYOUT_ACTIVITY =
@@ -127,6 +128,7 @@
     public static final ComponentName TEST_ACTIVITY = component("TestActivity");
     public static final ComponentName TOAST_ACTIVITY = component("ToastActivity");
     public static final ComponentName TOP_ACTIVITY = component("TopActivity");
+    public static final ComponentName TOP_NON_RESIZABLE_ACTIVITY = component("TopNonResizableActivity");
     public static final ComponentName TEST_ACTIVITY_WITH_SAME_AFFINITY =
             component("TestActivityWithSameAffinity");
     public static final ComponentName TEST_LIVE_WALLPAPER_SERVICE = component("LiveWallpaper");
@@ -138,6 +140,8 @@
             component("TranslucentAssistantActivity");
     public static final ComponentName TRANSLUCENT_TOP_ACTIVITY =
             component("TranslucentTopActivity");
+    public static final ComponentName TRANSLUCENT_TOP_NON_RESIZABLE_ACTIVITY =
+        component("TranslucentTopNonResizableActivity");
     public static final ComponentName TRANSLUCENT_TEST_ACTIVITY =
             component("TranslucentTestActivity");
     public static final ComponentName TURN_SCREEN_ON_ACTIVITY = component("TurnScreenOnActivity");
diff --git a/tests/framework/base/windowmanager/app/src/android/server/wm/app/TopNonResizableActivity.java b/tests/framework/base/windowmanager/app/src/android/server/wm/app/TopNonResizableActivity.java
new file mode 100644
index 0000000..07bb613
--- /dev/null
+++ b/tests/framework/base/windowmanager/app/src/android/server/wm/app/TopNonResizableActivity.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2020 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.server.wm.app;
+
+public class TopNonResizableActivity extends TopActivity {
+}
\ No newline at end of file
diff --git a/tests/framework/base/windowmanager/app/src/android/server/wm/app/TranslucentAssistantActivity.java b/tests/framework/base/windowmanager/app/src/android/server/wm/app/TranslucentAssistantActivity.java
index 3806377..98bb6a2 100644
--- a/tests/framework/base/windowmanager/app/src/android/server/wm/app/TranslucentAssistantActivity.java
+++ b/tests/framework/base/windowmanager/app/src/android/server/wm/app/TranslucentAssistantActivity.java
@@ -17,6 +17,7 @@
 package android.server.wm.app;
 
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
 
@@ -40,6 +41,7 @@
 
         final ActivityOptions options = ActivityOptions.makeBasic();
         options.setLaunchActivityType(ACTIVITY_TYPE_ASSISTANT);
+        options.setLaunchWindowingMode(WINDOWING_MODE_FULLSCREEN);
         caller.startActivity(intent, options.toBundle());
     }
 }
diff --git a/tests/framework/base/windowmanager/app/src/android/server/wm/app/TranslucentTopNonResizableActivity.java b/tests/framework/base/windowmanager/app/src/android/server/wm/app/TranslucentTopNonResizableActivity.java
new file mode 100644
index 0000000..b92c14d
--- /dev/null
+++ b/tests/framework/base/windowmanager/app/src/android/server/wm/app/TranslucentTopNonResizableActivity.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2020 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.server.wm.app;
+
+public class TranslucentTopNonResizableActivity extends TranslucentTopActivity {
+}
\ No newline at end of file
diff --git a/tests/framework/base/windowmanager/app27/Android.bp b/tests/framework/base/windowmanager/app27/Android.bp
index 6ddf919..a9cacef 100644
--- a/tests/framework/base/windowmanager/app27/Android.bp
+++ b/tests/framework/base/windowmanager/app27/Android.bp
@@ -24,7 +24,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/framework/base/windowmanager/appAShareUid/Android.bp b/tests/framework/base/windowmanager/appAShareUid/Android.bp
index 57adfd6..96e644d 100644
--- a/tests/framework/base/windowmanager/appAShareUid/Android.bp
+++ b/tests/framework/base/windowmanager/appAShareUid/Android.bp
@@ -24,7 +24,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/framework/base/windowmanager/appBShareUid/Android.bp b/tests/framework/base/windowmanager/appBShareUid/Android.bp
index ec15e80..01513e3 100644
--- a/tests/framework/base/windowmanager/appBShareUid/Android.bp
+++ b/tests/framework/base/windowmanager/appBShareUid/Android.bp
@@ -24,7 +24,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/framework/base/windowmanager/appDeprecatedSdk/Android.bp b/tests/framework/base/windowmanager/appDeprecatedSdk/Android.bp
index c83b44f..756bbc9 100644
--- a/tests/framework/base/windowmanager/appDeprecatedSdk/Android.bp
+++ b/tests/framework/base/windowmanager/appDeprecatedSdk/Android.bp
@@ -24,7 +24,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/framework/base/windowmanager/appDisplaySize/Android.bp b/tests/framework/base/windowmanager/appDisplaySize/Android.bp
index 819a9bf..b4e6a4a 100644
--- a/tests/framework/base/windowmanager/appDisplaySize/Android.bp
+++ b/tests/framework/base/windowmanager/appDisplaySize/Android.bp
@@ -24,7 +24,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/framework/base/windowmanager/appPrereleaseSdk/Android.bp b/tests/framework/base/windowmanager/appPrereleaseSdk/Android.bp
index d110d19..eab5460 100644
--- a/tests/framework/base/windowmanager/appPrereleaseSdk/Android.bp
+++ b/tests/framework/base/windowmanager/appPrereleaseSdk/Android.bp
@@ -22,7 +22,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/framework/base/windowmanager/appProfileable/Android.bp b/tests/framework/base/windowmanager/appProfileable/Android.bp
index cd54094..177062a 100644
--- a/tests/framework/base/windowmanager/appProfileable/Android.bp
+++ b/tests/framework/base/windowmanager/appProfileable/Android.bp
@@ -24,7 +24,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/framework/base/windowmanager/appSecondUid/Android.bp b/tests/framework/base/windowmanager/appSecondUid/Android.bp
index 5f44f5c..9d2aab6 100644
--- a/tests/framework/base/windowmanager/appSecondUid/Android.bp
+++ b/tests/framework/base/windowmanager/appSecondUid/Android.bp
@@ -24,7 +24,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/framework/base/windowmanager/appThirdUid/Android.bp b/tests/framework/base/windowmanager/appThirdUid/Android.bp
index 08a878c..c333a56 100644
--- a/tests/framework/base/windowmanager/appThirdUid/Android.bp
+++ b/tests/framework/base/windowmanager/appThirdUid/Android.bp
@@ -24,7 +24,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/framework/base/windowmanager/backgroundactivity/Android.bp b/tests/framework/base/windowmanager/backgroundactivity/Android.bp
index ca4b0ed..8b4e970 100644
--- a/tests/framework/base/windowmanager/backgroundactivity/Android.bp
+++ b/tests/framework/base/windowmanager/backgroundactivity/Android.bp
@@ -32,7 +32,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/framework/base/windowmanager/backgroundactivity/AppA/Android.bp b/tests/framework/base/windowmanager/backgroundactivity/AppA/Android.bp
index a5153de..47e56e5 100644
--- a/tests/framework/base/windowmanager/backgroundactivity/AppA/Android.bp
+++ b/tests/framework/base/windowmanager/backgroundactivity/AppA/Android.bp
@@ -27,7 +27,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/tests/framework/base/windowmanager/backgroundactivity/AppB/Android.bp b/tests/framework/base/windowmanager/backgroundactivity/AppB/Android.bp
index 7c10622..b2482b3 100644
--- a/tests/framework/base/windowmanager/backgroundactivity/AppB/Android.bp
+++ b/tests/framework/base/windowmanager/backgroundactivity/AppB/Android.bp
@@ -27,7 +27,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/tests/framework/base/windowmanager/dndsourceapp/Android.bp b/tests/framework/base/windowmanager/dndsourceapp/Android.bp
index 7abd478..4f7734d 100644
--- a/tests/framework/base/windowmanager/dndsourceapp/Android.bp
+++ b/tests/framework/base/windowmanager/dndsourceapp/Android.bp
@@ -24,7 +24,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/framework/base/windowmanager/dndtargetapp/Android.bp b/tests/framework/base/windowmanager/dndtargetapp/Android.bp
index 00b4055..bf7372b 100644
--- a/tests/framework/base/windowmanager/dndtargetapp/Android.bp
+++ b/tests/framework/base/windowmanager/dndtargetapp/Android.bp
@@ -22,7 +22,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/tests/framework/base/windowmanager/dndtargetappsdk23/Android.bp b/tests/framework/base/windowmanager/dndtargetappsdk23/Android.bp
index 13dbca2..b658c2a 100644
--- a/tests/framework/base/windowmanager/dndtargetappsdk23/Android.bp
+++ b/tests/framework/base/windowmanager/dndtargetappsdk23/Android.bp
@@ -22,7 +22,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/tests/framework/base/windowmanager/jetpack/Android.bp b/tests/framework/base/windowmanager/jetpack/Android.bp
index f0cc7cc..ec0c189 100644
--- a/tests/framework/base/windowmanager/jetpack/Android.bp
+++ b/tests/framework/base/windowmanager/jetpack/Android.bp
@@ -42,6 +42,21 @@
     installable: false,
 }
 
+java_library {
+    name: "cts_window_jetpack_utils",
+    srcs: [
+        "src/android/server/wm/jetpack/utils/**/*.java"
+    ],
+    static_libs: [
+        "compatibility-device-util-axt",
+    ],
+    libs: [
+        "cts_window-extensions",
+        "cts_window-sidecar",
+    ],
+    sdk_version: "test_current",
+}
+
 android_test {
     name: "CtsWindowManagerJetpackTestCases",
     defaults: ["cts_defaults"],
@@ -54,14 +69,13 @@
         "platform-test-annotations",
     ],
     libs: [
-        "android.test.base.stubs",
+        "android.test.base",
         "cts_window-extensions",
         "cts_window-sidecar",
     ],
     test_suites: [
         "cts",
         "vts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/ExtensionTest.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/ExtensionTest.java
index 0686443..2552686 100644
--- a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/ExtensionTest.java
+++ b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/ExtensionTest.java
@@ -16,7 +16,7 @@
 
 package android.server.wm.jetpack;
 
-import static android.server.wm.jetpack.ExtensionUtils.assertEqualsState;
+import static android.server.wm.jetpack.utils.ExtensionUtils.assertEqualsState;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -26,10 +26,11 @@
 import android.content.pm.ActivityInfo;
 import android.graphics.Rect;
 import android.os.IBinder;
-import android.server.wm.jetpack.wrapper.TestDeviceState;
-import android.server.wm.jetpack.wrapper.TestDisplayFeature;
-import android.server.wm.jetpack.wrapper.TestInterfaceCompat;
-import android.server.wm.jetpack.wrapper.TestWindowLayoutInfo;
+import android.server.wm.jetpack.utils.ExtensionUtils;
+import android.server.wm.jetpack.utils.wrapper.TestDeviceState;
+import android.server.wm.jetpack.utils.wrapper.TestDisplayFeature;
+import android.server.wm.jetpack.utils.wrapper.TestInterfaceCompat;
+import android.server.wm.jetpack.utils.wrapper.TestWindowLayoutInfo;
 
 import androidx.annotation.NonNull;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/ExtensionUtils.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/ExtensionUtils.java
deleted file mode 100644
index 1aef84e..0000000
--- a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/ExtensionUtils.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2020 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.server.wm.jetpack;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.junit.Assume.assumeFalse;
-
-import android.content.Context;
-import android.server.wm.jetpack.wrapper.TestDeviceState;
-import android.server.wm.jetpack.wrapper.extensionwrapperimpl.TestExtensionCompat;
-import android.server.wm.jetpack.wrapper.sidecarwrapperimpl.TestSidecarCompat;
-import android.server.wm.jetpack.wrapper.TestInterfaceCompat;
-import android.server.wm.jetpack.wrapper.sidecarwrapperimpl.TestSidecarDeviceState;
-import android.text.TextUtils;
-import android.util.Log;
-
-import androidx.annotation.Nullable;
-import androidx.window.extensions.ExtensionProvider;
-import androidx.window.sidecar.SidecarProvider;
-
-/** Helper class to get the vendor provided Extension/Sidecar implementation. */
-final class ExtensionUtils {
-    private static final String TAG = "TestInterfaceProvider";
-
-    /** Skips devices that don't implement the wm extension library. */
-    static void assumeSupportedDevice(Context context) {
-        assumeFalse(TextUtils.isEmpty(getVersion()) && getInterfaceCompat(context) == null);
-    }
-
-    /** Asserts that the vendor provided version is in the correct format and range. */
-    static void assertValidVersion() {
-        if (getExtensionVersion() != null) {
-            String versionStr = getExtensionVersion();
-            assertThat(Version.isValidVersion(versionStr)).isTrue();
-            assertThat(Version.parse(versionStr)).isAtLeast(Version.VERSION_1_0);
-        } else if (getSidecarVersion() != null) {
-            String versionStr = getSidecarVersion();
-            assertThat(Version.isValidVersion(versionStr)).isTrue();
-            assertThat(Version.parse(versionStr)).isEqualTo(Version.VERSION_0_1);
-        }
-    }
-
-    static void assertEqualsState(TestDeviceState left, TestDeviceState right) {
-        if (left instanceof TestSidecarDeviceState && right instanceof TestSidecarDeviceState) {
-            assertThat(left.getPosture()).isEqualTo(right.getPosture());
-        } else {
-            assertThat(left).isEqualTo(right);
-        }
-    }
-
-    /**
-     * Gets the vendor provided Extension implementation if available. If not available, gets the
-     * Sidecar implementation (deprecated). If neither is available, returns {@code null}.
-     */
-    @Nullable
-    static TestInterfaceCompat getInterfaceCompat(Context context) {
-        // TODO(b/158876142) Reinstate android.window.extension
-        if (!TextUtils.isEmpty(getSidecarVersion())) {
-            return getSidecarInterfaceCompat(context);
-        }
-        return null;
-    }
-
-    @Nullable
-    private static String getVersion() {
-        if (!TextUtils.isEmpty(getExtensionVersion())) {
-            return getExtensionVersion();
-        } else if (!TextUtils.isEmpty(getSidecarVersion())) {
-            return getSidecarVersion();
-        }
-        return null;
-    }
-
-    @Nullable
-    private static String getExtensionVersion() {
-        try {
-            return ExtensionProvider.getApiVersion();
-        } catch (NoClassDefFoundError e) {
-            Log.d(TAG, "Extension version not found");
-            return null;
-        } catch (UnsupportedOperationException e) {
-            Log.d(TAG, "Stub Extension");
-            return null;
-        }
-    }
-
-    @Nullable
-    private static TestExtensionCompat getExtensionInterfaceCompat(Context context) {
-        try {
-            return TestExtensionCompat.create(ExtensionProvider.getExtensionImpl(context));
-        } catch (NoClassDefFoundError e) {
-            Log.d(TAG, "Extension implementation not found");
-            return null;
-        } catch (UnsupportedOperationException e) {
-            Log.d(TAG, "Stub Extension");
-            return null;
-        }
-    }
-
-    @SuppressWarnings("deprecation")
-    @Nullable
-    private static String getSidecarVersion() {
-        try {
-            return SidecarProvider.getApiVersion();
-        } catch (NoClassDefFoundError e) {
-            Log.d(TAG, "Sidecar version not found");
-            return null;
-        } catch (UnsupportedOperationException e) {
-            Log.d(TAG, "Stub Sidecar");
-            return null;
-        }
-    }
-
-    @SuppressWarnings("deprecation")
-    @Nullable
-    private static TestSidecarCompat getSidecarInterfaceCompat(Context context) {
-        try {
-            return TestSidecarCompat.create(SidecarProvider.getSidecarImpl(context));
-        } catch (NoClassDefFoundError e) {
-            Log.d(TAG, "Sidecar implementation not found");
-            return null;
-        } catch (UnsupportedOperationException e) {
-            Log.d(TAG, "Stub Sidecar");
-            return null;
-        }
-    }
-
-    private ExtensionUtils() {}
-}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/TestGetWindowLayoutInfoActivity.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/TestGetWindowLayoutInfoActivity.java
index e9f6c66..679dba6 100644
--- a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/TestGetWindowLayoutInfoActivity.java
+++ b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/TestGetWindowLayoutInfoActivity.java
@@ -22,16 +22,17 @@
 
 import android.os.Bundle;
 import android.os.IBinder;
-import android.server.wm.jetpack.wrapper.TestInterfaceCompat;
-import android.server.wm.jetpack.wrapper.TestWindowLayoutInfo;
+import android.server.wm.jetpack.utils.ExtensionUtils;
+import android.server.wm.jetpack.utils.wrapper.TestInterfaceCompat;
+import android.server.wm.jetpack.utils.wrapper.TestWindowLayoutInfo;
 import android.view.View;
 
 import androidx.annotation.Nullable;
 
 /**
  * Activity that can verify the return value of
- * {@link android.server.wm.jetpack.wrapper.TestInterfaceCompat#getWindowLayoutInfo(IBinder)} on
- * activity's different states.
+ * {@link android.server.wm.jetpack.utils.wrapper.TestInterfaceCompat#getWindowLayoutInfo(IBinder)}
+ * on activity's different states.
  */
 public class TestGetWindowLayoutInfoActivity extends TestActivity {
 
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/Version.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/Version.java
deleted file mode 100644
index a9978c0..0000000
--- a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/Version.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2020 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.server.wm.jetpack;
-
-import android.text.TextUtils;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import java.math.BigInteger;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-
-/**
- * Class encapsulating a version with major, minor, patch and description values. Copied from
- * androidx.window.Version.
- */
-final class Version implements Comparable<Version> {
-    static final Version UNKNOWN = new Version(0, 0, 0, "");
-    static final Version VERSION_0_1 = new Version(0, 1, 0, "");
-    static final Version VERSION_1_0 = new Version(1, 0, 0, "");
-    static final Version CURRENT = VERSION_1_0;
-
-    private static final String VERSION_PATTERN_STRING =
-            "(\\d+)(?:\\.(\\d+))(?:\\.(\\d+))(?:-(.+))?";
-
-    private final int mMajor;
-    private final int mMinor;
-    private final int mPatch;
-    private final String mDescription;
-    // Cached BigInteger value of the version.
-    private BigInteger mBigInteger;
-
-    private Version(int major, int minor, int patch, String description) {
-        mMajor = major;
-        mMinor = minor;
-        mPatch = patch;
-        mDescription = description;
-    }
-
-    /**
-     * Parses a string to a version object.
-     *
-     * @param versionString string in the format "1.2.3" or "1.2.3-Description"
-     *                      (major.minor.patch[-description])
-     * @return the parsed Version object or {@code null}> if the versionString format is invalid.
-     */
-    @Nullable
-    static Version parse(String versionString) {
-        if (TextUtils.isEmpty(versionString)) {
-            return null;
-        }
-
-        Matcher matcher = Pattern.compile(VERSION_PATTERN_STRING).matcher(versionString);
-        if (!matcher.matches()) {
-            return null;
-        }
-
-        int major = Integer.parseInt(matcher.group(1));
-        int minor = Integer.parseInt(matcher.group(2));
-        int patch = Integer.parseInt(matcher.group(3));
-        String description = matcher.group(4) != null ? matcher.group(4) : "";
-        return new Version(major, minor, patch, description);
-    }
-
-    /** Checks whether the version is in the correct format. */
-    static boolean isValidVersion(String versionString) {
-        Matcher matcher = Pattern.compile(VERSION_PATTERN_STRING).matcher(versionString);
-        return matcher.matches();
-    }
-
-    int getMajor() {
-        return mMajor;
-    }
-
-    int getMinor() {
-        return mMinor;
-    }
-
-    int getPatch() {
-        return mPatch;
-    }
-
-    String getDescription() {
-        return mDescription;
-    }
-
-    @NonNull
-    @Override
-    public String toString() {
-        final StringBuilder sb = new StringBuilder(getMajor())
-                .append(".")
-                .append(getMinor())
-                .append(".")
-                .append(getPatch());
-        if (!TextUtils.isEmpty(getDescription())) {
-            sb.append("-").append(getDescription());
-        }
-        return sb.toString();
-    }
-
-    /**
-     * To compare the major, minor and patch version with another.
-     *
-     * @param other The version to compare to this one.
-     * @return 0 if it have the same major minor and patch version; less than 0 if this version
-     * sorts ahead of <var>other</var>; greater than 0 if this version sorts after <var>other</var>.
-     */
-    @Override
-    public int compareTo(@NonNull Version other) {
-        return toBigInteger().compareTo(other.toBigInteger());
-    }
-
-    @NonNull
-    private BigInteger toBigInteger() {
-        if (mBigInteger == null) {
-            mBigInteger = BigInteger.valueOf(mMajor)
-                    .shiftLeft(32)
-                    .or(BigInteger.valueOf(mMinor))
-                    .shiftLeft(32)
-                    .or(BigInteger.valueOf(mPatch));
-        }
-        return mBigInteger;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (!(obj instanceof Version)) {
-            return false;
-        }
-
-        Version otherVersionObj = (Version) obj;
-
-        // The equals checking ignores the description.
-        return mMajor == otherVersionObj.mMajor
-                && mMinor == otherVersionObj.mMinor
-                && mPatch == otherVersionObj.mPatch;
-    }
-
-    @Override
-    public int hashCode() {
-        // The hash code ignores the description.
-        int result = 17;
-        result = result * 31 + mMajor;
-        result = result * 31 + mMinor;
-        result = result * 31 + mPatch;
-        return result;
-    }
-}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/ExtensionUtils.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/ExtensionUtils.java
new file mode 100644
index 0000000..987cf26
--- /dev/null
+++ b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/ExtensionUtils.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2020 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.server.wm.jetpack.utils;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assume.assumeFalse;
+
+import android.content.Context;
+import android.server.wm.jetpack.utils.wrapper.TestDeviceState;
+import android.server.wm.jetpack.utils.wrapper.extensionwrapperimpl.TestExtensionCompat;
+import android.server.wm.jetpack.utils.wrapper.sidecarwrapperimpl.TestSidecarCompat;
+import android.server.wm.jetpack.utils.wrapper.TestInterfaceCompat;
+import android.server.wm.jetpack.utils.wrapper.sidecarwrapperimpl.TestSidecarDeviceState;
+import android.text.TextUtils;
+import android.util.Log;
+
+import androidx.annotation.Nullable;
+import androidx.window.extensions.ExtensionProvider;
+import androidx.window.sidecar.SidecarProvider;
+
+/** Helper class to get the vendor provided Extension/Sidecar implementation. */
+public final class ExtensionUtils {
+    private static final String TAG = "TestInterfaceProvider";
+
+    /** Skips devices that don't implement the wm extension library. */
+    public static void assumeSupportedDevice(Context context) {
+        assumeFalse(TextUtils.isEmpty(getVersion()) && getInterfaceCompat(context) == null);
+    }
+
+    /** Asserts that the vendor provided version is in the correct format and range. */
+    public static void assertValidVersion() {
+        if (getExtensionVersion() != null) {
+            String versionStr = getExtensionVersion();
+            assertThat(Version.isValidVersion(versionStr)).isTrue();
+            assertThat(Version.parse(versionStr)).isAtLeast(Version.VERSION_1_0);
+        } else if (getSidecarVersion() != null) {
+            String versionStr = getSidecarVersion();
+            assertThat(Version.isValidVersion(versionStr)).isTrue();
+            assertThat(Version.parse(versionStr)).isEqualTo(Version.VERSION_0_1);
+        }
+    }
+
+    public static void assertEqualsState(TestDeviceState left, TestDeviceState right) {
+        if (left instanceof TestSidecarDeviceState && right instanceof TestSidecarDeviceState) {
+            assertThat(left.getPosture()).isEqualTo(right.getPosture());
+        } else {
+            assertThat(left).isEqualTo(right);
+        }
+    }
+
+    /**
+     * Gets the vendor provided Extension implementation if available. If not available, gets the
+     * Sidecar implementation (deprecated). If neither is available, returns {@code null}.
+     */
+    @Nullable
+    public static TestInterfaceCompat getInterfaceCompat(Context context) {
+        // TODO(b/158876142) Reinstate android.window.extension
+        if (!TextUtils.isEmpty(getSidecarVersion())) {
+            return getSidecarInterfaceCompat(context);
+        }
+        return null;
+    }
+
+    @Nullable
+    public static String getVersion() {
+        if (!TextUtils.isEmpty(getExtensionVersion())) {
+            return getExtensionVersion();
+        } else if (!TextUtils.isEmpty(getSidecarVersion())) {
+            return getSidecarVersion();
+        }
+        return null;
+    }
+
+    @Nullable
+    private static String getExtensionVersion() {
+        try {
+            return ExtensionProvider.getApiVersion();
+        } catch (NoClassDefFoundError e) {
+            Log.d(TAG, "Extension version not found");
+            return null;
+        } catch (UnsupportedOperationException e) {
+            Log.d(TAG, "Stub Extension");
+            return null;
+        }
+    }
+
+    @Nullable
+    private static TestExtensionCompat getExtensionInterfaceCompat(Context context) {
+        try {
+            return TestExtensionCompat.create(ExtensionProvider.getExtensionImpl(context));
+        } catch (NoClassDefFoundError e) {
+            Log.d(TAG, "Extension implementation not found");
+            return null;
+        } catch (UnsupportedOperationException e) {
+            Log.d(TAG, "Stub Extension");
+            return null;
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    @Nullable
+    private static String getSidecarVersion() {
+        try {
+            return SidecarProvider.getApiVersion();
+        } catch (NoClassDefFoundError e) {
+            Log.d(TAG, "Sidecar version not found");
+            return null;
+        } catch (UnsupportedOperationException e) {
+            Log.d(TAG, "Stub Sidecar");
+            return null;
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    @Nullable
+    private static TestSidecarCompat getSidecarInterfaceCompat(Context context) {
+        try {
+            return TestSidecarCompat.create(SidecarProvider.getSidecarImpl(context));
+        } catch (NoClassDefFoundError e) {
+            Log.d(TAG, "Sidecar implementation not found");
+            return null;
+        } catch (UnsupportedOperationException e) {
+            Log.d(TAG, "Stub Sidecar");
+            return null;
+        }
+    }
+
+    private ExtensionUtils() {}
+}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/Version.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/Version.java
new file mode 100644
index 0000000..c95f090
--- /dev/null
+++ b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/Version.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2020 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.server.wm.jetpack.utils;
+
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import java.math.BigInteger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+
+/**
+ * Class encapsulating a version with major, minor, patch and description values. Copied from
+ * androidx.window.Version.
+ */
+final class Version implements Comparable<Version> {
+    static final Version UNKNOWN = new Version(0, 0, 0, "");
+    static final Version VERSION_0_1 = new Version(0, 1, 0, "");
+    static final Version VERSION_1_0 = new Version(1, 0, 0, "");
+    static final Version CURRENT = VERSION_1_0;
+
+    private static final String VERSION_PATTERN_STRING =
+            "(\\d+)(?:\\.(\\d+))(?:\\.(\\d+))(?:-(.+))?";
+
+    private final int mMajor;
+    private final int mMinor;
+    private final int mPatch;
+    private final String mDescription;
+    // Cached BigInteger value of the version.
+    private BigInteger mBigInteger;
+
+    private Version(int major, int minor, int patch, String description) {
+        mMajor = major;
+        mMinor = minor;
+        mPatch = patch;
+        mDescription = description;
+    }
+
+    /**
+     * Parses a string to a version object.
+     *
+     * @param versionString string in the format "1.2.3" or "1.2.3-Description"
+     *                      (major.minor.patch[-description])
+     * @return the parsed Version object or {@code null}> if the versionString format is invalid.
+     */
+    @Nullable
+    static Version parse(String versionString) {
+        if (TextUtils.isEmpty(versionString)) {
+            return null;
+        }
+
+        Matcher matcher = Pattern.compile(VERSION_PATTERN_STRING).matcher(versionString);
+        if (!matcher.matches()) {
+            return null;
+        }
+
+        int major = Integer.parseInt(matcher.group(1));
+        int minor = Integer.parseInt(matcher.group(2));
+        int patch = Integer.parseInt(matcher.group(3));
+        String description = matcher.group(4) != null ? matcher.group(4) : "";
+        return new Version(major, minor, patch, description);
+    }
+
+    /** Checks whether the version is in the correct format. */
+    static boolean isValidVersion(String versionString) {
+        Matcher matcher = Pattern.compile(VERSION_PATTERN_STRING).matcher(versionString);
+        return matcher.matches();
+    }
+
+    int getMajor() {
+        return mMajor;
+    }
+
+    int getMinor() {
+        return mMinor;
+    }
+
+    int getPatch() {
+        return mPatch;
+    }
+
+    String getDescription() {
+        return mDescription;
+    }
+
+    @NonNull
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder(getMajor())
+                .append(".")
+                .append(getMinor())
+                .append(".")
+                .append(getPatch());
+        if (!TextUtils.isEmpty(getDescription())) {
+            sb.append("-").append(getDescription());
+        }
+        return sb.toString();
+    }
+
+    /**
+     * To compare the major, minor and patch version with another.
+     *
+     * @param other The version to compare to this one.
+     * @return 0 if it have the same major minor and patch version; less than 0 if this version
+     * sorts ahead of <var>other</var>; greater than 0 if this version sorts after <var>other</var>.
+     */
+    @Override
+    public int compareTo(@NonNull Version other) {
+        return toBigInteger().compareTo(other.toBigInteger());
+    }
+
+    @NonNull
+    private BigInteger toBigInteger() {
+        if (mBigInteger == null) {
+            mBigInteger = BigInteger.valueOf(mMajor)
+                    .shiftLeft(32)
+                    .or(BigInteger.valueOf(mMinor))
+                    .shiftLeft(32)
+                    .or(BigInteger.valueOf(mPatch));
+        }
+        return mBigInteger;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (!(obj instanceof Version)) {
+            return false;
+        }
+
+        Version otherVersionObj = (Version) obj;
+
+        // The equals checking ignores the description.
+        return mMajor == otherVersionObj.mMajor
+                && mMinor == otherVersionObj.mMinor
+                && mPatch == otherVersionObj.mPatch;
+    }
+
+    @Override
+    public int hashCode() {
+        // The hash code ignores the description.
+        int result = 17;
+        result = result * 31 + mMajor;
+        result = result * 31 + mMinor;
+        result = result * 31 + mPatch;
+        return result;
+    }
+}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/TestDeviceState.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/TestDeviceState.java
new file mode 100644
index 0000000..7b4e386
--- /dev/null
+++ b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/TestDeviceState.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2020 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.server.wm.jetpack.utils.wrapper;
+
+import androidx.annotation.IntDef;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Test interface for {@link androidx.window.extensions.ExtensionDeviceState} and
+ * {@link androidx.window.sidecar.SidecarDeviceState} that serves as an API compatibility wrapper.
+ *
+ * @see android.server.wm.jetpack.utils.wrapper.extensionwrapperimpl.TestExtensionDeviceState
+ * @see android.server.wm.jetpack.utils.wrapper.sidecarwrapperimpl.TestSidecarDeviceState
+ */
+public interface TestDeviceState {
+
+    /** Copied from {@link androidx.window.extensions.ExtensionDeviceState}. */
+    int POSTURE_UNKNOWN = 0;
+    int POSTURE_CLOSED = 1;
+    int POSTURE_HALF_OPENED = 2;
+    int POSTURE_OPENED = 3;
+    int POSTURE_FLIPPED = 4;
+
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({
+            POSTURE_UNKNOWN,
+            POSTURE_CLOSED,
+            POSTURE_HALF_OPENED,
+            POSTURE_OPENED,
+            POSTURE_FLIPPED
+    })
+    @interface Posture{}
+
+    /** Gets the current posture of the foldable device. */
+    @Posture
+    int getPosture();
+}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/TestDisplayFeature.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/TestDisplayFeature.java
new file mode 100644
index 0000000..c31c2be
--- /dev/null
+++ b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/TestDisplayFeature.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2020 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.server.wm.jetpack.utils.wrapper;
+
+import android.graphics.Rect;
+
+import androidx.annotation.IntDef;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Test interface for {@link androidx.window.extensions.ExtensionDisplayFeature} and
+ * {@link androidx.window.sidecar.SidecarDisplayFeature} that serves as an API compatibility
+ * wrapper.
+ *
+ * @see android.server.wm.jetpack.utils.wrapper.extensionwrapperimpl.TestExtensionDisplayFeature
+ * @see android.server.wm.jetpack.utils.wrapper.sidecarwrapperimpl.TestSidecarDisplayFeature
+ */
+public interface TestDisplayFeature {
+
+    /**
+     * A fold in the flexible screen without a physical gap.
+     */
+    int TYPE_FOLD = 1;
+
+    /**
+     * A physical separation with a hinge that allows two display panels to fold.
+     */
+    int TYPE_HINGE = 2;
+
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({
+            TYPE_FOLD,
+            TYPE_HINGE,
+    })
+    @interface Type{}
+
+    /** Gets the bounding rect of the display feature in window coordinate space. */
+    Rect getBounds();
+
+    /** Gets the type of the display feature. */
+    int getType();
+}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/TestInterfaceCompat.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/TestInterfaceCompat.java
new file mode 100644
index 0000000..8a4d516
--- /dev/null
+++ b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/TestInterfaceCompat.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2020 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.server.wm.jetpack.utils.wrapper;
+
+import android.os.IBinder;
+import android.server.wm.jetpack.utils.wrapper.extensionwrapperimpl.TestExtensionCompat;
+import android.server.wm.jetpack.utils.wrapper.sidecarwrapperimpl.TestSidecarCompat;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Test interface for {@link androidx.window.extensions.ExtensionInterface} and
+ * {@link androidx.window.sidecar.SidecarInterface} that serves as an API compatibility wrapper.
+ *
+ * @see TestExtensionCompat
+ * @see TestSidecarCompat
+ */
+public interface TestInterfaceCompat {
+
+    /**
+     * Registers the support library as the callback for the extension. This interface will be used
+     * to report all extension changes to the support library.
+     */
+    void setExtensionCallback(@NonNull TestInterfaceCallback callback);
+
+    /**
+     * Gets current information about the display features present within the application window.
+     */
+    TestWindowLayoutInfo getWindowLayoutInfo(@NonNull IBinder windowToken);
+
+    /**
+     * Notifies extension that a listener for display feature layout changes was registered for the
+     * given window token.
+     */
+    void onWindowLayoutChangeListenerAdded(@NonNull IBinder windowToken);
+
+    /**
+     * Notifies extension that a listener for display feature layout changes was removed for the
+     * given window token.
+     */
+    void onWindowLayoutChangeListenerRemoved(@NonNull IBinder windowToken);
+
+    /**
+     * Gets current device state.
+     * @see #onDeviceStateListenersChanged(boolean)
+     */
+    TestDeviceState getDeviceState();
+
+    /**
+     * Notifies the extension that a device state change listener was updated.
+     * @param isEmpty flag indicating if the list of device state change listeners is empty.
+     */
+    void onDeviceStateListenersChanged(boolean isEmpty);
+
+    /**
+     * Callback that will be registered with the WindowManager library, and that the extension
+     * should use to report all state changes.
+     */
+    interface TestInterfaceCallback {
+        /**
+         * Called by extension when the device state changes.
+         */
+        void onDeviceStateChanged(@NonNull TestDeviceState newDeviceState);
+
+        /**
+         * Called by extension when the feature layout inside the window changes.
+         */
+        void onWindowLayoutChanged(@NonNull IBinder windowToken,
+                @NonNull TestWindowLayoutInfo newLayout);
+    }
+}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/TestWindowLayoutInfo.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/TestWindowLayoutInfo.java
new file mode 100644
index 0000000..7235346
--- /dev/null
+++ b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/TestWindowLayoutInfo.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2020 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.server.wm.jetpack.utils.wrapper;
+
+import androidx.annotation.Nullable;
+
+import java.util.List;
+
+/**
+ * Test interface for {@link androidx.window.extensions.ExtensionWindowLayoutInfo} and
+ * {@link androidx.window.sidecar.SidecarWindowLayoutInfo} that serves as an API compatibility
+ * wrapper.
+ *
+ * @see android.server.wm.jetpack.utils.wrapper.extensionwrapperimpl.TestExtensionWindowLayoutInfo
+ * @see android.server.wm.jetpack.utils.wrapper.sidecarwrapperimpl.TestSidecarWindowLayoutInfo
+ */
+public interface TestWindowLayoutInfo {
+    /** Gets the list of display features present within the window. */
+    @Nullable
+    List<TestDisplayFeature> getDisplayFeatures();
+}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/extensionwrapperimpl/TestExtensionCompat.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/extensionwrapperimpl/TestExtensionCompat.java
new file mode 100644
index 0000000..e66dc39
--- /dev/null
+++ b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/extensionwrapperimpl/TestExtensionCompat.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2020 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.server.wm.jetpack.utils.wrapper.extensionwrapperimpl;
+
+import android.os.IBinder;
+import android.server.wm.jetpack.utils.wrapper.TestDeviceState;
+import android.server.wm.jetpack.utils.wrapper.TestInterfaceCompat;
+import android.server.wm.jetpack.utils.wrapper.TestWindowLayoutInfo;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.window.extensions.ExtensionDeviceState;
+import androidx.window.extensions.ExtensionInterface;
+import androidx.window.extensions.ExtensionWindowLayoutInfo;
+
+/** Compatibility wrapper for extension versions v1.0+. */
+public final class TestExtensionCompat implements TestInterfaceCompat {
+
+    @Nullable
+    public static TestExtensionCompat create(@Nullable ExtensionInterface extensionInterface) {
+        return extensionInterface == null ? null : new TestExtensionCompat(extensionInterface);
+    }
+
+    @NonNull
+    private final ExtensionInterface mExtensionInterface;
+
+    private TestExtensionCompat(@NonNull ExtensionInterface extensionInterface) {
+        mExtensionInterface = extensionInterface;
+    }
+
+    @Override
+    public void setExtensionCallback(@NonNull TestInterfaceCallback callback) {
+        mExtensionInterface.setExtensionCallback(new ExtensionInterface.ExtensionCallback() {
+            @Override
+            public void onDeviceStateChanged(@NonNull ExtensionDeviceState newDeviceState) {
+                callback.onDeviceStateChanged(TestExtensionDeviceState.create(newDeviceState));
+            }
+
+            @Override
+            public void onWindowLayoutChanged(@NonNull IBinder windowToken,
+                    @NonNull ExtensionWindowLayoutInfo newLayout) {
+                callback.onWindowLayoutChanged(
+                        windowToken,
+                        TestExtensionWindowLayoutInfo.create(newLayout));
+            }
+        });
+    }
+
+    @Override
+    public TestWindowLayoutInfo getWindowLayoutInfo(@NonNull IBinder windowToken) {
+        return TestExtensionWindowLayoutInfo.create(
+                mExtensionInterface.getWindowLayoutInfo(windowToken));
+    }
+
+    @Override
+    public void onWindowLayoutChangeListenerAdded(@NonNull IBinder windowToken) {
+        mExtensionInterface.onWindowLayoutChangeListenerAdded(windowToken);
+    }
+
+    @Override
+    public void onWindowLayoutChangeListenerRemoved(@NonNull IBinder windowToken) {
+        mExtensionInterface.onWindowLayoutChangeListenerRemoved(windowToken);
+    }
+
+    @Override
+    public TestDeviceState getDeviceState() {
+        return TestExtensionDeviceState.create(mExtensionInterface.getDeviceState());
+    }
+
+    @Override
+    public void onDeviceStateListenersChanged(boolean isEmpty) {
+        mExtensionInterface.onDeviceStateListenersChanged(isEmpty);
+    }
+}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/extensionwrapperimpl/TestExtensionDeviceState.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/extensionwrapperimpl/TestExtensionDeviceState.java
new file mode 100644
index 0000000..f764564
--- /dev/null
+++ b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/extensionwrapperimpl/TestExtensionDeviceState.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2020 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.server.wm.jetpack.utils.wrapper.extensionwrapperimpl;
+
+import android.server.wm.jetpack.utils.wrapper.TestDeviceState;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.window.extensions.ExtensionDeviceState;
+
+import com.google.common.base.Preconditions;
+
+/** Compatibility wrapper for extension versions v1.0+. */
+final class TestExtensionDeviceState implements TestDeviceState {
+
+    @Nullable
+    static TestExtensionDeviceState create(@Nullable ExtensionDeviceState extensionDeviceState) {
+        return extensionDeviceState == null
+                ? null
+                : new TestExtensionDeviceState(extensionDeviceState);
+    }
+
+    private final ExtensionDeviceState mExtensionDeviceState;
+
+    private TestExtensionDeviceState(@NonNull ExtensionDeviceState extensionDeviceState) {
+        mExtensionDeviceState = Preconditions.checkNotNull(extensionDeviceState);
+    }
+
+    @Override
+    public int getPosture() {
+        return mExtensionDeviceState.getPosture();
+    }
+
+    @NonNull
+    @Override
+    public String toString() {
+        return mExtensionDeviceState.toString();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof TestExtensionDeviceState)) {
+            return false;
+        }
+        final TestExtensionDeviceState other = (TestExtensionDeviceState) obj;
+        return mExtensionDeviceState.equals(other.mExtensionDeviceState);
+    }
+
+    @Override
+    public int hashCode() {
+        return mExtensionDeviceState.hashCode();
+    }
+}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/extensionwrapperimpl/TestExtensionDisplayFeature.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/extensionwrapperimpl/TestExtensionDisplayFeature.java
new file mode 100644
index 0000000..a0ce233
--- /dev/null
+++ b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/extensionwrapperimpl/TestExtensionDisplayFeature.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2020 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.server.wm.jetpack.utils.wrapper.extensionwrapperimpl;
+
+import android.graphics.Rect;
+import android.server.wm.jetpack.utils.wrapper.TestDisplayFeature;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.window.extensions.ExtensionDisplayFeature;
+
+/** Compatibility wrapper for extension versions v1.0+. */
+final class TestExtensionDisplayFeature implements TestDisplayFeature {
+
+    @Nullable
+    static TestExtensionDisplayFeature create(
+            @Nullable ExtensionDisplayFeature extensionDisplayFeature) {
+        return extensionDisplayFeature == null
+                ? null
+                : new TestExtensionDisplayFeature(extensionDisplayFeature);
+    }
+
+    private final ExtensionDisplayFeature mExtensionDisplayFeature;
+
+    private TestExtensionDisplayFeature(@NonNull ExtensionDisplayFeature extensionDisplayFeature) {
+        mExtensionDisplayFeature = extensionDisplayFeature;
+    }
+
+    @Override
+    public Rect getBounds() {
+        return mExtensionDisplayFeature.getBounds();
+    }
+
+    @Override
+    public int getType() {
+        return mExtensionDisplayFeature.getType();
+    }
+
+    @NonNull
+    @Override
+    public String toString() {
+        return mExtensionDisplayFeature.toString();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof TestExtensionDisplayFeature)) {
+            return false;
+        }
+        final TestExtensionDisplayFeature other = (TestExtensionDisplayFeature) obj;
+        return mExtensionDisplayFeature.equals(other.mExtensionDisplayFeature);
+    }
+
+    @Override
+    public int hashCode() {
+        return mExtensionDisplayFeature.hashCode();
+    }
+}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/extensionwrapperimpl/TestExtensionWindowLayoutInfo.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/extensionwrapperimpl/TestExtensionWindowLayoutInfo.java
new file mode 100644
index 0000000..89d5e95
--- /dev/null
+++ b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/extensionwrapperimpl/TestExtensionWindowLayoutInfo.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2020 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.server.wm.jetpack.utils.wrapper.extensionwrapperimpl;
+
+
+import android.server.wm.jetpack.utils.wrapper.TestDisplayFeature;
+import android.server.wm.jetpack.utils.wrapper.TestWindowLayoutInfo;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.window.extensions.ExtensionDisplayFeature;
+import androidx.window.extensions.ExtensionWindowLayoutInfo;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/** Compatibility wrapper for extension versions v1.0+. */
+final class TestExtensionWindowLayoutInfo implements TestWindowLayoutInfo {
+
+    @Nullable
+    static TestExtensionWindowLayoutInfo create(
+            @Nullable ExtensionWindowLayoutInfo extensionWindowLayoutInfo) {
+        return extensionWindowLayoutInfo == null
+                ? null
+                : new TestExtensionWindowLayoutInfo(extensionWindowLayoutInfo);
+    }
+
+    private final ExtensionWindowLayoutInfo mExtensionWindowLayoutInfo;
+
+    private TestExtensionWindowLayoutInfo(ExtensionWindowLayoutInfo extensionWindowLayoutInfo) {
+        mExtensionWindowLayoutInfo = extensionWindowLayoutInfo;
+    }
+
+    @Nullable
+    @Override
+    public List<TestDisplayFeature> getDisplayFeatures() {
+        List<ExtensionDisplayFeature> displayFeatures =
+                mExtensionWindowLayoutInfo.getDisplayFeatures();
+        return displayFeatures == null
+                ? null
+                : mExtensionWindowLayoutInfo.getDisplayFeatures()
+                        .stream()
+                        .map(TestExtensionDisplayFeature::create)
+                        .collect(Collectors.toList());
+    }
+
+    @NonNull
+    @Override
+    public String toString() {
+        return mExtensionWindowLayoutInfo.toString();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof TestExtensionWindowLayoutInfo)) {
+            return false;
+        }
+        final TestExtensionWindowLayoutInfo other = (TestExtensionWindowLayoutInfo) obj;
+        return mExtensionWindowLayoutInfo.equals(other.mExtensionWindowLayoutInfo);
+    }
+
+    @Override
+    public int hashCode() {
+        return mExtensionWindowLayoutInfo.hashCode();
+    }
+}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/sidecarwrapperimpl/TestSidecarCompat.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/sidecarwrapperimpl/TestSidecarCompat.java
new file mode 100644
index 0000000..5eec289
--- /dev/null
+++ b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/sidecarwrapperimpl/TestSidecarCompat.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2020 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.server.wm.jetpack.utils.wrapper.sidecarwrapperimpl;
+
+import android.os.IBinder;
+import android.server.wm.jetpack.utils.wrapper.TestDeviceState;
+import android.server.wm.jetpack.utils.wrapper.TestInterfaceCompat;
+import android.server.wm.jetpack.utils.wrapper.TestWindowLayoutInfo;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.window.sidecar.SidecarDeviceState;
+import androidx.window.sidecar.SidecarInterface;
+import androidx.window.sidecar.SidecarWindowLayoutInfo;
+
+/** Extension interface compatibility wrapper for v0.1 sidecar. */
+@SuppressWarnings("deprecation")
+public final class TestSidecarCompat implements TestInterfaceCompat {
+
+    @Nullable
+    public static TestSidecarCompat create(@Nullable SidecarInterface sidecarInterface) {
+        return sidecarInterface == null ? null : new TestSidecarCompat(sidecarInterface);
+    }
+
+    @NonNull
+    private final SidecarInterface mSidecarInterface;
+
+    private TestSidecarCompat(@NonNull SidecarInterface sidecarInterface) {
+        mSidecarInterface = sidecarInterface;
+    }
+
+    @Override
+    public void setExtensionCallback(@NonNull TestInterfaceCallback callback) {
+        mSidecarInterface.setSidecarCallback(new SidecarInterface.SidecarCallback() {
+            @Override
+            public void onDeviceStateChanged(@NonNull SidecarDeviceState newDeviceState) {
+                callback.onDeviceStateChanged(TestSidecarDeviceState.create(newDeviceState));
+            }
+
+            @Override
+            public void onWindowLayoutChanged(@NonNull IBinder windowToken,
+                    @NonNull SidecarWindowLayoutInfo newLayout) {
+                callback.onWindowLayoutChanged(
+                        windowToken,
+                        TestSidecarWindowLayoutInfo.create(newLayout));
+            }
+        });
+    }
+
+    @Override
+    public TestWindowLayoutInfo getWindowLayoutInfo(@NonNull IBinder windowToken) {
+        return TestSidecarWindowLayoutInfo.create(
+                mSidecarInterface.getWindowLayoutInfo(windowToken));
+    }
+
+    @Override
+    public void onWindowLayoutChangeListenerAdded(@NonNull IBinder windowToken) {
+        mSidecarInterface.onWindowLayoutChangeListenerAdded(windowToken);
+    }
+
+    @Override
+    public void onWindowLayoutChangeListenerRemoved(@NonNull IBinder windowToken) {
+        mSidecarInterface.onWindowLayoutChangeListenerRemoved(windowToken);
+    }
+
+    @Override
+    public TestDeviceState getDeviceState() {
+        return TestSidecarDeviceState.create(mSidecarInterface.getDeviceState());
+    }
+
+    @Override
+    public void onDeviceStateListenersChanged(boolean isEmpty) {
+        mSidecarInterface.onDeviceStateListenersChanged(isEmpty);
+    }
+}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/sidecarwrapperimpl/TestSidecarDeviceState.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/sidecarwrapperimpl/TestSidecarDeviceState.java
new file mode 100644
index 0000000..f04deb8
--- /dev/null
+++ b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/sidecarwrapperimpl/TestSidecarDeviceState.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2020 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.server.wm.jetpack.utils.wrapper.sidecarwrapperimpl;
+
+import android.server.wm.jetpack.utils.wrapper.TestDeviceState;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.window.sidecar.SidecarDeviceState;
+
+/** Extension interface compatibility wrapper for v0.1 sidecar. */
+@SuppressWarnings("deprecation")
+public final class TestSidecarDeviceState implements TestDeviceState {
+
+    @Nullable
+    static TestSidecarDeviceState create(@Nullable SidecarDeviceState sidecarDeviceState) {
+        return sidecarDeviceState == null
+                ? null
+                : new TestSidecarDeviceState(sidecarDeviceState);
+    }
+
+    private final SidecarDeviceState mSidecarDeviceState;
+
+    private TestSidecarDeviceState(@NonNull SidecarDeviceState sidecarDeviceState) {
+        mSidecarDeviceState = sidecarDeviceState;
+    }
+
+    @Override
+    public int getPosture() {
+        return mSidecarDeviceState.posture;
+    }
+
+    @NonNull
+    @Override
+    public String toString() {
+        return mSidecarDeviceState.toString();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof TestSidecarDeviceState)) {
+            return false;
+        }
+        final TestSidecarDeviceState other = (TestSidecarDeviceState) obj;
+        return mSidecarDeviceState.equals(other.mSidecarDeviceState);
+    }
+
+    @Override
+    public int hashCode() {
+        return mSidecarDeviceState.hashCode();
+    }
+}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/sidecarwrapperimpl/TestSidecarDisplayFeature.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/sidecarwrapperimpl/TestSidecarDisplayFeature.java
new file mode 100644
index 0000000..2437e9b
--- /dev/null
+++ b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/sidecarwrapperimpl/TestSidecarDisplayFeature.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2020 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.server.wm.jetpack.utils.wrapper.sidecarwrapperimpl;
+
+import android.graphics.Rect;
+import android.server.wm.jetpack.utils.wrapper.TestDisplayFeature;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.window.sidecar.SidecarDisplayFeature;
+
+/** Extension interface compatibility wrapper for v0.1 sidecar. */
+@SuppressWarnings("deprecation")
+final class TestSidecarDisplayFeature implements TestDisplayFeature {
+
+    @Nullable
+    static TestSidecarDisplayFeature create(@Nullable SidecarDisplayFeature sidecarDisplayFeature) {
+        return sidecarDisplayFeature == null
+                ? null
+                : new TestSidecarDisplayFeature(sidecarDisplayFeature);
+    }
+
+    private final SidecarDisplayFeature mSidecarDisplayFeature;
+
+    private TestSidecarDisplayFeature(@NonNull SidecarDisplayFeature sidecarDisplayFeature) {
+        mSidecarDisplayFeature = sidecarDisplayFeature;
+    }
+
+    @Override
+    public Rect getBounds() {
+        return mSidecarDisplayFeature.getRect();
+    }
+
+    @Override
+    public int getType() {
+        return mSidecarDisplayFeature.getType();
+    }
+
+    @NonNull
+    @Override
+    public String toString() {
+        return mSidecarDisplayFeature.toString();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof TestSidecarDisplayFeature)) {
+            return false;
+        }
+        final TestSidecarDisplayFeature other = (TestSidecarDisplayFeature) obj;
+        return mSidecarDisplayFeature.equals(other.mSidecarDisplayFeature);
+    }
+
+    @Override
+    public int hashCode() {
+        return mSidecarDisplayFeature.hashCode();
+    }
+}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/sidecarwrapperimpl/TestSidecarWindowLayoutInfo.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/sidecarwrapperimpl/TestSidecarWindowLayoutInfo.java
new file mode 100644
index 0000000..e784351
--- /dev/null
+++ b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/wrapper/sidecarwrapperimpl/TestSidecarWindowLayoutInfo.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2020 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.server.wm.jetpack.utils.wrapper.sidecarwrapperimpl;
+
+
+import android.server.wm.jetpack.utils.wrapper.TestDisplayFeature;
+import android.server.wm.jetpack.utils.wrapper.TestWindowLayoutInfo;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.window.sidecar.SidecarDisplayFeature;
+import androidx.window.sidecar.SidecarWindowLayoutInfo;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/** Extension interface compatibility wrapper for v0.1 sidecar. */
+@SuppressWarnings("deprecation")
+final class TestSidecarWindowLayoutInfo implements TestWindowLayoutInfo {
+
+    @Nullable
+    static TestSidecarWindowLayoutInfo create(
+            @Nullable SidecarWindowLayoutInfo sidecarWindowLayoutInfo) {
+        return sidecarWindowLayoutInfo == null
+                ? null
+                : new TestSidecarWindowLayoutInfo(sidecarWindowLayoutInfo);
+    }
+
+    private final SidecarWindowLayoutInfo mSidecarWindowLayoutInfo;
+
+    private TestSidecarWindowLayoutInfo(SidecarWindowLayoutInfo sidecarWindowLayoutInfo) {
+        mSidecarWindowLayoutInfo = sidecarWindowLayoutInfo;
+    }
+
+    @Nullable
+    @Override
+    public List<TestDisplayFeature> getDisplayFeatures() {
+        List<SidecarDisplayFeature> displayFeatures = mSidecarWindowLayoutInfo.displayFeatures;
+        return displayFeatures == null
+                ? null
+                : displayFeatures
+                        .stream()
+                        .map(TestSidecarDisplayFeature::create)
+                        .collect(Collectors.toList());
+    }
+
+    @NonNull
+    @Override
+    public String toString() {
+        return mSidecarWindowLayoutInfo.toString();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof TestSidecarWindowLayoutInfo)) {
+            return false;
+        }
+        final TestSidecarWindowLayoutInfo other = (TestSidecarWindowLayoutInfo) obj;
+        return mSidecarWindowLayoutInfo.equals(other.mSidecarWindowLayoutInfo);
+    }
+
+    @Override
+    public int hashCode() {
+        return mSidecarWindowLayoutInfo.hashCode();
+    }
+}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/TestDeviceState.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/TestDeviceState.java
deleted file mode 100644
index 499b4da..0000000
--- a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/TestDeviceState.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2020 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.server.wm.jetpack.wrapper;
-
-import androidx.annotation.IntDef;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Test interface for {@link androidx.window.extensions.ExtensionDeviceState} and
- * {@link androidx.window.sidecar.SidecarDeviceState} that serves as an API compatibility wrapper.
- *
- * @see android.server.wm.jetpack.wrapper.extensionwrapperimpl.TestExtensionDeviceState
- * @see android.server.wm.jetpack.wrapper.sidecarwrapperimpl.TestSidecarDeviceState
- */
-public interface TestDeviceState {
-
-    /** Copied from {@link androidx.window.extensions.ExtensionDeviceState}. */
-    public static final int POSTURE_UNKNOWN = 0;
-    public static final int POSTURE_CLOSED = 1;
-    public static final int POSTURE_HALF_OPENED = 2;
-    public static final int POSTURE_OPENED = 3;
-    public static final int POSTURE_FLIPPED = 4;
-
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef({
-            POSTURE_UNKNOWN,
-            POSTURE_CLOSED,
-            POSTURE_HALF_OPENED,
-            POSTURE_OPENED,
-            POSTURE_FLIPPED
-    })
-    @interface Posture{}
-
-    /** Gets the current posture of the foldable device. */
-    @Posture
-    int getPosture();
-}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/TestDisplayFeature.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/TestDisplayFeature.java
deleted file mode 100644
index 8eb0774..0000000
--- a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/TestDisplayFeature.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2020 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.server.wm.jetpack.wrapper;
-
-import android.graphics.Rect;
-
-import androidx.annotation.IntDef;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Test interface for {@link androidx.window.extensions.ExtensionDisplayFeature} and
- * {@link androidx.window.sidecar.SidecarDisplayFeature} that serves as an API compatibility
- * wrapper.
- *
- * @see android.server.wm.jetpack.wrapper.extensionwrapperimpl.TestExtensionDisplayFeature
- * @see android.server.wm.jetpack.wrapper.sidecarwrapperimpl.TestSidecarDisplayFeature
- */
-public interface TestDisplayFeature {
-
-    /**
-     * A fold in the flexible screen without a physical gap.
-     */
-    public static final int TYPE_FOLD = 1;
-
-    /**
-     * A physical separation with a hinge that allows two display panels to fold.
-     */
-    public static final int TYPE_HINGE = 2;
-
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef({
-            TYPE_FOLD,
-            TYPE_HINGE,
-    })
-    @interface Type{}
-
-    /** Gets the bounding rect of the display feature in window coordinate space. */
-    Rect getBounds();
-
-    /** Gets the type of the display feature. */
-    int getType();
-}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/TestInterfaceCompat.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/TestInterfaceCompat.java
deleted file mode 100644
index 749d8c5..0000000
--- a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/TestInterfaceCompat.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2020 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.server.wm.jetpack.wrapper;
-
-import android.os.IBinder;
-import android.server.wm.jetpack.wrapper.extensionwrapperimpl.TestExtensionCompat;
-import android.server.wm.jetpack.wrapper.sidecarwrapperimpl.TestSidecarCompat;
-
-import androidx.annotation.NonNull;
-
-/**
- * Test interface for {@link androidx.window.extensions.ExtensionInterface} and
- * {@link androidx.window.sidecar.SidecarInterface} that serves as an API compatibility wrapper.
- *
- * @see TestExtensionCompat
- * @see TestSidecarCompat
- */
-public interface TestInterfaceCompat {
-
-    /**
-     * Registers the support library as the callback for the extension. This interface will be used
-     * to report all extension changes to the support library.
-     */
-    void setExtensionCallback(@NonNull TestInterfaceCallback callback);
-
-    /**
-     * Gets current information about the display features present within the application window.
-     */
-    TestWindowLayoutInfo getWindowLayoutInfo(@NonNull IBinder windowToken);
-
-    /**
-     * Notifies extension that a listener for display feature layout changes was registered for the
-     * given window token.
-     */
-    void onWindowLayoutChangeListenerAdded(@NonNull IBinder windowToken);
-
-    /**
-     * Notifies extension that a listener for display feature layout changes was removed for the
-     * given window token.
-     */
-    void onWindowLayoutChangeListenerRemoved(@NonNull IBinder windowToken);
-
-    /**
-     * Gets current device state.
-     * @see #onDeviceStateListenersChanged(boolean)
-     */
-    TestDeviceState getDeviceState();
-
-    /**
-     * Notifies the extension that a device state change listener was updated.
-     * @param isEmpty flag indicating if the list of device state change listeners is empty.
-     */
-    void onDeviceStateListenersChanged(boolean isEmpty);
-
-    /**
-     * Callback that will be registered with the WindowManager library, and that the extension
-     * should use to report all state changes.
-     */
-    interface TestInterfaceCallback {
-        /**
-         * Called by extension when the device state changes.
-         */
-        void onDeviceStateChanged(@NonNull TestDeviceState newDeviceState);
-
-        /**
-         * Called by extension when the feature layout inside the window changes.
-         */
-        void onWindowLayoutChanged(@NonNull IBinder windowToken,
-                @NonNull TestWindowLayoutInfo newLayout);
-    }
-}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/TestWindowLayoutInfo.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/TestWindowLayoutInfo.java
deleted file mode 100644
index 5e4621d..0000000
--- a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/TestWindowLayoutInfo.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2020 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.server.wm.jetpack.wrapper;
-
-import androidx.annotation.Nullable;
-
-import java.util.List;
-
-/**
- * Test interface for {@link androidx.window.extensions.ExtensionWindowLayoutInfo} and
- * {@link androidx.window.sidecar.SidecarWindowLayoutInfo} that serves as an API compatibility
- * wrapper.
- *
- * @see android.server.wm.jetpack.wrapper.extensionwrapperimpl.TestExtensionWindowLayoutInfo
- * @see android.server.wm.jetpack.wrapper.sidecarwrapperimpl.TestSidecarWindowLayoutInfo
- */
-public interface TestWindowLayoutInfo {
-    /** Gets the list of display features present within the window. */
-    @Nullable
-    List<TestDisplayFeature> getDisplayFeatures();
-}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/extensionwrapperimpl/TestExtensionCompat.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/extensionwrapperimpl/TestExtensionCompat.java
deleted file mode 100644
index 3f4d72d..0000000
--- a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/extensionwrapperimpl/TestExtensionCompat.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2020 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.server.wm.jetpack.wrapper.extensionwrapperimpl;
-
-import android.os.IBinder;
-import android.server.wm.jetpack.wrapper.TestDeviceState;
-import android.server.wm.jetpack.wrapper.TestInterfaceCompat;
-import android.server.wm.jetpack.wrapper.TestWindowLayoutInfo;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.window.extensions.ExtensionDeviceState;
-import androidx.window.extensions.ExtensionInterface;
-import androidx.window.extensions.ExtensionWindowLayoutInfo;
-
-/** Compatibility wrapper for extension versions v1.0+. */
-public final class TestExtensionCompat implements TestInterfaceCompat {
-
-    @Nullable
-    public static TestExtensionCompat create(@Nullable ExtensionInterface extensionInterface) {
-        return extensionInterface == null ? null : new TestExtensionCompat(extensionInterface);
-    }
-
-    @NonNull
-    private final ExtensionInterface mExtensionInterface;
-
-    private TestExtensionCompat(@NonNull ExtensionInterface extensionInterface) {
-        mExtensionInterface = extensionInterface;
-    }
-
-    @Override
-    public void setExtensionCallback(@NonNull TestInterfaceCallback callback) {
-        mExtensionInterface.setExtensionCallback(new ExtensionInterface.ExtensionCallback() {
-            @Override
-            public void onDeviceStateChanged(@NonNull ExtensionDeviceState newDeviceState) {
-                callback.onDeviceStateChanged(TestExtensionDeviceState.create(newDeviceState));
-            }
-
-            @Override
-            public void onWindowLayoutChanged(@NonNull IBinder windowToken,
-                    @NonNull ExtensionWindowLayoutInfo newLayout) {
-                callback.onWindowLayoutChanged(
-                        windowToken,
-                        TestExtensionWindowLayoutInfo.create(newLayout));
-            }
-        });
-    }
-
-    @Override
-    public TestWindowLayoutInfo getWindowLayoutInfo(@NonNull IBinder windowToken) {
-        return TestExtensionWindowLayoutInfo.create(
-                mExtensionInterface.getWindowLayoutInfo(windowToken));
-    }
-
-    @Override
-    public void onWindowLayoutChangeListenerAdded(@NonNull IBinder windowToken) {
-        mExtensionInterface.onWindowLayoutChangeListenerAdded(windowToken);
-    }
-
-    @Override
-    public void onWindowLayoutChangeListenerRemoved(@NonNull IBinder windowToken) {
-        mExtensionInterface.onWindowLayoutChangeListenerRemoved(windowToken);
-    }
-
-    @Override
-    public TestDeviceState getDeviceState() {
-        return TestExtensionDeviceState.create(mExtensionInterface.getDeviceState());
-    }
-
-    @Override
-    public void onDeviceStateListenersChanged(boolean isEmpty) {
-        mExtensionInterface.onDeviceStateListenersChanged(isEmpty);
-    }
-}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/extensionwrapperimpl/TestExtensionDeviceState.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/extensionwrapperimpl/TestExtensionDeviceState.java
deleted file mode 100644
index 60362b4..0000000
--- a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/extensionwrapperimpl/TestExtensionDeviceState.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2020 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.server.wm.jetpack.wrapper.extensionwrapperimpl;
-
-import android.server.wm.jetpack.wrapper.TestDeviceState;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.window.extensions.ExtensionDeviceState;
-
-import com.google.common.base.Preconditions;
-
-/** Compatibility wrapper for extension versions v1.0+. */
-final class TestExtensionDeviceState implements TestDeviceState {
-
-    @Nullable
-    static TestExtensionDeviceState create(@Nullable ExtensionDeviceState extensionDeviceState) {
-        return extensionDeviceState == null
-                ? null
-                : new TestExtensionDeviceState(extensionDeviceState);
-    }
-
-    private final ExtensionDeviceState mExtensionDeviceState;
-
-    private TestExtensionDeviceState(@NonNull ExtensionDeviceState extensionDeviceState) {
-        mExtensionDeviceState = Preconditions.checkNotNull(extensionDeviceState);
-    }
-
-    @Override
-    public int getPosture() {
-        return mExtensionDeviceState.getPosture();
-    }
-
-    @NonNull
-    @Override
-    public String toString() {
-        return mExtensionDeviceState.toString();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof TestExtensionDeviceState)) {
-            return false;
-        }
-        final TestExtensionDeviceState other = (TestExtensionDeviceState) obj;
-        return mExtensionDeviceState.equals(other.mExtensionDeviceState);
-    }
-
-    @Override
-    public int hashCode() {
-        return mExtensionDeviceState.hashCode();
-    }
-}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/extensionwrapperimpl/TestExtensionDisplayFeature.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/extensionwrapperimpl/TestExtensionDisplayFeature.java
deleted file mode 100644
index abc7d4d..0000000
--- a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/extensionwrapperimpl/TestExtensionDisplayFeature.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2020 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.server.wm.jetpack.wrapper.extensionwrapperimpl;
-
-import android.graphics.Rect;
-import android.server.wm.jetpack.wrapper.TestDisplayFeature;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.window.extensions.ExtensionDisplayFeature;
-
-/** Compatibility wrapper for extension versions v1.0+. */
-final class TestExtensionDisplayFeature implements TestDisplayFeature {
-
-    @Nullable
-    static TestExtensionDisplayFeature create(
-            @Nullable ExtensionDisplayFeature extensionDisplayFeature) {
-        return extensionDisplayFeature == null
-                ? null
-                : new TestExtensionDisplayFeature(extensionDisplayFeature);
-    }
-
-    private final ExtensionDisplayFeature mExtensionDisplayFeature;
-
-    private TestExtensionDisplayFeature(@NonNull ExtensionDisplayFeature extensionDisplayFeature) {
-        mExtensionDisplayFeature = extensionDisplayFeature;
-    }
-
-    @Override
-    public Rect getBounds() {
-        return mExtensionDisplayFeature.getBounds();
-    }
-
-    @Override
-    public int getType() {
-        return mExtensionDisplayFeature.getType();
-    }
-
-    @NonNull
-    @Override
-    public String toString() {
-        return mExtensionDisplayFeature.toString();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof TestExtensionDisplayFeature)) {
-            return false;
-        }
-        final TestExtensionDisplayFeature other = (TestExtensionDisplayFeature) obj;
-        return mExtensionDisplayFeature.equals(other.mExtensionDisplayFeature);
-    }
-
-    @Override
-    public int hashCode() {
-        return mExtensionDisplayFeature.hashCode();
-    }
-}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/extensionwrapperimpl/TestExtensionWindowLayoutInfo.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/extensionwrapperimpl/TestExtensionWindowLayoutInfo.java
deleted file mode 100644
index e31a29d..0000000
--- a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/extensionwrapperimpl/TestExtensionWindowLayoutInfo.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2020 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.server.wm.jetpack.wrapper.extensionwrapperimpl;
-
-
-import android.server.wm.jetpack.wrapper.TestDisplayFeature;
-import android.server.wm.jetpack.wrapper.TestWindowLayoutInfo;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.window.extensions.ExtensionDisplayFeature;
-import androidx.window.extensions.ExtensionWindowLayoutInfo;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/** Compatibility wrapper for extension versions v1.0+. */
-final class TestExtensionWindowLayoutInfo implements TestWindowLayoutInfo {
-
-    @Nullable
-    static TestExtensionWindowLayoutInfo create(
-            @Nullable ExtensionWindowLayoutInfo extensionWindowLayoutInfo) {
-        return extensionWindowLayoutInfo == null
-                ? null
-                : new TestExtensionWindowLayoutInfo(extensionWindowLayoutInfo);
-    }
-
-    private final ExtensionWindowLayoutInfo mExtensionWindowLayoutInfo;
-
-    private TestExtensionWindowLayoutInfo(ExtensionWindowLayoutInfo extensionWindowLayoutInfo) {
-        mExtensionWindowLayoutInfo = extensionWindowLayoutInfo;
-    }
-
-    @Nullable
-    @Override
-    public List<TestDisplayFeature> getDisplayFeatures() {
-        List<ExtensionDisplayFeature> displayFeatures =
-                mExtensionWindowLayoutInfo.getDisplayFeatures();
-        return displayFeatures == null
-                ? null
-                : mExtensionWindowLayoutInfo.getDisplayFeatures()
-                        .stream()
-                        .map(TestExtensionDisplayFeature::create)
-                        .collect(Collectors.toList());
-    }
-
-    @NonNull
-    @Override
-    public String toString() {
-        return mExtensionWindowLayoutInfo.toString();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof TestExtensionWindowLayoutInfo)) {
-            return false;
-        }
-        final TestExtensionWindowLayoutInfo other = (TestExtensionWindowLayoutInfo) obj;
-        return mExtensionWindowLayoutInfo.equals(other.mExtensionWindowLayoutInfo);
-    }
-
-    @Override
-    public int hashCode() {
-        return mExtensionWindowLayoutInfo.hashCode();
-    }
-}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/sidecarwrapperimpl/TestSidecarCompat.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/sidecarwrapperimpl/TestSidecarCompat.java
deleted file mode 100644
index 47b09e2..0000000
--- a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/sidecarwrapperimpl/TestSidecarCompat.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2020 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.server.wm.jetpack.wrapper.sidecarwrapperimpl;
-
-import android.os.IBinder;
-import android.server.wm.jetpack.wrapper.TestDeviceState;
-import android.server.wm.jetpack.wrapper.TestInterfaceCompat;
-import android.server.wm.jetpack.wrapper.TestWindowLayoutInfo;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.window.sidecar.SidecarDeviceState;
-import androidx.window.sidecar.SidecarInterface;
-import androidx.window.sidecar.SidecarWindowLayoutInfo;
-
-/** Extension interface compatibility wrapper for v0.1 sidecar. */
-@SuppressWarnings("deprecation")
-public final class TestSidecarCompat implements TestInterfaceCompat {
-
-    @Nullable
-    public static TestSidecarCompat create(@Nullable SidecarInterface sidecarInterface) {
-        return sidecarInterface == null ? null : new TestSidecarCompat(sidecarInterface);
-    }
-
-    @NonNull
-    private final SidecarInterface mSidecarInterface;
-
-    private TestSidecarCompat(@NonNull SidecarInterface sidecarInterface) {
-        mSidecarInterface = sidecarInterface;
-    }
-
-    @Override
-    public void setExtensionCallback(@NonNull TestInterfaceCallback callback) {
-        mSidecarInterface.setSidecarCallback(new SidecarInterface.SidecarCallback() {
-            @Override
-            public void onDeviceStateChanged(@NonNull SidecarDeviceState newDeviceState) {
-                callback.onDeviceStateChanged(TestSidecarDeviceState.create(newDeviceState));
-            }
-
-            @Override
-            public void onWindowLayoutChanged(@NonNull IBinder windowToken,
-                    @NonNull SidecarWindowLayoutInfo newLayout) {
-                callback.onWindowLayoutChanged(
-                        windowToken,
-                        TestSidecarWindowLayoutInfo.create(newLayout));
-            }
-        });
-    }
-
-    @Override
-    public TestWindowLayoutInfo getWindowLayoutInfo(@NonNull IBinder windowToken) {
-        return TestSidecarWindowLayoutInfo.create(
-                mSidecarInterface.getWindowLayoutInfo(windowToken));
-    }
-
-    @Override
-    public void onWindowLayoutChangeListenerAdded(@NonNull IBinder windowToken) {
-        mSidecarInterface.onWindowLayoutChangeListenerAdded(windowToken);
-    }
-
-    @Override
-    public void onWindowLayoutChangeListenerRemoved(@NonNull IBinder windowToken) {
-        mSidecarInterface.onWindowLayoutChangeListenerRemoved(windowToken);
-    }
-
-    @Override
-    public TestDeviceState getDeviceState() {
-        return TestSidecarDeviceState.create(mSidecarInterface.getDeviceState());
-    }
-
-    @Override
-    public void onDeviceStateListenersChanged(boolean isEmpty) {
-        mSidecarInterface.onDeviceStateListenersChanged(isEmpty);
-    }
-}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/sidecarwrapperimpl/TestSidecarDeviceState.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/sidecarwrapperimpl/TestSidecarDeviceState.java
deleted file mode 100644
index 76e920a..0000000
--- a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/sidecarwrapperimpl/TestSidecarDeviceState.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2020 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.server.wm.jetpack.wrapper.sidecarwrapperimpl;
-
-import android.server.wm.jetpack.wrapper.TestDeviceState;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.window.sidecar.SidecarDeviceState;
-
-/** Extension interface compatibility wrapper for v0.1 sidecar. */
-@SuppressWarnings("deprecation")
-public final class TestSidecarDeviceState implements TestDeviceState {
-
-    @Nullable
-    static TestSidecarDeviceState create(@Nullable SidecarDeviceState sidecarDeviceState) {
-        return sidecarDeviceState == null
-                ? null
-                : new TestSidecarDeviceState(sidecarDeviceState);
-    }
-
-    private final SidecarDeviceState mSidecarDeviceState;
-
-    private TestSidecarDeviceState(@NonNull SidecarDeviceState sidecarDeviceState) {
-        mSidecarDeviceState = sidecarDeviceState;
-    }
-
-    @Override
-    public int getPosture() {
-        return mSidecarDeviceState.posture;
-    }
-
-    @NonNull
-    @Override
-    public String toString() {
-        return mSidecarDeviceState.toString();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof TestSidecarDeviceState)) {
-            return false;
-        }
-        final TestSidecarDeviceState other = (TestSidecarDeviceState) obj;
-        return mSidecarDeviceState.equals(other.mSidecarDeviceState);
-    }
-
-    @Override
-    public int hashCode() {
-        return mSidecarDeviceState.hashCode();
-    }
-}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/sidecarwrapperimpl/TestSidecarDisplayFeature.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/sidecarwrapperimpl/TestSidecarDisplayFeature.java
deleted file mode 100644
index e94d15d..0000000
--- a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/sidecarwrapperimpl/TestSidecarDisplayFeature.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2020 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.server.wm.jetpack.wrapper.sidecarwrapperimpl;
-
-import android.graphics.Rect;
-import android.server.wm.jetpack.wrapper.TestDisplayFeature;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.window.sidecar.SidecarDisplayFeature;
-
-/** Extension interface compatibility wrapper for v0.1 sidecar. */
-@SuppressWarnings("deprecation")
-final class TestSidecarDisplayFeature implements TestDisplayFeature {
-
-    @Nullable
-    static TestSidecarDisplayFeature create(@Nullable SidecarDisplayFeature sidecarDisplayFeature) {
-        return sidecarDisplayFeature == null
-                ? null
-                : new TestSidecarDisplayFeature(sidecarDisplayFeature);
-    }
-
-    private final SidecarDisplayFeature mSidecarDisplayFeature;
-
-    private TestSidecarDisplayFeature(@NonNull SidecarDisplayFeature sidecarDisplayFeature) {
-        mSidecarDisplayFeature = sidecarDisplayFeature;
-    }
-
-    @Override
-    public Rect getBounds() {
-        return mSidecarDisplayFeature.getRect();
-    }
-
-    @Override
-    public int getType() {
-        return mSidecarDisplayFeature.getType();
-    }
-
-    @NonNull
-    @Override
-    public String toString() {
-        return mSidecarDisplayFeature.toString();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof TestSidecarDisplayFeature)) {
-            return false;
-        }
-        final TestSidecarDisplayFeature other = (TestSidecarDisplayFeature) obj;
-        return mSidecarDisplayFeature.equals(other.mSidecarDisplayFeature);
-    }
-
-    @Override
-    public int hashCode() {
-        return mSidecarDisplayFeature.hashCode();
-    }
-}
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/sidecarwrapperimpl/TestSidecarWindowLayoutInfo.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/sidecarwrapperimpl/TestSidecarWindowLayoutInfo.java
deleted file mode 100644
index 163e0b6..0000000
--- a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/wrapper/sidecarwrapperimpl/TestSidecarWindowLayoutInfo.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2020 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.server.wm.jetpack.wrapper.sidecarwrapperimpl;
-
-
-import android.server.wm.jetpack.wrapper.TestDisplayFeature;
-import android.server.wm.jetpack.wrapper.TestWindowLayoutInfo;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.window.sidecar.SidecarDisplayFeature;
-import androidx.window.sidecar.SidecarWindowLayoutInfo;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/** Extension interface compatibility wrapper for v0.1 sidecar. */
-@SuppressWarnings("deprecation")
-final class TestSidecarWindowLayoutInfo implements TestWindowLayoutInfo {
-
-    @Nullable
-    static TestSidecarWindowLayoutInfo create(
-            @Nullable SidecarWindowLayoutInfo sidecarWindowLayoutInfo) {
-        return sidecarWindowLayoutInfo == null
-                ? null
-                : new TestSidecarWindowLayoutInfo(sidecarWindowLayoutInfo);
-    }
-
-    private final SidecarWindowLayoutInfo mSidecarWindowLayoutInfo;
-
-    private TestSidecarWindowLayoutInfo(SidecarWindowLayoutInfo sidecarWindowLayoutInfo) {
-        mSidecarWindowLayoutInfo = sidecarWindowLayoutInfo;
-    }
-
-    @Nullable
-    @Override
-    public List<TestDisplayFeature> getDisplayFeatures() {
-        List<SidecarDisplayFeature> displayFeatures = mSidecarWindowLayoutInfo.displayFeatures;
-        return displayFeatures == null
-                ? null
-                : displayFeatures
-                        .stream()
-                        .map(TestSidecarDisplayFeature::create)
-                        .collect(Collectors.toList());
-    }
-
-    @NonNull
-    @Override
-    public String toString() {
-        return mSidecarWindowLayoutInfo.toString();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof TestSidecarWindowLayoutInfo)) {
-            return false;
-        }
-        final TestSidecarWindowLayoutInfo other = (TestSidecarWindowLayoutInfo) obj;
-        return mSidecarWindowLayoutInfo.equals(other.mSidecarWindowLayoutInfo);
-    }
-
-    @Override
-    public int hashCode() {
-        return mSidecarWindowLayoutInfo.hashCode();
-    }
-}
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/ActivityTransitionTests.java b/tests/framework/base/windowmanager/src/android/server/wm/ActivityTransitionTests.java
index 3aa6fec..9cc15ea 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/ActivityTransitionTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/ActivityTransitionTests.java
@@ -16,14 +16,14 @@
 
 package android.server.wm;
 
-import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
-import static android.server.wm.ActivityLauncher.KEY_NEW_TASK;
-import static android.server.wm.app.Components.TEST_ACTIVITY;
 import static android.view.Display.DEFAULT_DISPLAY;
 
 import static org.junit.Assert.assertTrue;
 
+import android.app.Activity;
 import android.app.ActivityOptions;
+import android.app.Instrumentation;
+import android.content.ComponentName;
 import android.content.Intent;
 import android.os.Bundle;
 import android.os.Handler;
@@ -34,6 +34,8 @@
 
 import org.junit.Test;
 
+import androidx.test.InstrumentationRegistry;
+
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -63,15 +65,19 @@
             latch.countDown();
         };
 
+        final Intent intent = new Intent(mContext, LauncherActivity.class)
+            .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+        final LauncherActivity launcherActivity =
+            (LauncherActivity) instrumentation.startActivitySync(intent);
+
         final Bundle bundle = ActivityOptions.makeCustomAnimation(mContext,
                 R.anim.alpha, 0, new Handler(Looper.getMainLooper()), startedListener,
                 finishedListener).toBundle();
-        final Intent intent = new Intent().setComponent(TEST_ACTIVITY)
-                .addFlags(FLAG_ACTIVITY_NEW_TASK);
-        mContext.startActivity(intent, bundle);
+        launcherActivity.startTransitionActivity(bundle);
         mWmState.waitForAppTransitionIdleOnDisplay(DEFAULT_DISPLAY);
-        waitAndAssertTopResumedActivity(TEST_ACTIVITY, DEFAULT_DISPLAY,
-                "Activity must be launched");
+        waitAndAssertTopResumedActivity(new ComponentName(mContext, TransitionActivity.class),
+            DEFAULT_DISPLAY, "Activity must be launched");
 
         latch.await(2, TimeUnit.SECONDS);
         final long totalTime = transitionEndTime[0] - transitionStartTime[0];
@@ -79,4 +85,14 @@
                 + "<" + minDurationMs + ", " + maxDurationMs + "> ms, "
                 + "actual=" + totalTime, durationRange.contains(totalTime));
     }
+
+    public static class LauncherActivity extends Activity {
+
+        public void startTransitionActivity(Bundle bundle) {
+            startActivity(new Intent(this, TransitionActivity.class), bundle);
+        }
+    }
+
+    public static class TransitionActivity extends Activity {
+    }
 }
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/ActivityViewTest.java b/tests/framework/base/windowmanager/src/android/server/wm/ActivityViewTest.java
index 5dfa874..a1019b0 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/ActivityViewTest.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/ActivityViewTest.java
@@ -224,7 +224,7 @@
         final ImeEventStream stream = imeSession.openEventStream();
         launchActivityInActivityView(INPUT_METHOD_TEST_ACTIVITY, extras);
 
-        tapOnDisplayCenter(mActivityView.getVirtualDisplayId());
+        tapOnCenter(getActivityViewBoundsOnScreen(), mActivityView.getVirtualDisplayId());
 
         // IME's seeing uniqueStringValue means that a valid connection is successfully
         // established from INPUT_METHOD_TEST_ACTIVITY the MockIme.
@@ -271,6 +271,15 @@
         mWmState.waitForValidState(activity);
     }
 
+    private Rect getActivityViewBoundsOnScreen() {
+        final int[] location = new int[2];
+        mInstrumentation.runOnMainSync(() -> {
+            mActivityView.getLocationOnScreen(location);
+        });
+        return new Rect(location[0], location[1], location[0] + mActivityView.getWidth(),
+                location[1] + mActivityView.getHeight());
+    }
+
     // Test activity
     public static class ActivityViewTestActivity extends Activity {
         private ActivityView mActivityView;
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/ActivityVisibilityTests.java b/tests/framework/base/windowmanager/src/android/server/wm/ActivityVisibilityTests.java
index 0824c46..b052e88 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/ActivityVisibilityTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/ActivityVisibilityTests.java
@@ -465,11 +465,12 @@
      */
     @Test
     public void testActivityStoppedWhileNextActivityNotIdle() {
-        launchActivity(LAUNCHING_ACTIVITY);
+        final ComponentName activityWithSameAffinity = TURN_SCREEN_ON_ATTR_ACTIVITY;
+        launchActivity(activityWithSameAffinity);
         launchNoIdleActivity();
-        waitAndAssertActivityState(LAUNCHING_ACTIVITY, STATE_STOPPED,
+        waitAndAssertActivityState(activityWithSameAffinity, STATE_STOPPED,
                 "Activity should be stopped before idle timeout");
-        mWmState.assertVisibility(LAUNCHING_ACTIVITY, false);
+        mWmState.assertVisibility(activityWithSameAffinity, false);
     }
 
     private void launchNoIdleActivity() {
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/AppConfigurationTests.java b/tests/framework/base/windowmanager/src/android/server/wm/AppConfigurationTests.java
index 302c915..52d8351 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/AppConfigurationTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/AppConfigurationTests.java
@@ -210,8 +210,11 @@
 
             final SizeInfo rotatedSizes = getActivityDisplaySize(RESIZEABLE_ACTIVITY);
             assertSizesRotate(prevSizes, rotatedSizes,
-                    // Skip orientation checks if we are not in fullscreen mode.
-                    task.getWindowingMode() != WINDOWING_MODE_FULLSCREEN);
+                    // Skip orientation checks if we are not in fullscreen mode, or when the display
+                    // is close to square because the app config orientation may always be landscape
+                    // excluding the system insets.
+                    task.getWindowingMode() != WINDOWING_MODE_FULLSCREEN
+                            || isCloseToSquareDisplay());
             prevSizes = rotatedSizes;
         }
     }
@@ -318,7 +321,7 @@
      */
     @Test
     public void testFullscreenAppOrientationRequests() {
-        assumeTrue("Skipping test: no rotation support", supportsRotation());
+        assumeTrue("Skipping test: no orientation request support", supportsOrientationRequest());
 
         separateTestJournal();
         launchActivity(PORTRAIT_ORIENTATION_ACTIVITY);
@@ -344,7 +347,7 @@
 
     @Test
     public void testNonfullscreenAppOrientationRequests() {
-        assumeTrue("Skipping test: no rotation support", supportsRotation());
+        assumeTrue("Skipping test: no orientation request support", supportsOrientationRequest());
 
         separateTestJournal();
         launchActivity(PORTRAIT_ORIENTATION_ACTIVITY, WINDOWING_MODE_FULLSCREEN);
@@ -371,7 +374,7 @@
      */
     @Test
     public void testAppOrientationRequestConfigChanges() {
-        assumeTrue("Skipping test: no rotation support", supportsRotation());
+        assumeTrue("Skipping test: no orientation request support", supportsOrientationRequest());
 
         separateTestJournal();
         launchActivity(PORTRAIT_ORIENTATION_ACTIVITY, WINDOWING_MODE_FULLSCREEN);
@@ -411,7 +414,7 @@
      */
     @Test
     public void testAppOrientationRequestConfigClears() {
-        assumeTrue("Skipping test: no rotation support", supportsRotation());
+        assumeTrue("Skipping test: no orientation request support", supportsOrientationRequest());
 
         separateTestJournal();
         launchActivity(TEST_ACTIVITY);
@@ -451,7 +454,7 @@
 
     @Test
     public void testRotatedInfoWithFixedRotationTransform() {
-        assumeTrue("Skipping test: no rotation support", supportsRotation());
+        assumeTrue("Skipping test: no orientation request support", supportsOrientationRequest());
 
         // Start a portrait activity first to ensure that the orientation will change.
         launchActivity(PORTRAIT_ORIENTATION_ACTIVITY);
@@ -511,10 +514,7 @@
 
     @Test
     public void testNonFullscreenActivityPermitted() throws Exception {
-        if(!supportsRotation()) {
-            //cannot physically rotate the screen on automotive device, skip
-            return;
-        }
+        assumeTrue("Skipping test: no orientation request support", supportsOrientationRequest());
 
         final RotationSession rotationSession = createManagedRotationSession();
         rotationSession.set(ROTATION_0);
@@ -532,13 +532,13 @@
      */
     @Test
     public void testTaskCloseRestoreFixedOrientation() {
-        assumeTrue("Skipping test: no rotation support", supportsRotation());
+        assumeTrue("Skipping test: no orientation request support", supportsOrientationRequest());
 
         // Start landscape activity.
-        launchActivity(LANDSCAPE_ORIENTATION_ACTIVITY);
+        launchActivity(LANDSCAPE_ORIENTATION_ACTIVITY, WINDOWING_MODE_FULLSCREEN);
         mWmState.assertVisibility(LANDSCAPE_ORIENTATION_ACTIVITY, true /* visible */);
-        assertEquals("Fullscreen app requested landscape orientation",
-                SCREEN_ORIENTATION_LANDSCAPE, mWmState.getLastOrientation());
+        mWmState.waitAndAssertLastOrientation("Fullscreen app requested landscape orientation",
+                SCREEN_ORIENTATION_LANDSCAPE);
 
         // Start another activity in a different task.
         launchActivityInNewTask(BROADCAST_RECEIVER_ACTIVITY);
@@ -565,7 +565,7 @@
      */
     @Test
     public void testTaskCloseRestoreFreeOrientation() {
-        assumeTrue("Skipping test: no rotation support", supportsRotation());
+        assumeTrue("Skipping test: no orientation request support", supportsOrientationRequest());
 
         // Start landscape activity.
         launchActivity(RESIZEABLE_ACTIVITY);
@@ -601,8 +601,8 @@
         mWmState.waitForActivityState(RESIZEABLE_ACTIVITY, STATE_RESUMED);
         reportedSizes = getLastReportedSizesForActivity(RESIZEABLE_ACTIVITY);
         assertNull("Should come back in original orientation", reportedSizes);
-        assertEquals("Should come back in original server orientation",
-                initialServerOrientation, mWmState.getLastOrientation());
+        mWmState.waitAndAssertLastOrientation("Should come back in original server orientation",
+                initialServerOrientation);
         assertRelaunchOrConfigChanged(RESIZEABLE_ACTIVITY, 0 /* numRelaunch */,
                 0 /* numConfigChange */);
     }
@@ -703,27 +703,27 @@
      */
     @Test
     public void testFixedOrientationWhenRotating() throws Exception {
-        assumeTrue("Skipping test: no rotation support", supportsRotation());
+        assumeTrue("Skipping test: no orientation request support", supportsOrientationRequest());
         // TODO(b/110533226): Fix test on devices with display cutout
         assumeFalse("Skipping test: display cutout present, can't predict exact lifecycle",
                 hasDisplayCutout());
 
         // Start portrait-fixed activity
         separateTestJournal();
-        launchActivity(RESIZEABLE_ACTIVITY);
-        launchActivity(PORTRAIT_ORIENTATION_ACTIVITY);
-        mWmState.assertVisibility(PORTRAIT_ORIENTATION_ACTIVITY, true /* visible */);
+        launchActivity(RESIZEABLE_ACTIVITY, WINDOWING_MODE_FULLSCREEN);
+        mWmState.assertVisibility(RESIZEABLE_ACTIVITY, true /* visible */);
 
-        final int displayId = mWmState
-                .getDisplayByActivity(PORTRAIT_ORIENTATION_ACTIVITY);
+        final int displayId = mWmState.getDisplayByActivity(RESIZEABLE_ACTIVITY);
 
-        // Rotate the activity and check that the orientation doesn't change
         final RotationSession rotationSession = createManagedRotationSession();
         assumeTrue("Skipping test: no user locked rotation support.",
                 supportsLockedUserRotation(rotationSession, displayId));
 
-        rotationSession.set(ROTATION_0);
+        launchActivity(PORTRAIT_ORIENTATION_ACTIVITY, WINDOWING_MODE_FULLSCREEN);
+        mWmState.assertVisibility(PORTRAIT_ORIENTATION_ACTIVITY, true /* visible */);
 
+        // Rotate the display and check that the orientation doesn't change
+        rotationSession.set(ROTATION_0);
         final int[] rotations = { ROTATION_270, ROTATION_180, ROTATION_90, ROTATION_0 };
         for (final int rotation : rotations) {
             separateTestJournal();
@@ -745,13 +745,13 @@
      */
     @Test
     public void testTaskMoveToBackOrientation() {
-        assumeTrue("Skipping test: no rotation support", supportsRotation());
+        assumeTrue("Skipping test: no orientation request support", supportsOrientationRequest());
 
         // Start landscape activity.
-        launchActivity(LANDSCAPE_ORIENTATION_ACTIVITY);
+        launchActivity(LANDSCAPE_ORIENTATION_ACTIVITY, WINDOWING_MODE_FULLSCREEN);
         mWmState.assertVisibility(LANDSCAPE_ORIENTATION_ACTIVITY, true /* visible */);
-        assertEquals("Fullscreen app requested landscape orientation",
-                SCREEN_ORIENTATION_LANDSCAPE, mWmState.getLastOrientation());
+        mWmState.waitAndAssertLastOrientation("Fullscreen app requested landscape orientation",
+                SCREEN_ORIENTATION_LANDSCAPE);
 
         // Start another activity in a different task.
         launchActivityInNewTask(BROADCAST_RECEIVER_ACTIVITY);
@@ -886,8 +886,7 @@
      * that are smaller than the dockedSizes.
      */
     private static void assertSizesAreSane(SizeInfo fullscreenSizes, SizeInfo dockedSizes) {
-        final boolean portrait = fullscreenSizes.displayWidth < fullscreenSizes.displayHeight;
-        if (portrait) {
+        if (isDisplayPortrait()) {
             assertThat(dockedSizes.displayHeight, lessThan(fullscreenSizes.displayHeight));
             assertThat(dockedSizes.heightDp, lessThan(fullscreenSizes.heightDp));
             assertThat(dockedSizes.metricsHeight, lessThan(fullscreenSizes.metricsHeight));
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/AssistantStackTests.java b/tests/framework/base/windowmanager/src/android/server/wm/AssistantStackTests.java
index 267bec9..d777db2 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/AssistantStackTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/AssistantStackTests.java
@@ -209,7 +209,7 @@
 
         // Launch an assistant activity on top of an existing fullscreen activity, and ensure that
         // the fullscreen activity is still visible and on top after the assistant activity finishes
-        launchActivityOnDisplay(TEST_ACTIVITY, mAssistantDisplayId);
+        launchActivityOnDisplay(TEST_ACTIVITY, WINDOWING_MODE_FULLSCREEN, mAssistantDisplayId);
         try (final AssistantSession assistantSession = new AssistantSession()) {
             assistantSession.setVoiceInteractionService(ASSISTANT_VOICE_INTERACTION_SERVICE);
 
@@ -265,7 +265,7 @@
             // Launch a fullscreen app and then launch the assistant and check to see that it is
             // also visible
             removeStacksWithActivityTypes(ACTIVITY_TYPE_ASSISTANT);
-            launchActivityOnDisplay(TEST_ACTIVITY, mAssistantDisplayId);
+            launchActivityOnDisplay(TEST_ACTIVITY, WINDOWING_MODE_FULLSCREEN, mAssistantDisplayId);
             launchActivityNoWait(LAUNCH_ASSISTANT_ACTIVITY_INTO_STACK,
                     EXTRA_ASSISTANT_IS_TRANSLUCENT, "true");
             waitForValidStateWithActivityType(
@@ -336,7 +336,7 @@
 
             // Launch a new fullscreen activity
             // Using Animation Test Activity because it is opaque on all devices.
-            launchActivityOnDisplay(ANIMATION_TEST_ACTIVITY, mAssistantDisplayId);
+            launchActivityOnDisplay(ANIMATION_TEST_ACTIVITY, WINDOWING_MODE_FULLSCREEN, mAssistantDisplayId);
             // Wait for animation finished.
             mWmState.waitForActivityState(ANIMATION_TEST_ACTIVITY, STATE_RESUMED);
             mWmState.assertVisibility(ASSISTANT_ACTIVITY, isAssistantOnTop());
@@ -367,7 +367,7 @@
 
             // Launch a fullscreen activity and a PIP activity, then launch the assistant, and
             // ensure that the test activity is still visible
-            launchActivity(TEST_ACTIVITY);
+            launchActivity(TEST_ACTIVITY, WINDOWING_MODE_FULLSCREEN);
             launchActivity(PIP_ACTIVITY, EXTRA_ENTER_PIP, "true");
             launchActivityNoWait(LAUNCH_ASSISTANT_ACTIVITY_INTO_STACK,
                     EXTRA_ASSISTANT_IS_TRANSLUCENT, String.valueOf(true));
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/ConfigChangeTests.java b/tests/framework/base/windowmanager/src/android/server/wm/ConfigChangeTests.java
index 850870a..2b7089d 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/ConfigChangeTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/ConfigChangeTests.java
@@ -16,6 +16,7 @@
 
 package android.server.wm;
 
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.server.wm.StateLogger.log;
 import static android.server.wm.StateLogger.logE;
 import static android.server.wm.WindowManagerState.STATE_RESUMED;
@@ -206,7 +207,7 @@
 
     private void testRotation(ComponentName activityName, int rotationStep, int numRelaunch,
             int numConfigChange) {
-        launchActivity(activityName);
+        launchActivity(activityName, WINDOWING_MODE_FULLSCREEN);
         mWmState.computeState(activityName);
 
         final int initialRotation = 4 - rotationStep;
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/DialogFrameTests.java b/tests/framework/base/windowmanager/src/android/server/wm/DialogFrameTests.java
index 627c3d6..9dd98b2 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/DialogFrameTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/DialogFrameTests.java
@@ -247,6 +247,7 @@
     }
 
     private Insets getActivitySystemInsets() {
+        getInstrumentation().waitForIdleSync();
         getInstrumentation().runOnMainSync(() -> {
             final Insets insets = mDialogTestActivity
                 .getActivity()
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/DisplayCutoutTests.java b/tests/framework/base/windowmanager/src/android/server/wm/DisplayCutoutTests.java
index 48a01d3..e4f5d3d 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/DisplayCutoutTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/DisplayCutoutTests.java
@@ -556,7 +556,9 @@
         public void onWindowFocusChanged(boolean hasFocus) {
             if (hasFocus) {
                 getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
-                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
+                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+                        | View.SYSTEM_UI_FLAG_FULLSCREEN
+                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
             }
         }
 
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/DreamManagerServiceTests.java b/tests/framework/base/windowmanager/src/android/server/wm/DreamManagerServiceTests.java
index 9f71d26..ffec8d0 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/DreamManagerServiceTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/DreamManagerServiceTests.java
@@ -29,12 +29,15 @@
 import android.app.DreamManager;
 import android.content.ComponentName;
 import android.platform.test.annotations.Presubmit;
+import android.provider.Settings;
 import android.view.Surface;
 
 import androidx.test.filters.FlakyTest;
 
 import com.android.compatibility.common.util.SystemUtil;
 
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 
 @Presubmit
@@ -45,15 +48,38 @@
     private static final long ACTIVITY_STOP_TIMEOUT = 3000;
 
     // Timeout after which the dream should have been forcefully stopped
-    private static final long ACTIVITY_FORCE_STOP_TIMEOUT = 5500;
+    private static final long ACTIVITY_FORCE_STOP_TIMEOUT = 6500;
 
     private ComponentName mDreamActivityName;
 
+    private boolean mDefaultDreamServiceEnabled = true;
+
     private static final ComponentName getDreamActivityName(ComponentName dream) {
         return new ComponentName(dream.getPackageName(),
                                  "android.service.dreams.DreamActivity");
     }
 
+    @Before
+    public void setDreamEnabled() {
+        mDefaultDreamServiceEnabled =
+                Settings.Secure.getInt(mContext.getContentResolver(),
+                                "screensaver_enabled", 1) != 0;
+        if (!mDefaultDreamServiceEnabled) {
+            SystemUtil.runWithShellPermissionIdentity(() -> {
+                Settings.Secure.putInt(mContext.getContentResolver(), "screensaver_enabled", 1);
+            });
+        }
+    }
+
+    @After
+    public void resetDreamEnabled()  {
+        if (!mDefaultDreamServiceEnabled) {
+            SystemUtil.runWithShellPermissionIdentity(() -> {
+                Settings.Secure.putInt(mContext.getContentResolver(), "screensaver_enabled", 0);
+            });
+        }
+    }
+
     private void startDream(ComponentName name) {
         DreamManager dreamer = mContext.getSystemService(DreamManager.class);
         SystemUtil.runWithShellPermissionIdentity(() -> {
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/FreeformWindowingModeTests.java b/tests/framework/base/windowmanager/src/android/server/wm/FreeformWindowingModeTests.java
index 342c5b9..1567288 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/FreeformWindowingModeTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/FreeformWindowingModeTests.java
@@ -24,6 +24,7 @@
 import static android.server.wm.app.Components.NO_RELAUNCH_ACTIVITY;
 import static android.server.wm.app.Components.TEST_ACTIVITY;
 
+import static android.server.wm.app.Components.TestActivity.TEST_ACTIVITY_ACTION_FINISH_SELF;
 import static org.junit.Assert.assertEquals;
 
 import android.graphics.Rect;
@@ -82,15 +83,26 @@
 
     @Test
     public void testNonResizeableActivityHasFullDisplayBounds() throws Exception {
+        launchActivity(TEST_ACTIVITY);
+
+        mWmState.computeState(TEST_ACTIVITY);
+
+        final ActivityTask testActivityTask =
+                mWmState.getTaskByActivity(TEST_ACTIVITY);
+        Rect expectedBounds = testActivityTask.getBounds();
+        mBroadcastActionTrigger.doAction(TEST_ACTIVITY_ACTION_FINISH_SELF);
+        mWmState.waitFor((wmState) ->
+                        !wmState.containsActivity(TEST_ACTIVITY),
+                "Waiting for test activity to finish...");
+
         launchActivity(NON_RESIZEABLE_ACTIVITY, WINDOWING_MODE_FREEFORM);
 
         mWmState.computeState(NON_RESIZEABLE_ACTIVITY);
 
-        final ActivityTask task =
+        final ActivityTask nonResizeableActivityTask =
                 mWmState.getTaskByActivity(NON_RESIZEABLE_ACTIVITY);
-        final ActivityTask stack = mWmState.getRootTask(task.mRootTaskId);
 
-        if (task.isFullscreen()) {
+        if (nonResizeableActivityTask.isFullscreen()) {
             // If the task is on the fullscreen stack, then we know that it will have bounds that
             // fill the entire display.
             return;
@@ -98,8 +110,7 @@
 
         // If the task is not on the fullscreen stack, then compare the task bounds to the display
         // bounds.
-        assertEquals(mWmState.getDisplay(stack.mDisplayId).getDisplayRect(),
-                task.getBounds());
+        assertEquals(expectedBounds, nonResizeableActivityTask.getBounds());
     }
 
     @Test
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/KeyguardInputTests.java b/tests/framework/base/windowmanager/src/android/server/wm/KeyguardInputTests.java
index a4d61ef..6ee0eb4 100755
--- a/tests/framework/base/windowmanager/src/android/server/wm/KeyguardInputTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/KeyguardInputTests.java
@@ -21,6 +21,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assume.assumeTrue;
 
 import android.content.ComponentName;
 import android.platform.test.annotations.Presubmit;
@@ -50,6 +51,8 @@
     @Before
     @Override
     public void setUp() {
+        assumeTrue(supportsInsecureLock());
+
         mActivity = mActivityRule.getActivity();
         PollingCheck.waitFor(mActivity::hasWindowFocus);
     }
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/ManifestLayoutTests.java b/tests/framework/base/windowmanager/src/android/server/wm/ManifestLayoutTests.java
index 8717771..b54f091 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/ManifestLayoutTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/ManifestLayoutTests.java
@@ -25,6 +25,7 @@
 import static android.server.wm.app.Components.TEST_ACTIVITY;
 import static android.server.wm.app.Components.TOP_LEFT_LAYOUT_ACTIVITY;
 import static android.server.wm.app.Components.TOP_RIGHT_LAYOUT_ACTIVITY;
+import static android.view.Display.DEFAULT_DISPLAY;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -34,6 +35,7 @@
 import android.graphics.Rect;
 import android.platform.test.annotations.Presubmit;
 import android.server.wm.WindowManagerState.WindowState;
+import android.view.DisplayCutout;
 
 import org.junit.Test;
 
@@ -116,8 +118,10 @@
         final int minWidth = dpToPx(MIN_WIDTH_DP, mDisplay.getDpi());
         final int minHeight = dpToPx(MIN_HEIGHT_DP, mDisplay.getDpi());
         final Rect containingRect = mWindowState.getContainingFrame();
+        final int cutoutSize = getCutoutSizeByHorGravity(GRAVITY_HOR_LEFT);
 
-        assertEquals("Min width is incorrect", minWidth, containingRect.width());
+        assertEquals("Min width is incorrect", minWidth,
+                containingRect.width() + cutoutSize);
         assertEquals("Min height is incorrect", minHeight, containingRect.height());
     }
 
@@ -186,7 +190,9 @@
     private void verifyFrameSizeAndPosition(
             int vGravity, int hGravity, int expectedWidthPx, int expectedHeightPx,
             Rect containingFrame, Rect parentFrame) {
-        assertEquals("Width is incorrect", expectedWidthPx, containingFrame.width());
+        final int cutoutSize = getCutoutSizeByHorGravity(hGravity);
+        assertEquals("Width is incorrect",
+                expectedWidthPx, containingFrame.width() + cutoutSize);
         assertEquals("Height is incorrect", expectedHeightPx, containingFrame.height());
 
         if (vGravity == GRAVITY_VER_TOP) {
@@ -196,9 +202,29 @@
         }
 
         if (hGravity == GRAVITY_HOR_LEFT) {
-            assertEquals("Should be on the left", parentFrame.left, containingFrame.left);
+            assertEquals("Should be on the left",
+                    parentFrame.left, containingFrame.left - cutoutSize);
         } else if (hGravity == GRAVITY_HOR_RIGHT){
-            assertEquals("Should be on the right", parentFrame.right, containingFrame.right);
+            assertEquals("Should be on the right",
+                    parentFrame.right, containingFrame.right + cutoutSize);
+        }
+    }
+
+    private int getCutoutSizeByHorGravity(int hGravity) {
+        DisplayCutout cutout = mDm.getDisplay(DEFAULT_DISPLAY).getCutout();
+        if (cutout == null) {
+            return 0;
+        }
+
+        // When the layoutInDisplayCutoutMode is default, the status bar & navigation bar already
+        // take top and bottom cutout into account.
+        // Here we only need to account for left & right cutout areas.
+        if (hGravity == GRAVITY_HOR_LEFT) {
+            return cutout.getSafeInsetLeft();
+        } else if (hGravity == GRAVITY_HOR_RIGHT) {
+            return cutout.getSafeInsetRight();
+        } else {
+            return 0;
         }
     }
 }
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplayPolicyTests.java b/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplayPolicyTests.java
index b6fc590..9bba49c 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplayPolicyTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplayPolicyTests.java
@@ -17,6 +17,7 @@
 package android.server.wm;
 
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
 import static android.server.wm.WindowManagerState.STATE_RESUMED;
 import static android.server.wm.WindowManagerState.STATE_STOPPED;
@@ -821,7 +822,8 @@
 
         getLaunchActivityBuilder().setUseInstrumentation()
                 .setTargetActivity(SDK_27_LAUNCHING_ACTIVITY).setNewTask(true)
-                .setDisplayId(DEFAULT_DISPLAY).execute();
+                .setDisplayId(DEFAULT_DISPLAY).setWindowingMode(WINDOWING_MODE_FULLSCREEN)
+                .execute();
         waitAndAssertTopResumedActivity(SDK_27_LAUNCHING_ACTIVITY, DEFAULT_DISPLAY,
                 "Activity launched on default display must be resumed and focused");
 
@@ -831,7 +833,8 @@
 
         getLaunchActivityBuilder().setUseInstrumentation()
                 .setTargetActivity(SDK_27_SEPARATE_PROCESS_ACTIVITY).setNewTask(true)
-                .setDisplayId(DEFAULT_DISPLAY).execute();
+                .setDisplayId(DEFAULT_DISPLAY).setWindowingMode(WINDOWING_MODE_FULLSCREEN)
+                .execute();
         waitAndAssertTopResumedActivity(SDK_27_SEPARATE_PROCESS_ACTIVITY, DEFAULT_DISPLAY,
                 "Activity launched on default display must be resumed and focused");
         assertTrue("Activity that was on secondary display must be resumed",
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplaySecurityTests.java b/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplaySecurityTests.java
index efe194f..cb956f6 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplaySecurityTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplaySecurityTests.java
@@ -820,9 +820,9 @@
 
         // Expect onStartInput / showSoftInput would be executed when user tapping on the
         // untrusted display intentionally.
-        final Rect drawRect = new Rect();
-        editText.getDrawingRect(drawRect);
-        tapOnDisplaySync(drawRect.left, drawRect.top, newDisplay.mId);
+        final int[] location = new int[2];
+        editText.getLocationOnScreen(location);
+        tapOnDisplaySync(location[0], location[1], newDisplay.mId);
         imeTestActivitySession.runOnMainSyncAndWait(
                 imeTestActivitySession.getActivity()::showSoftInput);
         waitOrderedImeEventsThenAssertImeShown(stream, DEFAULT_DISPLAY,
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplaySystemDecorationTests.java b/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplaySystemDecorationTests.java
index be945d6..219e78e 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplaySystemDecorationTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplaySystemDecorationTests.java
@@ -110,6 +110,8 @@
      */
     @Test
     public void testWallpaperGetDisplayContext() throws Exception {
+        assumeTrue(supportsLiveWallpaper());
+
         final ChangeWallpaperSession wallpaperSession = createManagedChangeWallpaperSession();
         final VirtualDisplaySession virtualDisplaySession = createManagedVirtualDisplaySession();
 
@@ -183,7 +185,7 @@
 
         @Override
         public void close() {
-            SystemUtil.runWithShellPermissionIdentity(mWallpaperManager::clearWallpaper);
+            SystemUtil.runWithShellPermissionIdentity(() -> mWallpaperManager.clearWallpaper());
             if (mTestBitmap != null) {
                 mTestBitmap.recycle();
             }
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplayTestBase.java b/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplayTestBase.java
index 6f97aa6..43ecf71 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplayTestBase.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/MultiDisplayTestBase.java
@@ -47,6 +47,7 @@
 
 import android.content.ComponentName;
 import android.content.Context;
+import android.content.pm.PackageManager;
 import android.content.res.Configuration;
 import android.os.Bundle;
 import android.provider.Settings;
@@ -736,6 +737,11 @@
         return hasDeviceFeature(FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS);
     }
 
+    /** Checks if the device supports wallpaper for multi-display. */
+    protected boolean supportsLiveWallpaper() {
+        return hasDeviceFeature(PackageManager.FEATURE_LIVE_WALLPAPER);
+    }
+
     /** @see ObjectTracker#manage(AutoCloseable) */
     protected ExternalDisplaySession createManagedExternalDisplaySession() {
         return mObjectTracker.manage(new ExternalDisplaySession());
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/PinnedStackTests.java b/tests/framework/base/windowmanager/src/android/server/wm/PinnedStackTests.java
index 3ac15bb..1319eb1 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/PinnedStackTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/PinnedStackTests.java
@@ -20,6 +20,7 @@
 import static android.app.ActivityTaskManager.INVALID_STACK_ID;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
 import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
@@ -71,12 +72,14 @@
 import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
 
 import static org.hamcrest.Matchers.lessThan;
+import static org.hamcrest.Matchers.lessThanOrEqualTo;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeFalse;
 import static org.junit.Assume.assumeTrue;
 
 import android.content.ComponentName;
@@ -575,7 +578,9 @@
         launchActivity(TEST_ACTIVITY);
 
         // Launch first PIP activity
-        launchActivity(PIP_ACTIVITY, EXTRA_ENTER_PIP, "true");
+        launchActivity(PIP_ACTIVITY);
+        int windowingMode = mWmState.getTaskByActivity(PIP_ACTIVITY).getWindowingMode();
+        mBroadcastActionTrigger.doAction(ACTION_ENTER_PIP);
         waitForEnterPipAnimationComplete(PIP_ACTIVITY);
 
         // Launch second PIP activity
@@ -586,7 +591,7 @@
         assertTrue(mWmState.containsActivityInWindowingMode(
                 PIP_ACTIVITY2, WINDOWING_MODE_PINNED));
         assertTrue(mWmState.containsActivityInWindowingMode(
-                PIP_ACTIVITY, WINDOWING_MODE_FULLSCREEN));
+                PIP_ACTIVITY, windowingMode));
     }
 
     @Test
@@ -625,98 +630,112 @@
     }
 
     @Test
-    public void testRemovePipWithNoFullscreenStack() throws Exception {
+    public void testRemovePipWithNoFullscreenOrFreeformStack() throws Exception {
         // Launch a pip activity
-        launchActivity(PIP_ACTIVITY, EXTRA_ENTER_PIP, "true");
+        launchActivity(PIP_ACTIVITY);
+        int windowingMode = mWmState.getTaskByActivity(PIP_ACTIVITY).getWindowingMode();
+        mBroadcastActionTrigger.doAction(ACTION_ENTER_PIP);
         waitForEnterPip(PIP_ACTIVITY);
         assertPinnedStackExists();
 
-        // Remove the stack and ensure that the task is now in the fullscreen stack (when no
-        // fullscreen stack existed before)
+        // Remove the stack and ensure that the task is now in the fullscreen/freeform stack (when
+        // no fullscreen/freeform stack existed before)
         removeStacksInWindowingModes(WINDOWING_MODE_PINNED);
-        assertPinnedStackStateOnMoveToFullscreen(PIP_ACTIVITY,
-                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_HOME);
+        assertPinnedStackStateOnMoveToBackStack(PIP_ACTIVITY,
+                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_HOME, windowingMode);
     }
 
     @Test
-    public void testRemovePipWithVisibleFullscreenStack() throws Exception {
-        // Launch a fullscreen activity, and a pip activity over that
+    public void testRemovePipWithVisibleFullscreenOrFreeformStack() throws Exception {
+        // Launch a fullscreen/freeform activity, and a pip activity over that
         launchActivity(TEST_ACTIVITY);
-        launchActivity(PIP_ACTIVITY, EXTRA_ENTER_PIP, "true");
+        launchActivity(PIP_ACTIVITY);
+        int testAppWindowingMode = mWmState.getTaskByActivity(TEST_ACTIVITY).getWindowingMode();
+        int pipWindowingMode = mWmState.getTaskByActivity(PIP_ACTIVITY).getWindowingMode();
+        mBroadcastActionTrigger.doAction(ACTION_ENTER_PIP);
         waitForEnterPip(PIP_ACTIVITY);
         assertPinnedStackExists();
 
-        // Remove the stack and ensure that the task is placed in the fullscreen stack, behind the
-        // top fullscreen activity
+        // Remove the stack and ensure that the task is placed in the fullscreen/freeform stack,
+        // behind the top fullscreen/freeform activity
         removeStacksInWindowingModes(WINDOWING_MODE_PINNED);
-        assertPinnedStackStateOnMoveToFullscreen(PIP_ACTIVITY,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
+        assertPinnedStackStateOnMoveToBackStack(PIP_ACTIVITY,
+                testAppWindowingMode, ACTIVITY_TYPE_STANDARD, pipWindowingMode);
     }
 
     @Test
-    public void testRemovePipWithHiddenFullscreenStack() throws Exception {
-        // Launch a fullscreen activity, return home and while the fullscreen stack is hidden,
-        // launch a pip activity over home
+    public void testRemovePipWithHiddenFullscreenOrFreeformStack() throws Exception {
+        // Launch a fullscreen/freeform activity, return home and while the fullscreen/freeform
+        // stack is hidden, launch a pip activity over home
         launchActivity(TEST_ACTIVITY);
         launchHomeActivity();
-        launchActivity(PIP_ACTIVITY, EXTRA_ENTER_PIP, "true");
+        launchActivity(PIP_ACTIVITY);
+        int windowingMode = mWmState.getTaskByActivity(PIP_ACTIVITY).getWindowingMode();
+        mBroadcastActionTrigger.doAction(ACTION_ENTER_PIP);
         waitForEnterPip(PIP_ACTIVITY);
         assertPinnedStackExists();
 
-        // Remove the stack and ensure that the task is placed on top of the hidden fullscreen
-        // stack, but that the home stack is still focused
+        // Remove the stack and ensure that the task is placed on top of the hidden
+        // fullscreen/freeform stack, but that the home stack is still focused
         removeStacksInWindowingModes(WINDOWING_MODE_PINNED);
-        assertPinnedStackStateOnMoveToFullscreen(PIP_ACTIVITY,
-                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_HOME);
+        assertPinnedStackStateOnMoveToBackStack(PIP_ACTIVITY,
+                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_HOME, windowingMode);
     }
 
     @Test
-    public void testMovePipToBackWithNoFullscreenStack() throws Exception {
+    public void testMovePipToBackWithNoFullscreenOrFreeformStack() throws Exception {
         // Start with a clean slate, remove all the stacks but home
         removeStacksWithActivityTypes(ALL_ACTIVITY_TYPE_BUT_HOME);
 
         // Launch a pip activity
-        launchActivity(PIP_ACTIVITY, EXTRA_ENTER_PIP, "true");
+        launchActivity(PIP_ACTIVITY);
+        int windowingMode = mWmState.getTaskByActivity(PIP_ACTIVITY).getWindowingMode();
+        mBroadcastActionTrigger.doAction(ACTION_ENTER_PIP);
         waitForEnterPip(PIP_ACTIVITY);
         assertPinnedStackExists();
 
-        // Remove the stack and ensure that the task is now in the fullscreen stack (when no
-        // fullscreen stack existed before)
+        // Remove the stack and ensure that the task is now in the fullscreen/freeform stack (when
+        // no fullscreen/freeform stack existed before)
         mBroadcastActionTrigger.doAction(ACTION_MOVE_TO_BACK);
-        assertPinnedStackStateOnMoveToFullscreen(PIP_ACTIVITY,
-                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_HOME);
+        assertPinnedStackStateOnMoveToBackStack(PIP_ACTIVITY,
+                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_HOME, windowingMode);
     }
 
     @Test
-    public void testMovePipToBackWithVisibleFullscreenStack() throws Exception {
-        // Launch a fullscreen activity, and a pip activity over that
+    public void testMovePipToBackWithVisibleFullscreenOrFreeformStack() throws Exception {
+        // Launch a fullscreen/freeform activity, and a pip activity over that
         launchActivity(TEST_ACTIVITY);
-        launchActivity(PIP_ACTIVITY, EXTRA_ENTER_PIP, "true");
+        launchActivity(PIP_ACTIVITY);
+        int testAppWindowingMode = mWmState.getTaskByActivity(TEST_ACTIVITY).getWindowingMode();
+        int pipWindowingMode = mWmState.getTaskByActivity(PIP_ACTIVITY).getWindowingMode();
+        mBroadcastActionTrigger.doAction(ACTION_ENTER_PIP);
         waitForEnterPip(PIP_ACTIVITY);
         assertPinnedStackExists();
 
-        // Remove the stack and ensure that the task is placed in the fullscreen stack, behind the
-        // top fullscreen activity
+        // Remove the stack and ensure that the task is placed in the fullscreen/freeform stack,
+        // behind the top fullscreen/freeform activity
         mBroadcastActionTrigger.doAction(ACTION_MOVE_TO_BACK);
-        assertPinnedStackStateOnMoveToFullscreen(PIP_ACTIVITY,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
+        assertPinnedStackStateOnMoveToBackStack(PIP_ACTIVITY,
+                testAppWindowingMode, ACTIVITY_TYPE_STANDARD, pipWindowingMode);
     }
 
     @Test
-    public void testMovePipToBackWithHiddenFullscreenStack() throws Exception {
-        // Launch a fullscreen activity, return home and while the fullscreen stack is hidden,
-        // launch a pip activity over home
+    public void testMovePipToBackWithHiddenFullscreenOrFreeformStack() throws Exception {
+        // Launch a fullscreen/freeform activity, return home and while the fullscreen/freeform
+        // stack is hidden, launch a pip activity over home
         launchActivity(TEST_ACTIVITY);
         launchHomeActivity();
-        launchActivity(PIP_ACTIVITY, EXTRA_ENTER_PIP, "true");
+        launchActivity(PIP_ACTIVITY);
+        int windowingMode = mWmState.getTaskByActivity(PIP_ACTIVITY).getWindowingMode();
+        mBroadcastActionTrigger.doAction(ACTION_ENTER_PIP);
         waitForEnterPip(PIP_ACTIVITY);
         assertPinnedStackExists();
 
-        // Remove the stack and ensure that the task is placed on top of the hidden fullscreen
-        // stack, but that the home stack is still focused
+        // Remove the stack and ensure that the task is placed on top of the hidden
+        // fullscreen/freeform stack, but that the home stack is still focused
         mBroadcastActionTrigger.doAction(ACTION_MOVE_TO_BACK);
-        assertPinnedStackStateOnMoveToFullscreen(
-                PIP_ACTIVITY, WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_HOME);
+        assertPinnedStackStateOnMoveToBackStack(
+                PIP_ACTIVITY, WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_HOME, windowingMode);
     }
 
     @Test
@@ -803,7 +822,7 @@
          *    fullscreen stack
          * 3) Bring the activity in the dynamic stack forward to trigger PiP
          */
-        launchActivity(RESUME_WHILE_PAUSING_ACTIVITY);
+        launchActivity(RESUME_WHILE_PAUSING_ACTIVITY, WINDOWING_MODE_FULLSCREEN);
         // Launch an activity that will enter PiP when it is paused with a delay that is long enough
         // for the next resumeWhilePausing activity to finish resuming, but slow enough to not
         // trigger the current system pause timeout (currently 500ms)
@@ -818,8 +837,7 @@
     @Test
     public void testDisallowEnterPipActivityLocked() throws Exception {
         launchActivity(PIP_ACTIVITY, EXTRA_ENTER_PIP_ON_PAUSE, "true");
-        ActivityTask task = mWmState.getStandardStackByWindowingMode(
-                WINDOWING_MODE_FULLSCREEN).getTopTask();
+        ActivityTask task = mWmState.getStackByActivity(PIP_ACTIVITY);
 
         // Lock the task and ensure that we can't enter picture-in-picture both explicitly and
         // when paused
@@ -846,18 +864,19 @@
         // configuration change happened after the picture-in-picture and multi-window callbacks
         launchActivity(PIP_ACTIVITY);
         separateTestJournal();
+        int windowingMode = mWmState.getTaskByActivity(PIP_ACTIVITY).getWindowingMode();
         mBroadcastActionTrigger.doAction(ACTION_ENTER_PIP);
         waitForEnterPip(PIP_ACTIVITY);
         assertPinnedStackExists();
         waitForValidPictureInPictureCallbacks(PIP_ACTIVITY);
-        assertValidPictureInPictureCallbackOrder(PIP_ACTIVITY);
+        assertValidPictureInPictureCallbackOrder(PIP_ACTIVITY, windowingMode);
 
-        // Trigger it to go back to fullscreen and ensure that only triggered one configuration
+        // Trigger it to go back to original mode and ensure that only triggered one configuration
         // change as well
         separateTestJournal();
         launchActivity(PIP_ACTIVITY);
         waitForValidPictureInPictureCallbacks(PIP_ACTIVITY);
-        assertValidPictureInPictureCallbackOrder(PIP_ACTIVITY);
+        assertValidPictureInPictureCallbackOrder(PIP_ACTIVITY, windowingMode);
     }
 
     /** Helper class to save, set, and restore transition_animation_scale preferences. */
@@ -925,7 +944,14 @@
     @Test
     public void testStopBeforeMultiWindowCallbacksOnDismiss() throws Exception {
         // Launch a PiP activity
-        launchActivity(PIP_ACTIVITY, EXTRA_ENTER_PIP, "true");
+        launchActivity(PIP_ACTIVITY);
+        int windowingMode = mWmState.getTaskByActivity(PIP_ACTIVITY).getWindowingMode();
+
+        // Skip the test if it's freeform, since freeform <-> PIP does not trigger any multi-window
+        // calbacks.
+        assumeFalse(windowingMode == WINDOWING_MODE_FREEFORM);
+
+        mBroadcastActionTrigger.doAction(ACTION_ENTER_PIP);
         // Wait for animation complete so that system has reported pip mode change event to
         // client and the last reported pip mode has updated.
         waitForEnterPipAnimationComplete(PIP_ACTIVITY);
@@ -971,8 +997,9 @@
 
     @Test
     public void testSetRequestedOrientationWhilePinned() throws Exception {
+        assumeTrue("Skipping test: no orientation request support", supportsOrientationRequest());
         // Launch the PiP activity fixed as portrait, and enter picture-in-picture
-        launchActivity(PIP_ACTIVITY,
+        launchActivity(PIP_ACTIVITY, WINDOWING_MODE_FULLSCREEN,
                 EXTRA_PIP_ORIENTATION, String.valueOf(ORIENTATION_PORTRAIT),
                 EXTRA_ENTER_PIP, "true");
         waitForEnterPip(PIP_ACTIVITY);
@@ -1203,20 +1230,19 @@
     }
 
     /**
-     * Called after the given {@param activityName} has been moved to the fullscreen stack. Ensures
-     * that the stack matching the {@param windowingMode} and {@param activityType} is focused, and
-     * checks the top and/or bottom tasks in the fullscreen stack if
-     * {@param expectTopTaskHasActivity} or {@param expectBottomTaskHasActivity} are set
-     * respectively.
+     * Called after the given {@param activityName} has been moved to the back stack, which follows
+     * the activity's previous windowing mode. Ensures that the stack matching the
+     * {@param windowingMode} and {@param activityType} is focused, and checks PIP activity is now
+     * properly stopped and now belongs to a stack of {@param previousWindowingMode}.
      */
-    private void assertPinnedStackStateOnMoveToFullscreen(ComponentName activityName,
-            int windowingMode, int activityType) {
+    private void assertPinnedStackStateOnMoveToBackStack(ComponentName activityName,
+            int windowingMode, int activityType, int previousWindowingMode) {
         mWmState.waitForFocusedStack(windowingMode, activityType);
         mWmState.assertFocusedStack("Wrong focused stack", windowingMode, activityType);
         waitAndAssertActivityState(activityName, STATE_STOPPED,
                 "Activity should go to STOPPED");
         assertTrue(mWmState.containsActivityInWindowingMode(
-                activityName, WINDOWING_MODE_FULLSCREEN));
+                activityName, previousWindowingMode));
         assertPinnedStackDoesNotExist();
     }
 
@@ -1260,25 +1286,37 @@
      * Asserts that the activity received exactly one of each of the callbacks when entering and
      * exiting picture-in-picture.
      */
-    private void assertValidPictureInPictureCallbackOrder(ComponentName activityName) {
+    private void assertValidPictureInPictureCallbackOrder(ComponentName activityName,
+            int windowingMode) {
         final ActivityLifecycleCounts lifecycles = new ActivityLifecycleCounts(activityName);
-
-        assertEquals(getActivityName(activityName) + " onConfigurationChanged()",
-                1, lifecycles.getCount(ActivityCallback.ON_CONFIGURATION_CHANGED));
+        // There might be one additional config change caused by smallest screen width change when
+        // there are cutout areas on the left & right edges of the display.
+        assertThat(getActivityName(activityName) +
+                        " onConfigurationChanged() shouldn't be triggered more than 2 times",
+                lifecycles.getCount(ActivityCallback.ON_CONFIGURATION_CHANGED),
+                lessThanOrEqualTo(2));
+        assertEquals(getActivityName(activityName) + " onMultiWindowModeChanged",
+                windowingMode == WINDOWING_MODE_FULLSCREEN ? 1 : 0,
+                lifecycles.getCount(ActivityCallback.ON_MULTI_WINDOW_MODE_CHANGED));
         assertEquals(getActivityName(activityName) + " onPictureInPictureModeChanged()",
                 1, lifecycles.getCount(ActivityCallback.ON_PICTURE_IN_PICTURE_MODE_CHANGED));
-        assertEquals(getActivityName(activityName) + " onMultiWindowModeChanged",
-                1, lifecycles.getCount(ActivityCallback.ON_MULTI_WINDOW_MODE_CHANGED));
         final int lastPipIndex = lifecycles
                 .getLastIndex(ActivityCallback.ON_PICTURE_IN_PICTURE_MODE_CHANGED);
-        final int lastMwIndex = lifecycles
-                .getLastIndex(ActivityCallback.ON_MULTI_WINDOW_MODE_CHANGED);
         final int lastConfigIndex = lifecycles
                 .getLastIndex(ActivityCallback.ON_CONFIGURATION_CHANGED);
-        assertThat("onPictureInPictureModeChanged should be before onMultiWindowModeChanged",
-                lastPipIndex, lessThan(lastMwIndex));
-        assertThat("onMultiWindowModeChanged should be before onConfigurationChanged",
-                lastMwIndex, lessThan(lastConfigIndex));
+        // In the case of Freeform, there's no onMultiWindowModeChange callback, so we will only
+        // check for that callback for Fullscreen
+        if (windowingMode == WINDOWING_MODE_FULLSCREEN) {
+            final int lastMwIndex = lifecycles
+                    .getLastIndex(ActivityCallback.ON_MULTI_WINDOW_MODE_CHANGED);
+            assertThat("onPictureInPictureModeChanged should be before onMultiWindowModeChanged",
+                    lastPipIndex, lessThan(lastMwIndex));
+            assertThat("onMultiWindowModeChanged should be before onConfigurationChanged",
+                    lastMwIndex, lessThan(lastConfigIndex));
+        } else {
+            assertThat("onPictureInPictureModeChanged should be before onConfigurationChanged",
+                    lastPipIndex, lessThan(lastConfigIndex));
+        }
     }
 
     /**
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/SplashscreenTests.java b/tests/framework/base/windowmanager/src/android/server/wm/SplashscreenTests.java
index 0fc4bc8..69b472e 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/SplashscreenTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/SplashscreenTests.java
@@ -33,6 +33,8 @@
 import org.junit.Before;
 import org.junit.Test;
 
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+
 /**
  * Build/Install/Run:
  *     atest CtsWindowManagerDeviceTestCases:SplashscreenTests
@@ -59,9 +61,15 @@
         mWmState.waitForAppTransitionIdleOnDisplay(DEFAULT_DISPLAY);
         mWmState.getStableBounds();
         final Bitmap image = takeScreenshot();
+        int windowingMode = mWmState.getFocusedStackWindowingMode();
+        Rect appBounds = new Rect();
+        appBounds.set(windowingMode == WINDOWING_MODE_FULLSCREEN ?
+                mWmState.getStableBounds() :
+                mWmState.findFirstWindowWithType(
+                        WindowManagerState.WindowState.WINDOW_TYPE_STARTING).getContentInsets());
         // Use ratios to flexibly accomodate circular or not quite rectangular displays
         // Note: Color.BLACK is the pixel color outside of the display region
-        assertColors(image, mWmState.getStableBounds(),
+        assertColors(image, appBounds,
             Color.RED, 0.50f, Color.BLACK, 0.02f);
     }
 
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/SplitScreenTests.java b/tests/framework/base/windowmanager/src/android/server/wm/SplitScreenTests.java
index 0c87438..49a15f5 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/SplitScreenTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/SplitScreenTests.java
@@ -106,8 +106,8 @@
         mWmState.computeState(TEST_ACTIVITY);
         mWmState.assertContainsStack("Must contain home stack.",
                 WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_HOME);
-        mWmState.assertContainsStack("Must contain fullscreen stack.",
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
+        mWmState.assertContainsStack("Must contain standard stack.",
+                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD);
         mWmState.assertDoesNotContainStack("Must not contain docked stack.",
                 WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD);
     }
@@ -185,12 +185,24 @@
         mWmState.assertContainsStack("Must contain docked stack.",
                 WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD);
 
-        // Exit split-screen mode and ensure we only get 1 multi-window mode changed callback.
+        int displayWindowingMode = mWmState.getDisplay(
+                mWmState.getDisplayByActivity(TEST_ACTIVITY)).getWindowingMode();
         separateTestJournal();
         SystemUtil.runWithShellPermissionIdentity(() -> mTaskOrganizer.dismissedSplitScreen());
-        final ActivityLifecycleCounts lifecycleCounts = waitForOnMultiWindowModeChanged(
-                TEST_ACTIVITY);
-        assertEquals(1, lifecycleCounts.getCount(ActivityCallback.ON_MULTI_WINDOW_MODE_CHANGED));
+        if (displayWindowingMode == WINDOWING_MODE_FULLSCREEN) {
+            // Exit split-screen mode and ensure we only get 1 multi-window mode changed callback.
+            final ActivityLifecycleCounts lifecycleCounts = waitForOnMultiWindowModeChanged(
+                    TEST_ACTIVITY);
+            assertEquals(1,
+                    lifecycleCounts.getCount(ActivityCallback.ON_MULTI_WINDOW_MODE_CHANGED));
+        } else {
+            // Display is not a fullscreen display, so there won't be a multi-window callback.
+            // Instead just verify that windows are not in split-screen anymore.
+            waitForIdle();
+            mWmState.computeState();
+            mWmState.assertDoesNotContainStack("Must have exited split-screen",
+                    WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD);
+        }
     }
 
     @Test
@@ -490,39 +502,6 @@
     }
 
     @Test
-    @FlakyTest(bugId = 131005232)
-    public void testActivityLifeCycleOnResizeDockedStack() throws Exception {
-        launchActivity(TEST_ACTIVITY);
-        mWmState.computeState(TEST_ACTIVITY);
-        final Rect fullScreenBounds = mWmState.getStandardRootTaskByWindowingMode(
-                WINDOWING_MODE_FULLSCREEN).getBounds();
-
-        setActivityTaskWindowingMode(TEST_ACTIVITY, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
-        mWmState.computeState(TEST_ACTIVITY);
-        launchActivity(NO_RELAUNCH_ACTIVITY, WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY);
-
-        mWmState.computeState(TEST_ACTIVITY, NO_RELAUNCH_ACTIVITY);
-        final Rect initialDockBounds = mWmState.getStandardRootTaskByWindowingMode(
-                WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) .getBounds();
-
-        separateTestJournal();
-
-        Rect newBounds = computeNewDockBounds(fullScreenBounds, initialDockBounds, true);
-        resizeDockedStack(
-                newBounds.width(), newBounds.height(), newBounds.width(), newBounds.height());
-        mWmState.computeState(TEST_ACTIVITY, NO_RELAUNCH_ACTIVITY);
-
-        // We resize twice to make sure we cross an orientation change threshold for both
-        // activities.
-        newBounds = computeNewDockBounds(fullScreenBounds, initialDockBounds, false);
-        resizeDockedStack(
-                newBounds.width(), newBounds.height(), newBounds.width(), newBounds.height());
-        mWmState.computeState(TEST_ACTIVITY, NO_RELAUNCH_ACTIVITY);
-        assertActivityLifecycle(TEST_ACTIVITY, true /* relaunched */);
-        assertActivityLifecycle(NO_RELAUNCH_ACTIVITY, false /* relaunched */);
-    }
-
-    @Test
     public void testDisallowEnterSplitscreenWhenInLockedTask() throws Exception {
         launchActivity(TEST_ACTIVITY, WINDOWING_MODE_FULLSCREEN);
         WindowManagerState.ActivityTask task =
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/SurfaceControlTest.java b/tests/framework/base/windowmanager/src/android/server/wm/SurfaceControlTest.java
index d0aa669..501e0bd 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/SurfaceControlTest.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/SurfaceControlTest.java
@@ -21,6 +21,7 @@
 import static android.server.wm.UiDeviceUtils.pressHomeButton;
 import static android.server.wm.UiDeviceUtils.pressUnlockButton;
 import static android.server.wm.UiDeviceUtils.pressWakeupButton;
+import static android.server.wm.WindowManagerState.getLogicalDisplaySize;
 
 import android.graphics.Canvas;
 import android.graphics.Color;
@@ -76,6 +77,7 @@
 
         mActivity = mActivityRule.getActivity();
         mActivity.dismissPermissionDialog();
+        mActivity.setLogicalDisplaySize(getLogicalDisplaySize());
     }
 
     /**
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/SurfaceViewSurfaceValidatorTest.java b/tests/framework/base/windowmanager/src/android/server/wm/SurfaceViewSurfaceValidatorTest.java
index fa6ee9a..6249f54 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/SurfaceViewSurfaceValidatorTest.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/SurfaceViewSurfaceValidatorTest.java
@@ -18,6 +18,8 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import static android.server.wm.WindowManagerState.getLogicalDisplaySize;
+
 import android.content.Context;
 import android.graphics.Canvas;
 import android.graphics.Color;
@@ -59,6 +61,7 @@
     public void setup() {
         mActivity = mActivityRule.getActivity();
         mActivity.dismissPermissionDialog();
+        mActivity.setLogicalDisplaySize(getLogicalDisplaySize());
     }
 
     /**
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/TransitionSelectionTests.java b/tests/framework/base/windowmanager/src/android/server/wm/TransitionSelectionTests.java
index fbd3f21..c6778a8 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/TransitionSelectionTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/TransitionSelectionTests.java
@@ -26,10 +26,13 @@
 import static android.server.wm.WindowManagerState.TRANSIT_WALLPAPER_INTRA_OPEN;
 import static android.server.wm.WindowManagerState.TRANSIT_WALLPAPER_OPEN;
 import static android.server.wm.app.Components.BOTTOM_ACTIVITY;
+import static android.server.wm.app.Components.BOTTOM_NON_RESIZABLE_ACTIVITY;
 import static android.server.wm.app.Components.BottomActivity.EXTRA_BOTTOM_WALLPAPER;
 import static android.server.wm.app.Components.BottomActivity.EXTRA_STOP_DELAY;
 import static android.server.wm.app.Components.TOP_ACTIVITY;
+import static android.server.wm.app.Components.TOP_NON_RESIZABLE_ACTIVITY;
 import static android.server.wm.app.Components.TRANSLUCENT_TOP_ACTIVITY;
+import static android.server.wm.app.Components.TRANSLUCENT_TOP_NON_RESIZABLE_ACTIVITY;
 import static android.server.wm.app.Components.TopActivity.EXTRA_FINISH_DELAY;
 import static android.server.wm.app.Components.TopActivity.EXTRA_TOP_WALLPAPER;
 
@@ -98,37 +101,37 @@
     @Test
     public void testOpenTask_NeitherWallpaper() {
         testOpenTask(false /*bottomWallpaper*/, false /*topWallpaper*/,
-                false /*slowStop*/, TRANSIT_TASK_OPEN);
+            true /* topResizable */, false /*slowStop*/, TRANSIT_TASK_OPEN);
     }
 
     @Test
     public void testCloseTask_NeitherWallpaper() {
         testCloseTask(false /*bottomWallpaper*/, false /*topWallpaper*/,
-                false /*slowStop*/, TRANSIT_TASK_CLOSE);
+            true /* topResizable */, false /*slowStop*/, TRANSIT_TASK_CLOSE);
     }
 
     @Test
-    public void testOpenTask_BottomWallpaper() {
+    public void testOpenTask_BottomWallpaper_TopNonResizable() {
         testOpenTask(true /*bottomWallpaper*/, false /*topWallpaper*/,
-                false /*slowStop*/, TRANSIT_WALLPAPER_CLOSE);
+            false /* topResizable */, false /*slowStop*/, TRANSIT_WALLPAPER_CLOSE);
     }
 
     @Test
-    public void testCloseTask_BottomWallpaper() {
+    public void testCloseTask_BottomWallpaper_TopNonResizable() {
         testCloseTask(true /*bottomWallpaper*/, false /*topWallpaper*/,
-                false /*slowStop*/, TRANSIT_WALLPAPER_OPEN);
+            false /* topResizable */, false /*slowStop*/, TRANSIT_WALLPAPER_OPEN);
     }
 
     @Test
     public void testOpenTask_BothWallpaper() {
         testOpenTask(true /*bottomWallpaper*/, true /*topWallpaper*/,
-                false /*slowStop*/, TRANSIT_WALLPAPER_INTRA_OPEN);
+            false /* topResizable */, false /*slowStop*/, TRANSIT_WALLPAPER_INTRA_OPEN);
     }
 
     @Test
     public void testCloseTask_BothWallpaper() {
         testCloseTask(true /*bottomWallpaper*/, true /*topWallpaper*/,
-                false /*slowStop*/, TRANSIT_WALLPAPER_INTRA_CLOSE);
+            false /* topResizable */, false /*slowStop*/, TRANSIT_WALLPAPER_INTRA_CLOSE);
     }
 
     //------------------------------------------------------------------------//
@@ -162,19 +165,19 @@
     @Test
     public void testCloseTask_NeitherWallpaper_SlowStop() {
         testCloseTask(false /*bottomWallpaper*/, false /*topWallpaper*/,
-                true /*slowStop*/, TRANSIT_TASK_CLOSE);
+            true /* topResizable */, true /*slowStop*/, TRANSIT_TASK_CLOSE);
     }
 
     @Test
-    public void testCloseTask_BottomWallpaper_SlowStop() {
+    public void testCloseTask_BottomWallpaper_TopNonResizable_SlowStop() {
         testCloseTask(true /*bottomWallpaper*/, false /*topWallpaper*/,
-                true /*slowStop*/, TRANSIT_WALLPAPER_OPEN);
+            false /* topResizable */, true /*slowStop*/, TRANSIT_WALLPAPER_OPEN);
     }
 
     @Test
     public void testCloseTask_BothWallpaper_SlowStop() {
         testCloseTask(true /*bottomWallpaper*/, true /*topWallpaper*/,
-                true /*slowStop*/, TRANSIT_WALLPAPER_INTRA_CLOSE);
+            false /* topResizable */, true /*slowStop*/, TRANSIT_WALLPAPER_INTRA_CLOSE);
     }
 
     //------------------------------------------------------------------------//
@@ -221,48 +224,54 @@
     private void testOpenActivity(boolean bottomWallpaper,
             boolean topWallpaper, boolean slowStop, String expectedTransit) {
         testTransitionSelection(true /*testOpen*/, false /*testNewTask*/,
-                bottomWallpaper, topWallpaper, false /*topTranslucent*/, slowStop, expectedTransit);
+            bottomWallpaper, topWallpaper, false /*topTranslucent*/, true /* topResizable */,
+            slowStop, expectedTransit);
     }
 
     private void testCloseActivity(boolean bottomWallpaper,
             boolean topWallpaper, boolean slowStop, String expectedTransit) {
         testTransitionSelection(false /*testOpen*/, false /*testNewTask*/,
-                bottomWallpaper, topWallpaper, false /*topTranslucent*/, slowStop, expectedTransit);
+            bottomWallpaper, topWallpaper, false /*topTranslucent*/, true /* topResizable */,
+            slowStop, expectedTransit);
     }
 
     private void testOpenTask(boolean bottomWallpaper,
-            boolean topWallpaper, boolean slowStop, String expectedTransit) {
+        boolean topWallpaper, boolean topResizable, boolean slowStop, String expectedTransit) {
         testTransitionSelection(true /*testOpen*/, true /*testNewTask*/,
-                bottomWallpaper, topWallpaper, false /*topTranslucent*/, slowStop, expectedTransit);
+            bottomWallpaper, topWallpaper, false /*topTranslucent*/, topResizable, slowStop,
+            expectedTransit);
     }
 
     private void testCloseTask(boolean bottomWallpaper,
-            boolean topWallpaper, boolean slowStop, String expectedTransit) {
+        boolean topWallpaper, boolean topResizable, boolean slowStop, String expectedTransit) {
         testTransitionSelection(false /*testOpen*/, true /*testNewTask*/,
-                bottomWallpaper, topWallpaper, false /*topTranslucent*/, slowStop, expectedTransit);
+            bottomWallpaper, topWallpaper, false /*topTranslucent*/,
+            topResizable /* topResizable */, slowStop, expectedTransit);
     }
 
     private void testCloseActivityTranslucent(boolean bottomWallpaper,
             boolean topWallpaper, String expectedTransit) {
         testTransitionSelection(false /*testOpen*/, false /*testNewTask*/,
-                bottomWallpaper, topWallpaper, true /*topTranslucent*/,
-                false /*slowStop*/, expectedTransit);
+            bottomWallpaper, topWallpaper, true /*topTranslucent*/, true /* topResizable */,
+            false /*slowStop*/, expectedTransit);
     }
 
     private void testCloseTaskTranslucent(boolean bottomWallpaper,
             boolean topWallpaper, String expectedTransit) {
         testTransitionSelection(false /*testOpen*/, true /*testNewTask*/,
-                bottomWallpaper, topWallpaper, true /*topTranslucent*/,
-                false /*slowStop*/, expectedTransit);
+            bottomWallpaper, topWallpaper, true /*topTranslucent*/, true /* topResizable */,
+            false /*slowStop*/, expectedTransit);
     }
 
     //------------------------------------------------------------------------//
 
     private void testTransitionSelection(
-            boolean testOpen, boolean testNewTask,
-            boolean bottomWallpaper, boolean topWallpaper, boolean topTranslucent,
-            boolean testSlowStop, String expectedTransit) {
-        String bottomStartCmd = getAmStartCmd(BOTTOM_ACTIVITY);
+        boolean testOpen, boolean testNewTask,
+        boolean bottomWallpaper, boolean topWallpaper, boolean topTranslucent,
+        boolean topResizable, boolean testSlowStop, String expectedTransit) {
+        final ComponentName bottomComponent = bottomWallpaper
+            ? BOTTOM_NON_RESIZABLE_ACTIVITY : BOTTOM_ACTIVITY;
+        String bottomStartCmd = getAmStartCmd(bottomComponent);
         if (bottomWallpaper) {
             bottomStartCmd += " --ez " + EXTRA_BOTTOM_WALLPAPER + " true";
         }
@@ -271,9 +280,18 @@
         }
         executeShellCommand(bottomStartCmd);
 
-        mWmState.computeState(BOTTOM_ACTIVITY);
+        mWmState.computeState(bottomComponent);
 
-        final ComponentName topActivity = topTranslucent ? TRANSLUCENT_TOP_ACTIVITY : TOP_ACTIVITY;
+        final ComponentName topActivity;
+        if (topTranslucent && !topResizable) {
+            topActivity = TRANSLUCENT_TOP_NON_RESIZABLE_ACTIVITY;
+        } else if (topTranslucent) {
+            topActivity = TRANSLUCENT_TOP_ACTIVITY;
+        } else if (!topResizable) {
+            topActivity = TOP_NON_RESIZABLE_ACTIVITY;
+        } else {
+            topActivity = TOP_ACTIVITY;
+        }
         String topStartCmd = getAmStartCmd(topActivity);
         if (testNewTask) {
             topStartCmd += " -f 0x18000000";
@@ -290,7 +308,7 @@
             if (testOpen) {
                 mWmState.computeState(topActivity);
             } else {
-                mWmState.computeState(BOTTOM_ACTIVITY);
+                mWmState.computeState(bottomComponent);
             }
             return expectedTransit.equals(
                     mWmState.getDefaultDisplayLastTransition());
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/WindowContextPolicyTests.java b/tests/framework/base/windowmanager/src/android/server/wm/WindowContextPolicyTests.java
index 9210263..a115396 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/WindowContextPolicyTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/WindowContextPolicyTests.java
@@ -39,6 +39,7 @@
 
     @Test(expected = UnsupportedOperationException.class)
     public void testCreateTooManyWindowContextWithoutViewThrowException() {
+        createAllowSystemAlertWindowAppOpSession();
         final WindowManagerState.DisplayContent display =  createManagedVirtualDisplaySession()
                 .setSimulateDisplay(true).createDisplay();
         for (int i = 0; i < 6; i++) {
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/WindowContextTests.java b/tests/framework/base/windowmanager/src/android/server/wm/WindowContextTests.java
index 05f1b09..99588ce 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/WindowContextTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/WindowContextTests.java
@@ -40,6 +40,7 @@
     @Test
     @AppModeFull
     public void testWindowContextConfigChanges() {
+        createAllowSystemAlertWindowAppOpSession();
         final WindowManagerState.DisplayContent display =  createManagedVirtualDisplaySession()
                 .setSimulateDisplay(true).createDisplay();
         final Context windowContext = createWindowContext(display.mId);
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/WindowFocusTests.java b/tests/framework/base/windowmanager/src/android/server/wm/WindowFocusTests.java
index bdb28b2..f3905b0 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/WindowFocusTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/WindowFocusTests.java
@@ -42,6 +42,7 @@
 import static org.junit.Assume.assumeFalse;
 import static org.junit.Assume.assumeTrue;
 
+import android.app.Activity;
 import android.content.Context;
 import android.content.res.Configuration;
 import android.graphics.Canvas;
@@ -58,6 +59,7 @@
 import android.view.View;
 import android.view.WindowManager.LayoutParams;
 
+import androidx.annotation.NonNull;
 import androidx.test.filters.FlakyTest;
 
 import com.android.compatibility.common.util.SystemUtil;
@@ -100,25 +102,29 @@
                 target.getKeyEventCount());
     }
 
-    private static void tapOnCenterOfDisplay(int displayId) {
-        final Point point = new Point();
-        getInstrumentation().getTargetContext()
-                .getSystemService(DisplayManager.class)
-                .getDisplay(displayId)
-                .getSize(point);
-        final int x = point.x / 2;
-        final int y = point.y / 2;
+    private static void tapOn(@NonNull Activity activity) {
+        final Point p = getCenterOfActivityOnScreen(activity);
+        final int displayId = activity.getDisplayId();
+
         final long downTime = SystemClock.elapsedRealtime();
         final MotionEvent downEvent = MotionEvent.obtain(downTime, downTime,
-                MotionEvent.ACTION_DOWN, x, y, 0 /* metaState */);
+                MotionEvent.ACTION_DOWN, p.x, p.y, 0 /* metaState */);
         downEvent.setDisplayId(displayId);
         getInstrumentation().sendPointerSync(downEvent);
         final MotionEvent upEvent = MotionEvent.obtain(downTime, SystemClock.elapsedRealtime(),
-                MotionEvent.ACTION_UP, x, y, 0 /* metaState */);
+                MotionEvent.ACTION_UP, p.x, p.y, 0 /* metaState */);
         upEvent.setDisplayId(displayId);
         getInstrumentation().sendPointerSync(upEvent);
     }
 
+    private static Point getCenterOfActivityOnScreen(@NonNull Activity activity) {
+        final View decorView = activity.getWindow().getDecorView();
+        final int[] location = new int[2];
+        decorView.getLocationOnScreen(location);
+        return new Point(location[0] + decorView.getWidth() / 2,
+                location[1] + decorView.getHeight() / 2);
+    }
+
     /**
      * Test the following conditions:
      * - Each display can have a focused window at the same time.
@@ -160,7 +166,7 @@
         secondaryActivity.assertAndConsumeKeyEvent(ACTION_DOWN, KEYCODE_6, 0 /* flags */);
         secondaryActivity.assertAndConsumeKeyEvent(ACTION_DOWN, KEYCODE_7, 0 /* flags */);
 
-        tapOnCenterOfDisplay(DEFAULT_DISPLAY);
+        tapOn(primaryActivity);
 
         // Assert only display-unspecified key would be cancelled after secondary activity is
         // not top focused if per-display focus is enabled. Otherwise, assert all non-released
@@ -239,7 +245,7 @@
         getInstrumentation().runOnMainSync(secondaryActivity::requestPointerCapture);
         secondaryActivity.waitAndAssertPointerCaptureState(true /* hasCapture */);
 
-        tapOnCenterOfDisplay(DEFAULT_DISPLAY);
+        tapOn(primaryActivity);
         primaryActivity.waitAndAssertWindowFocusState(true);
 
         // Assert secondary activity lost pointer capture when it is not top focused.
@@ -282,7 +288,7 @@
         final SecondaryActivity secondaryActivity =
                 createManagedInvisibleDisplaySession().startActivityAndFocus();
 
-        tapOnCenterOfDisplay(DEFAULT_DISPLAY);
+        tapOn(primaryActivity);
         // Ensure primary activity got focus
         primaryActivity.waitAndAssertWindowFocusState(true);
         secondaryActivity.waitAndAssertWindowFocusState(false);
@@ -311,7 +317,7 @@
         });
         getInstrumentation().waitForIdleSync();
 
-        tapOnCenterOfDisplay(DEFAULT_DISPLAY);
+        tapOn(primaryActivity);
         // Ensure secondary activity still has focus
         secondaryActivity.waitAndAssertWindowFocusState(true);
         primaryActivity.waitAndAssertWindowFocusState(false);
@@ -393,7 +399,7 @@
                 mKeyEventList.add(event);
                 mLockKeyEvent.notify();
             }
-            return super.dispatchKeyEvent(event);
+            return true;
         }
 
         int getKeyEventCount() {
@@ -545,7 +551,7 @@
         // An untrusted virtual display won't have focus until the display is touched.
         final SecondaryActivity activity = WindowManagerTestBase.startActivity(
                 SecondaryActivity.class, displayId, hasFocus);
-        tapOnCenterOfDisplay(displayId);
+        tapOn(activity);
         activity.waitAndAssertWindowFocusState(true);
         return activity;
     }
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsAnimationImeTests.java b/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsAnimationImeTests.java
index 0fedf6c..70c299d 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsAnimationImeTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsAnimationImeTests.java
@@ -16,6 +16,7 @@
 
 package android.server.wm;
 
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.graphics.Insets.NONE;
 import static android.view.WindowInsets.Type.ime;
 import static android.view.WindowInsets.Type.navigationBars;
@@ -70,7 +71,7 @@
     private void initActivity(boolean useFloating) throws Exception {
         initMockImeSession(useFloating);
 
-        mActivity = startActivity(TestActivity.class);
+        mActivity = startActivityInWindowingMode(TestActivity.class, WINDOWING_MODE_FULLSCREEN);
         mRootView = mActivity.getWindow().getDecorView();
     }
 
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsAnimationSynchronicityTests.java b/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsAnimationSynchronicityTests.java
index f51708f..8e28903 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsAnimationSynchronicityTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsAnimationSynchronicityTests.java
@@ -16,8 +16,12 @@
 
 package android.server.wm;
 
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
+import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
 import static android.server.wm.ActivityManagerTestBase.executeShellCommand;
 import static android.server.wm.WindowInsetsAnimationUtils.requestControlThenTransitionToVisibility;
+import static android.view.Display.DEFAULT_DISPLAY;
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 import static android.view.WindowInsets.Type.ime;
 import static android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN;
@@ -25,8 +29,10 @@
 import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
 
 import android.app.Activity;
+import android.app.ActivityOptions;
 import android.content.ComponentName;
 import android.content.Context;
+import android.content.Intent;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Insets;
@@ -55,10 +61,12 @@
 import androidx.test.rule.ActivityTestRule;
 
 import com.android.compatibility.common.util.PollingCheck;
+import com.android.compatibility.common.util.SystemUtil;
 
 import org.junit.Rule;
 import org.junit.Test;
 
+import java.lang.reflect.Array;
 import java.util.List;
 import java.util.Locale;
 import java.util.function.Supplier;
@@ -72,10 +80,6 @@
     @Rule
     public LimitedErrorCollector mErrorCollector = new LimitedErrorCollector();
 
-    @Rule
-    public ActivityTestRule<TestActivity> mActivityRule = new ActivityTestRule<>(
-            TestActivity.class, false, false);
-
     private final Context mContext = InstrumentationRegistry.getInstrumentation().getContext();
 
     @Test
@@ -90,7 +94,7 @@
 
     private void runTest(boolean useControlApi) throws Exception {
         try (ImeSession imeSession = new ImeSession(SimpleIme.getName(mContext))) {
-            TestActivity activity = mActivityRule.launchActivity(null);
+            TestActivity activity = launchActivity();
             activity.setUseControlApi(useControlApi);
             PollingCheck.waitFor(activity::hasWindowFocus);
             activity.setEvaluator(() -> {
@@ -111,9 +115,22 @@
                 }
             });
             Thread.sleep(2000);
+            activity.setEvaluator(null);
         }
     }
 
+    private TestActivity launchActivity() {
+        final ActivityOptions options= ActivityOptions.makeBasic();
+        options.setLaunchWindowingMode(WINDOWING_MODE_FULLSCREEN);
+        final TestActivity[] activity = (TestActivity[]) Array.newInstance(TestActivity.class, 1);
+        SystemUtil.runWithShellPermissionIdentity(() -> {
+            activity[0] = (TestActivity) getInstrumentation().startActivitySync(
+                    new Intent(getInstrumentation().getTargetContext(), TestActivity.class)
+                            .addFlags(FLAG_ACTIVITY_NEW_TASK), options.toBundle());
+        });
+        return activity[0];
+    }
+
     private static int lowestPixelWithColor(int color, int x, Bitmap bitmap) {
         int[] pixels = new int[bitmap.getHeight()];
         bitmap.getPixels(pixels, 0, 1, x, 0, 1, bitmap.getHeight());
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsControllerTests.java b/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsControllerTests.java
index aca3a97..ea3a54b 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsControllerTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsControllerTests.java
@@ -424,6 +424,8 @@
         // The swipe action brings down the notification shade which causes subsequent tests to
         // fail.
         if (isAutomotive(mContext)) {
+            // Bring system to a known state before requesting to close system dialogs.
+            launchHomeActivity();
             broadcastCloseSystemDialogs();
         }
     }
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsLayoutTests.java b/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsLayoutTests.java
index 91e1748..e622ad3 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsLayoutTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsLayoutTests.java
@@ -16,6 +16,7 @@
 
 package android.server.wm;
 
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
 import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
@@ -27,6 +28,7 @@
 
 import android.graphics.Insets;
 import android.graphics.Point;
+import android.os.Bundle;
 import android.platform.test.annotations.Presubmit;
 import android.view.Display;
 import android.view.View;
@@ -35,11 +37,11 @@
 import android.view.WindowInsets.Type;
 import android.view.WindowManager;
 
+import androidx.annotation.Nullable;
 import androidx.test.filters.FlakyTest;
 
 import com.android.compatibility.common.util.PollingCheck;
 
-import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -57,7 +59,9 @@
 
     @Test
     public void testSetFitInsetsTypes() {
-        final TestActivity activity = startActivity(TestActivity.class);
+        // Start the Activity in fullscreen windowing mode for its bounds to match display bounds.
+        final TestActivity activity =
+                startActivityInWindowingMode(TestActivity.class, WINDOWING_MODE_FULLSCREEN);
 
         // Make sure the main window has been laid out.
         final View mainWindowRoot = activity.getWindow().getDecorView();
@@ -99,7 +103,9 @@
 
     @Test
     public void testSetFitInsetsSides() {
-        final TestActivity activity = startActivity(TestActivity.class);
+        // Start the Activity in fullscreen windowing mode for its bounds to match display bounds.
+        final TestActivity activity =
+                startActivityInWindowingMode(TestActivity.class, WINDOWING_MODE_FULLSCREEN);
 
         // Make sure the main window has been laid out.
         final View mainWindowRoot = activity.getWindow().getDecorView();
@@ -143,7 +149,9 @@
 
     @Test
     public void testSetFitInsetsIgnoringVisibility() {
-        final TestActivity activity = startActivity(TestActivity.class);
+        // Start the Activity in fullscreen windowing mode for its bounds to match display bounds.
+        final TestActivity activity =
+                startActivityInWindowingMode(TestActivity.class, WINDOWING_MODE_FULLSCREEN);
 
         // Make sure the main window has been laid out.
         final View mainWindowRoot = activity.getWindow().getDecorView();
@@ -194,6 +202,14 @@
 
         private View mChildWindowRoot;
 
+        @Override
+        protected void onCreate(@Nullable Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            WindowManager.LayoutParams lp = getWindow().getAttributes();
+            lp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+            getWindow().setAttributes(lp);
+        }
+
         void addChildWindow(int types, int sides, boolean ignoreVis) {
             final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams();
             attrs.type = TYPE_APPLICATION_PANEL;
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/WindowManagerTestBase.java b/tests/framework/base/windowmanager/src/android/server/wm/WindowManagerTestBase.java
index 1b6bd76..0cf96d8 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/WindowManagerTestBase.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/WindowManagerTestBase.java
@@ -16,6 +16,7 @@
 
 package android.server.wm;
 
+import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
 import static android.server.wm.ActivityManagerTestBase.launchHomeActivityNoWait;
 import static android.server.wm.UiDeviceUtils.pressUnlockButton;
@@ -36,8 +37,6 @@
 import org.junit.Before;
 
 import java.lang.reflect.Array;
-import java.util.ArrayList;
-import java.util.List;
 
 import javax.annotation.concurrent.GuardedBy;
 
@@ -55,10 +54,31 @@
         return startActivity(cls, DEFAULT_DISPLAY);
     }
 
+    static <T extends FocusableActivity> T startActivity(Class<T> cls, int displayId) {
+        return startActivity(cls, displayId, true /* hasFocus */);
+    }
+
+    static <T extends FocusableActivity> T startActivity(
+            Class<T> cls, int displayId, boolean hasFocus) {
+        return startActivity(cls, displayId, hasFocus, WINDOWING_MODE_UNDEFINED);
+    }
+
+    static <T extends FocusableActivity> T startActivityInWindowingMode(
+            Class<T> cls, int windowingMode) {
+        return startActivity(cls, DEFAULT_DISPLAY, true /* hasFocus */, windowingMode);
+    }
+
     static <T extends FocusableActivity> T startActivity(Class<T> cls, int displayId,
-            boolean hasFocus) {
-        final Bundle options = (displayId == DEFAULT_DISPLAY
-                ? null : ActivityOptions.makeBasic().setLaunchDisplayId(displayId).toBundle());
+            boolean hasFocus, int windowingMode) {
+        final Bundle options;
+        if (displayId == DEFAULT_DISPLAY && windowingMode == WINDOWING_MODE_UNDEFINED) {
+            options = null;
+        } else {
+            final ActivityOptions ap= ActivityOptions.makeBasic();
+            if (displayId != DEFAULT_DISPLAY) ap.setLaunchDisplayId(displayId);
+            if (windowingMode != WINDOWING_MODE_UNDEFINED) ap.setLaunchWindowingMode(windowingMode);
+            options = ap.toBundle();
+        }
         final T[] activity = (T[]) Array.newInstance(FocusableActivity.class, 1);
         SystemUtil.runWithShellPermissionIdentity(() -> {
             activity[0] = (T) getInstrumentation().startActivitySync(
@@ -69,10 +89,6 @@
         return activity[0];
     }
 
-    static <T extends FocusableActivity> T startActivity(Class<T> cls, int displayId) {
-      return startActivity(cls, displayId, true /* hasFocus */);
-    }
-
     static class FocusableActivity extends Activity {
         private final Object mLockWindowFocus = new Object();
 
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/WindowMetricsTests.java b/tests/framework/base/windowmanager/src/android/server/wm/WindowMetricsTests.java
index 0d7e4aa..05d80a0 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/WindowMetricsTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/WindowMetricsTests.java
@@ -61,7 +61,8 @@
         final MetricsActivity activity = mMetricsActivity.launchActivity(null);
         activity.waitForLayout();
 
-        assertEquals(activity.mOnLayoutBounds, activity.mOnCreateCurrentMetrics.getBounds());
+        assertEquals(activity.mOnLayoutBoundsInScreen,
+                activity.mOnCreateCurrentMetrics.getBounds());
         assertTrue(activity.mOnCreateMaximumMetrics.getBounds().width()
                 >= activity.mOnCreateCurrentMetrics.getBounds().width());
         assertTrue(activity.mOnCreateMaximumMetrics.getBounds().height()
@@ -127,7 +128,7 @@
         private WindowMetrics mOnCreateMaximumMetrics;
         private WindowMetrics mOnCreateCurrentMetrics;
 
-        private Rect mOnLayoutBounds;
+        private Rect mOnLayoutBoundsInScreen;
         private WindowInsets mOnLayoutInsets;
 
         @Override
@@ -142,9 +143,14 @@
         public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft,
                 int oldTop, int oldRight, int oldBottom) {
             final View decorView = getWindow().getDecorView();
-            mOnLayoutBounds = new Rect(decorView.getTop(), decorView.getLeft(),
+            mOnLayoutBoundsInScreen = new Rect(decorView.getTop(), decorView.getLeft(),
                     decorView.getRight(), decorView.getBottom());
-            mOnLayoutInsets = getWindow().getDecorView().getRootWindowInsets();
+            // Convert decorView's bounds from window coordinates to screen coordinates.
+            final int[] locationOnScreen = new int[2];
+            decorView.getLocationOnScreen(locationOnScreen);
+            mOnLayoutBoundsInScreen.offset(locationOnScreen[0], locationOnScreen[1]);
+
+            mOnLayoutInsets = decorView.getRootWindowInsets();
             mLayoutLatch.countDown();
         }
 
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/intent/LaunchRunner.java b/tests/framework/base/windowmanager/src/android/server/wm/intent/LaunchRunner.java
index badb526..6219478 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/intent/LaunchRunner.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/intent/LaunchRunner.java
@@ -27,10 +27,13 @@
 import static org.junit.Assert.assertNotNull;
 
 import android.app.Activity;
+import android.app.ActivityOptions;
 import android.app.Instrumentation;
+import android.app.WindowConfiguration;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.os.Bundle;
 import android.os.SystemClock;
 import android.server.wm.WindowManagerStateHelper;
 import android.server.wm.WindowManagerState;
@@ -244,7 +247,7 @@
         Instrumentation.ActivityMonitor monitor = getInstrumentation()
                 .addMonitor((String) null, null, false);
 
-        context.startActivity(intent);
+        context.startActivity(intent, getLaunchOptions());
         Activity activity = monitor.waitForActivityWithTimeout(ACTIVITY_LAUNCH_TIMEOUT);
         waitAndAssertActivityLaunched(activity, intent);
 
@@ -256,9 +259,9 @@
                 .addMonitor((String) null, null, false);
 
         if (startForResult) {
-            activityContext.startActivityForResult(intent, 1);
+            activityContext.startActivityForResult(intent, 1, getLaunchOptions());
         } else {
-            activityContext.startActivity(intent);
+            activityContext.startActivity(intent, getLaunchOptions());
         }
         Activity activity = monitor.waitForActivityWithTimeout(ACTIVITY_LAUNCH_TIMEOUT);
 
@@ -328,4 +331,10 @@
         amWmState.computeState(new ComponentName[]{});
         return amWmState.getRootTasks();
     }
+
+    private static Bundle getLaunchOptions() {
+        ActivityOptions options = ActivityOptions.makeBasic();
+        options.setLaunchWindowingMode(WindowConfiguration.WINDOWING_MODE_FULLSCREEN);
+        return options.toBundle();
+    }
 }
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/lifecycle/ActivityLifecycleClientTestBase.java b/tests/framework/base/windowmanager/src/android/server/wm/lifecycle/ActivityLifecycleClientTestBase.java
index e3b406d..d3fa81d 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/lifecycle/ActivityLifecycleClientTestBase.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/lifecycle/ActivityLifecycleClientTestBase.java
@@ -16,6 +16,7 @@
 
 package android.server.wm.lifecycle;
 
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
 import static android.server.wm.StateLogger.log;
@@ -689,8 +690,39 @@
         moveTaskToPrimarySplitScreen(activity.getTaskId());
 
         final Class<? extends Activity> activityClass = activity.getClass();
-        waitAndAssertActivityTransitions(activityClass,
-                LifecycleVerifier.getSplitScreenTransitionSequence(activityClass),
-                "enterSplitScreen");
+        waitAndAssertActivityEnterSplitScreenTransitions(activityClass, "enterSplitScreen");
+    }
+
+    /**
+     * Blocking call that will wait for activities to perform the entering split screen sequence of
+     * transitions.
+     * @see LifecycleTracker#waitForActivityTransitions(Class, List)
+     */
+    final void waitAndAssertActivityEnterSplitScreenTransitions(
+            Class<? extends Activity> activityClass, String message) {
+        log("Start waitAndAssertActivitySplitScreenTransitions");
+
+        final List<LifecycleLog.ActivityCallback> expectedTransitions =
+                LifecycleVerifier.getSplitScreenTransitionSequence(activityClass);
+
+        mLifecycleTracker.waitForActivityTransitions(activityClass, expectedTransitions);
+        if (!expectedTransitions.contains(ON_MULTI_WINDOW_MODE_CHANGED)) {
+            LifecycleVerifier.assertSequence(activityClass, getLifecycleLog(),
+                    expectedTransitions, message);
+        } else {
+            final List<LifecycleLog.ActivityCallback> extraSequence =
+                    Arrays.asList(ON_MULTI_WINDOW_MODE_CHANGED, ON_TOP_POSITION_LOST,
+                            ON_PAUSE, ON_STOP, ON_DESTROY, PRE_ON_CREATE, ON_CREATE,
+                            ON_START, ON_POST_CREATE, ON_RESUME, ON_TOP_POSITION_GAINED,
+                            ON_TOP_POSITION_LOST, ON_PAUSE);
+            LifecycleVerifier.assertSequenceMatchesOneOf(activityClass, getLifecycleLog(),
+                    Arrays.asList(expectedTransitions, extraSequence), message);
+        }
+    }
+
+    final ActivityOptions getLaunchOptionsForFullscreen() {
+        final ActivityOptions launchOptions = ActivityOptions.makeBasic();
+        launchOptions.setLaunchWindowingMode(WINDOWING_MODE_FULLSCREEN);
+        return launchOptions;
     }
 }
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/lifecycle/ActivityLifecycleFreeformTests.java b/tests/framework/base/windowmanager/src/android/server/wm/lifecycle/ActivityLifecycleFreeformTests.java
index 5409191..3c8132c 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/lifecycle/ActivityLifecycleFreeformTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/lifecycle/ActivityLifecycleFreeformTests.java
@@ -17,6 +17,7 @@
 package android.server.wm.lifecycle;
 
 import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
 import static android.server.wm.WindowManagerState.STATE_PAUSED;
@@ -64,7 +65,7 @@
     @Test
     public void testLaunchInFreeform() throws Exception {
         // Launch a fullscreen activity, mainly to prevent setting pending due to task switching.
-        launchActivityAndWait(CallbackTrackingActivity.class);
+        launchActivityInFullscreenAndWait(CallbackTrackingActivity.class);
 
         // Launch an activity in freeform
         final ActivityOptions launchOptions = ActivityOptions.makeBasic();
@@ -85,7 +86,7 @@
     @Test
     public void testMultiLaunchInFreeform() throws Exception {
         // Launch a fullscreen activity, mainly to prevent setting pending due to task switching.
-        launchActivityAndWait(CallbackTrackingActivity.class);
+        launchActivityInFullscreenAndWait(CallbackTrackingActivity.class);
 
         final ActivityOptions launchOptions = ActivityOptions.makeBasic();
         launchOptions.setLaunchWindowingMode(WINDOWING_MODE_FREEFORM);
@@ -123,7 +124,7 @@
     @Test
     public void testLaunchOccludingInFreeform() throws Exception {
         // Launch a fullscreen activity, mainly to prevent setting pending due to task switching.
-        launchActivityAndWait(CallbackTrackingActivity.class);
+        launchActivityInFullscreenAndWait(CallbackTrackingActivity.class);
 
         final ActivityOptions launchOptions = ActivityOptions.makeBasic();
         launchOptions.setLaunchWindowingMode(WINDOWING_MODE_FREEFORM);
@@ -134,7 +135,7 @@
                 .setOptions(launchOptions)
                 .launch();
 
-        final Activity secondActivity = launchActivityAndWait(SecondActivity.class);
+        final Activity secondActivity = launchActivityInFullscreenAndWait(SecondActivity.class);
 
         new Launcher(ThirdActivity.class)
                 .setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_MULTIPLE_TASK)
@@ -181,7 +182,7 @@
     @Test
     public void testLaunchTranslucentInFreeform() throws Exception {
         // Launch a fullscreen activity, mainly to prevent setting pending due to task switching.
-        launchActivityAndWait(CallbackTrackingActivity.class);
+        launchActivityInFullscreenAndWait(CallbackTrackingActivity.class);
 
         final ActivityOptions launchOptions = ActivityOptions.makeBasic();
         launchOptions.setLaunchWindowingMode(WINDOWING_MODE_FREEFORM);
@@ -192,7 +193,8 @@
                 .setOptions(launchOptions)
                 .launch();
 
-        final Activity transparentActivity = launchActivityAndWait(TranslucentActivity.class);
+        final Activity transparentActivity =
+            launchActivityInFullscreenAndWait(TranslucentActivity.class);
 
         new Launcher(ThirdActivity.class)
                 .setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_MULTIPLE_TASK)
@@ -267,4 +269,13 @@
         waitAndAssertActivityState(SDK_27_LAUNCHING_ACTIVITY, STATE_RESUMED,
                 "Activity must be resumed.");
     }
+
+    private Activity launchActivityInFullscreenAndWait(Class<? extends Activity> activityClass)
+        throws Exception {
+        final ActivityOptions launchOptions = ActivityOptions.makeBasic();
+        launchOptions.setLaunchWindowingMode(WINDOWING_MODE_FULLSCREEN);
+        return new Launcher(activityClass)
+            .setOptions(launchOptions)
+            .launch();
+    }
 }
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/lifecycle/ActivityLifecycleSplitScreenTests.java b/tests/framework/base/windowmanager/src/android/server/wm/lifecycle/ActivityLifecycleSplitScreenTests.java
index 51645f1..6cf6e99 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/lifecycle/ActivityLifecycleSplitScreenTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/lifecycle/ActivityLifecycleSplitScreenTests.java
@@ -295,28 +295,14 @@
     @Test
     public void testLifecycleOnMoveToFromSplitScreenRelaunch() throws Exception {
         // Launch a singleTop activity
-        launchActivityAndWait(CallbackTrackingActivity.class);
+        final Activity activity = launchActivityAndWait(CallbackTrackingActivity.class);
 
         // Wait for the activity to resume
         LifecycleVerifier.assertLaunchSequence(CallbackTrackingActivity.class, getLifecycleLog());
 
         // Enter split screen
         getLifecycleLog().clear();
-        setActivityTaskWindowingMode(CALLBACK_TRACKING_ACTIVITY,
-                WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
-
-        // Wait for the activity to relaunch and receive multi-window mode change
-        final List<LifecycleLog.ActivityCallback> expectedEnterSequence =
-                Arrays.asList(ON_TOP_POSITION_LOST, ON_PAUSE, ON_STOP, ON_DESTROY, PRE_ON_CREATE,
-                        ON_CREATE, ON_START, ON_POST_CREATE, ON_RESUME, ON_TOP_POSITION_GAINED,
-                        ON_MULTI_WINDOW_MODE_CHANGED, ON_TOP_POSITION_LOST, ON_PAUSE);
-        waitForActivityTransitions(CallbackTrackingActivity.class, expectedEnterSequence);
-        LifecycleVerifier.assertOrder(getLifecycleLog(), CallbackTrackingActivity.class,
-                Arrays.asList(ON_TOP_POSITION_LOST, ON_PAUSE, ON_STOP, ON_DESTROY, ON_CREATE,
-                        ON_RESUME), "moveToSplitScreen");
-        LifecycleVerifier.assertTransitionObserved(getLifecycleLog(),
-                transition(CallbackTrackingActivity.class, ON_MULTI_WINDOW_MODE_CHANGED),
-                "moveToSplitScreen");
+        moveTaskToPrimarySplitScreenAndVerify(activity);
 
         // Exit split-screen
         getLifecycleLog().clear();
@@ -325,14 +311,15 @@
         // Wait for the activity to relaunch and receive multi-window mode change
         final List<LifecycleLog.ActivityCallback> expectedExitSequence =
                 Arrays.asList(ON_STOP, ON_DESTROY, PRE_ON_CREATE, ON_CREATE, ON_START,
-                        ON_POST_CREATE, ON_RESUME, ON_PAUSE, ON_MULTI_WINDOW_MODE_CHANGED,
-                        ON_RESUME, ON_TOP_POSITION_GAINED);
+                        ON_POST_CREATE, ON_RESUME, ON_TOP_POSITION_GAINED);
+
+        // ON_MULTI_WINDOW_MODE_CHANGED could happen before destroy
         waitForActivityTransitions(CallbackTrackingActivity.class, expectedExitSequence);
         LifecycleVerifier.assertOrder(getLifecycleLog(), CallbackTrackingActivity.class,
-                Arrays.asList(ON_DESTROY, ON_CREATE, ON_MULTI_WINDOW_MODE_CHANGED),
-                "moveFromSplitScreen");
-        LifecycleVerifier.assertOrder(getLifecycleLog(), CallbackTrackingActivity.class,
-                Arrays.asList(ON_RESUME, ON_TOP_POSITION_GAINED),
+                expectedExitSequence, "moveFromSplitScreen");
+        LifecycleVerifier.assertTransitionObserved(getLifecycleLog(),
+                LifecycleVerifier.transition(CallbackTrackingActivity.class,
+                        ON_MULTI_WINDOW_MODE_CHANGED),
                 "moveFromSplitScreen");
     }
 
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/lifecycle/ActivityLifecycleTests.java b/tests/framework/base/windowmanager/src/android/server/wm/lifecycle/ActivityLifecycleTests.java
index 5645d4d..f2cab44 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/lifecycle/ActivityLifecycleTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/lifecycle/ActivityLifecycleTests.java
@@ -146,9 +146,12 @@
     @Test
     public void testTranslucentMovedIntoStack() throws Exception {
         // Launch a translucent activity and a regular activity in separate stacks
-        final Activity translucentActivity = launchActivityAndWait(TranslucentActivity.class);
+        final Activity translucentActivity = new Launcher(TranslucentActivity.class)
+                .setOptions(getLaunchOptionsForFullscreen())
+                .launch();
         final Activity firstActivity = new Launcher(FirstActivity.class)
                 .setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_MULTIPLE_TASK)
+                .setOptions(getLaunchOptionsForFullscreen())
                 .launch();
         waitAndAssertActivityStates(state(translucentActivity, ON_STOP));
 
@@ -697,8 +700,10 @@
         // Launch activity whose process will be killed
         builder.execute();
 
-        // Start activity in another process to put original activity in background.
-        final Activity testActivity = launchActivityAndWait(FirstActivity.class);
+        // Start fullscreen activity in another process to put original activity in background.
+        final Activity testActivity = new Launcher(FirstActivity.class)
+                .setOptions(getLaunchOptionsForFullscreen())
+                .launch();
         final boolean isTranslucent = isTranslucent(testActivity);
         mWmState.waitForActivityState(
                 targetActivity, isTranslucent ? STATE_PAUSED : STATE_STOPPED);
@@ -731,6 +736,7 @@
         // Launch second activity to cover and stop first
         final Activity secondActivity = new Launcher(SecondActivity.class)
                 .setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_MULTIPLE_TASK)
+                .setOptions(getLaunchOptionsForFullscreen())
                 .launch();
 
         // Wait for first activity to become occluded
@@ -791,6 +797,7 @@
         // Launch something on top
         final Activity secondActivity = new Launcher(SecondActivity.class)
                 .setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_MULTIPLE_TASK)
+                .setOptions(getLaunchOptionsForFullscreen())
                 .launch();
 
         waitAndAssertActivityStates(state(singleTopActivity, ON_STOP));
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/lifecycle/ActivityTests.java b/tests/framework/base/windowmanager/src/android/server/wm/lifecycle/ActivityTests.java
index c0cc598..e96e017 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/lifecycle/ActivityTests.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/lifecycle/ActivityTests.java
@@ -252,8 +252,9 @@
     @Test
     public void testFinishAffinity_differentAffinity() throws Exception {
         final Activity firstActivity = launchActivityAndWait(FirstActivity.class);
-        final Activity differentAffinityActivity =
-                launchActivityAndWait(DifferentAffinityActivity.class);
+        final Activity differentAffinityActivity = new Launcher(DifferentAffinityActivity.class)
+                .setOptions(getLaunchOptionsForFullscreen())
+                .launch();
         waitAndAssertActivityStates(state(differentAffinityActivity, ON_RESUME),
                 state(firstActivity, ON_STOP));
 
@@ -271,9 +272,10 @@
     @Test
     public void testFinishAffinity_multiTask() throws Exception {
         final Activity firstActivity = launchActivityAndWait(FirstActivity.class);
-        // Launch activity in a new task
+        // Launch fullscreen activity in a new task to stop first activity
         final Activity secondActivity = new Launcher(SecondActivity.class)
                 .setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_MULTIPLE_TASK)
+                .setOptions(getLaunchOptionsForFullscreen())
                 .launch();
         waitAndAssertActivityStates(state(secondActivity, ON_RESUME),
                 state(firstActivity, ON_STOP));
diff --git a/tests/framework/base/windowmanager/testsdk25/Android.bp b/tests/framework/base/windowmanager/testsdk25/Android.bp
index 12bca0c..cc90392 100644
--- a/tests/framework/base/windowmanager/testsdk25/Android.bp
+++ b/tests/framework/base/windowmanager/testsdk25/Android.bp
@@ -31,7 +31,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/framework/base/windowmanager/testsdk28/Android.bp b/tests/framework/base/windowmanager/testsdk28/Android.bp
index 6962ffa..67d3516 100644
--- a/tests/framework/base/windowmanager/testsdk28/Android.bp
+++ b/tests/framework/base/windowmanager/testsdk28/Android.bp
@@ -31,7 +31,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/framework/base/windowmanager/testsdk29/Android.bp b/tests/framework/base/windowmanager/testsdk29/Android.bp
index ca76c86..f19f7b7 100644
--- a/tests/framework/base/windowmanager/testsdk29/Android.bp
+++ b/tests/framework/base/windowmanager/testsdk29/Android.bp
@@ -33,7 +33,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/framework/base/windowmanager/translucentapp/Android.bp b/tests/framework/base/windowmanager/translucentapp/Android.bp
index c551c29..9665321 100644
--- a/tests/framework/base/windowmanager/translucentapp/Android.bp
+++ b/tests/framework/base/windowmanager/translucentapp/Android.bp
@@ -29,7 +29,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/framework/base/windowmanager/translucentappsdk26/Android.bp b/tests/framework/base/windowmanager/translucentappsdk26/Android.bp
index 7c8d0d8..2b5ff50 100644
--- a/tests/framework/base/windowmanager/translucentappsdk26/Android.bp
+++ b/tests/framework/base/windowmanager/translucentappsdk26/Android.bp
@@ -27,7 +27,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/framework/base/windowmanager/util/src/android/server/wm/ActivityManagerTestBase.java b/tests/framework/base/windowmanager/util/src/android/server/wm/ActivityManagerTestBase.java
index f4e7d89..abd880c 100644
--- a/tests/framework/base/windowmanager/util/src/android/server/wm/ActivityManagerTestBase.java
+++ b/tests/framework/base/windowmanager/util/src/android/server/wm/ActivityManagerTestBase.java
@@ -17,6 +17,8 @@
 package android.server.wm;
 
 import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
+import static android.app.AppOpsManager.MODE_ALLOWED;
+import static android.app.AppOpsManager.OPSTR_SYSTEM_ALERT_WINDOW;
 import static android.app.Instrumentation.ActivityMonitor;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
@@ -138,6 +140,7 @@
 import android.server.wm.CommandSession.SizeInfo;
 import android.server.wm.TestJournalProvider.TestJournalContainer;
 import android.server.wm.settings.SettingsSession;
+import android.util.DisplayMetrics;
 import android.util.EventLog;
 import android.util.EventLog.Event;
 import android.view.Display;
@@ -149,6 +152,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
+import com.android.compatibility.common.util.AppOpsUtils;
 import com.android.compatibility.common.util.SystemUtil;
 
 import org.junit.Before;
@@ -1152,11 +1156,47 @@
                 || (!supportsLandscape && !supportsPortrait);
     }
 
+    /**
+     * The device should support orientation request from apps if it supports rotation and the
+     * display is not close to square.
+     */
+    protected boolean supportsOrientationRequest() {
+        return supportsRotation() && !isCloseToSquareDisplay();
+    }
+
+    /** Checks whether the display dimension is close to square. */
+    protected boolean isCloseToSquareDisplay() {
+        final Resources resources = mContext.getResources();
+        final float closeToSquareMaxAspectRatio;
+        try {
+            closeToSquareMaxAspectRatio = resources.getFloat(resources.getIdentifier(
+                    "config_closeToSquareDisplayMaxAspectRatio", "dimen", "android"));
+        } catch (Resources.NotFoundException e) {
+            // Assume device is not close to square.
+            return false;
+        }
+        final DisplayMetrics displayMetrics = new DisplayMetrics();
+        mDm.getDisplay(DEFAULT_DISPLAY).getRealMetrics(displayMetrics);
+        final int w = displayMetrics.widthPixels;
+        final int h = displayMetrics.heightPixels;
+        final float aspectRatio = Math.max(w, h) / (float) Math.min(w, h);
+        return aspectRatio <= closeToSquareMaxAspectRatio;
+    }
+
     protected boolean hasDeviceFeature(final String requiredFeature) {
         return mContext.getPackageManager()
                 .hasSystemFeature(requiredFeature);
     }
 
+    protected static boolean isDisplayPortrait() {
+        final DisplayManager displayManager = getInstrumentation()
+                .getContext().getSystemService(DisplayManager.class);
+        final Display display = displayManager.getDisplay(DEFAULT_DISPLAY);
+        final DisplayMetrics displayMetrics = new DisplayMetrics();
+        display.getRealMetrics(displayMetrics);
+        return displayMetrics.widthPixels < displayMetrics.heightPixels;
+    }
+
     protected static boolean isDisplayOn(int displayId) {
         final DisplayManager displayManager = getInstrumentation()
                 .getContext().getSystemService(DisplayManager.class);
@@ -1199,6 +1239,12 @@
         return new TestActivitySession<T>();
     }
 
+    /** @see ObjectTracker#manage(AutoCloseable) */
+    protected SystemAlertWindowAppOpSession createAllowSystemAlertWindowAppOpSession() {
+        return mObjectTracker.manage(
+                new SystemAlertWindowAppOpSession(mContext.getOpPackageName(), MODE_ALLOWED));
+    }
+
     /**
      * Test @Rule class that disables screen doze settings before each test method running and
      * restoring to initial values after test method finished.
@@ -1360,6 +1406,10 @@
             } else {
                 Condition.waitFor("display to turn off", () -> !isDisplayOn(DEFAULT_DISPLAY));
             }
+            if(!isLockDisabled()) {
+                mWmState.waitFor(state -> state.getKeyguardControllerState().keyguardShowing,
+                        "Keyguard showing");
+            }
             return this;
         }
 
@@ -1438,20 +1488,51 @@
         }
     }
 
+    /** Helper class to set and restore appop mode "android:system_alert_window". */
+    protected static class SystemAlertWindowAppOpSession implements AutoCloseable {
+        private final String mPackageName;
+        private final int mPreviousOpMode;
+
+        SystemAlertWindowAppOpSession(String packageName, int mode) {
+            mPackageName = packageName;
+            try {
+                mPreviousOpMode = AppOpsUtils.getOpMode(mPackageName, OPSTR_SYSTEM_ALERT_WINDOW);
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+            setOpMode(mode);
+        }
+
+        @Override
+        public void close() {
+            setOpMode(mPreviousOpMode);
+        }
+
+        void setOpMode(int mode) {
+            try {
+                AppOpsUtils.setOpMode(mPackageName, OPSTR_SYSTEM_ALERT_WINDOW, mode);
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
     /** Helper class to save, set & wait, and restore rotation related preferences. */
     protected class RotationSession extends SettingsSession<Integer> {
-        private final SettingsSession<Integer> mUserRotation;
+        private final String SET_FIX_TO_USER_ROTATION_COMMAND =
+                "cmd window set-fix-to-user-rotation ";
+        private final SettingsSession<Integer> mAccelerometerRotation;
         private final HandlerThread mThread;
         private final Handler mRunnableHandler;
         private final SettingsObserver mRotationObserver;
         private int mPreviousDegree;
 
         public RotationSession() {
-            // Save accelerometer_rotation preference.
-            super(Settings.System.getUriFor(Settings.System.ACCELEROMETER_ROTATION),
+            // Save user_rotation and accelerometer_rotation preferences.
+            super(Settings.System.getUriFor(Settings.System.USER_ROTATION),
                     Settings.System::getInt, Settings.System::putInt);
-            mUserRotation = new SettingsSession<>(
-                    Settings.System.getUriFor(Settings.System.USER_ROTATION),
+            mAccelerometerRotation = new SettingsSession<>(
+                    Settings.System.getUriFor(Settings.System.ACCELEROMETER_ROTATION),
                     Settings.System::getInt, Settings.System::putInt);
 
             mThread = new HandlerThread("Observer_Thread");
@@ -1459,9 +1540,12 @@
             mRunnableHandler = new Handler(mThread.getLooper());
             mRotationObserver = new SettingsObserver(mRunnableHandler);
 
-            mPreviousDegree = mUserRotation.get();
+            // Disable fixed to user rotation
+            executeShellCommand(SET_FIX_TO_USER_ROTATION_COMMAND + "disabled");
+
+            mPreviousDegree = get();
             // Disable accelerometer_rotation.
-            super.set(0);
+            mAccelerometerRotation.set(0);
         }
 
         @Override
@@ -1488,7 +1572,7 @@
             if (observeRotationSettings) {
                 mRotationObserver.observe();
             }
-            mUserRotation.set(value);
+            super.set(value);
             mPreviousDegree = value;
 
             if (waitSystemUI) {
@@ -1514,10 +1598,12 @@
 
         @Override
         public void close() {
+            // Set fixed to user rotation to default
+            executeShellCommand(SET_FIX_TO_USER_ROTATION_COMMAND + "default");
             mThread.quitSafely();
-            mUserRotation.close();
-            // Restore accelerometer_rotation preference.
             super.close();
+            // Restore accelerometer_rotation preference.
+            mAccelerometerRotation.close();
         }
 
         private class SettingsObserver extends ContentObserver {
diff --git a/tests/framework/base/windowmanager/util/src/android/server/wm/BarTestUtils.java b/tests/framework/base/windowmanager/util/src/android/server/wm/BarTestUtils.java
index be66641..0a373f0 100644
--- a/tests/framework/base/windowmanager/util/src/android/server/wm/BarTestUtils.java
+++ b/tests/framework/base/windowmanager/util/src/android/server/wm/BarTestUtils.java
@@ -84,6 +84,8 @@
         assumeFalse("No bars on watches and TVs", pm.hasSystemFeature(PackageManager.FEATURE_WATCH)
                 || pm.hasSystemFeature(PackageManager.FEATURE_TELEVISION)
                 || pm.hasSystemFeature(PackageManager.FEATURE_LEANBACK));
+
+        assumeFalse("No bars on PCs", pm.hasSystemFeature(PackageManager.FEATURE_PC));
     }
 
     private static boolean isRunningInVr() {
diff --git a/tests/framework/base/windowmanager/util/src/android/server/wm/TestTaskOrganizer.java b/tests/framework/base/windowmanager/util/src/android/server/wm/TestTaskOrganizer.java
index 9597478..e304958 100644
--- a/tests/framework/base/windowmanager/util/src/android/server/wm/TestTaskOrganizer.java
+++ b/tests/framework/base/windowmanager/util/src/android/server/wm/TestTaskOrganizer.java
@@ -61,6 +61,7 @@
         registerOrganizerIfNeeded();
         ActivityManager.RunningTaskInfo taskInfo = getTaskInfo(taskId);
         final WindowContainerTransaction t = new WindowContainerTransaction();
+        t.setBounds(taskInfo.getToken(), null);
         t.reparent(taskInfo.getToken(), mRootPrimary.getToken(), true /* onTop */);
         applyTransaction(t);
     }
@@ -156,12 +157,14 @@
 
         final int windowingMode =
                 taskInfo.getConfiguration().windowConfiguration.getWindowingMode();
-        if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) {
+        if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY
+                && (mRootPrimary == null || mRootPrimary.taskId == taskInfo.taskId)) {
             mRootPrimary = taskInfo;
             processRootPrimaryTaskInfoChanged();
         }
 
-        if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY) {
+        if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY
+                && (mRootSecondary == null || mRootSecondary.taskId == taskInfo.taskId)) {
             mRootSecondary = taskInfo;
         }
     }
diff --git a/tests/framework/base/windowmanager/util/src/android/server/wm/WindowManagerState.java b/tests/framework/base/windowmanager/util/src/android/server/wm/WindowManagerState.java
index f362c23..91e3359 100644
--- a/tests/framework/base/windowmanager/util/src/android/server/wm/WindowManagerState.java
+++ b/tests/framework/base/windowmanager/util/src/android/server/wm/WindowManagerState.java
@@ -39,6 +39,7 @@
 
 import android.content.ComponentName;
 import android.content.res.Configuration;
+import android.graphics.Point;
 import android.graphics.Rect;
 import android.os.ParcelFileDescriptor;
 import android.os.SystemClock;
@@ -610,15 +611,15 @@
         return -1;
     }
 
-    /** Get the stack position on its display. */
-    int getStackIndexByActivity(ComponentName activityName) {
+    /** Get the stack on its display. */
+    ActivityTask getStackByActivity(ComponentName activityName) {
         for (DisplayContent display : mDisplays) {
             for (int i = display.mRootTasks.size() - 1; i >= 0; --i) {
                 final ActivityTask stack = display.mRootTasks.get(i);
-                if (stack.containsActivity(activityName)) return i;
+                if (stack.containsActivity(activityName)) return stack;
             }
         }
-        return -1;
+        return null;
     }
 
     /** Get display id by activity on it. */
@@ -837,6 +838,14 @@
         return mPendingActivities.contains(getActivityName(activityName));
     }
 
+    // Get the logical display size of the default display.
+    public static Point getLogicalDisplaySize() {
+        WindowManagerState mWmState = new WindowManagerState();
+        mWmState.computeState();
+        Rect size = mWmState.getDisplay(DEFAULT_DISPLAY).getDisplayRect();
+        return new Point(size.width(), size.height());
+    }
+
     String getDefaultDisplayLastTransition() {
         return getDisplay(DEFAULT_DISPLAY).getLastTransition();
     }
@@ -1512,7 +1521,7 @@
     public static class WindowState extends WindowContainer {
 
         private static final int WINDOW_TYPE_NORMAL = 0;
-        private static final int WINDOW_TYPE_STARTING = 1;
+        public static final int WINDOW_TYPE_STARTING = 1;
         private static final int WINDOW_TYPE_EXITING = 2;
         private static final int WINDOW_TYPE_DEBUGGER = 3;
 
diff --git a/tests/inputmethod/Android.bp b/tests/inputmethod/Android.bp
index bca549a..909ad0e 100644
--- a/tests/inputmethod/Android.bp
+++ b/tests/inputmethod/Android.bp
@@ -18,11 +18,10 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     compile_multilib: "both",
-    libs: ["android.test.runner.stubs"],
+    libs: ["android.test.runner"],
     static_libs: [
         "androidx.test.rules",
         "androidx.test.uiautomator_uiautomator",
diff --git a/tests/inputmethod/AndroidTest.xml b/tests/inputmethod/AndroidTest.xml
index fd2ea5d..7419606 100644
--- a/tests/inputmethod/AndroidTest.xml
+++ b/tests/inputmethod/AndroidTest.xml
@@ -70,6 +70,11 @@
         <option name="cleanup-apks" value="true" />
         <option name="test-file-name" value="CtsInputMethodTestCases.apk" />
     </target_preparer>
+    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
+      <!-- Disable hidden API checking, see b/166236554 -->
+        <option name="run-command" value="settings put global hidden_api_policy 1" />
+        <option name="teardown-command" value="settings delete global hidden_api_policy" />
+    </target_preparer>
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="android.view.inputmethod.cts" />
         <option name="runtime-hint" value="1m0s" />
diff --git a/tests/inputmethod/mockime/Android.bp b/tests/inputmethod/mockime/Android.bp
index c73f870..58849e4 100644
--- a/tests/inputmethod/mockime/Android.bp
+++ b/tests/inputmethod/mockime/Android.bp
@@ -40,7 +40,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: [
diff --git a/tests/inputmethod/mockime/src/com/android/cts/mockime/ImeState.java b/tests/inputmethod/mockime/src/com/android/cts/mockime/ImeState.java
index 3275995..3870727 100644
--- a/tests/inputmethod/mockime/src/com/android/cts/mockime/ImeState.java
+++ b/tests/inputmethod/mockime/src/com/android/cts/mockime/ImeState.java
@@ -26,7 +26,7 @@
  */
 public final class ImeState {
     private final boolean mHasInputBinding;
-    private final boolean mHasDummyInputConnection;
+    private final boolean mHasFallbackInputConnection;
 
     /**
      * @return {@code true} if {@link MockIme#getCurrentInputBinding()} returned non-null
@@ -37,23 +37,23 @@
     }
 
     /**
-     * @return {@code true} if {@link MockIme#getCurrentInputConnection()} returned non-dummy
+     * @return {@code true} if {@link MockIme#getCurrentInputConnection()} returned non-fallback
      *         {@link android.view.inputmethod.InputConnection} when this snapshot was taken.
      */
-    public boolean hasDummyInputConnection() {
-        return mHasDummyInputConnection;
+    public boolean hasFallbackInputConnection() {
+        return mHasFallbackInputConnection;
     }
 
-    ImeState(boolean hasInputBinding, boolean hasDummyInputConnection) {
+    ImeState(boolean hasInputBinding, boolean hasFallbackInputConnection) {
         mHasInputBinding = hasInputBinding;
-        mHasDummyInputConnection = hasDummyInputConnection;
+        mHasFallbackInputConnection = hasFallbackInputConnection;
     }
 
     @NonNull
     Bundle toBundle() {
         final Bundle bundle = new Bundle();
         bundle.putBoolean("mHasInputBinding", mHasInputBinding);
-        bundle.putBoolean("mHasDummyInputConnection", mHasDummyInputConnection);
+        bundle.putBoolean("mHasFallbackInputConnection", mHasFallbackInputConnection);
         return bundle;
     }
 
@@ -63,7 +63,7 @@
             return null;
         }
         final boolean hasInputBinding = bundle.getBoolean("mHasInputBinding");
-        final boolean hasDummyInputConnection = bundle.getBoolean("mHasDummyInputConnection");
-        return new ImeState(hasInputBinding, hasDummyInputConnection);
+        final boolean hasFallbackInputConnection = bundle.getBoolean("mHasFallbackInputConnection");
+        return new ImeState(hasInputBinding, hasFallbackInputConnection);
     }
 }
diff --git a/tests/inputmethod/mockime/src/com/android/cts/mockime/MockIme.java b/tests/inputmethod/mockime/src/com/android/cts/mockime/MockIme.java
index 779bba8..cb68f93 100644
--- a/tests/inputmethod/mockime/src/com/android/cts/mockime/MockIme.java
+++ b/tests/inputmethod/mockime/src/com/android/cts/mockime/MockIme.java
@@ -740,10 +740,10 @@
     @NonNull
     private ImeState getState() {
         final boolean hasInputBinding = getCurrentInputBinding() != null;
-        final boolean hasDummyInputConnectionConnection =
+        final boolean hasFallbackInputConnection =
                 !hasInputBinding
                         || getCurrentInputConnection() == getCurrentInputBinding().getConnection();
-        return new ImeState(hasInputBinding, hasDummyInputConnectionConnection);
+        return new ImeState(hasInputBinding, hasFallbackInputConnection);
     }
 
     private PendingInlineSuggestions mPendingInlineSuggestions;
diff --git a/tests/inputmethod/src/android/view/inputmethod/cts/BaseInputConnectionTest.java b/tests/inputmethod/src/android/view/inputmethod/cts/BaseInputConnectionTest.java
index ea6da79..f59ca42 100644
--- a/tests/inputmethod/src/android/view/inputmethod/cts/BaseInputConnectionTest.java
+++ b/tests/inputmethod/src/android/view/inputmethod/cts/BaseInputConnectionTest.java
@@ -118,7 +118,7 @@
         assertNotNull(text);
         assertEquals(0, text.length());
 
-        // Test commitText, not dummy mode
+        // Test commitText, not default fake mode
         CharSequence str = "TestCommit ";
         Editable inputText = Editable.Factory.getInstance().newEditable(str);
         connection.commitText(inputText, inputText.length());
@@ -161,7 +161,7 @@
         Editable inputText = Editable.Factory.getInstance().newEditable(str);
         connection.commitText(inputText, inputText.length());
         final Editable text = connection.getEditable();
-        // Test finishComposingText, not dummy mode
+        // Test finishComposingText, not default fake mode
         BaseInputConnection.setComposingSpans(text);
         assertTrue(BaseInputConnection.getComposingSpanStart(text) > -1);
         assertTrue(BaseInputConnection.getComposingSpanEnd(text) > -1);
diff --git a/tests/inputmethod/src/android/view/inputmethod/cts/FocusHandlingTest.java b/tests/inputmethod/src/android/view/inputmethod/cts/FocusHandlingTest.java
index f8dd5f5..753d63c 100644
--- a/tests/inputmethod/src/android/view/inputmethod/cts/FocusHandlingTest.java
+++ b/tests/inputmethod/src/android/view/inputmethod/cts/FocusHandlingTest.java
@@ -152,7 +152,7 @@
             final ImeEvent onStart =
                     expectEvent(stream, editorMatcher("onStartInput", marker), TIMEOUT);
 
-            assertFalse(stream.dump(), onStart.getEnterState().hasDummyInputConnection());
+            assertFalse(stream.dump(), onStart.getEnterState().hasFallbackInputConnection());
             assertFalse(stream.dump(), onStart.getArguments().getBoolean("restarting"));
 
             // There shouldn't be onStartInput any more.
diff --git a/tests/inputmethod/src/android/view/inputmethod/cts/KeyboardVisibilityControlTest.java b/tests/inputmethod/src/android/view/inputmethod/cts/KeyboardVisibilityControlTest.java
index 0d169e3..cad3309 100644
--- a/tests/inputmethod/src/android/view/inputmethod/cts/KeyboardVisibilityControlTest.java
+++ b/tests/inputmethod/src/android/view/inputmethod/cts/KeyboardVisibilityControlTest.java
@@ -403,10 +403,11 @@
                     View.GONE, TIMEOUT);
             expectImeInvisible(TIMEOUT);
 
-            // Expect fake input connection started and keyboard invisible after activity focused.
+            // Expect fallback input connection started and keyboard invisible after activity
+            // focused.
             final ImeEvent onStart = expectEvent(stream,
                     event -> "onStartInput".equals(event.getEventName()), TIMEOUT);
-            assertTrue(onStart.getEnterState().hasDummyInputConnection());
+            assertTrue(onStart.getEnterState().hasFallbackInputConnection());
             TestUtils.waitOnMainUntil(() -> testActivity.hasWindowFocus(), TIMEOUT);
             expectEventWithKeyValue(stream, "onWindowVisibilityChanged", "visible",
                     View.GONE, TIMEOUT);
diff --git a/tests/inputmethod/src/android/view/inputmethod/cts/SearchViewTest.java b/tests/inputmethod/src/android/view/inputmethod/cts/SearchViewTest.java
index c6183e4..8750ec2 100644
--- a/tests/inputmethod/src/android/view/inputmethod/cts/SearchViewTest.java
+++ b/tests/inputmethod/src/android/view/inputmethod/cts/SearchViewTest.java
@@ -138,7 +138,7 @@
             // Wait until "showSoftInput" gets called with a real InputConnection
             expectEvent(stream, event ->
                     "showSoftInput".equals(event.getEventName())
-                            && !event.getExitState().hasDummyInputConnection(),
+                            && !event.getExitState().hasFallbackInputConnection(),
                     CHECK_EXIT_EVENT_ONLY, TIMEOUT);
 
             expectImeVisible(TIMEOUT);
@@ -171,7 +171,7 @@
             // (SearchAutoComplete) with real InputConnection.
             expectEvent(stream, event ->
                     "showSoftInput".equals(event.getEventName())
-                            && !event.getExitState().hasDummyInputConnection(),
+                            && !event.getExitState().hasFallbackInputConnection(),
                     CHECK_EXIT_EVENT_ONLY, TIMEOUT);
 
             expectImeVisible(TIMEOUT);
@@ -198,7 +198,7 @@
             // Wait until "showSoftInput" gets called with a real InputConnection
             expectEvent(stream, event ->
                             "showSoftInput".equals(event.getEventName())
-                                    && !event.getExitState().hasDummyInputConnection(),
+                                    && !event.getExitState().hasFallbackInputConnection(),
                     CHECK_EXIT_EVENT_ONLY, TIMEOUT);
 
             expectImeVisible(TIMEOUT);
diff --git a/tests/jdwp/Android.bp b/tests/jdwp/Android.bp
index ef127b5..bea346d 100644
--- a/tests/jdwp/Android.bp
+++ b/tests/jdwp/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/tests/jdwp/runner/host-side/Android.bp b/tests/jdwp/runner/host-side/Android.bp
index db1e3fa..a78fe2e 100644
--- a/tests/jdwp/runner/host-side/Android.bp
+++ b/tests/jdwp/runner/host-side/Android.bp
@@ -33,7 +33,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
 	"mts",
     ],
diff --git a/tests/leanbackjank/Android.bp b/tests/leanbackjank/Android.bp
index 0823885..f72d1fb 100644
--- a/tests/leanbackjank/Android.bp
+++ b/tests/leanbackjank/Android.bp
@@ -23,7 +23,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: [
@@ -32,5 +31,5 @@
         "ub-uiautomator",
         "androidx.test.janktesthelper",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
 }
diff --git a/tests/leanbackjank/app/Android.bp b/tests/leanbackjank/app/Android.bp
index 7f1f8cf..cfcff77 100644
--- a/tests/leanbackjank/app/Android.bp
+++ b/tests/leanbackjank/app/Android.bp
@@ -20,7 +20,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     resource_dirs: ["res"],
diff --git a/tests/libcore/jsr166/Android.bp b/tests/libcore/jsr166/Android.bp
index d714ada..b6dbd78 100644
--- a/tests/libcore/jsr166/Android.bp
+++ b/tests/libcore/jsr166/Android.bp
@@ -19,6 +19,9 @@
     static_libs: [
         "cts-core-test-runner-axt",
         "jsr166-tests",
+
+        // Jar containing expectations files.
+        "libcore-expectations-knownfailures-jar",
     ],
     dex_preopt: {
         enabled: false,
@@ -29,8 +32,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
-    java_resources: [":libcore-expectations-knownfailures"],
 }
diff --git a/tests/libcore/luni/Android.bp b/tests/libcore/luni/Android.bp
index 6d6903d..5edde79 100644
--- a/tests/libcore/luni/Android.bp
+++ b/tests/libcore/luni/Android.bp
@@ -22,6 +22,11 @@
         "conscrypt-tests",
         "core-tests",
         "cts-core-test-runner-axt",
+
+        // Jars containing expectations files.
+        "libcore-expectations-knownfailures-jar",
+        "libcore-expectations-virtualdeviceknownfailures-jar",
+
         "mockito-target-minus-junit4",
         "time_zone_distro-tests",
         "time_zone_distro_installer-tests",
@@ -53,11 +58,6 @@
     test_suites: [
         "cts",
         "mts",
-        "vts10",
         "general-tests",
     ],
-    java_resources: [
-        ":libcore-expectations-knownfailures",
-        ":libcore-expectations-virtualdeviceknownfailures",
-    ],
 }
diff --git a/tests/libcore/ojluni/Android.bp b/tests/libcore/ojluni/Android.bp
index 59e57e3..6a5e8ed 100644
--- a/tests/libcore/ojluni/Android.bp
+++ b/tests/libcore/ojluni/Android.bp
@@ -16,7 +16,12 @@
     name: "CtsLibcoreOjTestCases",
     defaults: ["cts_support_defaults"],
     platform_apis: true,
-    static_libs: ["core-ojtests-public"],
+    static_libs: [
+        "core-ojtests-public",
+
+        // Jar containing expectations files.
+        "libcore-expectations-knownfailures-jar",
+    ],
     libs: ["testng"],
     dxflags: ["--core-library"],
     dex_preopt: {
@@ -31,9 +36,7 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
-	"mts",
+        "mts",
     ],
-    java_resources: [":libcore-expectations-knownfailures"],
 }
diff --git a/tests/libcore/ojluni/AndroidTest.xml b/tests/libcore/ojluni/AndroidTest.xml
index f4d043a..d69101e 100644
--- a/tests/libcore/ojluni/AndroidTest.xml
+++ b/tests/libcore/ojluni/AndroidTest.xml
@@ -41,8 +41,8 @@
                 value="com.android.cts.core.runner.ExpectationBasedFilter" />
         <option name="core-expectation" value="/knownfailures.txt" />
         <option name="runtime-hint" value="35m"/>
-        <!-- 20x default timeout of 600sec -->
-        <option name="shell-timeout" value="12000000"/>
+        <!-- shell-timeout is the amount of time we wait for an output before stopping the instrumentation -->
+        <option name="shell-timeout" value="45m"/>
         <option name="hidden-api-checks" value="false"/>
     </test>
 
diff --git a/tests/libcore/okhttp/Android.bp b/tests/libcore/okhttp/Android.bp
index b0f17d2..02ce4e4 100644
--- a/tests/libcore/okhttp/Android.bp
+++ b/tests/libcore/okhttp/Android.bp
@@ -20,6 +20,10 @@
     static_libs: [
         "bouncycastle-unbundled",
         "cts-core-test-runner-axt",
+
+        // Jar containing expectations files.
+        "libcore-expectations-knownfailures-jar",
+
         "okhttp-nojarjar",
         "okhttp-tests-nojarjar",
     ],
@@ -37,7 +41,5 @@
         "cts",
         "general-tests",
         "mts",
-        "vts10",
     ],
-    java_resources: [":libcore-expectations-knownfailures"],
 }
diff --git a/tests/libcore/runner/Android.bp b/tests/libcore/runner/Android.bp
index 183187c..25a9dcd 100644
--- a/tests/libcore/runner/Android.bp
+++ b/tests/libcore/runner/Android.bp
@@ -26,8 +26,7 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
-	"mts",
+        "mts",
     ],
 }
diff --git a/tests/libcore/wycheproof-bc/Android.bp b/tests/libcore/wycheproof-bc/Android.bp
index 6457120..57f59b7 100644
--- a/tests/libcore/wycheproof-bc/Android.bp
+++ b/tests/libcore/wycheproof-bc/Android.bp
@@ -18,6 +18,10 @@
     platform_apis: true,
     static_libs: [
         "cts-core-test-runner-axt",
+
+        // Jar containing expectations files.
+        "libcore-expectations-knownfailures-jar",
+
         "wycheproof",
     ],
     srcs: ["src/**/*.java"],
@@ -33,7 +37,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
+        "general-tests",
     ],
-    java_resources: [":libcore-expectations-knownfailures"],
 }
diff --git a/tests/libcore/wycheproof/Android.bp b/tests/libcore/wycheproof/Android.bp
index e0abd73..859e82f 100644
--- a/tests/libcore/wycheproof/Android.bp
+++ b/tests/libcore/wycheproof/Android.bp
@@ -18,6 +18,10 @@
     platform_apis: true,
     static_libs: [
         "cts-core-test-runner-axt",
+
+        // Jar containing expectations files.
+        "libcore-expectations-knownfailures-jar",
+
         "wycheproof",
     ],
     srcs: ["src/**/*.java"],
@@ -33,8 +37,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
-    java_resources: [":libcore-expectations-knownfailures"],
 }
diff --git a/tests/location/common/Android.bp b/tests/location/common/Android.bp
index 4ca35fe..c242fcf 100644
--- a/tests/location/common/Android.bp
+++ b/tests/location/common/Android.bp
@@ -19,6 +19,6 @@
     ],
     libs: [
         "compatibility-device-util-axt",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
 }
diff --git a/tests/location/common/src/android/location/cts/common/TestMeasurementUtil.java b/tests/location/common/src/android/location/cts/common/TestMeasurementUtil.java
index 846094c..afb5785 100644
--- a/tests/location/common/src/android/location/cts/common/TestMeasurementUtil.java
+++ b/tests/location/common/src/android/location/cts/common/TestMeasurementUtil.java
@@ -16,6 +16,8 @@
 
 package android.location.cts.common;
 
+import android.content.Context;
+import android.content.pm.PackageManager;
 import android.location.GnssClock;
 import android.location.GnssMeasurement;
 import android.location.GnssMeasurementsEvent;
@@ -120,6 +122,13 @@
     }
 
     /**
+     * Check if current device is an Android Automotive OS device.
+     */
+    public static boolean isAutomotiveDevice(Context context) {
+        return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE);
+    }
+
+    /**
      * Check if pseudorange rate uncertainty in Gnss Measurement is in the expected range.
      * See field description in {@code gps.h}.
      *
diff --git a/tests/location/location_coarse/Android.bp b/tests/location/location_coarse/Android.bp
index 114354a..ba53aea 100644
--- a/tests/location/location_coarse/Android.bp
+++ b/tests/location/location_coarse/Android.bp
@@ -25,12 +25,11 @@
         "truth-prebuilt",
     ],
     libs: [
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/location/location_fine/Android.bp b/tests/location/location_fine/Android.bp
index ff298d8..acd0b1d 100644
--- a/tests/location/location_fine/Android.bp
+++ b/tests/location/location_fine/Android.bp
@@ -25,12 +25,11 @@
         "truth-prebuilt",
     ],
     libs: [
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/location/location_gnss/Android.bp b/tests/location/location_gnss/Android.bp
index 563ea5b..5748862 100644
--- a/tests/location/location_gnss/Android.bp
+++ b/tests/location/location_gnss/Android.bp
@@ -15,8 +15,8 @@
 java_test_helper_library {
     name: "cts-location-gnss-tests",
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     static_libs: [
         "LocationCtsCommon",
@@ -48,8 +48,8 @@
         "apache-commons-math",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     proto: {
         type: "nano",
@@ -60,7 +60,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/location/location_gnss/src/android/location/cts/gnss/GnssMeasurementRegistrationTest.java b/tests/location/location_gnss/src/android/location/cts/gnss/GnssMeasurementRegistrationTest.java
index 25d57f4..6db3d4f 100644
--- a/tests/location/location_gnss/src/android/location/cts/gnss/GnssMeasurementRegistrationTest.java
+++ b/tests/location/location_gnss/src/android/location/cts/gnss/GnssMeasurementRegistrationTest.java
@@ -92,6 +92,11 @@
             return;
         }
 
+        if (TestMeasurementUtil.isAutomotiveDevice(getContext())) {
+            Log.i(TAG, "Test is being skipped because the system has the AUTOMOTIVE feature.");
+            return;
+        }
+
         // Register for GPS measurements.
         mMeasurementListener = new TestGnssMeasurementListener(TAG, GPS_EVENTS_COUNT);
         mTestLocationManager.registerGnssMeasurementCallback(mMeasurementListener);
diff --git a/tests/location/location_gnss/src/android/location/cts/gnss/GnssMeasurementValuesTest.java b/tests/location/location_gnss/src/android/location/cts/gnss/GnssMeasurementValuesTest.java
index eb04679..e8c8ab1 100644
--- a/tests/location/location_gnss/src/android/location/cts/gnss/GnssMeasurementValuesTest.java
+++ b/tests/location/location_gnss/src/android/location/cts/gnss/GnssMeasurementValuesTest.java
@@ -90,6 +90,11 @@
             return;
         }
 
+        if (TestMeasurementUtil.isAutomotiveDevice(getContext())) {
+            Log.i(TAG, "Test is being skipped because the system has the AUTOMOTIVE feature.");
+            return;
+        }
+
         mLocationListener = new TestLocationListener(LOCATION_TO_COLLECT_COUNT);
         mTestLocationManager.requestLocationUpdates(mLocationListener);
 
diff --git a/tests/location/location_gnss/src/android/location/cts/gnss/GnssMeasurementWhenNoLocationTest.java b/tests/location/location_gnss/src/android/location/cts/gnss/GnssMeasurementWhenNoLocationTest.java
index 1e4e2c3..35aaa4d 100644
--- a/tests/location/location_gnss/src/android/location/cts/gnss/GnssMeasurementWhenNoLocationTest.java
+++ b/tests/location/location_gnss/src/android/location/cts/gnss/GnssMeasurementWhenNoLocationTest.java
@@ -108,6 +108,11 @@
             return;
         }
 
+        if (TestMeasurementUtil.isAutomotiveDevice(getContext())) {
+            Log.i(TAG, "Test is being skipped because the system has the AUTOMOTIVE feature.");
+            return;
+        }
+
         // Set the device in airplane mode so that the GPS assistance data cannot be downloaded.
         // This results in GNSS measurements being reported before a location is reported.
         // NOTE: Changing global setting airplane_mode_on is not allowed in CtsVerifier application.
diff --git a/tests/location/location_gnss/src/android/location/cts/gnss/GnssMeasurementsConstellationTest.java b/tests/location/location_gnss/src/android/location/cts/gnss/GnssMeasurementsConstellationTest.java
index b34465e..0c30cce 100644
--- a/tests/location/location_gnss/src/android/location/cts/gnss/GnssMeasurementsConstellationTest.java
+++ b/tests/location/location_gnss/src/android/location/cts/gnss/GnssMeasurementsConstellationTest.java
@@ -85,6 +85,11 @@
             return;
         }
 
+        if (TestMeasurementUtil.isAutomotiveDevice(getContext())) {
+            Log.i(TAG, "Test is being skipped because the system has the AUTOMOTIVE feature.");
+            return;
+        }
+
         // Register for GPS measurements.
         mMeasurementListener = new TestGnssMeasurementListener(TAG, GPS_EVENTS_COUNT);
         mTestLocationManager.registerGnssMeasurementCallback(mMeasurementListener);
diff --git a/tests/location/location_gnss/src/android/location/cts/gnss/GnssNavigationMessageRegistrationTest.java b/tests/location/location_gnss/src/android/location/cts/gnss/GnssNavigationMessageRegistrationTest.java
index 24a1726..9491bda 100644
--- a/tests/location/location_gnss/src/android/location/cts/gnss/GnssNavigationMessageRegistrationTest.java
+++ b/tests/location/location_gnss/src/android/location/cts/gnss/GnssNavigationMessageRegistrationTest.java
@@ -95,6 +95,11 @@
             return;
         }
 
+        if (TestMeasurementUtil.isAutomotiveDevice(getContext())) {
+            Log.i(TAG, "Test is being skipped because the system has the AUTOMOTIVE feature.");
+            return;
+        }
+
         // Register Gps Navigation Message Listener.
         mTestGnssNavigationMessageListener =
                 new TestGnssNavigationMessageListener(TAG, EVENTS_COUNT);
diff --git a/tests/location/location_gnss/src/android/location/cts/gnss/GnssNavigationMessageTest.java b/tests/location/location_gnss/src/android/location/cts/gnss/GnssNavigationMessageTest.java
index 69c5c9e..246df43 100644
--- a/tests/location/location_gnss/src/android/location/cts/gnss/GnssNavigationMessageTest.java
+++ b/tests/location/location_gnss/src/android/location/cts/gnss/GnssNavigationMessageTest.java
@@ -24,6 +24,7 @@
 import android.location.cts.common.TestMeasurementUtil;
 import android.os.Build;
 import android.os.Parcel;
+import android.util.Log;
 
 import java.util.List;
 
@@ -83,6 +84,11 @@
             return;
         }
 
+        if (TestMeasurementUtil.isAutomotiveDevice(getContext())) {
+            Log.i(TAG, "Test is being skipped because the system has the AUTOMOTIVE feature.");
+            return;
+        }
+
         mLocationListener = new TestLocationListener(EVENTS_COUNT);
         mTestLocationManager.requestLocationUpdates(mLocationListener);
 
diff --git a/tests/location/location_gnss/src/android/location/cts/gnss/GnssPseudorangeVerificationTest.java b/tests/location/location_gnss/src/android/location/cts/gnss/GnssPseudorangeVerificationTest.java
index 4438304..2b8509e 100644
--- a/tests/location/location_gnss/src/android/location/cts/gnss/GnssPseudorangeVerificationTest.java
+++ b/tests/location/location_gnss/src/android/location/cts/gnss/GnssPseudorangeVerificationTest.java
@@ -116,6 +116,11 @@
       return;
     }
 
+    if (TestMeasurementUtil.isAutomotiveDevice(getContext())) {
+        Log.i(TAG, "Test is being skipped because the system has the AUTOMOTIVE feature.");
+        return;
+    }
+
     mLocationListener = new TestLocationListener(LOCATION_TO_COLLECT_COUNT);
     mTestLocationManager.requestLocationUpdates(mLocationListener);
 
@@ -262,6 +267,11 @@
             return;
         }
 
+        if (TestMeasurementUtil.isAutomotiveDevice(getContext())) {
+            Log.i(TAG, "Test is being skipped because the system has the AUTOMOTIVE feature.");
+            return;
+        }
+
         mLocationListener = new TestLocationListener(LOCATION_TO_COLLECT_COUNT);
         mTestLocationManager.requestLocationUpdates(mLocationListener);
 
diff --git a/tests/location/location_none/Android.bp b/tests/location/location_none/Android.bp
index e1dbdce..74732aa 100644
--- a/tests/location/location_none/Android.bp
+++ b/tests/location/location_none/Android.bp
@@ -25,12 +25,11 @@
         "truth-prebuilt",
     ],
     libs: [
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/location/location_none/src/android/location/cts/none/NoLocationPermissionTest.java b/tests/location/location_none/src/android/location/cts/none/NoLocationPermissionTest.java
index d619f32..7d150cb 100644
--- a/tests/location/location_none/src/android/location/cts/none/NoLocationPermissionTest.java
+++ b/tests/location/location_none/src/android/location/cts/none/NoLocationPermissionTest.java
@@ -16,8 +16,6 @@
 
 package android.location.cts.none;
 
-import static android.content.pm.PackageManager.FEATURE_TELEPHONY;
-
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.fail;
 
@@ -29,9 +27,6 @@
 import android.location.cts.common.LocationListenerCapture;
 import android.location.cts.common.LocationPendingIntentCapture;
 import android.os.Looper;
-import android.telephony.CellInfo;
-import android.telephony.PhoneStateListener;
-import android.telephony.TelephonyManager;
 
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -40,8 +35,6 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import java.util.List;
-
 
 @RunWith(AndroidJUnit4.class)
 public class NoLocationPermissionTest {
@@ -57,81 +50,6 @@
         assertNotNull(mLocationManager);
     }
 
-    @SuppressWarnings("deprecation")
-    @Test
-    public void testGetCellLocation() {
-        if (!mContext.getPackageManager().hasSystemFeature(FEATURE_TELEPHONY)) {
-            return;
-        }
-
-        TelephonyManager telephonyManager = mContext.getSystemService(TelephonyManager.class);
-        assertNotNull(telephonyManager);
-
-        try {
-            telephonyManager.getCellLocation();
-            fail("Should throw SecurityException");
-        } catch (SecurityException e) {
-            // expected
-        }
-    }
-
-    @Test
-    public void testGetAllCellInfo() {
-        if (!mContext.getPackageManager().hasSystemFeature(FEATURE_TELEPHONY)) {
-            return;
-        }
-
-        TelephonyManager telephonyManager = mContext.getSystemService(TelephonyManager.class);
-        assertNotNull(telephonyManager);
-
-        try {
-            telephonyManager.getAllCellInfo();
-            fail("Should throw SecurityException");
-        } catch (SecurityException e) {
-            // expected
-        }
-    }
-
-    @Test
-    public void testListenCellLocation() {
-        if (!mContext.getPackageManager().hasSystemFeature(FEATURE_TELEPHONY)) {
-            return;
-        }
-
-        TelephonyManager telephonyManager = mContext.getSystemService(TelephonyManager.class);
-        assertNotNull(telephonyManager);
-
-        try {
-            telephonyManager.listen(new PhoneStateListener(Runnable::run),
-                    PhoneStateListener.LISTEN_CELL_LOCATION);
-            fail("Should throw SecurityException");
-        } catch (SecurityException e) {
-            // expected
-        }
-    }
-
-    @Test
-    public void testRequestCellInfoUpdate() {
-        if (!mContext.getPackageManager().hasSystemFeature(FEATURE_TELEPHONY)) {
-            return;
-        }
-
-        TelephonyManager telephonyManager = mContext.getSystemService(TelephonyManager.class);
-        assertNotNull(telephonyManager);
-
-        try {
-            telephonyManager.requestCellInfoUpdate(Runnable::run,
-                    new TelephonyManager.CellInfoCallback() {
-                        @Override
-                        public void onCellInfo(List<CellInfo> cellInfos) {
-                        }
-                    });
-            fail("Should throw SecurityException");
-        } catch (SecurityException e) {
-            // expected
-        }
-    }
-
     @Test
     public void testRequestLocationUpdates() {
         for (String provider : mLocationManager.getAllProviders()) {
diff --git a/tests/location/location_privileged/Android.bp b/tests/location/location_privileged/Android.bp
index a32212d..d4b87fc 100644
--- a/tests/location/location_privileged/Android.bp
+++ b/tests/location/location_privileged/Android.bp
@@ -25,7 +25,7 @@
         "truth-prebuilt",
     ],
     libs: [
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     test_suites: [
diff --git a/tests/location/location_privileged/src/android/location/cts/privileged/GnssMeasurementRegistrationTest.java b/tests/location/location_privileged/src/android/location/cts/privileged/GnssMeasurementRegistrationTest.java
index a6e2021..8136d83 100644
--- a/tests/location/location_privileged/src/android/location/cts/privileged/GnssMeasurementRegistrationTest.java
+++ b/tests/location/location_privileged/src/android/location/cts/privileged/GnssMeasurementRegistrationTest.java
@@ -97,6 +97,11 @@
             return;
         }
 
+        if (TestMeasurementUtil.isAutomotiveDevice(getContext())) {
+            Log.i(TAG, "Test is being skipped because the system has the AUTOMOTIVE feature.");
+            return;
+        }
+
         // Register for GPS measurements.
         mMeasurementListener = new TestGnssMeasurementListener(TAG, GPS_EVENTS_COUNT);
         mTestLocationManager.registerGnssMeasurementCallback(mMeasurementListener,
diff --git a/tests/media/Android.bp b/tests/media/Android.bp
index 27232c8..686f744 100644
--- a/tests/media/Android.bp
+++ b/tests/media/Android.bp
@@ -19,12 +19,15 @@
     static_libs: [
         "compatibility-device-util-axt",
         "ctstestrunner-axt",
+        "ctstestserver",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "org.apache.http.legacy",
+        "android.test.runner",
+        "android.test.base",
     ],
-    jni_uses_platform_apis: true,
+    platform_apis: true,
+    jni_uses_sdk_apis: true,
     jni_libs: [
         "libctsmediav2muxer_jni",
         "libctsmediav2extractor_jni",
@@ -34,8 +37,7 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
-    sdk_version: "test_current",
+    min_sdk_version: "29",
 }
diff --git a/tests/media/AndroidManifest.xml b/tests/media/AndroidManifest.xml
index 3ccd92e..3a97bbe 100644
--- a/tests/media/AndroidManifest.xml
+++ b/tests/media/AndroidManifest.xml
@@ -28,8 +28,10 @@
         android:requestLegacyExternalStorage="true"
         android:usesCleartextTraffic="true">
         <uses-library android:name="android.test.runner" />
+        <uses-library android:name="org.apache.http.legacy" />
         <activity android:name="android.mediav2.cts.CodecTestActivity" />
     </application>
+    <uses-sdk android:minSdkVersion="29"   android:targetSdkVersion="29" />
     <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
             android:targetPackage="android.mediav2.cts"
             android:label="CTS MediaV2 tests of android.media" >
diff --git a/tests/media/AndroidTest.xml b/tests/media/AndroidTest.xml
index a618ac0..0617211 100644
--- a/tests/media/AndroidTest.xml
+++ b/tests/media/AndroidTest.xml
@@ -25,7 +25,7 @@
     </target_preparer>
     <target_preparer class="com.android.compatibility.common.tradefed.targetprep.MediaPreparer">
         <option name="push-all" value="true" />
-        <option name="media-folder-name" value="CtsMediaV2TestCases-1.2" />
+        <option name="media-folder-name" value="CtsMediaV2TestCases-1.9" />
         <option name="dynamic-config-module" value="CtsMediaV2TestCases" />
     </target_preparer>
     <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
diff --git a/tests/media/DynamicConfig.xml b/tests/media/DynamicConfig.xml
index 384d3d7..9f79bd6 100644
--- a/tests/media/DynamicConfig.xml
+++ b/tests/media/DynamicConfig.xml
@@ -1,6 +1,6 @@
 <dynamicConfig>
     <entry key="media_files_url">
-      <value>https://storage.googleapis.com/android_media/cts/tests/media/CtsMediaV2TestCases-1.2.zip</value>
+      <value>https://storage.googleapis.com/android_media/cts/tests/media/CtsMediaV2TestCases-1.9.zip</value>
     </entry>
 </dynamicConfig>
 
diff --git a/tests/media/README.md b/tests/media/README.md
index 53d76f8..8b02147 100644
--- a/tests/media/README.md
+++ b/tests/media/README.md
@@ -1,5 +1,11 @@
 ## Media V2 CTS Tests
-Current folder comprises of files necessary for testing media extractor, media muxer, media codec SDK and NDK Api.  These test aims to test all codecs advertised in MediaCodecList, available muxers and extractors. The aim of these tests is not verify the CDD requirements but to test components, their plugins and their interactions with media framework. The test vectors used by the test suite is available at [link](https://storage.googleapis.com/android_media/cts/tests/media/CtsMediaV2TestCases.zip) and is downloaded automatically while running tests. The test suite looks to cover sdk/ndk api in normal and error scenarios. Error scenarios are seperated from regular usage and are placed under class *UnitTest (MuxerUnitTest, ExtractorUnitTest, ...).
+Current folder comprises of files necessary for testing media extractor, media muxer, media codec SDK and NDK Api. These tests aims to test all codecs advertised in MediaCodecList, available muxers and extractors.
+
+The aim of these tests is not solely to verify the CDD requirements but also to test components, their plugins and their interactions with media framework.
+
+The test vectors used by the test suite is available at [link](https://storage.googleapis.com/android_media/cts/tests/media/CtsMediaV2TestCases-1.9.zip) and is downloaded automatically while running tests. Manual installation of these can be done using install_media.sh script in this directory.
+
+The test suite looks to cover sdk/ndk api in normal and error scenarios. Error scenarios are separated from regular usage and are placed under class *UnitTest (MuxerUnitTest, ExtractorUnitTest, ...).
 
 ### Commands
 ```sh
diff --git a/tests/media/copy_media.sh b/tests/media/copy_media.sh
new file mode 100755
index 0000000..51ce72a
--- /dev/null
+++ b/tests/media/copy_media.sh
@@ -0,0 +1,47 @@
+#!/bin/sh
+# Copyright (C) 2020 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.
+#
+
+## script to install mediav2 test files manually
+
+adbOptions=" "
+resLabel=CtsMediaV2TestCases-1.9
+srcDir="/tmp/$resLabel"
+tgtDir="/sdcard/test"
+usage="Usage: $0 [-h] [-s serial]"
+
+if [ $# -gt 0 ]; then
+  if [ "$1" = "-h" ]; then
+    echo $usage
+    exit 1
+  elif [ "$1" = "-s" -a "$2" != "" ] ; then
+    adbOptions=""$1" "$2""
+  else
+    echo "bad options"
+    echo $usage
+    exit 1
+  fi
+fi
+
+## download resources if not already done
+if [ ! -f "/tmp/$resLabel.zip" ]; then
+  wget "https://storage.googleapis.com/android_media/cts/tests/media/$resLabel.zip" -O /tmp/$resLabel.zip
+fi
+unzip -qo "/tmp/$resLabel" -d $srcDir
+
+## install on target device
+echo "adb $adbOptions push $srcDir $tgtDir"
+adb $adbOptions shell mkdir -p $tgtDir
+adb $adbOptions push $srcDir/. $tgtDir
diff --git a/tests/media/jni/Android.bp b/tests/media/jni/Android.bp
index 1e13378..f6d436d 100644
--- a/tests/media/jni/Android.bp
+++ b/tests/media/jni/Android.bp
@@ -23,6 +23,7 @@
         "libmediandk",
         "liblog",
     ],
+    header_libs: ["liblog_headers"],
     include_dirs: [
         "frameworks/av/media/ndk/include/media",
     ],
@@ -32,6 +33,7 @@
         "-Wall",
     ],
     gtest: false,
+    sdk_version: "29",
 }
 
 cc_test_library {
@@ -44,7 +46,9 @@
     shared_libs: [
         "libmediandk",
         "liblog",
+        "libz",
     ],
+    header_libs: ["liblog_headers"],
     include_dirs: [
         "frameworks/av/media/ndk/include/media",
     ],
@@ -54,6 +58,7 @@
         "-Wall",
     ],
     gtest: false,
+    sdk_version: "29",
 }
 
 cc_test_library {
@@ -70,7 +75,9 @@
         "libmediandk",
         "liblog",
         "libandroid",
+        "libz",
     ],
+    header_libs: ["liblog_headers"],
     include_dirs: [
         "frameworks/av/media/ndk/include/media",
     ],
@@ -80,4 +87,5 @@
         "-Wall",
     ],
     gtest: false,
+    sdk_version: "29",
 }
diff --git a/tests/media/jni/NativeCodecDecoderTest.cpp b/tests/media/jni/NativeCodecDecoderTest.cpp
index 8dace62..754ccb3 100644
--- a/tests/media/jni/NativeCodecDecoderTest.cpp
+++ b/tests/media/jni/NativeCodecDecoderTest.cpp
@@ -24,12 +24,14 @@
 
 #include <array>
 #include <fstream>
+#include <string>
 
 #include "NativeCodecTestBase.h"
 #include "NativeMediaCommon.h"
 
 class CodecDecoderTest final : public CodecTestBase {
   private:
+    bool mIsInterlaced;
     uint8_t* mRefData;
     size_t mRefLength;
     AMediaExtractor* mExtractor;
@@ -57,7 +59,7 @@
     ~CodecDecoderTest();
 
     bool testSimpleDecode(const char* decoder, const char* testFile, const char* refFile,
-                          float rmsError);
+                          float rmsError, uLong checksum);
     bool testFlush(const char* decoder, const char* testFile);
     bool testOnlyEos(const char* decoder, const char* testFile);
     bool testSimpleDecodeQueueCSD(const char* decoder, const char* testFile);
@@ -123,6 +125,8 @@
                                               COLOR_FormatYUV420Flexible);
                     }
                     mInpDecFormat = currFormat;
+                    // TODO: determine this from the extractor format when it becomes exposed.
+                    mIsInterlaced = strstr(srcFile, "_interlaced_") != nullptr;
                     break;
                 }
                 AMediaFormat_delete(currFormat);
@@ -206,7 +210,8 @@
         }
         CHECK_STATUS(AMediaCodec_queueInputBuffer(mCodec, bufferIndex, 0, size, pts, flags),
                      "AMediaCodec_queueInputBuffer failed");
-        ALOGV("input: id: %zu  size: %zu  pts: %d  flags: %d", bufferIndex, size, (int)pts, flags);
+        ALOGV("input: id: %zu  size: %zu  pts: %" PRId64 "  flags: %d", bufferIndex, size, pts,
+              flags);
         if (size > 0) {
             mOutputBuff->saveInPTS(pts);
             mInputCount++;
@@ -224,13 +229,13 @@
             size_t buffSize;
             uint8_t* buf = AMediaCodec_getOutputBuffer(mCodec, bufferIndex, &buffSize);
             if (mIsAudio) mOutputBuff->saveToMemory(buf, info);
-            else mOutputBuff->saveChecksum(buf, info);
+            mOutputBuff->updateChecksum(buf, info);
         }
         mOutputBuff->saveOutPTS(info->presentationTimeUs);
         mOutputCount++;
     }
-    ALOGV("output: id: %zu  size: %d  pts: %d  flags: %d", bufferIndex, info->size,
-          (int)info->presentationTimeUs, info->flags);
+    ALOGV("output: id: %zu  size: %d  pts: %" PRId64 "  flags: %d", bufferIndex, info->size,
+          info->presentationTimeUs, info->flags);
     CHECK_STATUS(AMediaCodec_releaseOutputBuffer(mCodec, bufferIndex, mWindow != nullptr),
                  "AMediaCodec_releaseOutputBuffer failed");
     return !hasSeenError();
@@ -253,7 +258,7 @@
             if (bufferIndex >= 0) {
                 isOk = enqueueCodecConfig(bufferIndex);
             } else {
-                ALOGE("unexpected return value from *_dequeueInputBuffer: %d", (int)bufferIndex);
+                ALOGE("unexpected return value from *_dequeueInputBuffer: %d", bufferIndex);
                 return false;
             }
         }
@@ -284,7 +289,7 @@
 }
 
 bool CodecDecoderTest::testSimpleDecode(const char* decoder, const char* testFile,
-                                        const char* refFile, float rmsError) {
+                                        const char* refFile, float rmsError, uLong checksum) {
     bool isPass = true;
     if (!setUpExtractor(testFile)) return false;
     mSaveToMem = (mWindow == nullptr);
@@ -345,9 +350,13 @@
             CHECK_ERR(
                     loopCounter == 0 && mIsAudio && (!ref->isPtsStrictlyIncreasing(mPrevOutputPts)),
                     log, "pts is not strictly increasing", isPass);
-            CHECK_ERR(loopCounter == 0 && !mIsAudio &&
-                      (!ref->isOutPtsListIdenticalToInpPtsList(false)),
-                      log, "input pts list and output pts list are not identical", isPass);
+            // TODO: Timestamps for deinterlaced content are under review. (E.g. can decoders
+            // produce multiple progressive frames?) For now, do not verify timestamps.
+            if (!mIsInterlaced) {
+                CHECK_ERR(loopCounter == 0 && !mIsAudio &&
+                          (!ref->isOutPtsListIdenticalToInpPtsList(false)),
+                          log, "input pts list and output pts list are not identical", isPass);
+            }
             if (validateFormat) {
                 if (mIsCodecInAsyncMode ? !mAsyncHandle.hasOutputFormatChanged()
                                         : !mSignalledOutFormatChanged) {
@@ -360,6 +369,10 @@
                     isPass = false;
                 }
             }
+            if (checksum != ref->getChecksum()) {
+                ALOGE(log, "sdk output and ndk output differ");
+                isPass = false;
+            }
             loopCounter++;
         }
     }
@@ -396,8 +409,12 @@
     }
     CHECK_ERR(mIsAudio && (!ref->isPtsStrictlyIncreasing(mPrevOutputPts)), "",
               "pts is not strictly increasing", isPass);
-    CHECK_ERR(!mIsAudio && (!ref->isOutPtsListIdenticalToInpPtsList(false)), "",
-              "input pts list and output pts list are not identical", isPass);
+    // TODO: Timestamps for deinterlaced content are under review. (E.g. can decoders
+    // produce multiple progressive frames?) For now, do not verify timestamps.
+    if (!mIsInterlaced) {
+        CHECK_ERR(!mIsAudio && (!ref->isOutPtsListIdenticalToInpPtsList(false)), "",
+                  "input pts list and output pts list are not identical", isPass);
+    }
     if (!isPass) return false;
 
     auto test = &mTestBuff;
@@ -634,15 +651,17 @@
 
 static jboolean nativeTestSimpleDecode(JNIEnv* env, jobject, jstring jDecoder, jobject surface,
                                        jstring jMime, jstring jtestFile, jstring jrefFile,
-                                       jfloat jrmsError) {
+                                       jfloat jrmsError, jlong jChecksum) {
     const char* cDecoder = env->GetStringUTFChars(jDecoder, nullptr);
     const char* cMime = env->GetStringUTFChars(jMime, nullptr);
     const char* cTestFile = env->GetStringUTFChars(jtestFile, nullptr);
     const char* cRefFile = env->GetStringUTFChars(jrefFile, nullptr);
     float cRmsError = jrmsError;
+    uLong cChecksum = jChecksum;
     ANativeWindow* window = surface ? ANativeWindow_fromSurface(env, surface) : nullptr;
     auto* codecDecoderTest = new CodecDecoderTest(cMime, window);
-    bool isPass = codecDecoderTest->testSimpleDecode(cDecoder, cTestFile, cRefFile, cRmsError);
+    bool isPass =
+            codecDecoderTest->testSimpleDecode(cDecoder, cTestFile, cRefFile, cRmsError, cChecksum);
     delete codecDecoderTest;
     if (window) {
         ANativeWindow_release(window);
@@ -706,7 +725,7 @@
     const JNINativeMethod methodTable[] = {
             {"nativeTestSimpleDecode",
              "(Ljava/lang/String;Landroid/view/Surface;Ljava/lang/String;Ljava/lang/String;Ljava/"
-             "lang/String;F)Z",
+             "lang/String;FJ)Z",
              (void*)nativeTestSimpleDecode},
             {"nativeTestOnlyEos", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z",
              (void*)nativeTestOnlyEos},
@@ -725,7 +744,7 @@
     const JNINativeMethod methodTable[] = {
             {"nativeTestSimpleDecode",
              "(Ljava/lang/String;Landroid/view/Surface;Ljava/lang/String;Ljava/lang/String;Ljava/"
-             "lang/String;F)Z",
+             "lang/String;FJ)Z",
              (void*)nativeTestSimpleDecode},
             {"nativeTestFlush",
              "(Ljava/lang/String;Landroid/view/Surface;Ljava/lang/String;Ljava/lang/String;)Z",
diff --git a/tests/media/jni/NativeCodecEncoderSurfaceTest.cpp b/tests/media/jni/NativeCodecEncoderSurfaceTest.cpp
index 2c76eb1..bcf6ef1 100644
--- a/tests/media/jni/NativeCodecEncoderSurfaceTest.cpp
+++ b/tests/media/jni/NativeCodecEncoderSurfaceTest.cpp
@@ -243,7 +243,8 @@
         }
         CHECK_STATUS(AMediaCodec_queueInputBuffer(mDecoder, bufferIndex, 0, size, pts, flags),
                      "AMediaCodec_queueInputBuffer failed");
-        ALOGV("input: id: %zu  size: %zu  pts: %d  flags: %d", bufferIndex, size, (int)pts, flags);
+        ALOGV("input: id: %zu  size: %zu  pts: %" PRId64 "  flags: %d", bufferIndex, size, pts,
+              flags);
         if (size > 0) {
             mOutputBuff->saveInPTS(pts);
             mDecInputCount++;
@@ -260,8 +261,8 @@
     if (bufferInfo->size > 0 && (bufferInfo->flags & AMEDIACODEC_BUFFER_FLAG_CODEC_CONFIG) == 0) {
         mDecOutputCount++;
     }
-    ALOGV("output: id: %zu  size: %d  pts: %d  flags: %d", bufferIndex, bufferInfo->size,
-          (int)bufferInfo->presentationTimeUs, bufferInfo->flags);
+    ALOGV("output: id: %zu  size: %d  pts: %" PRId64 "  flags: %d", bufferIndex, bufferInfo->size,
+          bufferInfo->presentationTimeUs, bufferInfo->flags);
     CHECK_STATUS(AMediaCodec_releaseOutputBuffer(mDecoder, bufferIndex, mWindow != nullptr),
                  "AMediaCodec_releaseOutputBuffer failed");
     return !hasSeenError();
@@ -291,8 +292,8 @@
             mEncOutputCount++;
         }
     }
-    ALOGV("output: id: %zu  size: %d  pts: %d  flags: %d", bufferIndex, info->size,
-          (int)info->presentationTimeUs, info->flags);
+    ALOGV("output: id: %zu  size: %d  pts: %" PRId64 "  flags: %d", bufferIndex, info->size,
+          info->presentationTimeUs, info->flags);
     CHECK_STATUS(AMediaCodec_releaseOutputBuffer(mEncoder, bufferIndex, false),
                  "AMediaCodec_releaseOutputBuffer failed");
     return !hasSeenError();
@@ -316,7 +317,7 @@
             } else if (bufferID == AMEDIACODEC_INFO_TRY_AGAIN_LATER) {
             } else if (bufferID == AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED) {
             } else {
-                ALOGE("unexpected return value from *_dequeueOutputBuffer: %d", (int)bufferID);
+                ALOGE("unexpected return value from *_dequeueOutputBuffer: %d", bufferID);
                 return false;
             }
         }
@@ -352,7 +353,7 @@
                 if (!enqueueDecoderEOS(bufferIndex)) return false;
             } else {
                 ALOGE("unexpected return value from *_dequeueInputBufferBuffer: %d",
-                      (int)bufferIndex);
+                      bufferIndex);
                 return false;
             }
         }
@@ -383,7 +384,7 @@
                 } else if (oBufferID == AMEDIACODEC_INFO_TRY_AGAIN_LATER) {
                 } else if (oBufferID == AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED) {
                 } else {
-                    ALOGE("unexpected return value from *_dequeueOutputBuffer: %d", (int)oBufferID);
+                    ALOGE("unexpected return value from *_dequeueOutputBuffer: %zd", oBufferID);
                     return false;
                 }
             }
@@ -431,7 +432,7 @@
             } else if (oBufferID == AMEDIACODEC_INFO_TRY_AGAIN_LATER) {
             } else if (oBufferID == AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED) {
             } else {
-                ALOGE("unexpected return value from *_dequeueOutputBuffer: %d", (int)oBufferID);
+                ALOGE("unexpected return value from *_dequeueOutputBuffer: %zd", oBufferID);
                 return false;
             }
             ssize_t iBufferId = AMediaCodec_dequeueInputBuffer(mDecoder, kQDeQTimeOutUs);
@@ -440,7 +441,7 @@
                 frameCnt++;
             } else if (iBufferId == AMEDIACODEC_INFO_TRY_AGAIN_LATER) {
             } else {
-                ALOGE("unexpected return value from *_dequeueInputBuffer: %d", (int)iBufferId);
+                ALOGE("unexpected return value from *_dequeueInputBuffer: %zd", iBufferId);
                 return false;
             }
             if (mSawDecOutputEOS) AMediaCodec_signalEndOfInputStream(mEncoder);
diff --git a/tests/media/jni/NativeCodecEncoderTest.cpp b/tests/media/jni/NativeCodecEncoderTest.cpp
index 032bd6c..ef7f1c8 100644
--- a/tests/media/jni/NativeCodecEncoderTest.cpp
+++ b/tests/media/jni/NativeCodecEncoderTest.cpp
@@ -162,7 +162,12 @@
                     int channels = mEncParamList2[i];
                     AMediaFormat* format = AMediaFormat_new();
                     AMediaFormat_setString(format, AMEDIAFORMAT_KEY_MIME, mMime);
-                    AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_BIT_RATE, bitrate);
+                    if (!strcmp(mMime, AMEDIA_MIMETYPE_AUDIO_FLAC)) {
+                        AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_FLAC_COMPRESSION_LEVEL,
+                                              bitrate);
+                    } else {
+                        AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_BIT_RATE, bitrate);
+                    }
                     AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_SAMPLE_RATE, rate);
                     AMediaFormat_setInt32(format, AMEDIAFORMAT_KEY_CHANNEL_COUNT, channels);
                     mFormats.push_back(format);
@@ -208,9 +213,9 @@
 bool CodecEncoderTest::flushCodec() {
     bool isOk = CodecTestBase::flushCodec();
     if (mIsAudio) {
-        mInputOffsetPts = (mNumBytesSubmitted + 1024) * 1000000L / (2 * mChannels * mSampleRate);
+        mInputOffsetPts = (mNumBytesSubmitted + 1024) * 1000000LL / (2 * mChannels * mSampleRate);
     } else {
-        mInputOffsetPts = (mInputCount + 5) * 1000000L / mDefFrameRate;
+        mInputOffsetPts = (mInputCount + 5) * 1000000LL / mDefFrameRate;
     }
     mPrevOutputPts = mInputOffsetPts - 1;
     mNumBytesSubmitted = 0;
@@ -270,7 +275,7 @@
         size_t buffSize;
         uint8_t* inputBuffer = AMediaCodec_getInputBuffer(mCodec, bufferIndex, &buffSize);
         if (mIsAudio) {
-            pts += mNumBytesSubmitted * 1000000L / (2 * mChannels * mSampleRate);
+            pts += mNumBytesSubmitted * 1000000LL / (2 * mChannels * mSampleRate);
             size = std::min(buffSize, mInputLength - mNumBytesSubmitted);
             memcpy(inputBuffer, mInputData + mNumBytesSubmitted, size);
             if (mNumBytesSubmitted + size >= mInputLength && mSignalEOSWithLastFrame) {
@@ -279,7 +284,7 @@
             }
             mNumBytesSubmitted += size;
         } else {
-            pts += mInputCount * 1000000L / mDefFrameRate;
+            pts += mInputCount * 1000000LL / mDefFrameRate;
             size = mWidth * mHeight * 3 / 2;
             int frmSize = kInpFrmWidth * kInpFrmHeight * 3 / 2;
             if (mNumBytesSubmitted + frmSize > mInputLength) {
@@ -303,7 +308,8 @@
         }
         CHECK_STATUS(AMediaCodec_queueInputBuffer(mCodec, bufferIndex, 0, size, pts, flags),
                      "AMediaCodec_queueInputBuffer failed");
-        ALOGV("input: id: %zu  size: %d  pts: %d  flags: %d", bufferIndex, size, (int)pts, flags);
+        ALOGV("input: id: %zu  size: %d  pts: %" PRId64 "  flags: %d", bufferIndex, size, pts,
+              flags);
         mOutputBuff->saveInPTS(pts);
         mInputCount++;
     }
@@ -329,8 +335,8 @@
             mOutputCount++;
         }
     }
-    ALOGV("output: id: %zu  size: %d  pts: %d  flags: %d", bufferIndex, info->size,
-          (int)info->presentationTimeUs, info->flags);
+    ALOGV("output: id: %zu  size: %d  pts: %" PRId64 "  flags: %d", bufferIndex, info->size,
+          info->presentationTimeUs, info->flags);
     CHECK_STATUS(AMediaCodec_releaseOutputBuffer(mCodec, bufferIndex, false),
                  "AMediaCodec_releaseOutputBuffer failed");
     return !hasSeenError();
diff --git a/tests/media/jni/NativeCodecTestBase.cpp b/tests/media/jni/NativeCodecTestBase.cpp
index b07c1c3..4e13e9c 100644
--- a/tests/media/jni/NativeCodecTestBase.cpp
+++ b/tests/media/jni/NativeCodecTestBase.cpp
@@ -188,32 +188,15 @@
     return status;
 }
 
-uint32_t OutputManager::adler32(const uint8_t* input, int offset, int len) {
-    constexpr uint32_t modAdler = 65521;
-    constexpr uint32_t overflowLimit = 5500;
-    uint32_t a = 1;
-    uint32_t b = 0;
-    for (int i = offset, count = 0; i < len; i++) {
-        a += input[i];
-        b += a;
-        count++;
-        if (count > overflowLimit) {
-            a %= modAdler;
-            b %= modAdler;
-            count = 0;
-        }
-    }
-    return b * 65536 + a;
-}
-
 bool OutputManager::isPtsStrictlyIncreasing(int64_t lastPts) {
     bool result = true;
     for (auto it1 = outPtsArray.cbegin(); it1 < outPtsArray.cend(); it1++) {
         if (lastPts < *it1) {
             lastPts = *it1;
         } else {
-            ALOGE("Timestamp ordering check failed: last timestamp: %d / current timestamp: %d",
-                  (int)lastPts, (int)*it1);
+            ALOGE("Timestamp ordering check failed: last timestamp: %" PRId64
+                  " / current timestamp: %" PRId64 "",
+                  lastPts, *it1);
             result = false;
             break;
         }
@@ -230,14 +213,15 @@
     if (outPtsArray != inpPtsArray) {
         if (outPtsArray.size() != inpPtsArray.size()) {
             ALOGE("input and output presentation timestamp list sizes are not identical sizes "
-                  "exp/rec %d/%d", (int)inpPtsArray.size(), (int)outPtsArray.size());
+                  "exp/rec %zu/%zu", inpPtsArray.size(), outPtsArray.size());
             isEqual = false;
         } else {
             int count = 0;
             for (auto it1 = outPtsArray.cbegin(), it2 = inpPtsArray.cbegin();
                  it1 < outPtsArray.cend(); it1++, it2++) {
                 if (*it1 != *it2) {
-                    ALOGE("input output pts mismatch, exp/rec %d/%d", (int)*it2, (int)*it1);
+                    ALOGE("input output pts mismatch, exp/rec %" PRId64 "/%" PRId64 "",
+                          *it2, *it1);
                     count++;
                 }
                 if (count == 20) {
@@ -255,15 +239,15 @@
     if (this == that) return true;
     if (outPtsArray != that->outPtsArray) {
         if (outPtsArray.size() != that->outPtsArray.size()) {
-            ALOGE("ref and test outputs presentation timestamp arrays are of unequal sizes %d, %d",
-                  (int)outPtsArray.size(), (int)that->outPtsArray.size());
+            ALOGE("ref and test outputs presentation timestamp arrays are of unequal sizes "
+                  "%zu, %zu", outPtsArray.size(), that->outPtsArray.size());
             return false;
         } else {
             int count = 0;
             for (auto it1 = outPtsArray.cbegin(), it2 = that->outPtsArray.cbegin();
                  it1 < outPtsArray.cend(); it1++, it2++) {
                 if (*it1 != *it2) {
-                    ALOGE("presentation timestamp exp/rec %d/%d", (int)*it1, (int)*it2);
+                    ALOGE("presentation timestamp exp/rec %" PRId64 "/%" PRId64 "", *it1, *it2);
                     count++;
                 }
                 if (count == 20) {
@@ -274,17 +258,17 @@
             if (count != 0) return false;
         }
     }
-    if (memory != that->memory) {
+    if (crc32value != that->crc32value) {
+        ALOGE("ref and test outputs checksum do not match %lu, %lu", crc32value, that->crc32value);
         if (memory.size() != that->memory.size()) {
-            ALOGE("ref and test outputs decoded buffer are of unequal sizes %d, %d",
-                  (int)memory.size(), (int)that->memory.size());
-            return false;
+            ALOGE("ref and test outputs decoded buffer are of unequal sizes %zu, %zu",
+                  memory.size(), that->memory.size());
         } else {
             int count = 0;
             for (auto it1 = memory.cbegin(), it2 = that->memory.cbegin(); it1 < memory.cend();
                  it1++, it2++) {
                 if (*it1 != *it2) {
-                    ALOGE("decoded sample exp/rec %d/%d", (int)*it1, (int)*it2);
+                    ALOGE("decoded sample exp/rec %d/%d", *it1, *it2);
                     count++;
                 }
                 if (count == 20) {
@@ -292,37 +276,16 @@
                     break;
                 }
             }
-            if (count != 0) return false;
         }
-    }
-    if (checksum != that->checksum) {
-        if (checksum.size() != that->checksum.size()) {
-            ALOGE("ref and test outputs checksum arrays are of unequal sizes %d, %d",
-                  (int)checksum.size(), (int)that->checksum.size());
-            return false;
-        } else {
-            int count = 0;
-            for (auto it1 = checksum.cbegin(), it2 = that->checksum.cbegin(); it1 < checksum.cend();
-                 it1++, it2++) {
-                if (*it1 != *it2) {
-                    ALOGE("adler32 checksum exp/rec %u/%u", (int)*it1, (int)*it2);
-                    count++;
-                }
-                if (count == 20) {
-                    ALOGE("stopping after 20 mismatches ... ");
-                    break;
-                }
-            }
-            if (count != 0) return false;
-        }
+        return false;
     }
     return true;
 }
 
 float OutputManager::getRmsError(uint8_t* refData, int length) {
     long totalErrorSquared = 0;
-    if (length != memory.size()) return -1.0F;
-    if ((length % 2) != 0) return -1.0F;
+    if (length != memory.size()) return MAXFLOAT;
+    if ((length % 2) != 0) return MAXFLOAT;
     auto* testData = new uint8_t[length];
     std::copy(memory.begin(), memory.end(), testData);
     auto* testDataReinterpret = reinterpret_cast<int16_t*>(testData);
@@ -453,7 +416,7 @@
             } else if (oBufferID == AMEDIACODEC_INFO_TRY_AGAIN_LATER) {
             } else if (oBufferID == AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED) {
             } else {
-                ALOGE("unexpected return value from *_dequeueOutputBuffer: %d", (int)oBufferID);
+                ALOGE("unexpected return value from *_dequeueOutputBuffer: %zd", oBufferID);
                 return false;
             }
             ssize_t iBufferId = AMediaCodec_dequeueInputBuffer(mCodec, kQDeQTimeOutUs);
@@ -462,7 +425,7 @@
                 frameCnt++;
             } else if (iBufferId == AMEDIACODEC_INFO_TRY_AGAIN_LATER) {
             } else {
-                ALOGE("unexpected return value from *_dequeueInputBuffer: %d", (int)iBufferId);
+                ALOGE("unexpected return value from *_dequeueInputBuffer: %zd", iBufferId);
                 return false;
             }
         }
@@ -485,7 +448,7 @@
             if (bufferIndex >= 0) {
                 isOk = enqueueEOS(bufferIndex);
             } else {
-                ALOGE("unexpected return value from *_dequeueInputBuffer: %d", (int)bufferIndex);
+                ALOGE("unexpected return value from *_dequeueInputBuffer: %d", bufferIndex);
                 return false;
             }
         }
@@ -518,7 +481,7 @@
             } else if (bufferID == AMEDIACODEC_INFO_TRY_AGAIN_LATER) {
             } else if (bufferID == AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED) {
             } else {
-                ALOGE("unexpected return value from *_dequeueOutputBuffer: %d", (int)bufferID);
+                ALOGE("unexpected return value from *_dequeueOutputBuffer: %d", bufferID);
                 return false;
             }
         }
@@ -532,7 +495,7 @@
     AMediaFormat_getInt32(format, AMEDIAFORMAT_KEY_WIDTH, &width);
     if (AMediaFormat_getRect(format, "crop", &cropLeft, &cropTop, &cropRight, &cropBottom) ||
         (AMediaFormat_getInt32(format, "crop-left", &cropLeft) &&
-        AMediaFormat_getInt32(format, "crop-right", &cropRight))) {
+         AMediaFormat_getInt32(format, "crop-right", &cropRight))) {
         width = cropRight + 1 - cropLeft;
     }
     return width;
@@ -544,7 +507,7 @@
     AMediaFormat_getInt32(format, AMEDIAFORMAT_KEY_HEIGHT, &height);
     if (AMediaFormat_getRect(format, "crop", &cropLeft, &cropTop, &cropRight, &cropBottom) ||
         (AMediaFormat_getInt32(format, "crop-top", &cropTop) &&
-        AMediaFormat_getInt32(format, "crop-bottom", &cropBottom))) {
+         AMediaFormat_getInt32(format, "crop-bottom", &cropBottom))) {
         height = cropBottom + 1 - cropTop;
     }
     return height;
diff --git a/tests/media/jni/NativeCodecTestBase.h b/tests/media/jni/NativeCodecTestBase.h
index b730fb0..87a46f9 100644
--- a/tests/media/jni/NativeCodecTestBase.h
+++ b/tests/media/jni/NativeCodecTestBase.h
@@ -18,6 +18,7 @@
 #define MEDIACTSNATIVE_NATIVE_CODEC_TEST_BASE_H
 
 #include <NdkMediaCodec.h>
+#include <zlib.h>
 
 #include <cmath>
 #include <cstdint>
@@ -25,6 +26,8 @@
 #include <mutex>
 #include <vector>
 
+#include "NativeMediaCommon.h"
+
 #define CHECK_STATUS(status, str)                  \
     {                                              \
         media_status_t val = (status);             \
@@ -87,14 +90,12 @@
     std::vector<int64_t> inpPtsArray;
     std::vector<int64_t> outPtsArray;
     std::vector<uint8_t> memory;
-    std::vector<uint32_t> checksum;
-
-    uint32_t adler32(const uint8_t* input, int offset, int len);
+    uLong crc32value = 0U;
 
   public:
     void saveInPTS(int64_t pts) {
         // Add only Unique timeStamp, discarding any duplicate frame / non-display frame
-        if(0 == std::count(inpPtsArray.begin(), inpPtsArray.end(), pts)) {
+        if (0 == std::count(inpPtsArray.begin(), inpPtsArray.end(), pts)) {
             inpPtsArray.push_back(pts);
         }
     }
@@ -104,14 +105,22 @@
     void saveToMemory(uint8_t* buf, AMediaCodecBufferInfo* info) {
         memory.insert(memory.end(), buf + info->offset, buf + info->size);
     }
-    void saveChecksum(uint8_t* buf, AMediaCodecBufferInfo* info) {
-        checksum.push_back(adler32(buf, info->offset, info->size));
+    void updateChecksum(uint8_t* buf, AMediaCodecBufferInfo* info) {
+        crc32value = crc32(crc32value, buf + info->offset, info->size);
+        uint8_t flattenInfo[16];
+        int pos = 0;
+        flattenField<int32_t>(flattenInfo, &pos, info->size);
+        flattenField<int32_t>(flattenInfo, &pos,
+                              info->flags & ~AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM);
+        flattenField<int64_t>(flattenInfo, &pos, info->presentationTimeUs);
+        crc32value = crc32(crc32value, flattenInfo, sizeof(flattenInfo));
     }
+    uLong getChecksum() { return crc32value; }
     void reset() {
         inpPtsArray.clear();
         outPtsArray.clear();
         memory.clear();
-        checksum.clear();
+        crc32value = 0U;
     }
     bool equals(const OutputManager* that);
     float getRmsError(uint8_t* refData, int length);
diff --git a/tests/media/jni/NativeCodecUnitTest.cpp b/tests/media/jni/NativeCodecUnitTest.cpp
index 3709172..724bf7b 100644
--- a/tests/media/jni/NativeCodecUnitTest.cpp
+++ b/tests/media/jni/NativeCodecUnitTest.cpp
@@ -1191,8 +1191,8 @@
         } else {
             if (AMEDIA_OK == AMediaCodec_queueInputBuffer(mCodec, 0, 0, bufSize + 100, 0,
                                                           AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM)) {
-                ALOGE("queueInputBuffer succeeds for bad size %d, buffer capacity %d, ",
-                      (int)bufSize + 100, (int)bufSize);
+                ALOGE("queueInputBuffer succeeds for bad size %zu, buffer capacity %zu ",
+                      bufSize + 100, bufSize);
                 return false;
             }
         }
diff --git a/tests/media/jni/NativeExtractorTest.cpp b/tests/media/jni/NativeExtractorTest.cpp
index 596026f..e5c391a 100644
--- a/tests/media/jni/NativeExtractorTest.cpp
+++ b/tests/media/jni/NativeExtractorTest.cpp
@@ -21,12 +21,20 @@
 #include <NdkMediaExtractor.h>
 #include <jni.h>
 #include <sys/stat.h>
+#include <zlib.h>
 
 #include <cstdlib>
 #include <random>
 
 #include "NativeMediaCommon.h"
 
+#define CHECK_KEY(hasKey, format, isPass) \
+    if (!(hasKey)) {                      \
+        AMediaFormat_delete((format));    \
+        (isPass) = false;                 \
+        break;                            \
+    }
+
 static bool isExtractorOKonEOS(AMediaExtractor* extractor) {
     return AMediaExtractor_getSampleTrackIndex(extractor) < 0 &&
            AMediaExtractor_getSampleSize(extractor) < 0 &&
@@ -47,38 +55,6 @@
            (int)refSample->flags >= 0 && refSample->size >= 0 && refSample->presentationTimeUs >= 0;
 }
 
-static bool isFormatSimilar(AMediaFormat* refFormat, AMediaFormat* testFormat) {
-    const char *refMime = nullptr, *testMime = nullptr;
-    bool hasRefMime = AMediaFormat_getString(refFormat, AMEDIAFORMAT_KEY_MIME, &refMime);
-    bool hasTestMime = AMediaFormat_getString(testFormat, AMEDIAFORMAT_KEY_MIME, &testMime);
-
-    if (!hasRefMime || !hasTestMime || strcmp(refMime, testMime) != 0) return false;
-    if (!isCSDIdentical(refFormat, testFormat)) return false;
-    if (!strncmp(refMime, "audio/", strlen("audio/"))) {
-        int32_t refSampleRate, testSampleRate, refNumChannels, testNumChannels;
-        bool hasRefSampleRate =
-                AMediaFormat_getInt32(refFormat, AMEDIAFORMAT_KEY_SAMPLE_RATE, &refSampleRate);
-        bool hasTestSampleRate =
-                AMediaFormat_getInt32(testFormat, AMEDIAFORMAT_KEY_SAMPLE_RATE, &testSampleRate);
-        bool hasRefNumChannels =
-                AMediaFormat_getInt32(refFormat, AMEDIAFORMAT_KEY_CHANNEL_COUNT, &refNumChannels);
-        bool hasTestNumChannels =
-                AMediaFormat_getInt32(testFormat, AMEDIAFORMAT_KEY_CHANNEL_COUNT, &testNumChannels);
-        return hasRefSampleRate && hasTestSampleRate && hasRefNumChannels && hasTestNumChannels &&
-               refNumChannels == testNumChannels && refSampleRate == testSampleRate;
-    } else if (!strncmp(refMime, "video/", strlen("video/"))) {
-        int32_t refWidth, testWidth, refHeight, testHeight;
-        bool hasRefWidth = AMediaFormat_getInt32(refFormat, AMEDIAFORMAT_KEY_WIDTH, &refWidth);
-        bool hasTestWidth = AMediaFormat_getInt32(testFormat, AMEDIAFORMAT_KEY_WIDTH, &testWidth);
-        bool hasRefHeight = AMediaFormat_getInt32(refFormat, AMEDIAFORMAT_KEY_HEIGHT, &refHeight);
-        bool hasTestHeight =
-                AMediaFormat_getInt32(testFormat, AMEDIAFORMAT_KEY_HEIGHT, &testHeight);
-        return hasRefWidth && hasTestWidth && hasRefHeight && hasTestHeight &&
-               refWidth == testWidth && refHeight == testHeight;
-    }
-    return true;
-}
-
 static void inline setSampleInfo(AMediaExtractor* extractor, AMediaCodecBufferInfo* info) {
     info->flags = AMediaExtractor_getSampleFlags(extractor);
     info->offset = 0;
@@ -120,8 +96,8 @@
                     ALOGD(" Mime: %s mismatch for sample: %d", refMime, frameCount);
                     ALOGD(" flags exp/got: %d / %d", refSampleInfo.flags, testSampleInfo.flags);
                     ALOGD(" size exp/got: %d / %d ", refSampleInfo.size, testSampleInfo.size);
-                    ALOGD(" ts exp/got: %d / %d ", (int)refSampleInfo.presentationTimeUs,
-                          (int)testSampleInfo.presentationTimeUs);
+                    ALOGD(" ts exp/got: %" PRId64 " / %" PRId64 "",
+                          refSampleInfo.presentationTimeUs, testSampleInfo.presentationTimeUs);
                     areTracksIdentical = false;
                     break;
                 }
@@ -176,9 +152,9 @@
                     areTracksIdentical = false;
                     break;
                 }
-                ALOGV("Mime: %s Sample: %d flags: %d size: %d ts: %d", refMime, frameCount,
-                      refSampleInfo.flags, refSampleInfo.size,
-                      (int)refSampleInfo.presentationTimeUs);
+                ALOGV("Mime: %s Sample: %d flags: %d size: %d ts: % " PRId64 "", refMime,
+                      frameCount, refSampleInfo.flags, refSampleInfo.size,
+                      refSampleInfo.presentationTimeUs);
                 if (!haveRefSamples || frameCount >= sampleLimit) {
                     break;
                 }
@@ -239,6 +215,37 @@
     return extractor;
 }
 
+static bool createExtractorFromUrl(JNIEnv* env, jobjectArray jkeys, jobjectArray jvalues,
+                                   AMediaExtractor** ex, AMediaDataSource** ds, const char* url) {
+    int numkeys = jkeys ? env->GetArrayLength(jkeys) : 0;
+    int numvalues = jvalues ? env->GetArrayLength(jvalues) : 0;
+    if (numkeys != numvalues) {
+        ALOGE("Unequal number of keys and values");
+        return false;
+    }
+    const char** keyvalues = numkeys ? new const char*[numkeys * 2] : nullptr;
+    for (int i = 0; i < numkeys; i++) {
+        auto jkey = (jstring)(env->GetObjectArrayElement(jkeys, i));
+        auto jvalue = (jstring)(env->GetObjectArrayElement(jvalues, i));
+        const char* key = env->GetStringUTFChars(jkey, nullptr);
+        const char* value = env->GetStringUTFChars(jvalue, nullptr);
+        keyvalues[i * 2] = key;
+        keyvalues[i * 2 + 1] = value;
+    }
+    *ex = AMediaExtractor_new();
+    *ds = AMediaDataSource_newUri(url, numkeys, keyvalues);
+    bool isPass = *ds ? (AMEDIA_OK == AMediaExtractor_setDataSourceCustom(*ex, *ds)) : false;
+    if (!isPass) ALOGE("setDataSourceCustom failed");
+    for (int i = 0; i < numkeys; i++) {
+        auto jkey = (jstring)(env->GetObjectArrayElement(jkeys, i));
+        auto jvalue = (jstring)(env->GetObjectArrayElement(jvalues, i));
+        env->ReleaseStringUTFChars(jkey, keyvalues[i * 2]);
+        env->ReleaseStringUTFChars(jvalue, keyvalues[i * 2 + 1]);
+    }
+    delete[] keyvalues;
+    return isPass;
+}
+
 // content necessary for testing seek are grouped in this class
 class SeekTestParams {
   public:
@@ -426,8 +433,8 @@
             if (!isSampleInfoIdentical(&arg->mExpected, &received)) {
                 ALOGE(" flags exp/got: %d / %d", arg->mExpected.flags, received.flags);
                 ALOGE(" size exp/got: %d / %d ", arg->mExpected.size, received.size);
-                ALOGE(" ts exp/got: %d / %d ", (int)arg->mExpected.presentationTimeUs,
-                      (int)received.presentationTimeUs);
+                ALOGE(" ts exp/got: %" PRId64 " / %" PRId64 "", arg->mExpected.presentationTimeUs,
+                      received.presentationTimeUs);
                 errCnt++;
             }
         }
@@ -484,8 +491,8 @@
                 if (!result) {
                     ALOGE(" flags exp/got: %d / %d", refSampleInfo.flags, testSampleInfo.flags);
                     ALOGE(" size exp/got: %d / %d ", refSampleInfo.size, testSampleInfo.size);
-                    ALOGE(" ts exp/got: %d / %d ", (int)refSampleInfo.presentationTimeUs,
-                          (int)testSampleInfo.presentationTimeUs);
+                    ALOGE(" ts exp/got: %" PRId64 " / %" PRId64 "",
+                          refSampleInfo.presentationTimeUs, testSampleInfo.presentationTimeUs);
                 }
                 int refTrackIdx = AMediaExtractor_getSampleTrackIndex(refExtractor);
                 int testTrackIdx = AMediaExtractor_getSampleTrackIndex(testExtractor);
@@ -501,6 +508,140 @@
     return result;
 }
 
+static jlong nativeReadAllData(JNIEnv* env, jobject, jstring jsrcPath, jstring jmime,
+                               jint sampleLimit, jobjectArray jkeys, jobjectArray jvalues,
+                               jboolean isSrcUrl) {
+    const int maxSampleSize = (4 * 1024 * 1024);
+    bool isPass = true;
+    uLong crc32value = 0U;
+    const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr);
+    const char* cmime = env->GetStringUTFChars(jmime, nullptr);
+    AMediaExtractor* extractor = nullptr;
+    AMediaDataSource* dataSource = nullptr;
+    FILE* srcFp = nullptr;
+
+    if (isSrcUrl) {
+        isPass = createExtractorFromUrl(env, jkeys, jvalues, &extractor, &dataSource, csrcPath);
+    } else {
+        srcFp = fopen(csrcPath, "rbe");
+        extractor = createExtractorFromFD(srcFp);
+        if (extractor == nullptr) {
+            if (srcFp) fclose(srcFp);
+            isPass = false;
+        }
+    }
+    if (!isPass) {
+        env->ReleaseStringUTFChars(jmime, cmime);
+        env->ReleaseStringUTFChars(jsrcPath, csrcPath);
+        ALOGE("Error while creating extractor");
+        if (dataSource) AMediaDataSource_delete(dataSource);
+        if (extractor) AMediaExtractor_delete(extractor);
+        return static_cast<jlong>(-2);
+    }
+    auto buffer = new uint8_t[maxSampleSize];
+    int bufferSize = 0;
+    int tracksSelected = 0;
+    for (size_t trackID = 0; trackID < AMediaExtractor_getTrackCount(extractor) && isPass;
+         trackID++) {
+        AMediaFormat* format = AMediaExtractor_getTrackFormat(extractor, trackID);
+        const char* refMime = nullptr;
+        CHECK_KEY(AMediaFormat_getString(format, AMEDIAFORMAT_KEY_MIME, &refMime), format, isPass);
+        if (strlen(cmime) != 0 && strcmp(refMime, cmime) != 0) {
+            AMediaFormat_delete(format);
+            continue;
+        }
+        AMediaExtractor_selectTrack(extractor, trackID);
+        tracksSelected++;
+        if (strncmp(refMime, "audio/", strlen("audio/")) == 0) {
+            int32_t refSampleRate, refNumChannels;
+            flattenField<int32_t>(buffer, &bufferSize, 0);
+            CHECK_KEY(AMediaFormat_getInt32(format, AMEDIAFORMAT_KEY_SAMPLE_RATE, &refSampleRate),
+                      format, isPass);
+            flattenField<int32_t>(buffer, &bufferSize, refSampleRate);
+            CHECK_KEY(
+                    AMediaFormat_getInt32(format, AMEDIAFORMAT_KEY_CHANNEL_COUNT, &refNumChannels),
+                    format, isPass);
+            flattenField<int32_t>(buffer, &bufferSize, refNumChannels);
+        } else if (strncmp(refMime, "video/", strlen("video/")) == 0) {
+            int32_t refWidth, refHeight;
+            flattenField<int32_t>(buffer, &bufferSize, 1);
+            CHECK_KEY(AMediaFormat_getInt32(format, AMEDIAFORMAT_KEY_WIDTH, &refWidth), format,
+                      isPass);
+            flattenField<int32_t>(buffer, &bufferSize, refWidth);
+            CHECK_KEY(AMediaFormat_getInt32(format, AMEDIAFORMAT_KEY_HEIGHT, &refHeight), format,
+                      isPass);
+            flattenField<int32_t>(buffer, &bufferSize, refHeight);
+        } else {
+            flattenField<int32_t>(buffer, &bufferSize, 2);
+        }
+        int64_t keyDuration = 0;
+        CHECK_KEY(AMediaFormat_getInt64(format, AMEDIAFORMAT_KEY_DURATION, &keyDuration), format,
+                  isPass);
+        flattenField<int64_t>(buffer, &bufferSize, keyDuration);
+        // csd keys
+        for (int i = 0;; i++) {
+            char csdName[16];
+            void* csdBuffer;
+            size_t csdSize;
+            snprintf(csdName, sizeof(csdName), "csd-%d", i);
+            if (AMediaFormat_getBuffer(format, csdName, &csdBuffer, &csdSize)) {
+                crc32value = crc32(crc32value, static_cast<uint8_t*>(csdBuffer), csdSize);
+            } else
+                break;
+        }
+        AMediaFormat_delete(format);
+    }
+    if (tracksSelected < 1) {
+        isPass = false;
+        ALOGE("No track selected");
+    }
+    crc32value = crc32(crc32value, buffer, bufferSize);
+
+    AMediaCodecBufferInfo sampleInfo;
+    for (int sampleCount = 0; sampleCount < sampleLimit && isPass; sampleCount++) {
+        setSampleInfo(extractor, &sampleInfo);
+        ssize_t refSz = AMediaExtractor_readSampleData(extractor, buffer, maxSampleSize);
+        crc32value = crc32(crc32value, buffer, refSz);
+        if (sampleInfo.size != refSz) {
+            isPass = false;
+            ALOGE("Buffer read size %zd mismatches extractor sample size %d", refSz,
+                  sampleInfo.size);
+        }
+        if (sampleInfo.flags == -1) {
+            isPass = false;
+            ALOGE("No extractor flags");
+        }
+        if (sampleInfo.presentationTimeUs == -1) {
+            isPass = false;
+            ALOGE("Presentation times are negative");
+        }
+        bufferSize = 0;
+        flattenField<int32_t>(buffer, &bufferSize, sampleInfo.size);
+        flattenField<int32_t>(buffer, &bufferSize, sampleInfo.flags);
+        flattenField<int64_t>(buffer, &bufferSize, sampleInfo.presentationTimeUs);
+        crc32value = crc32(crc32value, buffer, bufferSize);
+        sampleCount++;
+        if (!AMediaExtractor_advance(extractor)) {
+            if (!isExtractorOKonEOS(extractor)) {
+                isPass = false;
+                ALOGE("Mime: %s calls post advance() are not OK", cmime);
+            }
+            break;
+        }
+    }
+    delete[] buffer;
+    if (extractor) AMediaExtractor_delete(extractor);
+    if (dataSource) AMediaDataSource_delete(dataSource);
+    if (srcFp) fclose(srcFp);
+    env->ReleaseStringUTFChars(jmime, cmime);
+    env->ReleaseStringUTFChars(jsrcPath, csrcPath);
+    if (!isPass) {
+        ALOGE(" Error while extracting");
+        return static_cast<jlong>(-3);
+    }
+    return static_cast<jlong>(crc32value);
+}
+
 static jboolean nativeTestExtract(JNIEnv* env, jobject, jstring jsrcPath, jstring jrefPath,
                                   jstring jmime) {
     bool isPass = false;
@@ -536,8 +677,8 @@
         std::shuffle(seekTestArgs.begin(), seekTestArgs.end(), std::default_random_engine(kSeed));
         int seekAccErrCnt = checkSeekPoints(csrcPath, cmime, seekTestArgs);
         if (seekAccErrCnt != 0) {
-            ALOGE("For %s seek chose inaccurate Sync point in: %d / %d", csrcPath, seekAccErrCnt,
-                  (int)seekTestArgs.size());
+            ALOGE("For %s seek chose inaccurate Sync point in: %d / %zu", csrcPath, seekAccErrCnt,
+                  seekTestArgs.size());
             isPass = false;
         } else {
             isPass = true;
@@ -609,8 +750,8 @@
                     ALOGE("seen mismatch seekTo(0, SEEK_TO_CLOSEST_SYNC)");
                     ALOGE(" flags exp/got: %d / %d", sampleInfoAtZero.flags, currInfo.flags);
                     ALOGE(" size exp/got: %d / %d ", sampleInfoAtZero.size, currInfo.size);
-                    ALOGE(" ts exp/got: %d / %d ", (int)sampleInfoAtZero.presentationTimeUs,
-                          (int)currInfo.presentationTimeUs);
+                    ALOGE(" ts exp/got: %" PRId64 " / %" PRId64 " ",
+                          sampleInfoAtZero.presentationTimeUs, currInfo.presentationTimeUs);
                     AMediaFormat_delete(format);
                     break;
                 }
@@ -621,8 +762,8 @@
                     ALOGE("seen mismatch seekTo(-1, SEEK_TO_CLOSEST_SYNC)");
                     ALOGE(" flags exp/got: %d / %d", sampleInfoAtZero.flags, currInfo.flags);
                     ALOGE(" size exp/got: %d / %d ", sampleInfoAtZero.size, currInfo.size);
-                    ALOGE(" ts exp/got: %d / %d ", (int)sampleInfoAtZero.presentationTimeUs,
-                          (int)currInfo.presentationTimeUs);
+                    ALOGE(" ts exp/got: %" PRId64 " / %" PRId64 "",
+                          sampleInfoAtZero.presentationTimeUs, currInfo.presentationTimeUs);
                     AMediaFormat_delete(format);
                     break;
                 }
@@ -667,13 +808,9 @@
     if (status == AMEDIA_OK) {
         isPass &= validateCachedDuration(refExtractor, true);
         const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr);
-        AMediaDataSource* dataSource = AMediaDataSource_newUri(csrcUrl, 0, nullptr);
-        AMediaExtractor* testExtractor = AMediaExtractor_new();
-        status = AMediaExtractor_setDataSourceCustom(testExtractor, dataSource);
-        if (status != AMEDIA_OK) {
-            ALOGE("setDataSourceCustom failed");
-            isPass = false;
-        } else {
+        AMediaDataSource* dataSource = nullptr;
+        AMediaExtractor* testExtractor = nullptr;
+        if (createExtractorFromUrl(env, nullptr, nullptr, &testExtractor, &dataSource, csrcUrl)) {
             isPass &= validateCachedDuration(testExtractor, true);
             if (!(isMediaSimilar(refExtractor, testExtractor, nullptr) &&
                   isFileFormatIdentical(refExtractor, testExtractor) &&
@@ -733,13 +870,24 @@
     return env->RegisterNatives(c, methodTable, sizeof(methodTable) / sizeof(JNINativeMethod));
 }
 
+int registerAndroidMediaV2CtsExtractorTest(JNIEnv* env) {
+    const JNINativeMethod methodTable[] = {
+            {"nativeReadAllData",
+             "(Ljava/lang/String;Ljava/lang/String;I[Ljava/lang/String;[Ljava/lang/String;Z)J",
+             (void*)nativeReadAllData},
+    };
+    jclass c = env->FindClass("android/mediav2/cts/ExtractorTest");
+    return env->RegisterNatives(c, methodTable, sizeof(methodTable) / sizeof(JNINativeMethod));
+}
+
 extern int registerAndroidMediaV2CtsExtractorUnitTestApi(JNIEnv* env);
 
 extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void*) {
     JNIEnv* env;
     if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) return JNI_ERR;
+    if (registerAndroidMediaV2CtsExtractorTest(env) != JNI_OK) return JNI_ERR;
     if (registerAndroidMediaV2CtsExtractorTestSetDS(env) != JNI_OK) return JNI_ERR;
     if (registerAndroidMediaV2CtsExtractorTestFunc(env) != JNI_OK) return JNI_ERR;
     if (registerAndroidMediaV2CtsExtractorUnitTestApi(env) != JNI_OK) return JNI_ERR;
     return JNI_VERSION_1_6;
-}
\ No newline at end of file
+}
diff --git a/tests/media/jni/NativeMediaCommon.cpp b/tests/media/jni/NativeMediaCommon.cpp
index 0debeac..8cccbc0 100644
--- a/tests/media/jni/NativeMediaCommon.cpp
+++ b/tests/media/jni/NativeMediaCommon.cpp
@@ -36,6 +36,7 @@
 const char* AMEDIA_MIMETYPE_AUDIO_AMR_NB = "audio/3gpp";
 const char* AMEDIA_MIMETYPE_AUDIO_AMR_WB = "audio/amr-wb";
 const char* AMEDIA_MIMETYPE_AUDIO_AAC = "audio/mp4a-latm";
+const char* AMEDIA_MIMETYPE_AUDIO_FLAC = "audio/flac";
 const char* AMEDIA_MIMETYPE_AUDIO_VORBIS = "audio/vorbis";
 const char* AMEDIA_MIMETYPE_AUDIO_OPUS = "audio/opus";
 
@@ -48,11 +49,6 @@
 bool isCSDIdentical(AMediaFormat* refFormat, AMediaFormat* testFormat) {
     const char* mime;
     AMediaFormat_getString(refFormat, AMEDIAFORMAT_KEY_MIME, &mime);
-    /* TODO(b/154177490) */
-    if ((strcmp(mime, AMEDIA_MIMETYPE_VIDEO_VP9) == 0) ||
-        (strcmp(mime, AMEDIA_MIMETYPE_VIDEO_AV1) == 0)) {
-        return true;
-    }
     for (int i = 0;; i++) {
         std::pair<void*, size_t> refCsd;
         std::pair<void*, size_t> testCsd;
@@ -77,4 +73,70 @@
         } else break;
     }
     return true;
-}
\ No newline at end of file
+}
+
+template <class T>
+void flattenField(uint8_t* buffer, int* pos, T value) {
+    uint8_t* ptr = (buffer + *pos);
+    for (int i = sizeof(T) - 1; i >= 0; i--) {
+        *ptr++ = (uint8_t)((value >> (i * 8)) & 0xff);
+    }
+    *pos += sizeof(T);
+}
+
+template void flattenField<int32_t>(uint8_t* buffer, int* pos, int32_t value);
+template void flattenField<int64_t>(uint8_t* buffer, int* pos, int64_t value);
+
+bool isFormatSimilar(AMediaFormat* refFormat, AMediaFormat* testFormat) {
+    const char *refMime = nullptr, *testMime = nullptr;
+    int64_t refKeyDuration, testKeyDuration;
+    bool hasRefMime = AMediaFormat_getString(refFormat, AMEDIAFORMAT_KEY_MIME, &refMime);
+    if (!hasRefMime) return false;
+    bool hasTestMime = AMediaFormat_getString(testFormat, AMEDIAFORMAT_KEY_MIME, &testMime);
+    if (!hasTestMime) return false;
+    if (strcmp(refMime, testMime) != 0) return false;
+    bool hasRefKeyDuration =
+            AMediaFormat_getInt64(refFormat, AMEDIAFORMAT_KEY_DURATION, &refKeyDuration);
+    if (!hasRefKeyDuration) return false;
+    bool hasTestKeyDuration =
+            AMediaFormat_getInt64(testFormat, AMEDIAFORMAT_KEY_DURATION, &testKeyDuration);
+    if (!hasTestKeyDuration) return false;
+    if (refKeyDuration != testKeyDuration) {
+        ALOGW("Duration mismatches ref / test = %lld / %lld", (long long) refKeyDuration,
+              (long long) testKeyDuration);
+        // TODO (b/163477410)(b/163478168)
+//        return false;
+    }
+    if (!isCSDIdentical(refFormat, testFormat)) return false;
+    if (!strncmp(refMime, "audio/", strlen("audio/"))) {
+        int32_t refSampleRate, testSampleRate, refNumChannels, testNumChannels;
+        bool hasRefSampleRate =
+                AMediaFormat_getInt32(refFormat, AMEDIAFORMAT_KEY_SAMPLE_RATE, &refSampleRate);
+        if (!hasRefSampleRate) return false;
+        bool hasTestSampleRate =
+                AMediaFormat_getInt32(testFormat, AMEDIAFORMAT_KEY_SAMPLE_RATE, &testSampleRate);
+        if (!hasTestSampleRate) return false;
+        if (refSampleRate != testSampleRate)return false;
+        bool hasRefNumChannels =
+                AMediaFormat_getInt32(refFormat, AMEDIAFORMAT_KEY_CHANNEL_COUNT, &refNumChannels);
+        if (!hasRefNumChannels) return false;
+        bool hasTestNumChannels =
+                AMediaFormat_getInt32(testFormat, AMEDIAFORMAT_KEY_CHANNEL_COUNT, &testNumChannels);
+        if (!hasTestNumChannels) return false;
+        if (refNumChannels != testNumChannels) return false;
+    } else if (!strncmp(refMime, "video/", strlen("video/"))) {
+        int32_t refWidth, testWidth, refHeight, testHeight;
+        bool hasRefWidth = AMediaFormat_getInt32(refFormat, AMEDIAFORMAT_KEY_WIDTH, &refWidth);
+        if (!hasRefWidth) return false;
+        bool hasTestWidth = AMediaFormat_getInt32(testFormat, AMEDIAFORMAT_KEY_WIDTH, &testWidth);
+        if (!hasTestWidth) return false;
+        if (refWidth != testWidth) return false;
+        bool hasRefHeight = AMediaFormat_getInt32(refFormat, AMEDIAFORMAT_KEY_HEIGHT, &refHeight);
+        if (!hasRefHeight) return false;
+        bool hasTestHeight =
+                AMediaFormat_getInt32(testFormat, AMEDIAFORMAT_KEY_HEIGHT, &testHeight);
+        if (!hasTestHeight) return false;
+        if (refHeight != testHeight) return false;
+    }
+    return true;
+}
diff --git a/tests/media/jni/NativeMediaCommon.h b/tests/media/jni/NativeMediaCommon.h
index f5f8fb2..b74eb17 100644
--- a/tests/media/jni/NativeMediaCommon.h
+++ b/tests/media/jni/NativeMediaCommon.h
@@ -17,6 +17,7 @@
 #ifndef MEDIACTSNATIVE_NATIVE_MEDIA_COMMON_H
 #define MEDIACTSNATIVE_NATIVE_MEDIA_COMMON_H
 
+#include <inttypes.h>
 #include <NdkMediaFormat.h>
 
 extern const char* AMEDIA_MIMETYPE_VIDEO_VP8;
@@ -30,6 +31,7 @@
 extern const char* AMEDIA_MIMETYPE_AUDIO_AMR_NB;
 extern const char* AMEDIA_MIMETYPE_AUDIO_AMR_WB;
 extern const char* AMEDIA_MIMETYPE_AUDIO_AAC;
+extern const char* AMEDIA_MIMETYPE_AUDIO_FLAC;
 extern const char* AMEDIA_MIMETYPE_AUDIO_VORBIS;
 extern const char* AMEDIA_MIMETYPE_AUDIO_OPUS;
 
@@ -61,5 +63,9 @@
 
 // common utility functions
 bool isCSDIdentical(AMediaFormat* refFormat, AMediaFormat* testFormat);
+bool isFormatSimilar(AMediaFormat* refFormat, AMediaFormat* testFormat);
+
+template <class T>
+void flattenField(uint8_t* buffer, int* pos, T value);
 
 #endif  // MEDIACTSNATIVE_NATIVE_MEDIA_COMMON_H
diff --git a/tests/media/jni/NativeMuxerTest.cpp b/tests/media/jni/NativeMuxerTest.cpp
index 56f2ba8..cea162c7 100644
--- a/tests/media/jni/NativeMuxerTest.cpp
+++ b/tests/media/jni/NativeMuxerTest.cpp
@@ -68,7 +68,7 @@
 
     bool isSubsetOf(MuxerNativeTestHelper* that);
 
-    void offsetTimeStamp(int trackID, long tsOffset, int sampleOffset);
+    void offsetTimeStamp(int64_t tsAudioOffsetUs, int64_t tsVideoOffsetUs, int sampleOffset);
 
   private:
     void splitMediaToMuxerParameters();
@@ -205,11 +205,11 @@
             delete[] frameCount;
             return false;
         }
-        ALOGV("Track: %d Timestamp: %d", trackID, (int)info->presentationTimeUs);
+        ALOGV("Track: %d Timestamp: %" PRId64 "", trackID, info->presentationTimeUs);
         frameCount[index]++;
     }
     delete[] frameCount;
-    ALOGV("Total track samples %d", (int)mTrackIdxOrder.size());
+    ALOGV("Total track samples %zu", mTrackIdxOrder.size());
     return true;
 }
 
@@ -250,8 +250,8 @@
                                                     info) != AMEDIA_OK) {
                         return false;
                     }
-                    ALOGV("Track: %d Timestamp: %d", outIndexMap[idx],
-                          (int)info->presentationTimeUs);
+                    ALOGV("Track: %d Timestamp: %" PRId64 "", outIndexMap[idx],
+                          info->presentationTimeUs);
                 }
                 idx++;
             }
@@ -277,7 +277,7 @@
             const char* thatMime = nullptr;
             AMediaFormat_getString(thatFormat, AMEDIAFORMAT_KEY_MIME, &thatMime);
             if (thisMime != nullptr && thatMime != nullptr && !strcmp(thisMime, thatMime)) {
-                if (!isCSDIdentical(thisFormat, thatFormat)) continue;
+                if (!isFormatSimilar(thisFormat, thatFormat)) continue;
                 if (mBufferInfo[i].size() == that->mBufferInfo[j].size()) {
                     int tolerance =
                             !strncmp(thisMime, "video/", strlen("video/")) ? STTS_TOLERANCE_US : 0;
@@ -312,12 +312,24 @@
     return true;
 }
 
-void MuxerNativeTestHelper::offsetTimeStamp(int trackID, long tsOffset, int sampleOffset) {
-    // offset pts of samples from index sampleOffset till the end by tsOffset
-    if (trackID < mTrackCount) {
-        for (int i = sampleOffset; i < mBufferInfo[trackID].size(); i++) {
-            AMediaCodecBufferInfo* info = mBufferInfo[trackID][i];
-            info->presentationTimeUs += tsOffset;
+void MuxerNativeTestHelper::offsetTimeStamp(int64_t tsAudioOffsetUs, int64_t tsVideoOffsetUs,
+                                            int sampleOffset) {
+    // offset pts of samples from index sampleOffset till the end by tsOffset for each audio and
+    // video track
+    for (int trackID = 0; trackID < mTrackCount; trackID++) {
+        int64_t tsOffsetUs = 0;
+        const char* thisMime = nullptr;
+        AMediaFormat_getString(mFormat[trackID], AMEDIAFORMAT_KEY_MIME, &thisMime);
+        if (thisMime != nullptr) {
+            if (strncmp(thisMime, "video/", strlen("video/")) == 0) {
+                tsOffsetUs = tsVideoOffsetUs;
+            } else if (strncmp(thisMime, "audio/", strlen("audio/")) == 0) {
+                tsOffsetUs = tsAudioOffsetUs;
+            }
+            for (int i = sampleOffset; i < mBufferInfo[trackID].size(); i++) {
+                AMediaCodecBufferInfo *info = mBufferInfo[trackID][i];
+                info->presentationTimeUs += tsOffsetUs;
+            }
         }
     }
 }
@@ -511,7 +523,8 @@
     if (mediaInfoA->getTrackCount() == 1 && mediaInfoB->getTrackCount() == 1) {
         const char* crefPath = env->GetStringUTFChars(jrefPath, nullptr);
         // number of times to repeat {mSrcFileA, mSrcFileB} in Output
-        int numTracks[][2]{{1, 1}, {2, 0}, {0, 2}, {1, 2}, {2, 1}};
+        // values should be in sync with testMultiTrack
+        static const int numTracks[][2] = {{1, 1}, {2, 0}, {0, 2}, {1, 2}, {2, 1}, {2, 2}};
         // prepare reference
         FILE* rfp = fopen(crefPath, "wbe+");
         if (rfp) {
@@ -593,35 +606,40 @@
 static jboolean nativeTestOffsetPts(JNIEnv* env, jobject, jint format, jstring jsrcPath,
                                     jstring jdstPath, jintArray joffsetIndices) {
     bool isPass = true;
-    const int OFFSET_TS = 111000;
+    // values should be in sync with testOffsetPresentationTime
+    static const int64_t OFFSET_TS_AUDIO_US[4] = {-23220LL, 0LL, 200000LL, 400000LL};
+    static const int64_t OFFSET_TS_VIDEO_US[3] = {0LL, 200000LL, 400000LL};
     jsize len = env->GetArrayLength(joffsetIndices);
     jint* coffsetIndices = env->GetIntArrayElements(joffsetIndices, nullptr);
     const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr);
     const char* cdstPath = env->GetStringUTFChars(jdstPath, nullptr);
     auto* mediaInfo = new MuxerNativeTestHelper(csrcPath);
     if (mediaInfo->getTrackCount() != 0) {
-        for (int trackID = 0; trackID < mediaInfo->getTrackCount() && isPass; trackID++) {
-            for (int i = 0; i < len; i++) {
-                mediaInfo->offsetTimeStamp(trackID, OFFSET_TS, coffsetIndices[i]);
-            }
-            FILE* ofp = fopen(cdstPath, "wbe+");
-            if (ofp) {
-                AMediaMuxer* muxer = AMediaMuxer_new(fileno(ofp), (OutputFormat)format);
-                mediaInfo->muxMedia(muxer);
-                AMediaMuxer_delete(muxer);
-                fclose(ofp);
-                auto* outInfo = new MuxerNativeTestHelper(cdstPath);
-                isPass = mediaInfo->isSubsetOf(outInfo);
-                if (!isPass) {
-                    ALOGE("Validation failed after adding timestamp offset to track %d", trackID);
+        for (int64_t audioOffsetUs : OFFSET_TS_AUDIO_US) {
+            for (int64_t videoOffsetUs : OFFSET_TS_VIDEO_US) {
+                for (int i = 0; i < len; i++) {
+                    mediaInfo->offsetTimeStamp(audioOffsetUs, videoOffsetUs, coffsetIndices[i]);
                 }
-                delete outInfo;
-            } else {
-                isPass = false;
-                ALOGE("failed to open output file %s", cdstPath);
-            }
-            for (int i = len - 1; i >= 0; i--) {
-                mediaInfo->offsetTimeStamp(trackID, -OFFSET_TS, coffsetIndices[i]);
+                FILE *ofp = fopen(cdstPath, "wbe+");
+                if (ofp) {
+                    AMediaMuxer *muxer = AMediaMuxer_new(fileno(ofp), (OutputFormat) format);
+                    mediaInfo->muxMedia(muxer);
+                    AMediaMuxer_delete(muxer);
+                    fclose(ofp);
+                    auto *outInfo = new MuxerNativeTestHelper(cdstPath);
+                    isPass = mediaInfo->isSubsetOf(outInfo);
+                    if (!isPass) {
+                        ALOGE("Validation failed after adding timestamp offsets audio: %lld,"
+                              " video: %lld", (long long) audioOffsetUs, (long long) videoOffsetUs);
+                    }
+                    delete outInfo;
+                } else {
+                    isPass = false;
+                    ALOGE("failed to open output file %s", cdstPath);
+                }
+                for (int i = len - 1; i >= 0; i--) {
+                    mediaInfo->offsetTimeStamp(-audioOffsetUs, -videoOffsetUs, coffsetIndices[i]);
+                }
             }
         }
     } else {
@@ -744,4 +762,4 @@
     if (registerAndroidMediaV2CtsMuxerTestSimpleMux(env) != JNI_OK) return JNI_ERR;
     if (registerAndroidMediaV2CtsMuxerUnitTestApi(env) != JNI_OK) return JNI_ERR;
     return JNI_VERSION_1_6;
-}
\ No newline at end of file
+}
diff --git a/tests/media/src/android/mediav2/cts/CodecDecoderExtTest.java b/tests/media/src/android/mediav2/cts/CodecDecoderExtTest.java
index 51a83ef..0f7fe55 100644
--- a/tests/media/src/android/mediav2/cts/CodecDecoderExtTest.java
+++ b/tests/media/src/android/mediav2/cts/CodecDecoderExtTest.java
@@ -49,6 +49,9 @@
 
     @Parameterized.Parameters(name = "{index}({0})")
     public static Collection<Object[]> input() {
+        final boolean isEncoder = false;
+        final boolean needAudio = false;
+        final boolean needVideo = true;
         final List<Object[]> exhaustiveArgsList = Arrays.asList(new Object[][]{
                 {MediaFormat.MIMETYPE_VIDEO_VP9,
                         //show and no-show frames are sent as separate inputs
@@ -66,19 +69,7 @@
                         //show and no-show frames are sent as one input
                         "bbb_512x288_30fps_1mbps_mpeg2_interlaced_nob_2fields.mp4"},
         });
-
-        Set<String> list = new HashSet<>();
-        if (isHandheld() || isTv() || isAutomotive()) {
-            // sec 2.2.2, 2.3.2, 2.5.2
-            list.add(MediaFormat.MIMETYPE_VIDEO_VP9);
-        }
-        if (isTv()) {
-            // sec 2.3.2
-            list.add(MediaFormat.MIMETYPE_VIDEO_MPEG2);
-        }
-        ArrayList<String> cddRequiredMimeList = new ArrayList<>(list);
-
-        return prepareParamList(cddRequiredMimeList, exhaustiveArgsList, false);
+        return prepareParamList(exhaustiveArgsList, isEncoder, needAudio, needVideo, false);
     }
 
     /**
diff --git a/tests/media/src/android/mediav2/cts/CodecDecoderSurfaceTest.java b/tests/media/src/android/mediav2/cts/CodecDecoderSurfaceTest.java
index 096b5c1..75656e9 100644
--- a/tests/media/src/android/mediav2/cts/CodecDecoderSurfaceTest.java
+++ b/tests/media/src/android/mediav2/cts/CodecDecoderSurfaceTest.java
@@ -19,11 +19,8 @@
 import android.media.MediaCodec;
 import android.media.MediaExtractor;
 import android.media.MediaFormat;
-import android.util.DisplayMetrics;
 import android.util.Log;
 import android.view.Surface;
-import android.view.SurfaceView;
-import android.view.ViewGroup;
 
 import androidx.test.filters.LargeTest;
 import androidx.test.rule.ActivityTestRule;
@@ -38,9 +35,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
@@ -50,34 +45,12 @@
     private static final String LOG_TAG = CodecDecoderSurfaceTest.class.getSimpleName();
 
     private final String mReconfigFile;
-    private SurfaceView mSurfaceView;
 
     public CodecDecoderSurfaceTest(String mime, String testFile, String reconfigFile) {
         super(mime, testFile);
         mReconfigFile = reconfigFile;
     }
 
-    private void setScreenParams(int width, int height, boolean noStretch) {
-        ViewGroup.LayoutParams lp = mSurfaceView.getLayoutParams();
-        final DisplayMetrics dm = mActivityRule.getActivity().getResources().getDisplayMetrics();
-        if (noStretch && width <= dm.widthPixels && height <= dm.heightPixels) {
-            lp.width = width;
-            lp.height = height;
-        } else {
-            int a = dm.widthPixels * height / width;
-            if (a <= dm.heightPixels) {
-                lp.width = dm.widthPixels;
-                lp.height = a;
-            } else {
-                lp.width = dm.heightPixels * width / height;
-                lp.height = dm.heightPixels;
-            }
-        }
-        assertTrue(lp.width <= dm.widthPixels);
-        assertTrue(lp.height <= dm.heightPixels);
-        mActivityRule.getActivity().runOnUiThread(() -> mSurfaceView.setLayoutParams(lp));
-    }
-
     void dequeueOutput(int bufferIndex, MediaCodec.BufferInfo info) {
         if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
             mSawOutputEOS = true;
@@ -95,6 +68,8 @@
 
     private void decodeAndSavePts(String file, String decoder, long pts, int mode, int frameLimit)
             throws IOException, InterruptedException {
+        Surface sf = mSurface;
+        mSurface = null; // for reference, decode in non-surface mode
         mOutputBuff = new OutputManager();
         mCodec = MediaCodec.createByCodecName(decoder);
         MediaFormat format = setUpSource(file);
@@ -107,46 +82,18 @@
         mCodec.stop();
         mCodec.release();
         mExtractor.release();
+        mSurface = sf; // restore surface
     }
 
     @Rule
     public ActivityTestRule<CodecTestActivity> mActivityRule =
             new ActivityTestRule<>(CodecTestActivity.class);
 
-    public void setUpSurface() {
-        CodecTestActivity activity = mActivityRule.getActivity();
-        mSurfaceView = activity.findViewById(R.id.surface);
-        mSurface = mSurfaceView.getHolder().getSurface();
-    }
-
-    public void tearDownSurface() {
-        if (mSurface != null) {
-            mSurface.release();
-            mSurface = null;
-        }
-    }
-
     @Parameterized.Parameters(name = "{index}({0})")
     public static Collection<Object[]> input() {
-        Set<String> list = new HashSet<>();
-        if (isHandheld() || isTv() || isAutomotive()) {
-            // sec 2.2.2, 2.3.2, 2.5.2
-            list.add(MediaFormat.MIMETYPE_VIDEO_AVC);
-            list.add(MediaFormat.MIMETYPE_VIDEO_MPEG4);
-            list.add(MediaFormat.MIMETYPE_VIDEO_H263);
-            list.add(MediaFormat.MIMETYPE_VIDEO_VP8);
-            list.add(MediaFormat.MIMETYPE_VIDEO_VP9);
-        }
-        if (isHandheld()) {
-            // sec 2.2.2
-            list.add(MediaFormat.MIMETYPE_VIDEO_HEVC);
-        }
-        if (isTv()) {
-            // sec 2.3.2
-            list.add(MediaFormat.MIMETYPE_VIDEO_HEVC);
-            list.add(MediaFormat.MIMETYPE_VIDEO_MPEG2);
-        }
-        ArrayList<String> cddRequiredMimeList = new ArrayList<>(list);
+        final boolean isEncoder = false;
+        final boolean needAudio = false;
+        final boolean needVideo = true;
         final List<Object[]> exhaustiveArgsList = Arrays.asList(new Object[][]{
                 {MediaFormat.MIMETYPE_VIDEO_MPEG2, "bbb_340x280_768kbps_30fps_mpeg2.mp4",
                         "bbb_520x390_1mbps_30fps_mpeg2.mp4"},
@@ -179,8 +126,11 @@
                         "bbb_520x390_1mbps_30fps_split_non_display_frame_vp9.webm"},
                 {MediaFormat.MIMETYPE_VIDEO_AV1, "bbb_340x280_768kbps_30fps_av1.mp4",
                         "bbb_520x390_1mbps_30fps_av1.mp4"},
+                {MediaFormat.MIMETYPE_VIDEO_AV1,
+                        "bikes_qcif_color_bt2020_smpte2086Hlg_bt2020Ncl_fr_av1.mp4",
+                        "bbb_520x390_1mbps_30fps_av1.mp4"},
         });
-        return prepareParamList(cddRequiredMimeList, exhaustiveArgsList, false);
+        return prepareParamList(exhaustiveArgsList, isEncoder, needAudio, needVideo, true);
     }
 
     /**
@@ -199,15 +149,20 @@
         OutputManager test = new OutputManager();
         final long pts = 0;
         final int mode = MediaExtractor.SEEK_TO_CLOSEST_SYNC;
+        CodecTestActivity activity = mActivityRule.getActivity();
+        setUpSurface(activity);
         for (String decoder : listOfDecoders) {
             decodeAndSavePts(mTestFile, decoder, pts, mode, Integer.MAX_VALUE);
             ref = mOutputBuff;
-            assertTrue("input pts list and output pts list are not identical",
-                    ref.isOutPtsListIdenticalToInpPtsList(false));
+            // TODO: Timestamps for deinterlaced content are under review. (E.g. can decoders
+            // produce multiple progressive frames?) For now, do not verify timestamps.
+            if (!mIsInterlaced) {
+                assertTrue("input pts list and output pts list are not identical",
+                        ref.isOutPtsListIdenticalToInpPtsList(false));
+            }
             MediaFormat format = setUpSource(mTestFile);
             mCodec = MediaCodec.createByCodecName(decoder);
-            setUpSurface();
-            setScreenParams(getWidth(format), getHeight(format), true);
+            activity.setScreenParams(getWidth(format), getHeight(format), true);
             for (boolean isAsync : boolStates) {
                 String log = String.format("codec: %s, file: %s, mode: %s:: ", decoder, mTestFile,
                         (isAsync ? "async" : "sync"));
@@ -225,11 +180,16 @@
                 assertTrue(log + " unexpected error", !mAsyncHandle.hasSeenError());
                 assertTrue(log + "no input sent", 0 != mInputCount);
                 assertTrue(log + "output received", 0 != mOutputCount);
-                assertTrue(log + "decoder output is flaky", ref.equals(test));
+                // TODO: Timestamps for deinterlaced content are under review. (E.g. can decoders
+                // produce multiple progressive frames?) For now, do not verify timestamps.
+                if (mIsInterlaced) {
+                    assertTrue(log + "decoder output is flaky", ref.equalsInterlaced(test));
+                } else {
+                    assertTrue(log + "decoder output is flaky", ref.equals(test));
+                }
             }
             mCodec.release();
             mExtractor.release();
-            mSurface = null;
         }
         tearDownSurface();
     }
@@ -259,16 +219,21 @@
         final int mode = MediaExtractor.SEEK_TO_CLOSEST_SYNC;
         boolean[] boolStates = {true, false};
         OutputManager test = new OutputManager();
+        CodecTestActivity activity = mActivityRule.getActivity();
+        setUpSurface(activity);
         for (String decoder : listOfDecoders) {
             decodeAndSavePts(mTestFile, decoder, pts, mode, Integer.MAX_VALUE);
             OutputManager ref = mOutputBuff;
-            assertTrue("input pts list and output pts list are not identical",
-                    ref.isOutPtsListIdenticalToInpPtsList(false));
+            // TODO: Timestamps for deinterlaced content are under review. (E.g. can decoders
+            // produce multiple progressive frames?) For now, do not verify timestamps.
+            if (!mIsInterlaced) {
+                assertTrue("input pts list and output pts list are not identical",
+                        ref.isOutPtsListIdenticalToInpPtsList(false));
+            }
             mOutputBuff = test;
             setUpSource(mTestFile);
             mCodec = MediaCodec.createByCodecName(decoder);
-            setUpSurface();
-            setScreenParams(getWidth(format), getHeight(format), false);
+            activity.setScreenParams(getWidth(format), getHeight(format), false);
             for (boolean isAsync : boolStates) {
                 String log = String.format("decoder: %s, input file: %s, mode: %s:: ", decoder,
                         mTestFile, (isAsync ? "async" : "sync"));
@@ -323,7 +288,6 @@
             }
             mCodec.release();
             mExtractor.release();
-            mSurface = null;
         }
         tearDownSurface();
     }
@@ -348,19 +312,24 @@
         final int mode = MediaExtractor.SEEK_TO_CLOSEST_SYNC;
         boolean[] boolStates = {true, false};
         OutputManager test = new OutputManager();
+        CodecTestActivity activity = mActivityRule.getActivity();
+        setUpSurface(activity);
         for (String decoder : listOfDecoders) {
             decodeAndSavePts(mTestFile, decoder, pts, mode, Integer.MAX_VALUE);
             OutputManager ref = mOutputBuff;
             decodeAndSavePts(mReconfigFile, decoder, pts, mode, Integer.MAX_VALUE);
             OutputManager configRef = mOutputBuff;
-            assertTrue("input pts list and reference pts list are not identical",
-                    ref.isOutPtsListIdenticalToInpPtsList(false));
-            assertTrue("input pts list and reconfig ref output pts list are not identical",
-                    configRef.isOutPtsListIdenticalToInpPtsList(false));
+            // TODO: Timestamps for deinterlaced content are under review. (E.g. can decoders
+            // produce multiple progressive frames?) For now, do not verify timestamps.
+            if (!mIsInterlaced) {
+                assertTrue("input pts list and reference pts list are not identical",
+                        ref.isOutPtsListIdenticalToInpPtsList(false));
+                assertTrue("input pts list and reconfig ref output pts list are not identical",
+                        configRef.isOutPtsListIdenticalToInpPtsList(false));
+            }
             mOutputBuff = test;
             mCodec = MediaCodec.createByCodecName(decoder);
-            setUpSurface();
-            setScreenParams(getWidth(format), getHeight(format), false);
+            activity.setScreenParams(getWidth(format), getHeight(format), false);
             for (boolean isAsync : boolStates) {
                 setUpSource(mTestFile);
                 String log = String.format("decoder: %s, input file: %s, mode: %s:: ", decoder,
@@ -414,7 +383,7 @@
                 setUpSource(mReconfigFile);
                 log = String.format("decoder: %s, input file: %s, mode: %s:: ", decoder,
                         mReconfigFile, (isAsync ? "async" : "sync"));
-                setScreenParams(getWidth(newFormat), getHeight(newFormat), true);
+                activity.setScreenParams(getWidth(newFormat), getHeight(newFormat), true);
                 reConfigureCodec(newFormat, isAsync, false, false);
                 mCodec.start();
                 test.reset();
@@ -432,28 +401,28 @@
                 mExtractor.release();
             }
             mCodec.release();
-            mSurface = null;
         }
         tearDownSurface();
     }
 
     private native boolean nativeTestSimpleDecode(String decoder, Surface surface, String mime,
-            String testFile, String refFile, float rmsError);
+            String testFile, String refFile, float rmsError, long checksum);
 
     @LargeTest
     @Test(timeout = PER_TEST_TIMEOUT_LARGE_TEST_MS)
-    public void testSimpleDecodeToSurfaceNative() throws IOException {
+    public void testSimpleDecodeToSurfaceNative() throws IOException, InterruptedException {
         ArrayList<String> listOfDecoders = selectCodecs(mMime, null, null, false);
         if (listOfDecoders.isEmpty()) {
             fail("no suitable codecs found for mime: " + mMime);
         }
         MediaFormat format = setUpSource(mTestFile);
         mExtractor.release();
-        setUpSurface();
-        setScreenParams(getWidth(format), getHeight(format), false);
+        CodecTestActivity activity = mActivityRule.getActivity();
+        setUpSurface(activity);
+        activity.setScreenParams(getWidth(format), getHeight(format), false);
         for (String decoder : listOfDecoders) {
             assertTrue(nativeTestSimpleDecode(decoder, mSurface, mMime, mInpPrefix + mTestFile,
-                    mInpPrefix + mReconfigFile, -1.0f));
+                    mInpPrefix + mReconfigFile, -1.0f, 0L));
         }
         tearDownSurface();
     }
@@ -463,15 +432,16 @@
 
     @LargeTest
     @Test(timeout = PER_TEST_TIMEOUT_LARGE_TEST_MS)
-    public void testFlushNative() throws IOException {
+    public void testFlushNative() throws IOException, InterruptedException {
         ArrayList<String> listOfDecoders = selectCodecs(mMime, null, null, false);
         if (listOfDecoders.isEmpty()) {
             fail("no suitable codecs found for mime: " + mMime);
         }
         MediaFormat format = setUpSource(mTestFile);
         mExtractor.release();
-        setUpSurface();
-        setScreenParams(getWidth(format), getHeight(format), true);
+        CodecTestActivity activity = mActivityRule.getActivity();
+        setUpSurface(activity);
+        activity.setScreenParams(getWidth(format), getHeight(format), true);
         for (String decoder : listOfDecoders) {
             assertTrue(nativeTestFlush(decoder, mSurface, mMime, mInpPrefix + mTestFile));
         }
diff --git a/tests/media/src/android/mediav2/cts/CodecDecoderTest.java b/tests/media/src/android/mediav2/cts/CodecDecoderTest.java
index 30ddd29..44561f3 100644
--- a/tests/media/src/android/mediav2/cts/CodecDecoderTest.java
+++ b/tests/media/src/android/mediav2/cts/CodecDecoderTest.java
@@ -41,10 +41,9 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -60,17 +59,20 @@
 @RunWith(Parameterized.class)
 public class CodecDecoderTest extends CodecDecoderTestBase {
     private static final String LOG_TAG = CodecDecoderTest.class.getSimpleName();
+    private static final float RMS_ERROR_TOLERANCE = 1.05f;        // 5%
 
     private final String mRefFile;
     private final String mReconfigFile;
     private final float mRmsError;
+    private final long mRefCRC;
 
     public CodecDecoderTest(String mime, String testFile, String refFile, String reconfigFile,
-            float rmsError) {
+            float rmsError, long refCRC) {
         super(mime, testFile);
         mRefFile = refFile;
         mReconfigFile = reconfigFile;
         mRmsError = rmsError;
+        mRefCRC = refCRC;
     }
 
     private short[] setUpAudioReference() throws IOException {
@@ -125,104 +127,85 @@
 
     @Parameterized.Parameters(name = "{index}({0})")
     public static Collection<Object[]> input() {
-        Set<String> list = new HashSet<>();
-        if (hasAudioOutput()) {
-            // sec 5.1.2
-            list.add(MediaFormat.MIMETYPE_AUDIO_AAC);
-            list.add(MediaFormat.MIMETYPE_AUDIO_FLAC);
-            list.add(MediaFormat.MIMETYPE_AUDIO_MPEG);
-            list.add(MediaFormat.MIMETYPE_AUDIO_VORBIS);
-            list.add(MediaFormat.MIMETYPE_AUDIO_RAW);
-            list.add(MediaFormat.MIMETYPE_AUDIO_OPUS);
-        }
-        if (isHandheld() || isTv() || isAutomotive()) {
-            // sec 2.2.2, 2.3.2, 2.5.2
-            list.add(MediaFormat.MIMETYPE_AUDIO_AAC);
-            list.add(MediaFormat.MIMETYPE_VIDEO_AVC);
-            list.add(MediaFormat.MIMETYPE_VIDEO_MPEG4);
-            list.add(MediaFormat.MIMETYPE_VIDEO_H263);
-            list.add(MediaFormat.MIMETYPE_VIDEO_VP8);
-            list.add(MediaFormat.MIMETYPE_VIDEO_VP9);
-        }
-        if (isHandheld()) {
-            // sec 2.2.2
-            list.add(MediaFormat.MIMETYPE_AUDIO_AMR_NB);
-            list.add(MediaFormat.MIMETYPE_AUDIO_AMR_WB);
-            list.add(MediaFormat.MIMETYPE_VIDEO_HEVC);
-        }
-        if (isTv()) {
-            // sec 2.3.2
-            list.add(MediaFormat.MIMETYPE_VIDEO_HEVC);
-            list.add(MediaFormat.MIMETYPE_VIDEO_MPEG2);
-        }
-        ArrayList<String> cddRequiredMimeList = new ArrayList<>(list);
+        final boolean isEncoder = false;
+        final boolean needAudio = true;
+        final boolean needVideo = true;
+        // mime, testClip, referenceClip, reconfigureTestClip, refRmsError, refCRC32
         final List<Object[]> exhaustiveArgsList = Arrays.asList(new Object[][]{
                 {MediaFormat.MIMETYPE_AUDIO_MPEG, "bbb_1ch_8kHz_lame_cbr.mp3",
-                        "bbb_1ch_8kHz_s16le.raw", "bbb_2ch_44kHz_lame_vbr.mp3",
-                        91.022f * 1.05f},
+                        "bbb_1ch_8kHz_s16le.raw", "bbb_2ch_44kHz_lame_vbr.mp3", 91.022f, -1L},
                 {MediaFormat.MIMETYPE_AUDIO_MPEG, "bbb_1ch_16kHz_lame_vbr.mp3",
-                        "bbb_1ch_16kHz_s16le.raw", "bbb_2ch_44kHz_lame_vbr.mp3",
-                        119.256f * 1.05f},
+                        "bbb_1ch_16kHz_s16le.raw", "bbb_2ch_44kHz_lame_vbr.mp3", 119.256f, -1L},
                 {MediaFormat.MIMETYPE_AUDIO_MPEG, "bbb_2ch_44kHz_lame_cbr.mp3",
-                        "bbb_2ch_44kHz_s16le.raw", "bbb_1ch_16kHz_lame_vbr.mp3",
-                        103.60f * 1.05f},
+                        "bbb_2ch_44kHz_s16le.raw", "bbb_1ch_16kHz_lame_vbr.mp3", 103.60f, -1L},
                 {MediaFormat.MIMETYPE_AUDIO_MPEG, "bbb_2ch_44kHz_lame_vbr.mp3",
-                        "bbb_2ch_44kHz_s16le.raw", "bbb_1ch_8kHz_lame_cbr.mp3",
-                        53.066f * 1.05f},
+                        "bbb_2ch_44kHz_s16le.raw", "bbb_1ch_8kHz_lame_cbr.mp3", 53.066f, -1L},
+                {MediaFormat.MIMETYPE_AUDIO_MPEG, "bbb_2ch_44kHz_lame_crc.mp3",
+                        "bbb_2ch_44kHz_s16le.raw", "bbb_1ch_16kHz_lame_vbr.mp3", 104.09f, -1L},
                 {MediaFormat.MIMETYPE_AUDIO_AMR_WB, "bbb_1ch_16kHz_16kbps_amrwb.3gp",
-                        "bbb_1ch_16kHz_s16le.raw", "bbb_1ch_16kHz_23kbps_amrwb.3gp",
-                        2393.598f * 1.05f},
+                        "bbb_1ch_16kHz_s16le.raw", "bbb_1ch_16kHz_23kbps_amrwb.3gp", 2393.598f,
+                        -1L},
                 {MediaFormat.MIMETYPE_AUDIO_AMR_NB, "bbb_1ch_8kHz_10kbps_amrnb.3gp",
-                        "bbb_1ch_8kHz_s16le.raw", "bbb_1ch_8kHz_8kbps_amrnb.3gp", -1.0f},
+                        "bbb_1ch_8kHz_s16le.raw", "bbb_1ch_8kHz_8kbps_amrnb.3gp", -1.0f, -1L},
                 {MediaFormat.MIMETYPE_AUDIO_FLAC, "bbb_1ch_16kHz_flac.mka",
-                        "bbb_1ch_16kHz_s16le.raw", "bbb_2ch_44kHz_flac.mka", 0.0f},
+                        "bbb_1ch_16kHz_s16le.raw", "bbb_2ch_44kHz_flac.mka", 0.0f, -1L},
                 {MediaFormat.MIMETYPE_AUDIO_FLAC, "bbb_2ch_44kHz_flac.mka",
-                        "bbb_2ch_44kHz_s16le.raw", "bbb_1ch_16kHz_flac.mka", 0.0f},
+                        "bbb_2ch_44kHz_s16le.raw", "bbb_1ch_16kHz_flac.mka", 0.0f, -1L},
                 {MediaFormat.MIMETYPE_AUDIO_RAW, "bbb_1ch_16kHz.wav", "bbb_1ch_16kHz_s16le.raw",
-                        "bbb_2ch_44kHz.wav", 0.0f},
+                        "bbb_2ch_44kHz.wav", 0.0f, -1L},
                 {MediaFormat.MIMETYPE_AUDIO_RAW, "bbb_2ch_44kHz.wav", "bbb_2ch_44kHz_s16le.raw",
-                        "bbb_1ch_16kHz.wav", 0.0f},
+                        "bbb_1ch_16kHz.wav", 0.0f, -1L},
                 {MediaFormat.MIMETYPE_AUDIO_G711_ALAW, "bbb_1ch_8kHz_alaw.wav",
-                        "bbb_1ch_8kHz_s16le.raw", "bbb_2ch_8kHz_alaw.wav", 23.08678f * 1.05f},
+                        "bbb_1ch_8kHz_s16le.raw", "bbb_2ch_8kHz_alaw.wav", 23.08678f, -1L},
                 {MediaFormat.MIMETYPE_AUDIO_G711_MLAW, "bbb_1ch_8kHz_mulaw.wav",
-                        "bbb_1ch_8kHz_s16le.raw", "bbb_2ch_8kHz_mulaw.wav", 24.4131f * 1.05f},
+                        "bbb_1ch_8kHz_s16le.raw", "bbb_2ch_8kHz_mulaw.wav", 24.4131f, -1L},
                 {MediaFormat.MIMETYPE_AUDIO_MSGSM, "bbb_1ch_8kHz_gsm.wav",
-                        "bbb_1ch_8kHz_s16le.raw", "bbb_1ch_8kHz_gsm.wav", 946.02698f * 1.05f},
+                        "bbb_1ch_8kHz_s16le.raw", "bbb_1ch_8kHz_gsm.wav", 946.02698f, -1L},
                 {MediaFormat.MIMETYPE_AUDIO_VORBIS, "bbb_1ch_16kHz_vorbis.mka",
-                        "bbb_1ch_8kHz_s16le.raw", "bbb_2ch_44kHz_vorbis.mka", -1.0f},
+                        "bbb_1ch_8kHz_s16le.raw", "bbb_2ch_44kHz_vorbis.mka", -1.0f, -1L},
                 {MediaFormat.MIMETYPE_AUDIO_OPUS, "bbb_2ch_48kHz_opus.mka",
-                        "bbb_2ch_48kHz_s16le.raw", "bbb_1ch_48kHz_opus.mka", -1.0f},
+                        "bbb_2ch_48kHz_s16le.raw", "bbb_1ch_48kHz_opus.mka", -1.0f, -1L},
                 {MediaFormat.MIMETYPE_AUDIO_AAC, "bbb_1ch_16kHz_aac.mp4",
-                        "bbb_1ch_8kHz_s16le.raw", "bbb_2ch_44kHz_aac.mp4", -1.0f},
+                        "bbb_1ch_16kHz_s16le.raw", "bbb_2ch_44kHz_aac.mp4", -1.0f, -1L},
                 {MediaFormat.MIMETYPE_VIDEO_MPEG2, "bbb_340x280_768kbps_30fps_mpeg2.mp4", null,
-                        "bbb_520x390_1mbps_30fps_mpeg2.mp4", -1.0f},
+                        "bbb_520x390_1mbps_30fps_mpeg2.mp4", -1.0f, -1L},
                 {MediaFormat.MIMETYPE_VIDEO_MPEG2,
                         "bbb_512x288_30fps_1mbps_mpeg2_interlaced_nob_2fields.mp4", null,
-                        "bbb_520x390_1mbps_30fps_mpeg2.mp4", -1.0f},
+                        "bbb_520x390_1mbps_30fps_mpeg2.mp4", -1.0f, -1L},
                 {MediaFormat.MIMETYPE_VIDEO_MPEG2,
                         "bbb_512x288_30fps_1mbps_mpeg2_interlaced_nob_1field.ts", null,
-                        "bbb_520x390_1mbps_30fps_mpeg2.mp4", -1.0f},
+                        "bbb_520x390_1mbps_30fps_mpeg2.mp4", -1.0f, -1L},
                 {MediaFormat.MIMETYPE_VIDEO_AVC, "bbb_340x280_768kbps_30fps_avc.mp4", null,
-                        "bbb_520x390_1mbps_30fps_avc.mp4", -1.0f},
+                        "bbb_520x390_1mbps_30fps_avc.mp4", -1.0f, 1746312400L},
+                /* TODO(b/163299340) */
+//                {MediaFormat.MIMETYPE_VIDEO_AVC, "bbb_504x224_768kbps_30fps_avc.mp4", null,
+//                        "bbb_520x390_1mbps_30fps_avc.mp4", -1.0f, 4060874918L},
                 {MediaFormat.MIMETYPE_VIDEO_HEVC, "bbb_520x390_1mbps_30fps_hevc.mp4", null,
-                        "bbb_340x280_768kbps_30fps_hevc.mp4", -1.0f},
+                        "bbb_340x280_768kbps_30fps_hevc.mp4", -1.0f, 3061322606L},
+                /* TODO(b/163299340) */
+//                {MediaFormat.MIMETYPE_VIDEO_HEVC, "bbb_560x280_1mbps_30fps_hevc.mkv", null,
+//                        "bbb_340x280_768kbps_30fps_hevc.mp4", -1.0f, 26298353L},
                 {MediaFormat.MIMETYPE_VIDEO_MPEG4, "bbb_128x96_64kbps_12fps_mpeg4.mp4",
-                        null, "bbb_176x144_192kbps_15fps_mpeg4.mp4", -1.0f},
+                        null, "bbb_176x144_192kbps_15fps_mpeg4.mp4", -1.0f, -1L},
                 {MediaFormat.MIMETYPE_VIDEO_H263, "bbb_176x144_128kbps_15fps_h263.3gp",
-                        null, "bbb_176x144_192kbps_10fps_h263.3gp", -1.0f},
+                        null, "bbb_176x144_192kbps_10fps_h263.3gp", -1.0f, -1L},
                 {MediaFormat.MIMETYPE_VIDEO_VP8, "bbb_340x280_768kbps_30fps_vp8.webm", null,
-                        "bbb_520x390_1mbps_30fps_vp8.webm", -1.0f},
+                        "bbb_520x390_1mbps_30fps_vp8.webm", -1.0f, 2030620796L},
                 {MediaFormat.MIMETYPE_VIDEO_VP9, "bbb_340x280_768kbps_30fps_vp9.webm", null,
-                        "bbb_520x390_1mbps_30fps_vp9.webm", -1.0f},
+                        "bbb_520x390_1mbps_30fps_vp9.webm", -1.0f, 4122701060L},
                 {MediaFormat.MIMETYPE_VIDEO_VP9,
                         "bbb_340x280_768kbps_30fps_split_non_display_frame_vp9.webm", null,
-                        "bbb_520x390_1mbps_30fps_split_non_display_frame_vp9.webm", -1.0f},
+                        "bbb_520x390_1mbps_30fps_split_non_display_frame_vp9.webm", -1.0f,
+                        4122701060L},
                 {MediaFormat.MIMETYPE_VIDEO_AV1, "bbb_340x280_768kbps_30fps_av1.mp4", null,
-                        "bbb_520x390_1mbps_30fps_av1.mp4", -1.0f},
+                        "bbb_520x390_1mbps_30fps_av1.mp4", -1.0f, 400672933L},
         });
-        return prepareParamList(cddRequiredMimeList, exhaustiveArgsList, false);
+        return prepareParamList(exhaustiveArgsList, isEncoder, needAudio, needVideo, true);
     }
 
+    private native boolean nativeTestSimpleDecode(String decoder, Surface surface, String mime,
+            String testFile, String refFile, float rmsError, long checksum);
+
     /**
      * Tests decoder for combinations:
      * 1. Codec Sync Mode, Signal Eos with Last frame
@@ -306,32 +289,26 @@
                 }
             }
             mCodec.release();
-            if (mSaveToMem && mRefFile != null && mRmsError >= 0) {
-                short[] refData = setUpAudioReference();
-                assertTrue(String.format("%s rms error too high", mTestFile),
-                        ref.getRmsError(refData) <= mRmsError);
+            if (mSaveToMem) {
+                if (mRmsError >= 0) {
+                    assertTrue(mRefFile != null);
+                    short[] refData = setUpAudioReference();
+                    float currError = ref.getRmsError(refData);
+                    float errMargin = mRmsError * RMS_ERROR_TOLERANCE;
+                    assertTrue(String.format("%s rms error too high exp/got %f/%f", mTestFile,
+                            errMargin, currError), currError <= errMargin);
+                } else if (mRefCRC >= 0) {
+                    assertEquals(String.format("%s checksum mismatch", mTestFile), mRefCRC,
+                            ref.getCheckSumImage());
+                }
             }
+            assertTrue(nativeTestSimpleDecode(decoder, null, mMime, mInpPrefix + mTestFile,
+                    mInpPrefix + mRefFile, mRmsError * RMS_ERROR_TOLERANCE,
+                    ref.getCheckSumBuffer()));
         }
         mExtractor.release();
     }
 
-    private native boolean nativeTestSimpleDecode(String decoder, Surface surface, String mime,
-            String testFile, String refFile, float rmsError);
-
-
-    @LargeTest
-    @Test(timeout = PER_TEST_TIMEOUT_LARGE_TEST_MS)
-    public void testSimpleDecodeNative() {
-        ArrayList<String> listOfDecoders = selectCodecs(mMime, null, null, false);
-        if (listOfDecoders.isEmpty()) {
-            fail("no suitable codecs found for mime: " + mMime);
-        }
-        for (String decoder : listOfDecoders) {
-            assertTrue(nativeTestSimpleDecode(decoder, null, mMime, mInpPrefix + mTestFile,
-                    mInpPrefix + mRefFile, mRmsError));
-        }
-    }
-
     /**
      * Tests flush when codec is in sync and async mode. In these scenarios, Timestamp
      * ordering is verified. The output has to be consistent (not flaky) in all runs
diff --git a/tests/media/src/android/mediav2/cts/CodecEncoderSurfaceTest.java b/tests/media/src/android/mediav2/cts/CodecEncoderSurfaceTest.java
index f2501c0..7a9fde1 100644
--- a/tests/media/src/android/mediav2/cts/CodecEncoderSurfaceTest.java
+++ b/tests/media/src/android/mediav2/cts/CodecEncoderSurfaceTest.java
@@ -22,7 +22,6 @@
 import android.media.MediaExtractor;
 import android.media.MediaFormat;
 import android.media.MediaMuxer;
-import android.os.Build;
 import android.util.Log;
 import android.util.Pair;
 import android.view.Surface;
@@ -38,9 +37,9 @@
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
-import java.util.Map;
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -99,13 +98,10 @@
 
     @Parameterized.Parameters(name = "{index}({0})")
     public static Collection<Object[]> input() {
-        ArrayList<String> cddRequiredMimeList = new ArrayList<>();
-        if (CodecTestBase.isHandheld() || CodecTestBase.isTv() || CodecTestBase.isAutomotive()) {
-            // sec 2.2.2, 2.3.2, 2.5.2
-            cddRequiredMimeList.add(MediaFormat.MIMETYPE_VIDEO_AVC);
-            cddRequiredMimeList.add(MediaFormat.MIMETYPE_VIDEO_VP8);
-        }
-        final Object[][] exhaustiveArgsList = new Object[][]{
+        final boolean isEncoder = true;
+        final boolean needAudio = false;
+        final boolean needVideo = true;
+        final List<Object[]> exhaustiveArgsList = Arrays.asList(new Object[][]{
                 // Video - CodecMime, test file, bit rate, frame rate
                 {MediaFormat.MIMETYPE_VIDEO_H263, "bbb_176x144_128kbps_15fps_h263.3gp", 128000, 15},
                 {MediaFormat.MIMETYPE_VIDEO_MPEG4, "bbb_128x96_64kbps_12fps_mpeg4.mp4", 64000, 12},
@@ -114,60 +110,9 @@
                 {MediaFormat.MIMETYPE_VIDEO_VP8, "bbb_cif_768kbps_30fps_avc.mp4", 512000, 30},
                 {MediaFormat.MIMETYPE_VIDEO_VP9, "bbb_cif_768kbps_30fps_avc.mp4", 512000, 30},
                 {MediaFormat.MIMETYPE_VIDEO_AV1, "bbb_cif_768kbps_30fps_avc.mp4", 512000, 30},
-        };
-        ArrayList<String> mimes = new ArrayList<>();
-        if (CodecTestBase.codecSelKeys.contains(CodecTestBase.CODEC_SEL_VALUE)) {
-            MediaCodecList codecList = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
-            MediaCodecInfo[] codecInfos = codecList.getCodecInfos();
-            for (MediaCodecInfo codecInfo : codecInfos) {
-                if (!codecInfo.isEncoder()) continue;
-                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && codecInfo.isAlias()) continue;
-                String[] types = codecInfo.getSupportedTypes();
-                for (String type : types) {
-                    if (!mimes.contains(type) && type.startsWith("video/")) {
-                        mimes.add(type);
-                    }
-                }
-            }
-            // TODO(b/154423708): add checks for video o/p port and display length >= 2.5"
-            /* sec 5.2: device implementations include an embedded screen display with the diagonal
-            length of at least 2.5inches or include a video output port or declare the support of a
-            camera */
-            if (CodecTestBase.hasCamera() && !mimes.contains(MediaFormat.MIMETYPE_VIDEO_AVC) &&
-                    !mimes.contains(MediaFormat.MIMETYPE_VIDEO_VP8)) {
-                fail("device must support at least one of VP8 or AVC video encoders");
-            }
-            for (String mime : cddRequiredMimeList) {
-                if (!mimes.contains(mime)) {
-                    fail("no codec found for mime " + mime + " as required by cdd");
-                }
-            }
-        } else {
-            for (Map.Entry<String, String> entry : CodecTestBase.codecSelKeyMimeMap.entrySet()) {
-                String key = entry.getKey();
-                String value = entry.getValue();
-                if (CodecTestBase.codecSelKeys.contains(key) && !mimes.contains(value)) {
-                    mimes.add(value);
-                }
-            }
-        }
-        final List<Object[]> argsList = new ArrayList<>();
-        for (String mime : mimes) {
-            boolean miss = true;
-            for (Object[] arg : exhaustiveArgsList) {
-                if (mime.equals(arg[0])) {
-                    argsList.add(arg);
-                    miss = false;
-                }
-            }
-            if (miss) {
-                if (cddRequiredMimeList.contains(mime)) {
-                    fail("no test vectors for required mimetype " + mime);
-                }
-                Log.w(LOG_TAG, "no test vectors available for optional mime type " + mime);
-            }
-        }
-        return argsList;
+        });
+        return CodecTestBase.prepareParamList(exhaustiveArgsList, isEncoder, needAudio, needVideo,
+                true);
     }
 
     private boolean hasSeenError() {
diff --git a/tests/media/src/android/mediav2/cts/CodecEncoderTest.java b/tests/media/src/android/mediav2/cts/CodecEncoderTest.java
index 2d9da22..0d5f49c 100644
--- a/tests/media/src/android/mediav2/cts/CodecEncoderTest.java
+++ b/tests/media/src/android/mediav2/cts/CodecEncoderTest.java
@@ -32,12 +32,11 @@
 import org.junit.runners.Parameterized;
 
 import java.io.IOException;
+import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -61,6 +60,7 @@
     private ArrayList<MediaFormat> mFormats;
     private int mNumSyncFramesReceived;
     private ArrayList<Integer> mSyncFramesPos;
+    ArrayList<MediaCodec.BufferInfo> mInfoList;
 
     public CodecEncoderTest(String mime, int[] bitrates, int[] encoderInfo1, int[] encoderInfo2) {
         super(mime);
@@ -69,6 +69,7 @@
         mEncParamList2 = encoderInfo2;
         mFormats = new ArrayList<>();
         mSyncFramesPos = new ArrayList<>();
+        mInfoList = new ArrayList<>();
     }
 
     @Override
@@ -90,6 +91,12 @@
             mNumSyncFramesReceived += 1;
             mSyncFramesPos.add(mOutputCount);
         }
+        if (mSaveToMem && info.size > 0) {
+            MediaCodec.BufferInfo copy = new MediaCodec.BufferInfo();
+            copy.set(mOutputBuff.getOutStreamSize(), info.size, info.presentationTimeUs,
+                    info.flags);
+            mInfoList.add(copy);
+        }
         super.dequeueOutput(bufferIndex, info);
     }
 
@@ -159,26 +166,9 @@
 
     @Parameterized.Parameters(name = "{index}({0})")
     public static Collection<Object[]> input() {
-        Set<String> list = new HashSet<>();
-        if (hasMicrophone()) {
-            // sec 5.1.1
-            // TODO(b/154423550)
-            // list.add(MediaFormat.MIMETYPE_AUDIO_RAW);
-            list.add(MediaFormat.MIMETYPE_AUDIO_FLAC);
-            list.add(MediaFormat.MIMETYPE_AUDIO_OPUS);
-        }
-        if (isHandheld() || isTv() || isAutomotive()) {
-            // sec 2.2.2, 2.3.2, 2.5.2
-            list.add(MediaFormat.MIMETYPE_AUDIO_AAC);
-            list.add(MediaFormat.MIMETYPE_VIDEO_AVC);
-            list.add(MediaFormat.MIMETYPE_VIDEO_VP8);
-        }
-        if (isHandheld()) {
-            // sec 2.2.2
-            list.add(MediaFormat.MIMETYPE_AUDIO_AMR_NB);
-            list.add(MediaFormat.MIMETYPE_AUDIO_AMR_WB);
-        }
-        ArrayList<String> cddRequiredMimeList = new ArrayList<>(list);
+        final boolean isEncoder = true;
+        final boolean needAudio = true;
+        final boolean needVideo = true;
         final List<Object[]> exhaustiveArgsList = Arrays.asList(new Object[][]{
                 // Audio - CodecMime, arrays of bit-rates, sample rates, channel counts
                 {MediaFormat.MIMETYPE_AUDIO_AAC, new int[]{64000, 128000}, new int[]{8000, 11025,
@@ -189,8 +179,9 @@
                         10200, 12200}, new int[]{8000}, new int[]{1}},
                 {MediaFormat.MIMETYPE_AUDIO_AMR_WB, new int[]{6600, 8850, 12650, 14250, 15850,
                         18250, 19850, 23050, 23850}, new int[]{16000}, new int[]{1}},
-                {MediaFormat.MIMETYPE_AUDIO_FLAC, new int[]{64000, 192000}, new int[]{8000, 48000
-                        , 96000, 192000}, new int[]{1, 2}},
+                /* TODO(169310292) */
+                {MediaFormat.MIMETYPE_AUDIO_FLAC, new int[]{/* 0, 1, 2, */ 3, 4, 5, 6, 7, 8},
+                        new int[]{8000, 48000, 96000, 192000}, new int[]{1, 2}},
 
                 // Video - CodecMime, arrays of bit-rates, height, width
                 {MediaFormat.MIMETYPE_VIDEO_H263, new int[]{32000, 64000}, new int[]{176},
@@ -208,7 +199,25 @@
                 {MediaFormat.MIMETYPE_VIDEO_AV1, new int[]{256000, 512000}, new int[]{176, 352,
                         352, 480}, new int[]{144, 240, 288, 360}},
         });
-        return prepareParamList(cddRequiredMimeList, exhaustiveArgsList, true);
+        return prepareParamList(exhaustiveArgsList, isEncoder, needAudio, needVideo, true);
+    }
+
+    private ByteBuffer decodeElementaryStream(String decoder, MediaFormat format,
+            ByteBuffer elementaryStream, ArrayList<MediaCodec.BufferInfo> infos)
+            throws IOException, InterruptedException {
+        String mime = format.getString(MediaFormat.KEY_MIME);
+        CodecDecoderTestBase cdtb = new CodecDecoderTestBase(mime, null);
+        cdtb.mOutputBuff = new OutputManager();
+        cdtb.mSaveToMem = true;
+        cdtb.mCodec = MediaCodec.createByCodecName(decoder);
+        cdtb.mCodec.configure(format, null, null, 0);
+        cdtb.mCodec.start();
+        cdtb.doWork(elementaryStream, infos);
+        cdtb.queueEOS();
+        cdtb.waitForAllOutputs();
+        cdtb.mCodec.stop();
+        cdtb.mCodec.release();
+        return cdtb.mOutputBuff.getBuffer();
     }
 
     private void setUpParams(int limit) {
@@ -219,7 +228,11 @@
                     for (int channels : mEncParamList2) {
                         MediaFormat format = new MediaFormat();
                         format.setString(MediaFormat.KEY_MIME, mMime);
-                        format.setInteger(MediaFormat.KEY_BIT_RATE, bitrate);
+                        if (mMime.equals(MediaFormat.MIMETYPE_AUDIO_FLAC)) {
+                            format.setInteger(MediaFormat.KEY_FLAC_COMPRESSION_LEVEL, bitrate);
+                        } else {
+                            format.setInteger(MediaFormat.KEY_BIT_RATE, bitrate);
+                        }
                         format.setInteger(MediaFormat.KEY_SAMPLE_RATE, rate);
                         format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, channels);
                         mFormats.add(format);
@@ -332,6 +345,77 @@
         }
     }
 
+    private boolean isCodecLossless(String mime) {
+        return mime.equals(MediaFormat.MIMETYPE_AUDIO_FLAC) ||
+                mime.equals(MediaFormat.MIMETYPE_AUDIO_RAW);
+    }
+
+    /**
+     * Identity test for encoder
+     */
+    @LargeTest
+    @Test(timeout = PER_TEST_TIMEOUT_LARGE_TEST_MS)
+    public void testLosslessEncodeDecode() throws IOException, InterruptedException {
+        Assume.assumeTrue(isCodecLossless(mMime));
+        setUpParams(Integer.MAX_VALUE);
+        ArrayList<String> listOfEncoders = selectCodecs(mMime, null, null, true);
+        assertFalse("no suitable codecs found for mime: " + mMime, listOfEncoders.isEmpty());
+        setUpSource(mInputFile);
+        mOutputBuff = new OutputManager();
+        for (String encoder : listOfEncoders) {
+            mCodec = MediaCodec.createByCodecName(encoder);
+            mSaveToMem = true;
+            for (MediaFormat format : mFormats) {
+                if (mIsAudio) {
+                    mSampleRate = format.getInteger(MediaFormat.KEY_SAMPLE_RATE);
+                    mChannels = format.getInteger(MediaFormat.KEY_CHANNEL_COUNT);
+                } else {
+                    mWidth = format.getInteger(MediaFormat.KEY_WIDTH);
+                    mHeight = format.getInteger(MediaFormat.KEY_HEIGHT);
+                }
+                String log = String.format("format: %s \n codec: %s, file: %s :: ", format, encoder,
+                        mInputFile);
+                mOutputBuff.reset();
+                mInfoList.clear();
+                configureCodec(format, true, true, true);
+                mCodec.start();
+                doWork(Integer.MAX_VALUE);
+                queueEOS();
+                waitForAllOutputs();
+                /* TODO(b/147348711) */
+                if (false) mCodec.stop();
+                else mCodec.reset();
+                assertTrue(log + "unexpected error", !mAsyncHandle.hasSeenError());
+                assertTrue(log + "no input sent", 0 != mInputCount);
+                assertTrue(log + "no output received", 0 != mOutputCount);
+                if (!mIsAudio) {
+                    assertTrue(
+                            log + "input count != output count, act/exp: " + mOutputCount +
+                                    " / " + mInputCount, mInputCount == mOutputCount);
+                }
+                if (mIsAudio) {
+                    assertTrue(log + " pts is not strictly increasing",
+                            mOutputBuff.isPtsStrictlyIncreasing(mPrevOutputPts));
+                } else {
+                    assertTrue(
+                            log + " input pts list and output pts list are not identical",
+                            mOutputBuff.isOutPtsListIdenticalToInpPtsList((mMaxBFrames != 0)));
+                }
+                ArrayList<String> listOfDecoders = selectCodecs(mMime, null, null, false);
+                assertFalse("no suitable codecs found for mime: " + mMime,
+                        listOfDecoders.isEmpty());
+                for (String decoder : listOfDecoders) {
+                    ByteBuffer out = decodeElementaryStream(decoder, format,
+                            mOutputBuff.getBuffer(), mInfoList);
+                    if (!out.equals(ByteBuffer.wrap(mInputData))) {
+                        fail(log + "identity test failed");
+                    }
+                }
+            }
+            mCodec.release();
+        }
+    }
+
     private native boolean nativeTestSimpleEncode(String encoder, String file, String mime,
             int[] list0, int[] list1, int[] list2, int colorFormat);
 
diff --git a/tests/media/src/android/mediav2/cts/CodecListTest.java b/tests/media/src/android/mediav2/cts/CodecListTest.java
new file mode 100644
index 0000000..4c6abaa
--- /dev/null
+++ b/tests/media/src/android/mediav2/cts/CodecListTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2020 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.mediav2.cts;
+
+import android.media.MediaFormat;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+
+import static org.junit.Assert.assertTrue;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class CodecListTest {
+
+    /**
+     * Tests if the device under test has support for required components as guided by CDD.
+     * The test only checks for the components availability. It doesn't check if the component
+     * adheres to additional requirements (support for min profile/level, ...) set by cdd.
+     */
+    @Test
+    public void testCddRequiredCodecsAvailability() {
+        final boolean needAudio = true;
+        final boolean needVideo = true;
+        boolean[] modes = {true, false};
+        for (boolean isEncoder : modes) {
+            ArrayList<String> cddRequiredMimeList =
+                    CodecTestBase.prepareRequiredArgsList(isEncoder, needAudio, needVideo);
+            for (String mime : cddRequiredMimeList) {
+                String log = String.format("no %s found for mime %s as required by cdd ",
+                        isEncoder ? "encoder" : "decoder", mime);
+                assertTrue(log, isEncoder ? CodecTestBase.hasEncoder(mime) :
+                                        CodecTestBase.hasDecoder(mime));
+            }
+        }
+        if (CodecTestBase.hasCamera()) {
+            assertTrue("device doesn't support either VP8 or AVC video encoders",
+                    CodecTestBase.hasEncoder(MediaFormat.MIMETYPE_VIDEO_AVC) ||
+                            CodecTestBase.hasEncoder(MediaFormat.MIMETYPE_VIDEO_VP8));
+        }
+    }
+}
+
diff --git a/tests/media/src/android/mediav2/cts/CodecTestActivity.java b/tests/media/src/android/mediav2/cts/CodecTestActivity.java
index 18099dd..fb20f2c 100644
--- a/tests/media/src/android/mediav2/cts/CodecTestActivity.java
+++ b/tests/media/src/android/mediav2/cts/CodecTestActivity.java
@@ -18,21 +18,92 @@
 
 import android.app.Activity;
 import android.os.Bundle;
-import android.view.WindowManager;
+import android.os.SystemClock;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.Surface;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+import android.view.ViewGroup;
 
-public class CodecTestActivity extends Activity {
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+public class CodecTestActivity extends Activity implements SurfaceHolder.Callback {
+    private static final String LOG_TAG = CodecTestActivity.class.getSimpleName();
+    private SurfaceView mSurfaceView;
+    private SurfaceHolder mHolder;
+    private Surface mSurface;
+    private final Lock mLock = new ReentrantLock();
+    private final Condition mCondition = mLock.newCondition();
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.media_decoder_surface_layout);
+        mSurfaceView = findViewById(R.id.surface);
+        mHolder = mSurfaceView.getHolder();
+        mHolder.addCallback(this);
     }
 
     @Override
-    protected void onResume() {
-        setTurnScreenOn(true);
-        setShowWhenLocked(true);
-        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-        super.onResume();
+    public void surfaceCreated(SurfaceHolder holder) {
+        Log.v(LOG_TAG, "surface created");
+        mLock.lock();
+        mSurface = mHolder.getSurface();
+        mLock.unlock();
+    }
+
+    @Override
+    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+        Log.v(LOG_TAG, "surface changed " + format + " " + width + " " + height);
+    }
+
+    @Override
+    public void surfaceDestroyed(SurfaceHolder holder) {
+        Log.v(LOG_TAG, "surface deleted");
+        mLock.lock();
+        mSurface = null;
+        mLock.unlock();
+    }
+
+    public void waitTillSurfaceIsCreated() throws InterruptedException {
+        final long mWaitTimeMs = 1000;
+        final int retries = 3;
+        mLock.lock();
+        final long start = SystemClock.elapsedRealtime();
+        while ((SystemClock.elapsedRealtime() - start) < (retries * mWaitTimeMs) &&
+                mSurface == null) {
+            mCondition.await(mWaitTimeMs, TimeUnit.MILLISECONDS);
+        }
+        mLock.unlock();
+        if (mSurface == null) {
+            throw new InterruptedException("Taking too long to attach a SurfaceView to a window.");
+        }
+    }
+
+    public Surface getSurface() {
+        return mSurface;
+    }
+
+    public void setScreenParams(int width, int height, boolean noStretch) {
+        ViewGroup.LayoutParams lp = mSurfaceView.getLayoutParams();
+        final DisplayMetrics dm = getResources().getDisplayMetrics();
+        if (noStretch && width <= dm.widthPixels && height <= dm.heightPixels) {
+            lp.width = width;
+            lp.height = height;
+        } else {
+            int a = dm.widthPixels * height / width;
+            if (a <= dm.heightPixels) {
+                lp.width = dm.widthPixels;
+                lp.height = a;
+            } else {
+                lp.width = dm.heightPixels * width / height;
+                lp.height = dm.heightPixels;
+            }
+        }
+        runOnUiThread(() -> mSurfaceView.setLayoutParams(lp));
     }
 }
diff --git a/tests/media/src/android/mediav2/cts/CodecTestBase.java b/tests/media/src/android/mediav2/cts/CodecTestBase.java
index a47ede1..1350d6f 100644
--- a/tests/media/src/android/mediav2/cts/CodecTestBase.java
+++ b/tests/media/src/android/mediav2/cts/CodecTestBase.java
@@ -18,6 +18,7 @@
 
 import android.content.pm.PackageManager;
 import android.graphics.ImageFormat;
+import android.graphics.Rect;
 import android.media.Image;
 import android.media.MediaCodec;
 import android.media.MediaCodecInfo;
@@ -44,14 +45,17 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.zip.CRC32;
 
+import static android.media.MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface;
 import static android.media.MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -206,14 +210,16 @@
     private static final String LOG_TAG = OutputManager.class.getSimpleName();
     private byte[] memory;
     private int memIndex;
-    private ArrayList<Long> crc32List;
+    private CRC32 mCrc32UsingImage;
+    private CRC32 mCrc32UsingBuffer;
     private ArrayList<Long> inpPtsList;
     private ArrayList<Long> outPtsList;
 
     OutputManager() {
         memory = new byte[1024];
         memIndex = 0;
-        crc32List = new ArrayList<>();
+        mCrc32UsingImage = new CRC32();
+        mCrc32UsingBuffer = new CRC32();
         inpPtsList = new ArrayList<>();
         outPtsList = new ArrayList<>();
     }
@@ -280,9 +286,8 @@
         int cap = buf.capacity();
         assertTrue("checksum() params are invalid: size = " + size + " cap = " + cap,
                 size > 0 && size <= cap);
-        CRC32 crc = new CRC32();
         if (buf.hasArray()) {
-            crc.update(buf.array(), buf.position() + buf.arrayOffset(), size);
+            mCrc32UsingBuffer.update(buf.array(), buf.position() + buf.arrayOffset(), size);
         } else {
             int pos = buf.position();
             final int rdsize = Math.min(4096, size);
@@ -291,43 +296,49 @@
             for (int i = 0; i < size; i += chk) {
                 chk = Math.min(rdsize, size - i);
                 buf.get(bb, 0, chk);
-                crc.update(bb, 0, chk);
+                mCrc32UsingBuffer.update(bb, 0, chk);
             }
             buf.position(pos);
         }
-        crc32List.add(crc.getValue());
     }
 
     void checksum(Image image) {
         int format = image.getFormat();
-        if (format != ImageFormat.YUV_420_888) {
-            crc32List.add(-1L);
-            return;
-        }
-        CRC32 crc = new CRC32();
-        int imageWidth = image.getWidth();
-        int imageHeight = image.getHeight();
+        assertEquals("unexpected image format", ImageFormat.YUV_420_888, format);
+
+        Rect cropRect = image.getCropRect();
+        int imageWidth = cropRect.width();
+        int imageHeight = cropRect.height();
+        assertTrue("unexpected image dimensions", imageWidth > 0 && imageHeight > 0);
+
+        int imageLeft = cropRect.left;
+        int imageTop = cropRect.top;
         Image.Plane[] planes = image.getPlanes();
         for (int i = 0; i < planes.length; ++i) {
             ByteBuffer buf = planes[i].getBuffer();
-            int width, height, rowStride, pixelStride, x, y;
+            int width, height, rowStride, pixelStride, x, y, left, top;
             rowStride = planes[i].getRowStride();
             pixelStride = planes[i].getPixelStride();
             if (i == 0) {
                 width = imageWidth;
                 height = imageHeight;
+                left = imageLeft;
+                top = imageTop;
             } else {
                 width = imageWidth / 2;
                 height = imageHeight / 2;
+                left = imageLeft / 2;
+                top = imageTop / 2;
             }
+            int cropOffset = left + top * rowStride;
             // local contiguous pixel buffer
             byte[] bb = new byte[width * height];
             if (buf.hasArray()) {
                 byte[] b = buf.array();
-                int offs = buf.arrayOffset();
+                int offs = buf.arrayOffset() + cropOffset;
                 if (pixelStride == 1) {
                     for (y = 0; y < height; ++y) {
-                        System.arraycopy(bb, y * width, b, y * rowStride + offs, width);
+                        System.arraycopy(b, offs + y * rowStride, bb, y * width, width);
                     }
                 } else {
                     // do it pixel-by-pixel
@@ -339,7 +350,8 @@
                     }
                 }
             } else { // almost always ends up here due to direct buffers
-                int pos = buf.position();
+                int base = buf.position();
+                int pos = base + cropOffset;
                 if (pixelStride == 1) {
                     for (y = 0; y < height; ++y) {
                         buf.position(pos + y * rowStride);
@@ -358,11 +370,10 @@
                         }
                     }
                 }
-                buf.position(pos);
+                buf.position(base);
             }
-            crc.update(bb, 0, width * height);
+            mCrc32UsingImage.update(bb, 0, width * height);
         }
-        crc32List.add(crc.getValue());
     }
 
     void saveToMemory(ByteBuffer buf, MediaCodec.BufferInfo info) {
@@ -385,7 +396,8 @@
 
     void reset() {
         position(0);
-        crc32List.clear();
+        mCrc32UsingImage.reset();
+        mCrc32UsingBuffer.reset();
         inpPtsList.clear();
         outPtsList.clear();
     }
@@ -404,38 +416,60 @@
         return (float) Math.sqrt(avgErrorSquared);
     }
 
+    long getCheckSumImage() {
+        return mCrc32UsingImage.getValue();
+    }
+
+    long getCheckSumBuffer() {
+        return mCrc32UsingBuffer.getValue();
+    }
+
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
         OutputManager that = (OutputManager) o;
-        boolean isEqual = true;
-        if (!crc32List.equals(that.crc32List)) {
-            isEqual = false;
-            Log.e(LOG_TAG, "ref and test crc32 checksums mismatch");
-        }
+        // TODO: Timestamps for deinterlaced content are under review. (E.g. can decoders
+        // produce multiple progressive frames?) For now, do not verify timestamps.
+        boolean isEqual = this.equalsInterlaced(o);
         if (!outPtsList.equals(that.outPtsList)) {
             isEqual = false;
             Log.e(LOG_TAG, "ref and test presentation timestamp mismatch");
         }
-        if (memIndex == that.memIndex) {
-            int count = 0;
-            for (int i = 0; i < memIndex; i++) {
-                if (memory[i] != that.memory[i]) {
-                    count++;
-                    if (count < 20) {
-                        Log.d(LOG_TAG, "sample at offset " + i + " exp/got:: " + memory[i] + '/' +
-                                that.memory[i]);
+        return isEqual;
+    }
+
+    public boolean equalsInterlaced(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        OutputManager that = (OutputManager) o;
+        boolean isEqual = true;
+        if (mCrc32UsingImage.getValue() != that.mCrc32UsingImage.getValue()) {
+            isEqual = false;
+            Log.e(LOG_TAG, "ref and test crc32 checksums calculated using image mismatch " +
+                          mCrc32UsingImage.getValue() + '/' + that.mCrc32UsingImage.getValue());
+        }
+        if (mCrc32UsingBuffer.getValue() != that.mCrc32UsingBuffer.getValue()) {
+            isEqual = false;
+            Log.e(LOG_TAG, "ref and test crc32 checksums calculated using buffer mismatch " +
+                          mCrc32UsingBuffer.getValue() + '/' + that.mCrc32UsingBuffer.getValue());
+            if (memIndex == that.memIndex) {
+                int count = 0;
+                for (int i = 0; i < memIndex; i++) {
+                    if (memory[i] != that.memory[i]) {
+                        count++;
+                        if (count < 20) {
+                            Log.d(LOG_TAG, "sample at " + i + " exp/got:: " + memory[i] + '/' +
+                                    that.memory[i]);
+                        }
                     }
                 }
+                if (count != 0) {
+                    Log.e(LOG_TAG, "ref and test o/p samples mismatch " + count);
+                }
+            } else {
+                Log.e(LOG_TAG, "ref and test o/p sizes mismatch " + memIndex + '/' + that.memIndex);
             }
-            if (count != 0) {
-                isEqual = false;
-                Log.e(LOG_TAG, "ref and test o/p samples mismatch " + count);
-            }
-        } else {
-            isEqual = false;
-            Log.e(LOG_TAG, "ref and test o/p sizes mismatch " + memIndex + '/' + that.memIndex);
         }
         return isEqual;
     }
@@ -450,6 +484,7 @@
     static final int PER_TEST_TIMEOUT_LARGE_TEST_MS = 300000;
     static final int PER_TEST_TIMEOUT_SMALL_TEST_MS = 60000;
     static final long Q_DEQ_TIMEOUT_US = 5000;
+    static final int UNSPECIFIED = 0;
     static final String mInpPrefix = WorkDir.getMediaDirString();
     static final PackageManager pm =
             InstrumentationRegistry.getInstrumentation().getContext().getPackageManager();
@@ -522,19 +557,101 @@
         return pm.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE);
     }
 
+    static boolean isPc() {
+        return pm.hasSystemFeature(PackageManager.FEATURE_PC);
+    }
+
     static boolean hasAudioOutput() {
         return pm.hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT);
     }
 
     static boolean isHandheld() {
         // handheld nature is not exposed to package manager, for now
-        // we check for touchscreen and NOT watch and NOT tv
+        // we check for touchscreen and NOT watch and NOT tv and NOT pc
         return pm.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN) && !isWatch() && !isTv() &&
-                !isAutomotive();
+                !isAutomotive() && !isPc();
     }
 
-    static List<Object[]> prepareParamList(ArrayList<String> cddRequiredMimeList,
-            List<Object[]> exhaustiveArgsList, boolean isEncoder) {
+    static boolean hasDecoder(String mime) {
+        return CodecTestBase.selectCodecs(mime, null, null, false).size() != 0;
+    }
+
+    static boolean hasEncoder(String mime) {
+        return CodecTestBase.selectCodecs(mime, null, null, true).size() != 0;
+    }
+
+    static ArrayList<String> prepareRequiredArgsList(boolean isEncoder, boolean needAudio,
+            boolean needVideo) {
+        Set<String> list = new HashSet<>();
+        if (!isEncoder) {
+            if (hasAudioOutput() && needAudio) {
+                // sec 5.1.2
+                list.add(MediaFormat.MIMETYPE_AUDIO_AAC);
+                list.add(MediaFormat.MIMETYPE_AUDIO_FLAC);
+                list.add(MediaFormat.MIMETYPE_AUDIO_MPEG);
+                list.add(MediaFormat.MIMETYPE_AUDIO_VORBIS);
+                list.add(MediaFormat.MIMETYPE_AUDIO_RAW);
+                list.add(MediaFormat.MIMETYPE_AUDIO_OPUS);
+            }
+            if (isHandheld() || isTv() || isAutomotive()) {
+                // sec 2.2.2, 2.3.2, 2.5.2
+                if (needAudio) {
+                    list.add(MediaFormat.MIMETYPE_AUDIO_AAC);
+                }
+                if (needVideo) {
+                    list.add(MediaFormat.MIMETYPE_VIDEO_AVC);
+                    list.add(MediaFormat.MIMETYPE_VIDEO_MPEG4);
+                    list.add(MediaFormat.MIMETYPE_VIDEO_H263);
+                    list.add(MediaFormat.MIMETYPE_VIDEO_VP8);
+                    list.add(MediaFormat.MIMETYPE_VIDEO_VP9);
+                }
+            }
+            if (isHandheld()) {
+                // sec 2.2.2
+                if (needAudio) {
+                    list.add(MediaFormat.MIMETYPE_AUDIO_AMR_NB);
+                    list.add(MediaFormat.MIMETYPE_AUDIO_AMR_WB);
+                }
+                if (needVideo) {
+                    list.add(MediaFormat.MIMETYPE_VIDEO_HEVC);
+                }
+            }
+            if (isTv() && needVideo) {
+                // sec 2.3.2
+                list.add(MediaFormat.MIMETYPE_VIDEO_HEVC);
+                list.add(MediaFormat.MIMETYPE_VIDEO_MPEG2);
+            }
+        } else {
+            if (hasMicrophone() && needAudio) {
+                // sec 5.1.1
+                // TODO(b/154423550)
+                // list.add(MediaFormat.MIMETYPE_AUDIO_RAW);
+                list.add(MediaFormat.MIMETYPE_AUDIO_FLAC);
+                list.add(MediaFormat.MIMETYPE_AUDIO_OPUS);
+            }
+            if (isHandheld() || isTv() || isAutomotive()) {
+                // sec 2.2.2, 2.3.2, 2.5.2
+                if (needAudio) {
+                    list.add(MediaFormat.MIMETYPE_AUDIO_AAC);
+                }
+                if (needVideo) {
+                    list.add(MediaFormat.MIMETYPE_VIDEO_AVC);
+                    list.add(MediaFormat.MIMETYPE_VIDEO_VP8);
+                }
+            }
+            if (isHandheld() && needAudio) {
+                // sec 2.2.2
+                list.add(MediaFormat.MIMETYPE_AUDIO_AMR_NB);
+                list.add(MediaFormat.MIMETYPE_AUDIO_AMR_WB);
+            }
+        }
+        return new ArrayList<>(list);
+    }
+
+    static List<Object[]> prepareParamList(List<Object[]> exhaustiveArgsList, boolean isEncoder,
+            boolean needAudio, boolean needVideo, boolean mustTestRequiredArgsList) {
+        ArrayList<String> cddRequiredMimeList =
+                prepareRequiredArgsList(isEncoder, needAudio, needVideo);
         ArrayList<String> mimes = new ArrayList<>();
         if (codecSelKeys.contains(CODEC_SEL_VALUE)) {
             MediaCodecList codecList = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
@@ -544,6 +661,8 @@
                 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && codecInfo.isAlias()) continue;
                 String[] types = codecInfo.getSupportedTypes();
                 for (String type : types) {
+                    if (!needAudio && type.startsWith("audio/")) continue;
+                    if (!needVideo && type.startsWith("video/")) continue;
                     if (!mimes.contains(type)) {
                         mimes.add(type);
                     }
@@ -553,13 +672,19 @@
             /* sec 5.2: device implementations include an embedded screen display with the
             diagonal length of at least 2.5inches or include a video output port or declare the
             support of a camera */
-            if (isEncoder && hasCamera() && !mimes.contains(MediaFormat.MIMETYPE_VIDEO_AVC) &&
+            if (isEncoder && hasCamera() && needVideo &&
+                    !mimes.contains(MediaFormat.MIMETYPE_VIDEO_AVC) &&
                     !mimes.contains(MediaFormat.MIMETYPE_VIDEO_VP8)) {
-                fail("device must support at least one of VP8 or AVC video encoders");
+                // Add required cdd mimes here so that respective codec tests fail.
+                mimes.add(MediaFormat.MIMETYPE_VIDEO_AVC);
+                mimes.add(MediaFormat.MIMETYPE_VIDEO_VP8);
+                Log.e(LOG_TAG,"device must support at least one of VP8 or AVC video encoders");
             }
             for (String mime : cddRequiredMimeList) {
                 if (!mimes.contains(mime)) {
-                    fail("no codec found for mime " + mime + " as required by cdd");
+                    // Add required cdd mimes here so that respective codec tests fail.
+                    mimes.add(mime);
+                    Log.e(LOG_TAG, "no codec found for mime " + mime + " as required by cdd");
                 }
             }
         } else {
@@ -578,7 +703,7 @@
                     miss = false;
                 }
             }
-            if (miss) {
+            if (miss && mustTestRequiredArgsList) {
                 if (cddRequiredMimeList.contains(mime)) {
                     fail("no test vectors for required mimetype " + mime);
                 }
@@ -831,12 +956,32 @@
     }
 
     void validateColorAspects(MediaFormat fmt, int range, int standard, int transfer) {
-        int colorRange = fmt.getInteger(MediaFormat.KEY_COLOR_RANGE, 0);
-        int colorStandard = fmt.getInteger(MediaFormat.KEY_COLOR_STANDARD, 0);
-        int colorTransfer = fmt.getInteger(MediaFormat.KEY_COLOR_TRANSFER, 0);
-        assertEquals("range mismatch ", range, colorRange);
-        assertEquals("color mismatch ", standard, colorStandard);
-        assertEquals("transfer mismatch ", transfer, colorTransfer);
+        int colorRange = fmt.getInteger(MediaFormat.KEY_COLOR_RANGE, UNSPECIFIED);
+        int colorStandard = fmt.getInteger(MediaFormat.KEY_COLOR_STANDARD, UNSPECIFIED);
+        int colorTransfer = fmt.getInteger(MediaFormat.KEY_COLOR_TRANSFER, UNSPECIFIED);
+        if (range > UNSPECIFIED) {
+            assertEquals("color range mismatch ", range, colorRange);
+        }
+        if (standard > UNSPECIFIED) {
+            assertEquals("color standard mismatch ", standard, colorStandard);
+        }
+        if (transfer > UNSPECIFIED) {
+            assertEquals("color transfer mismatch ", transfer, colorTransfer);
+        }
+    }
+
+    public void setUpSurface(CodecTestActivity activity) throws InterruptedException {
+        activity.waitTillSurfaceIsCreated();
+        mSurface = activity.getSurface();
+        assertTrue("Surface created is null.", mSurface != null);
+        assertTrue("Surface created is invalid.", mSurface.isValid());
+    }
+
+    public void tearDownSurface() {
+        if (mSurface != null) {
+            mSurface.release();
+            mSurface = null;
+        }
     }
 }
 
@@ -845,10 +990,13 @@
 
     String mMime;
     String mTestFile;
+    boolean mIsInterlaced;
 
     ArrayList<ByteBuffer> mCsdBuffers;
     private int mCurrCsdIdx;
 
+    private ByteBuffer flatBuffer = ByteBuffer.allocate(4 * Integer.BYTES);
+
     MediaExtractor mExtractor;
 
     CodecDecoderTestBase(String mime, String testFile) {
@@ -871,10 +1019,15 @@
             if (mMime.equalsIgnoreCase(format.getString(MediaFormat.KEY_MIME))) {
                 mExtractor.selectTrack(trackID);
                 if (!mIsAudio) {
-                    // COLOR_FormatYUV420Flexible by default should be supported by all components
-                    // This call shouldn't effect configure() call for any codec
-                    format.setInteger(MediaFormat.KEY_COLOR_FORMAT, COLOR_FormatYUV420Flexible);
+                    if (mSurface == null) {
+                        // COLOR_FormatYUV420Flexible must be supported by all components
+                        format.setInteger(MediaFormat.KEY_COLOR_FORMAT, COLOR_FormatYUV420Flexible);
+                    } else {
+                        format.setInteger(MediaFormat.KEY_COLOR_FORMAT, COLOR_FormatSurface);
+                    }
                 }
+                // TODO: determine this from the extractor format when it becomes exposed.
+                mIsInterlaced = srcFile.contains("_interlaced_");
                 return format;
             }
         }
@@ -886,6 +1039,12 @@
         return format.containsKey("csd-0");
     }
 
+    void flattenBufferInfo(MediaCodec.BufferInfo info) {
+        flatBuffer.putInt(info.size).putInt(info.flags & ~MediaCodec.BUFFER_FLAG_END_OF_STREAM)
+                .putLong(info.presentationTimeUs);
+        flatBuffer.flip();
+    }
+
     void enqueueCodecConfig(int bufferIndex) {
         ByteBuffer inputBuffer = mCodec.getInputBuffer(bufferIndex);
         ByteBuffer csdBuffer = mCsdBuffers.get(mCurrCsdIdx);
@@ -951,8 +1110,11 @@
 
     void dequeueOutput(int bufferIndex, MediaCodec.BufferInfo info) {
         if (info.size > 0 && mSaveToMem) {
+            ByteBuffer buf = mCodec.getOutputBuffer(bufferIndex);
+            mOutputBuff.checksum(buf, info.size);
+            flattenBufferInfo(info);
+            mOutputBuff.checksum(flatBuffer, flatBuffer.limit());
             if (mIsAudio) {
-                ByteBuffer buf = mCodec.getOutputBuffer(bufferIndex);
                 mOutputBuff.saveToMemory(buf, info);
             } else {
                 // tests both getOutputImage and getOutputBuffer. Can do time division
@@ -960,9 +1122,6 @@
                 Image img = mCodec.getOutputImage(bufferIndex);
                 assertTrue(img != null);
                 mOutputBuff.checksum(img);
-
-                ByteBuffer buf = mCodec.getOutputBuffer(bufferIndex);
-                mOutputBuff.checksum(buf, info.size);
             }
         }
         if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
@@ -1060,9 +1219,15 @@
     }
 
     void validateColorAspects(String decoder, String parent, String name, int range, int standard,
-            int transfer) throws IOException, InterruptedException {
+            int transfer, boolean ignoreColorBox)
+            throws IOException, InterruptedException {
         mOutputBuff = new OutputManager();
         MediaFormat format = setUpSource(parent, name);
+        if (ignoreColorBox) {
+            format.removeKey(MediaFormat.KEY_COLOR_RANGE);
+            format.removeKey(MediaFormat.KEY_COLOR_STANDARD);
+            format.removeKey(MediaFormat.KEY_COLOR_TRANSFER);
+        }
         if (decoder == null) {
             MediaCodecList codecList = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
             decoder = codecList.findDecoderForFormat(format);
@@ -1078,25 +1243,6 @@
         mCodec.release();
         mExtractor.release();
     }
-
-    void validateColorAspects(String decoder, MediaFormat format, ByteBuffer buffer,
-            ArrayList<MediaCodec.BufferInfo> infos, int range, int standard, int transfer)
-            throws IOException, InterruptedException {
-        mOutputBuff = new OutputManager();
-        if (decoder == null) {
-            MediaCodecList codecList = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
-            decoder = codecList.findDecoderForFormat(format);
-        }
-        mCodec = MediaCodec.createByCodecName(decoder);
-        configureCodec(format, true, true, false);
-        mCodec.start();
-        doWork(buffer, infos);
-        queueEOS();
-        waitForAllOutputs();
-        validateColorAspects(mCodec.getOutputFormat(), range, standard, transfer);
-        mCodec.stop();
-        mCodec.release();
-    }
 }
 
 class CodecEncoderTestBase extends CodecTestBase {
diff --git a/tests/media/src/android/mediav2/cts/DecoderColorAspectsTest.java b/tests/media/src/android/mediav2/cts/DecoderColorAspectsTest.java
new file mode 100644
index 0000000..d848059
--- /dev/null
+++ b/tests/media/src/android/mediav2/cts/DecoderColorAspectsTest.java
@@ -0,0 +1,266 @@
+/*
+ * Copyright (C) 2020 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.mediav2.cts;
+
+import android.media.MediaFormat;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.rule.ActivityTestRule;
+
+import org.junit.Assume;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+@RunWith(Parameterized.class)
+public class DecoderColorAspectsTest extends CodecDecoderTestBase {
+    private static final String LOG_TAG = DecoderColorAspectsTest.class.getSimpleName();
+    private final int mColorRange;
+    private final int mColorStandard;
+    private final int mColorTransferCurve;
+    private final boolean mCanIgnoreColorBox;
+    private ArrayList<String> mCheckESList;
+
+    public DecoderColorAspectsTest(String mime, String testFile, int range, int standard,
+            int transferCurve, boolean canIgnoreColorBox) {
+        super(mime, testFile);
+        mColorRange = range;
+        mColorStandard = standard;
+        mColorTransferCurve = transferCurve;
+        mCheckESList = new ArrayList<>();
+        mCheckESList.add(MediaFormat.MIMETYPE_VIDEO_AVC);
+        mCheckESList.add(MediaFormat.MIMETYPE_VIDEO_HEVC);
+        /* TODO (b/165492703) Mpeg2 and (b/165787556) AV1 has problems in signalling color
+            aspects information via elementary stream. */
+        // mCheckESList.add(MediaFormat.MIMETYPE_VIDEO_MPEG2);
+        // mCheckESList.add(MediaFormat.MIMETYPE_VIDEO_AV1);
+        mCanIgnoreColorBox = canIgnoreColorBox;
+    }
+
+    @Parameterized.Parameters(name = "{index}({0})")
+    public static Collection<Object[]> input() {
+        final boolean isEncoder = false;
+        final boolean needAudio = true;
+        final boolean needVideo = true;
+
+        // testClip, colorRange, colorStandard, colorTransfer
+        final List<Object[]> exhaustiveArgsList = Arrays.asList(new Object[][]{
+                // h264 clips
+                {MediaFormat.MIMETYPE_VIDEO_AVC, "bbb_qcif_color_bt709_lr_sdr_avc.mp4",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT709,
+                        MediaFormat.COLOR_TRANSFER_SDR_VIDEO, true},
+                {MediaFormat.MIMETYPE_VIDEO_AVC, "bbb_qcif_color_bt601_625_fr_gamma22_avc.mp4",
+                        MediaFormat.COLOR_RANGE_FULL, MediaFormat.COLOR_STANDARD_BT601_PAL,
+                        /* MediaFormat.COLOR_TRANSFER_GAMMA2_2 */ 4, true},
+                {MediaFormat.MIMETYPE_VIDEO_AVC, "bbb_qcif_color_bt601_525_lr_gamma28_avc.mp4",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT601_NTSC,
+                        /* MediaFormat.COLOR_TRANSFER_GAMMA2_8 */ 5, true},
+                {MediaFormat.MIMETYPE_VIDEO_AVC, "bbb_qcif_color_bt709_lr_srgb_avc.mp4",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT709,
+                        /* MediaFormat.COLOR_TRANSFER_SRGB */ 2, true},
+                {MediaFormat.MIMETYPE_VIDEO_AVC, "bbb_qcif_color_unspcfd_avc.mp4",
+                        UNSPECIFIED, UNSPECIFIED, UNSPECIFIED, true},
+                {MediaFormat.MIMETYPE_VIDEO_AVC, "bbb_qcif_color_bt470m_linear_fr_avc.mp4",
+                        MediaFormat.COLOR_RANGE_FULL, /* MediaFormat.COLOR_STANDARD_BT470M */ 8,
+                        MediaFormat.COLOR_TRANSFER_LINEAR, true},
+                {MediaFormat.MIMETYPE_VIDEO_AVC,
+                        "bikes_qcif_color_bt2020_smpte2084_bt2020Ncl_lr_avc.mp4",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT2020,
+                        MediaFormat.COLOR_TRANSFER_ST2084, true},
+                {MediaFormat.MIMETYPE_VIDEO_AVC,
+                        "bikes_qcif_color_bt2020_smpte2086Hlg_bt2020Ncl_fr_avc.mp4",
+                        MediaFormat.COLOR_RANGE_FULL, MediaFormat.COLOR_STANDARD_BT2020,
+                        MediaFormat.COLOR_TRANSFER_HLG, true},
+
+                // h265 clips
+                {MediaFormat.MIMETYPE_VIDEO_HEVC, "bbb_qcif_color_bt709_lr_sdr_hevc.mp4",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT709,
+                        MediaFormat.COLOR_TRANSFER_SDR_VIDEO, true},
+                {MediaFormat.MIMETYPE_VIDEO_HEVC, "bbb_qcif_color_bt601_625_fr_gamma22_hevc.mp4",
+                        MediaFormat.COLOR_RANGE_FULL, MediaFormat.COLOR_STANDARD_BT601_PAL,
+                        /* MediaFormat.COLOR_TRANSFER_GAMMA2_2 */ 4, true},
+                {MediaFormat.MIMETYPE_VIDEO_HEVC, "bbb_qcif_color_bt601_525_lr_gamma28_hevc.mp4",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT601_NTSC,
+                        /* MediaFormat.COLOR_TRANSFER_GAMMA2_8 */ 5, true},
+                {MediaFormat.MIMETYPE_VIDEO_HEVC, "bbb_qcif_color_bt709_lr_srgb_hevc.mp4",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT709,
+                        /* MediaFormat.COLOR_TRANSFER_SRGB */ 2, true},
+                {MediaFormat.MIMETYPE_VIDEO_HEVC, "bbb_qcif_color_unspcfd_hevc.mp4",
+                        UNSPECIFIED, UNSPECIFIED, UNSPECIFIED, true},
+                {MediaFormat.MIMETYPE_VIDEO_HEVC, "bbb_qcif_color_bt470m_linear_fr_hevc.mp4",
+                        MediaFormat.COLOR_RANGE_FULL, /* MediaFormat.COLOR_STANDARD_BT470M */ 8,
+                        MediaFormat.COLOR_TRANSFER_LINEAR, true},
+                {MediaFormat.MIMETYPE_VIDEO_HEVC,
+                        "bikes_qcif_color_bt2020_smpte2084_bt2020Ncl_lr_hevc.mp4",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT2020,
+                        MediaFormat.COLOR_TRANSFER_ST2084, true},
+                {MediaFormat.MIMETYPE_VIDEO_HEVC,
+                        "bikes_qcif_color_bt2020_smpte2086Hlg_bt2020Ncl_fr_hevc.mp4",
+                        MediaFormat.COLOR_RANGE_FULL, MediaFormat.COLOR_STANDARD_BT2020,
+                        MediaFormat.COLOR_TRANSFER_HLG, true},
+
+                // Mpeg2 clips
+                {MediaFormat.MIMETYPE_VIDEO_MPEG2, "bbb_qcif_color_bt709_lr_sdr_mpeg2.mp4",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT709,
+                        MediaFormat.COLOR_TRANSFER_SDR_VIDEO, true},
+                {MediaFormat.MIMETYPE_VIDEO_MPEG2, "bbb_qcif_color_bt601_625_lr_gamma22_mpeg2.mp4",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT601_PAL,
+                        /* MediaFormat.COLOR_TRANSFER_GAMMA2_2 */ 4, true},
+                {MediaFormat.MIMETYPE_VIDEO_MPEG2, "bbb_qcif_color_bt601_525_lr_gamma28_mpeg2.mp4",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT601_NTSC,
+                        /* MediaFormat.COLOR_TRANSFER_GAMMA2_8 */ 5, true},
+                {MediaFormat.MIMETYPE_VIDEO_MPEG2, "bbb_qcif_color_bt709_lr_srgb_mpeg2.mp4",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT709,
+                        /* MediaFormat.COLOR_TRANSFER_SRGB */ 2, true},
+                {MediaFormat.MIMETYPE_VIDEO_MPEG2, "bbb_qcif_color_unspcfd_lr_mpeg2.mp4",
+                        UNSPECIFIED, UNSPECIFIED, UNSPECIFIED, true},
+                {MediaFormat.MIMETYPE_VIDEO_MPEG2, "bbb_qcif_color_bt470m_linear_lr_mpeg2.mp4",
+                        MediaFormat.COLOR_RANGE_LIMITED, /* MediaFormat.COLOR_STANDARD_BT470M */ 8,
+                        MediaFormat.COLOR_TRANSFER_LINEAR, true},
+
+                // Mpeg4 clips
+                {MediaFormat.MIMETYPE_VIDEO_MPEG4, "bbb_qcif_color_bt709_lr_sdr_mpeg4.mp4",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT709,
+                        MediaFormat.COLOR_TRANSFER_SDR_VIDEO, false},
+                {MediaFormat.MIMETYPE_VIDEO_MPEG4, "bbb_qcif_color_bt601_625_fr_gamma22_mpeg4.mp4",
+                        MediaFormat.COLOR_RANGE_FULL, MediaFormat.COLOR_STANDARD_BT601_PAL,
+                        /* MediaFormat.COLOR_TRANSFER_GAMMA2_2 */ 4, false},
+                {MediaFormat.MIMETYPE_VIDEO_MPEG4, "bbb_qcif_color_bt601_525_lr_gamma28_mpeg4.mp4",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT601_NTSC,
+                        /* MediaFormat.COLOR_TRANSFER_GAMMA2_8 */ 5, false},
+                {MediaFormat.MIMETYPE_VIDEO_MPEG4, "bbb_qcif_color_bt709_lr_srgb_mpeg4.mp4",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT709,
+                        /* MediaFormat.COLOR_TRANSFER_SRGB */ 2, false},
+                {MediaFormat.MIMETYPE_VIDEO_MPEG4, "bbb_qcif_color_unspcfd_mpeg4.mp4",
+                        UNSPECIFIED, UNSPECIFIED, UNSPECIFIED, false},
+                {MediaFormat.MIMETYPE_VIDEO_MPEG4, "bbb_qcif_color_bt470m_linear_fr_mpeg4.mp4",
+                        MediaFormat.COLOR_RANGE_FULL, /* MediaFormat.COLOR_STANDARD_BT470M */ 8,
+                        MediaFormat.COLOR_TRANSFER_LINEAR, false},
+
+                // Vp8 clips
+                {MediaFormat.MIMETYPE_VIDEO_VP8, "bbb_qcif_color_bt709_lr_sdr_vp8.webm",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT709,
+                        MediaFormat.COLOR_TRANSFER_SDR_VIDEO, false},
+                {MediaFormat.MIMETYPE_VIDEO_VP8, "bbb_qcif_color_bt601_625_fr_gamma22_vp8.mkv",
+                        MediaFormat.COLOR_RANGE_FULL, MediaFormat.COLOR_STANDARD_BT601_PAL,
+                        /* MediaFormat.COLOR_TRANSFER_GAMMA2_2 */ 4, false},
+                {MediaFormat.MIMETYPE_VIDEO_VP8, "bbb_qcif_color_bt601_525_lr_gamma28_vp8.mkv",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT601_NTSC,
+                        /* MediaFormat.COLOR_TRANSFER_GAMMA2_8 */ 5, false},
+                {MediaFormat.MIMETYPE_VIDEO_VP8, "bbb_qcif_color_bt709_lr_srgb_vp8.mkv",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT709,
+                        /* MediaFormat.COLOR_TRANSFER_SRGB */ 2, false},
+                {MediaFormat.MIMETYPE_VIDEO_VP8, "bbb_qcif_color_unspcfd_vp8.mkv",
+                        UNSPECIFIED, UNSPECIFIED, UNSPECIFIED, false},
+                {MediaFormat.MIMETYPE_VIDEO_VP8, "bbb_qcif_color_bt470m_linear_fr_vp8.mkv",
+                        MediaFormat.COLOR_RANGE_FULL, /* MediaFormat.COLOR_STANDARD_BT470M */ 8,
+                        MediaFormat.COLOR_TRANSFER_LINEAR, false},
+
+                // Vp9 clips
+                {MediaFormat.MIMETYPE_VIDEO_VP9, "bbb_qcif_color_bt709_lr_sdr_vp9.webm",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT709,
+                        MediaFormat.COLOR_TRANSFER_SDR_VIDEO, false},
+                {MediaFormat.MIMETYPE_VIDEO_VP9, "bbb_qcif_color_bt601_625_fr_gamma22_vp9.mkv",
+                        MediaFormat.COLOR_RANGE_FULL, MediaFormat.COLOR_STANDARD_BT601_PAL,
+                        /* MediaFormat.COLOR_TRANSFER_GAMMA2_2 */ 4, false},
+                {MediaFormat.MIMETYPE_VIDEO_VP9, "bbb_qcif_color_smpte170_lr_gamma28_vp9.mkv",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT601_NTSC,
+                        /* MediaFormat.COLOR_TRANSFER_GAMMA2_8 */ 5, false},
+                {MediaFormat.MIMETYPE_VIDEO_VP9, "bbb_qcif_color_bt709_lr_srgb_vp9.mkv",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT709,
+                        /* MediaFormat.COLOR_TRANSFER_SRGB */ 2, false},
+                {MediaFormat.MIMETYPE_VIDEO_VP9, "bbb_qcif_color_unspcfd_vp9.mkv",
+                        UNSPECIFIED, UNSPECIFIED, UNSPECIFIED, false},
+                {MediaFormat.MIMETYPE_VIDEO_VP9, "bbb_qcif_color_bt470m_linear_fr_vp9.mkv",
+                        MediaFormat.COLOR_RANGE_FULL, /* MediaFormat.COLOR_STANDARD_BT470M */ 8,
+                        MediaFormat.COLOR_TRANSFER_LINEAR, false},
+                {MediaFormat.MIMETYPE_VIDEO_VP9,
+                        "bikes_qcif_color_bt2020_smpte2084_bt2020Ncl_lr_vp9.mkv",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT2020,
+                        MediaFormat.COLOR_TRANSFER_ST2084, false},
+                {MediaFormat.MIMETYPE_VIDEO_VP9,
+                        "bikes_qcif_color_bt2020_smpte2086Hlg_bt2020Ncl_fr_vp9.mkv",
+                        MediaFormat.COLOR_RANGE_FULL, MediaFormat.COLOR_STANDARD_BT2020,
+                        MediaFormat.COLOR_TRANSFER_HLG, false},
+
+                // AV1 clips
+                {MediaFormat.MIMETYPE_VIDEO_AV1, "bbb_qcif_color_bt709_lr_sdr_av1.mp4",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT709,
+                        MediaFormat.COLOR_TRANSFER_SDR_VIDEO, true},
+                {MediaFormat.MIMETYPE_VIDEO_AV1, "bbb_qcif_color_bt601_625_fr_gamma22_av1.mp4",
+                        MediaFormat.COLOR_RANGE_FULL, MediaFormat.COLOR_STANDARD_BT601_PAL,
+                        /* MediaFormat.COLOR_TRANSFER_GAMMA2_2 */ 4, true},
+                {MediaFormat.MIMETYPE_VIDEO_AV1, "bbb_qcif_color_bt601_525_lr_gamma28_av1.mp4",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT601_NTSC,
+                        /* MediaFormat.COLOR_TRANSFER_GAMMA2_8 */ 5, true},
+                {MediaFormat.MIMETYPE_VIDEO_AV1, "bbb_qcif_color_bt709_lr_srgb_av1.mp4",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT709,
+                        /* MediaFormat.COLOR_TRANSFER_SRGB */ 2, true},
+                {MediaFormat.MIMETYPE_VIDEO_AV1, "bbb_qcif_color_unspcfd_av1.mp4",
+                        UNSPECIFIED, UNSPECIFIED, UNSPECIFIED, true},
+                {MediaFormat.MIMETYPE_VIDEO_AV1, "bbb_qcif_color_bt470m_linear_fr_av1.mp4",
+                        MediaFormat.COLOR_RANGE_FULL, /* MediaFormat.COLOR_STANDARD_BT470M */ 8,
+                        MediaFormat.COLOR_TRANSFER_LINEAR, true},
+                {MediaFormat.MIMETYPE_VIDEO_AV1,
+                        "bikes_qcif_color_bt2020_smpte2084_bt2020Ncl_lr_av1.mp4",
+                        MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT2020,
+                        MediaFormat.COLOR_TRANSFER_ST2084, true},
+                {MediaFormat.MIMETYPE_VIDEO_AV1,
+                        "bikes_qcif_color_bt2020_smpte2086Hlg_bt2020Ncl_fr_av1.mp4",
+                        MediaFormat.COLOR_RANGE_FULL, MediaFormat.COLOR_STANDARD_BT2020,
+                        MediaFormat.COLOR_TRANSFER_HLG, true},
+        });
+        return prepareParamList(exhaustiveArgsList, isEncoder, needAudio, needVideo, false);
+    }
+
+    @Rule
+    public ActivityTestRule<CodecTestActivity> mActivityRule =
+            new ActivityTestRule<>(CodecTestActivity.class);
+
+    @SmallTest
+    @Test(timeout = PER_TEST_TIMEOUT_SMALL_TEST_MS)
+    public void testColorAspects() throws IOException, InterruptedException {
+        CodecTestActivity activity = mActivityRule.getActivity();
+        setUpSurface(activity);
+        MediaFormat format = setUpSource(mInpPrefix, mTestFile);
+        mExtractor.release();
+        ArrayList<MediaFormat> formats = new ArrayList<>();
+        formats.add(format);
+        ArrayList<String> listOfDecoders = selectCodecs(mMime, formats, null, false);
+        Assume.assumeFalse("no suitable codecs found for : " + format.toString(),
+                listOfDecoders.isEmpty());
+        activity.setScreenParams(getWidth(format), getHeight(format), true);
+        for (String decoder : listOfDecoders) {
+            validateColorAspects(decoder, mInpPrefix, mTestFile, mColorRange, mColorStandard,
+                    mColorTransferCurve, false);
+            // If color metadata can also be signalled via elementary stream, then verify if the
+            // elementary stream contains color aspects as expected
+            if (mCanIgnoreColorBox && mCheckESList.contains(mMime)) {
+                validateColorAspects(decoder, mInpPrefix, mTestFile, mColorRange,
+                        mColorStandard, mColorTransferCurve, true);
+            }
+        }
+        tearDownSurface();
+    }
+}
diff --git a/tests/media/src/android/mediav2/cts/EncoderColorAspectsTest.java b/tests/media/src/android/mediav2/cts/EncoderColorAspectsTest.java
index 24ef99f..e5cc44c 100644
--- a/tests/media/src/android/mediav2/cts/EncoderColorAspectsTest.java
+++ b/tests/media/src/android/mediav2/cts/EncoderColorAspectsTest.java
@@ -18,10 +18,8 @@
 
 import android.media.MediaCodec;
 import android.media.MediaCodecInfo;
-import android.media.MediaCodecList;
 import android.media.MediaFormat;
 import android.media.MediaMuxer;
-import android.os.Build;
 import android.util.Log;
 
 import androidx.test.filters.SmallTest;
@@ -46,7 +44,6 @@
 @RunWith(Parameterized.class)
 public class EncoderColorAspectsTest extends CodecEncoderTestBase {
     private static final String LOG_TAG = EncoderColorAspectsTest.class.getSimpleName();
-    private static final int UNSPECIFIED = 0;
 
     private int mRange;
     private int mStandard;
@@ -56,8 +53,6 @@
     private MediaMuxer mMuxer;
     private int mTrackID = -1;
 
-    private ArrayList<MediaCodec.BufferInfo> mInfoList = new ArrayList<>();
-
     private ArrayList<String> mCheckESList = new ArrayList<>();
 
     public EncoderColorAspectsTest(String mime, int width, int height, int range, int standard,
@@ -98,44 +93,33 @@
                 }
                 mMuxer.writeSampleData(mTrackID, buf, info);
             }
-            MediaCodec.BufferInfo copy = new MediaCodec.BufferInfo();
-            copy.set(mOutputBuff.getOutStreamSize(), info.size, info.presentationTimeUs,
-                    info.flags);
-            mInfoList.add(copy);
         }
         super.dequeueOutput(bufferIndex, info);
     }
 
     @Parameterized.Parameters(name = "{index}({0}{3}{4}{5})")
     public static Collection<Object[]> input() {
-        ArrayList<String> testMimeList = new ArrayList<>();
-        testMimeList.add(MediaFormat.MIMETYPE_VIDEO_AVC);
-        testMimeList.add(MediaFormat.MIMETYPE_VIDEO_HEVC);
-        testMimeList.add(MediaFormat.MIMETYPE_VIDEO_VP8);
-        testMimeList.add(MediaFormat.MIMETYPE_VIDEO_VP9);
-        ArrayList<String> mimes = new ArrayList<>();
-        if (CodecTestBase.codecSelKeys.contains(CodecTestBase.CODEC_SEL_VALUE)) {
-            MediaCodecList codecList = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
-            MediaCodecInfo[] codecInfos = codecList.getCodecInfos();
-            for (MediaCodecInfo codecInfo : codecInfos) {
-                if (!codecInfo.isEncoder()) continue;
-                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && codecInfo.isAlias()) continue;
-                String[] types = codecInfo.getSupportedTypes();
-                for (String type : types) {
-                    if (testMimeList.contains(type) && !mimes.contains(type)) {
-                        mimes.add(type);
-                    }
-                }
-            }
-        }
-        int[] ranges =
-                {-1, UNSPECIFIED, MediaFormat.COLOR_RANGE_FULL, MediaFormat.COLOR_RANGE_LIMITED};
-        int[] standards =
-                {-1, UNSPECIFIED, MediaFormat.COLOR_STANDARD_BT709,
-                        MediaFormat.COLOR_STANDARD_BT601_PAL,
-                        MediaFormat.COLOR_STANDARD_BT601_NTSC, MediaFormat.COLOR_STANDARD_BT2020};
-        int[] transfers =
-                {-1, UNSPECIFIED, MediaFormat.COLOR_TRANSFER_LINEAR, MediaFormat.COLOR_TRANSFER_SDR_VIDEO};
+        final boolean isEncoder = true;
+        final boolean needAudio = false;
+        final boolean needVideo = true;
+        String[] mimes = {MediaFormat.MIMETYPE_VIDEO_AVC,
+                MediaFormat.MIMETYPE_VIDEO_HEVC,
+                MediaFormat.MIMETYPE_VIDEO_VP8,
+                MediaFormat.MIMETYPE_VIDEO_VP9};
+        int[] ranges = {-1,
+                UNSPECIFIED,
+                MediaFormat.COLOR_RANGE_FULL,
+                MediaFormat.COLOR_RANGE_LIMITED};
+        int[] standards = {-1,
+                UNSPECIFIED,
+                MediaFormat.COLOR_STANDARD_BT709,
+                MediaFormat.COLOR_STANDARD_BT601_PAL,
+                MediaFormat.COLOR_STANDARD_BT601_NTSC,
+                MediaFormat.COLOR_STANDARD_BT2020};
+        int[] transfers = {-1,
+                UNSPECIFIED,
+                MediaFormat.COLOR_TRANSFER_LINEAR,
+                MediaFormat.COLOR_TRANSFER_SDR_VIDEO};
         // TODO: COLOR_TRANSFER_ST2084, COLOR_TRANSFER_HLG are for 10 bit and above. Should these
         //  be tested as well?
         List<Object[]> exhaustiveArgsList = new ArrayList<>();
@@ -150,7 +134,8 @@
                 }
             }
         }
-        return exhaustiveArgsList;
+        return CodecTestBase
+                .prepareParamList(exhaustiveArgsList, isEncoder, needAudio, needVideo, false);
     }
 
     @SmallTest
@@ -159,19 +144,10 @@
         ArrayList<String> listOfEncoders = selectCodecs(mMime, null, null, true);
         assertFalse("no suitable codecs found for mime: " + mMime, listOfEncoders.isEmpty());
         setUpSource(mInputFile);
-        mSaveToMem = true;
         mOutputBuff = new OutputManager();
         for (String encoder : listOfEncoders) {
             mCodec = MediaCodec.createByCodecName(encoder);
             mOutputBuff.reset();
-            mInfoList.clear();
-            /* TODO(b/157523045) */
-            if (mRange <= UNSPECIFIED || mStandard <= UNSPECIFIED ||
-                    mTransferCurve <= UNSPECIFIED) {
-                Log.d(LOG_TAG, "test skipped due to b/157523045");
-                mCodec.release();
-                continue;
-            }
             /* TODO(b/156571486) */
             if (encoder.equals("c2.android.hevc.encoder") ||
                     encoder.equals("OMX.google.h264.encoder") ||
@@ -220,16 +196,13 @@
             if (parent != null) parent += File.separator;
             else parent = "";
             cdtb.validateColorAspects(null, parent, tmpFile.getName(), mRange, mStandard,
-                    mTransferCurve);
+                    mTransferCurve, false);
 
             // if color metadata can also be signalled via elementary stream then verify if the
             // elementary stream contains color aspects as expected
             if (mCheckESList.contains(mMime)) {
-                fmt.removeKey(MediaFormat.KEY_COLOR_RANGE);
-                fmt.removeKey(MediaFormat.KEY_COLOR_STANDARD);
-                fmt.removeKey(MediaFormat.KEY_COLOR_TRANSFER);
-                cdtb.validateColorAspects(null, fmt, mOutputBuff.getBuffer(), mInfoList, mRange,
-                        mStandard, mTransferCurve);
+                cdtb.validateColorAspects(null, parent, tmpFile.getName(), mRange, mStandard,
+                        mTransferCurve, true);
             }
         }
     }
diff --git a/tests/media/src/android/mediav2/cts/EncoderProfileLevelTest.java b/tests/media/src/android/mediav2/cts/EncoderProfileLevelTest.java
index d0e4030..5d780f0 100644
--- a/tests/media/src/android/mediav2/cts/EncoderProfileLevelTest.java
+++ b/tests/media/src/android/mediav2/cts/EncoderProfileLevelTest.java
@@ -18,15 +18,21 @@
 
 import android.media.MediaCodec;
 import android.media.MediaCodecInfo;
+import android.media.MediaExtractor;
 import android.media.MediaFormat;
+import android.media.MediaMuxer;
+import android.mediav2.cts.MuxerTest;
 import android.util.Log;
 import android.util.Pair;
 
+import org.junit.Assume;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
+import java.io.File;
 import java.io.IOException;
+import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -34,8 +40,10 @@
 import java.util.List;
 
 import static android.media.MediaCodecInfo.CodecProfileLevel.*;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 /**
  * Validate profile and level configuration for listed encoder components
@@ -47,6 +55,8 @@
     private static final HashMap<String, Pair<int[], Integer>> mProfileLevelCdd = new HashMap<>();
 
     private MediaFormat mConfigFormat;
+    private MediaMuxer mMuxer;
+    private ArrayList<MediaCodec.BufferInfo> mInfoList = new ArrayList<>();
 
     public EncoderProfileLevelTest(String mime, int bitrate, int encoderInfo1, int encoderInfo2,
             int frameRate) {
@@ -74,13 +84,9 @@
 
     @Parameterized.Parameters(name = "{index}({0})")
     public static Collection<Object[]> input() {
-        ArrayList<String> cddRequiredMimeList = new ArrayList<>();
-        if (isHandheld() || isTv() || isAutomotive()) {
-            // sec 2.2.2, 2.3.2, 2.5.2
-            cddRequiredMimeList.add(MediaFormat.MIMETYPE_AUDIO_AAC);
-            cddRequiredMimeList.add(MediaFormat.MIMETYPE_VIDEO_AVC);
-            cddRequiredMimeList.add(MediaFormat.MIMETYPE_VIDEO_VP8);
-        }
+        final boolean isEncoder = true;
+        final boolean needAudio = true;
+        final boolean needVideo = true;
         final List<Object[]> exhaustiveArgsList = Arrays.asList(new Object[][]{
                 // Audio - CodecMime, bit-rate, sample rate, channel count
                 {MediaFormat.MIMETYPE_AUDIO_AAC, 64000, 48000, 1, -1},
@@ -193,7 +199,7 @@
                 {MediaFormat.MIMETYPE_VIDEO_VP8, 512000, 176, 144, 20},
                 {MediaFormat.MIMETYPE_VIDEO_VP8, 512000, 480, 360, 20},
         });
-        return prepareParamList(cddRequiredMimeList, exhaustiveArgsList, true);
+        return prepareParamList(exhaustiveArgsList, isEncoder, needAudio, needVideo, false);
     }
 
     static {
@@ -221,9 +227,7 @@
                         MPEG4ProfileAdvancedCore, MPEG4ProfileAdvancedScalable,
                         MPEG4ProfileAdvancedSimple});
         mProfileMap.put(MediaFormat.MIMETYPE_VIDEO_VP8, new int[]{VP8ProfileMain});
-        mProfileMap.put(MediaFormat.MIMETYPE_VIDEO_VP9,
-                new int[]{VP9Profile0, VP9Profile1, VP9Profile2, VP9Profile3, VP9Profile2HDR,
-                        VP9Profile3HDR, VP9Profile2HDR10Plus, VP9Profile3HDR10Plus});
+        mProfileMap.put(MediaFormat.MIMETYPE_VIDEO_VP9, new int[]{VP9Profile0, VP9Profile1});
         mProfileMap.put(MediaFormat.MIMETYPE_VIDEO_AV1,
                 new int[]{AV1ProfileMain8, AV1ProfileMain10, AV1ProfileMain10HDR10,
                         AV1ProfileMain10HDR10Plus});
@@ -608,6 +612,17 @@
     }
 
     @Override
+    void dequeueOutput(int bufferIndex, MediaCodec.BufferInfo info) {
+        if (info.size > 0) {
+            MediaCodec.BufferInfo copy = new MediaCodec.BufferInfo();
+            copy.set(mOutputBuff.getOutStreamSize(), info.size, info.presentationTimeUs,
+                    info.flags);
+            mInfoList.add(copy);
+        }
+        super.dequeueOutput(bufferIndex, info);
+    }
+
+    @Override
     boolean isFormatSimilar(MediaFormat inpFormat, MediaFormat outFormat) {
         if (!super.isFormatSimilar(inpFormat, outFormat)) {
             Log.e(LOG_TAG, "Basic channel-rate/resolution comparisons failed");
@@ -618,21 +633,31 @@
         assertTrue("Input and Output mimes are different.", inpMime.equals(outMime));
         if (outMime.startsWith("audio/")) {
             if (outFormat.getString(MediaFormat.KEY_MIME).equals(MediaFormat.MIMETYPE_AUDIO_AAC)) {
-                if (!outFormat.containsKey(MediaFormat.KEY_AAC_PROFILE)) {
-                    Log.e(LOG_TAG, "Output format doesn't contain aac-profile key");
+                int inputProfileKey, outputProfileKey;
+                if (outFormat.containsKey(MediaFormat.KEY_AAC_PROFILE)) {
+                    outputProfileKey = outFormat.getInteger(MediaFormat.KEY_AAC_PROFILE);
+                } else if (outFormat.containsKey(MediaFormat.KEY_PROFILE)) {
+                    outputProfileKey = outFormat.getInteger(MediaFormat.KEY_PROFILE);
+                } else {
+                    Log.e(LOG_TAG,
+                            "Output format doesn't contain either KEY_AAC_PROFILE or KEY_PROFILE");
+                    return false;
+                }
+                if (inpFormat.containsKey(MediaFormat.KEY_AAC_PROFILE)) {
+                    inputProfileKey = inpFormat.getInteger(MediaFormat.KEY_AAC_PROFILE);
+                } else if (inpFormat.containsKey(MediaFormat.KEY_PROFILE)) {
+                    inputProfileKey = inpFormat.getInteger(MediaFormat.KEY_PROFILE);
+                } else {
+                    Log.e(LOG_TAG,
+                            "Input format doesn't contain either KEY_AAC_PROFILE or KEY_PROFILE");
+                    return false;
+                }
+                if (outputProfileKey != inputProfileKey) {
+                    Log.e(LOG_TAG, "aac-profile in output doesn't match configured input");
                     //TODO (b/151429829)
                     if (true) return true;
                     return false;
                 }
-                if (!inpFormat.containsKey(MediaFormat.KEY_AAC_PROFILE)) {
-                    Log.e(LOG_TAG, "Input format doesn't contain aac-profile key");
-                    return false;
-                }
-                if (outFormat.getInteger(MediaFormat.KEY_AAC_PROFILE)
-                        != inpFormat.getInteger(MediaFormat.KEY_AAC_PROFILE)) {
-                    Log.e(LOG_TAG, "aac-profile in output doesn't match configured input");
-                    return false;
-                }
             }
         } else if (outMime.startsWith("video/")) {
             if (!outFormat.containsKey(MediaFormat.KEY_PROFILE)) {
@@ -675,6 +700,8 @@
      * Sets profile and level keys in config format for encoder and validates the keys in output
      * format if component supports the configuration and also verifies whether cdd mandated
      * (profile, level) combination is supported
+     * Write the encoder output in all container formats that can hold the mime and validates the
+     * keys in extracted format.
      */
     @Test(timeout = PER_TEST_TIMEOUT_LARGE_TEST_MS)
     public void testValidateProfileLevel() throws IOException, InterruptedException {
@@ -695,6 +722,8 @@
         MediaFormat format = mConfigFormat;
         mOutputBuff = new OutputManager();
         setUpSource(mInputFile);
+        mSaveToMem = true;
+        String tempMuxedFile = File.createTempFile("tmp", ".out").getAbsolutePath();
         int supportedCddCount = listOfEncoders.size() * (cddSupportedMime ? profileCdd.length : 1);
         for (String encoder : listOfEncoders) {
             mCodec = MediaCodec.createByCodecName(encoder);
@@ -739,10 +768,67 @@
                     assertTrue(log + "configured format and output format are not similar." +
                                     (ENABLE_LOGS ? "\n output format:" + outFormat : ""),
                             isFormatSimilar(format, outFormat));
+
+                    // TODO (b/151429829) (b/151398466)
+                    if (mMime.equals(MediaFormat.MIMETYPE_AUDIO_AAC)) {
+                        Assume.assumeTrue("neither KEY_AAC_PROFILE nor KEY_PROFILE are present",
+                                outFormat.containsKey(MediaFormat.KEY_AAC_PROFILE) ||
+                                        outFormat.containsKey(MediaFormat.KEY_PROFILE));
+                    } else {
+                        Assume.assumeTrue("KEY_PROFILE not present",
+                                outFormat.containsKey(MediaFormat.KEY_PROFILE));
+                    }
+                    Assume.assumeTrue(outFormat.containsKey(MediaFormat.KEY_LEVEL));
+                    // TODO (b/166300446) avc mime fails validation
+                    if (mMime.equals(MediaFormat.MIMETYPE_VIDEO_AVC)) {
+                        Log.w(LOG_TAG, "Skip validation after muxing for mime = " + mMime);
+                        continue;
+                    }
+                    // TODO (b/166305723) hevc mime fails validation
+                    if (mMime.equals(MediaFormat.MIMETYPE_VIDEO_HEVC)) {
+                        Log.w(LOG_TAG, "Skip validation after muxing for mime = " + mMime);
+                        continue;
+                    }
+                    // TODO (b/166300448) h263 and mpeg4 mimes fails validation
+                    if (mMime.equals(MediaFormat.MIMETYPE_VIDEO_H263) ||
+                                mMime.equals(MediaFormat.MIMETYPE_VIDEO_MPEG4)) {
+                        Log.w(LOG_TAG, "Skip validation after muxing for mime = " + mMime);
+                        continue;
+                    }
+                    for (int muxerFormat = MediaMuxer.OutputFormat.MUXER_OUTPUT_FIRST;
+                         muxerFormat <= MediaMuxer.OutputFormat.MUXER_OUTPUT_LAST; muxerFormat++) {
+                        if (!MuxerTest.isCodecContainerPairValid(mMime, muxerFormat)) continue;
+                        ByteBuffer mBuff = mOutputBuff.getBuffer();
+                        mMuxer = new MediaMuxer(tempMuxedFile, muxerFormat);
+                        try {
+                            mMuxer.addTrack(outFormat);
+                            mMuxer.start();
+                            for (int i = 0; i < mInfoList.size(); i++) {
+                                mMuxer.writeSampleData(0, mBuff, mInfoList.get(i));
+                            }
+                            mMuxer.stop();
+                        } catch (Exception e) {
+                            fail(log + "error! failed write to muxer format " + muxerFormat);
+                        } finally {
+                            mMuxer.release();
+                            mMuxer = null;
+                        }
+                        MediaExtractor extractor = new MediaExtractor();
+                        extractor.setDataSource(tempMuxedFile);
+                        assertEquals("Should be only 1 track ", 1, extractor.getTrackCount());
+                        MediaFormat extractedFormat = extractor.getTrackFormat(0);
+                        assertTrue(log + "\nmuxer input config = " + outFormat +
+                                           "\ninput format and extracted format are not similar." +
+                                           "\nextracted format:" + extractedFormat +
+                                           "\ncontainer format = " + muxerFormat,
+                                isFormatSimilar(format, extractedFormat));
+                        extractor.release();
+                    }
                 }
             }
             mCodec.release();
         }
+        new File(tempMuxedFile).delete();
         assertFalse("No components support cdd requirement profile level for mime: " + mMime,
                 supportedCddCount == 0);
     }
diff --git a/tests/media/src/android/mediav2/cts/ExtractorTest.java b/tests/media/src/android/mediav2/cts/ExtractorTest.java
index cbfc9c6..e2a9b57 100644
--- a/tests/media/src/android/mediav2/cts/ExtractorTest.java
+++ b/tests/media/src/android/mediav2/cts/ExtractorTest.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.content.res.AssetFileDescriptor;
 import android.media.MediaCodec;
+import android.media.MediaCodecInfo;
 import android.media.MediaDataSource;
 import android.media.MediaExtractor;
 import android.media.MediaFormat;
@@ -26,11 +27,14 @@
 import android.os.ParcelFileDescriptor;
 import android.os.PersistableBundle;
 import android.util.Log;
+import android.webkit.cts.CtsTestServer;
 
 import androidx.test.filters.LargeTest;
 import androidx.test.filters.SmallTest;
 import androidx.test.platform.app.InstrumentationRegistry;
 
+import org.apache.http.Header;
+import org.apache.http.HttpRequest;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Ignore;
@@ -41,18 +45,27 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
+import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StreamTokenizer;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Random;
+import java.util.zip.CRC32;
 
+import static android.mediav2.cts.CodecTestBase.hasDecoder;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import static org.junit.Assume.assumeTrue;
@@ -149,19 +162,25 @@
     static private final List<String> codecListforTypeTs =
             Arrays.asList(MediaFormat.MIMETYPE_AUDIO_AAC, MediaFormat.MIMETYPE_VIDEO_MPEG2,
                     MediaFormat.MIMETYPE_VIDEO_AVC);
+    static private final List<String> codecListforTypePs =
+            Arrays.asList(MediaFormat.MIMETYPE_VIDEO_MPEG2);
     static private final List<String> codecListforTypeRaw =
             Arrays.asList(MediaFormat.MIMETYPE_AUDIO_AAC, MediaFormat.MIMETYPE_AUDIO_FLAC,
                     MediaFormat.MIMETYPE_AUDIO_MPEG, MediaFormat.MIMETYPE_AUDIO_AMR_NB,
                     MediaFormat.MIMETYPE_AUDIO_AMR_WB, MediaFormat.MIMETYPE_AUDIO_RAW);
+    static private final List<String> codecListforTypeWav =
+            Arrays.asList(MediaFormat.MIMETYPE_AUDIO_RAW,  MediaFormat.MIMETYPE_AUDIO_G711_ALAW,
+                    MediaFormat.MIMETYPE_AUDIO_G711_MLAW,  MediaFormat.MIMETYPE_AUDIO_MSGSM);
     // List of codecs that are not required to be supported as per CDD but are tested
     static private final List<String> codecListSupp =
-            Arrays.asList(MediaFormat.MIMETYPE_VIDEO_AV1);
+            Arrays.asList(MediaFormat.MIMETYPE_VIDEO_AV1, MediaFormat.MIMETYPE_AUDIO_AC3,
+                    MediaFormat.MIMETYPE_AUDIO_AC4, MediaFormat.MIMETYPE_AUDIO_EAC3);
     private static String mInpPrefix = WorkDir.getMediaDirString();
     private static String extSel;
 
     static {
         android.os.Bundle args = InstrumentationRegistry.getArguments();
-        final String defSel = "mp4;webm;3gp;mkv;ogg;supp";
+        final String defSel = "mp4;webm;3gp;mkv;ogg;supp;raw;ts;ps;wav";
         extSel = (null == args.getString(EXT_SEL_KEY)) ? defSel : args.getString(EXT_SEL_KEY);
     }
 
@@ -172,6 +191,10 @@
                 (extSel.contains("3gp") && codecListforType3gp.contains(mime)) ||
                 (extSel.contains("mkv") && codecListforTypeMkv.contains(mime)) ||
                 (extSel.contains("ogg") && codecListforTypeOgg.contains(mime)) ||
+                (extSel.contains("ts") && codecListforTypeTs.contains(mime)) ||
+                (extSel.contains("ps") && codecListforTypePs.contains(mime)) ||
+                (extSel.contains("raw") && codecListforTypeRaw.contains(mime)) ||
+                (extSel.contains("wav") && codecListforTypeWav.contains(mime)) ||
                 (extSel.contains("supp") && codecListSupp.contains(mime)))
             result = true;
         return result;
@@ -223,22 +246,30 @@
         return true;
     }
 
-    private static boolean isFormatSimilar(MediaFormat refFormat, MediaFormat testFormat) {
+    static boolean isFormatSimilar(MediaFormat refFormat, MediaFormat testFormat) {
         String refMime = refFormat.getString(MediaFormat.KEY_MIME);
         String testMime = testFormat.getString(MediaFormat.KEY_MIME);
 
         if (!refMime.equals(testMime)) return false;
+        if (refFormat.getLong(MediaFormat.KEY_DURATION) !=
+                    testFormat.getLong(MediaFormat.KEY_DURATION)) {
+            Log.w(LOG_TAG, "Duration mismatches ref / test = " +
+                                   refFormat.getLong(MediaFormat.KEY_DURATION) + " / " +
+                                   testFormat.getLong(MediaFormat.KEY_DURATION));
+            // TODO (b/163477410)(b/163478168)
+//            return false;
+        }
         if (!isCSDIdentical(refFormat, testFormat)) return false;
         if (refMime.startsWith("audio/")) {
-            return refFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT) ==
-                    testFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT) &&
-                    refFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE) ==
-                            testFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE);
+            if (refFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT) !=
+                        testFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT)) return false;
+            if (refFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE) !=
+                        testFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE)) return false;
         } else if (refMime.startsWith("video/")) {
-            return refFormat.getInteger(MediaFormat.KEY_WIDTH) ==
-                    testFormat.getInteger(MediaFormat.KEY_WIDTH) &&
-                    refFormat.getInteger(MediaFormat.KEY_HEIGHT) ==
-                            testFormat.getInteger(MediaFormat.KEY_HEIGHT);
+            if (refFormat.getInteger(MediaFormat.KEY_WIDTH) !=
+                        testFormat.getInteger(MediaFormat.KEY_WIDTH)) return false;
+            if (refFormat.getInteger(MediaFormat.KEY_HEIGHT) !=
+                        testFormat.getInteger(MediaFormat.KEY_HEIGHT)) return false;
         }
         return true;
     }
@@ -378,6 +409,71 @@
         }
     }
 
+    private static long readAllData(MediaExtractor extractor, String mime, int sampleLimit) {
+        CRC32 checksum = new CRC32();
+        ByteBuffer buffer = ByteBuffer.allocate(MAX_SAMPLE_SIZE);
+        int tracksSelected = 0;
+        for (int trackID = 0; trackID < extractor.getTrackCount(); trackID++) {
+            MediaFormat format = extractor.getTrackFormat(trackID);
+            String srcMime = format.getString(MediaFormat.KEY_MIME);
+            if (mime != null && !srcMime.equals(mime)) {
+                continue;
+            }
+            extractor.selectTrack(trackID);
+            tracksSelected++;
+            if (srcMime.startsWith("audio/")) {
+                buffer.putInt(0);
+                buffer.putInt(format.getInteger(MediaFormat.KEY_SAMPLE_RATE));
+                buffer.putInt(format.getInteger(MediaFormat.KEY_CHANNEL_COUNT));
+            } else if (srcMime.startsWith("video/")) {
+                buffer.putInt(1);
+                buffer.putInt(format.getInteger(MediaFormat.KEY_WIDTH));
+                buffer.putInt(format.getInteger(MediaFormat.KEY_HEIGHT));
+            } else {
+                buffer.putInt(2);
+            }
+            buffer.putLong(format.getLong(MediaFormat.KEY_DURATION));
+            for (int i = 0; ; i++) {
+                String csdKey = "csd-" + i;
+                if (format.containsKey(csdKey)) {
+                    checksum.update(format.getByteBuffer(csdKey));
+                } else break;
+            }
+        }
+        assertTrue(tracksSelected > 0);
+        buffer.flip();
+        checksum.update(buffer);
+
+        MediaCodec.BufferInfo sampleInfo = new MediaCodec.BufferInfo();
+        for (int sampleCount = 0; sampleCount < sampleLimit; sampleCount++) {
+            sampleInfo.set(0, (int) extractor.getSampleSize(), extractor.getSampleTime(),
+                    extractor.getSampleFlags());
+            extractor.readSampleData(buffer, 0);
+            checksum.update(buffer);
+            assertEquals(sampleInfo.size, buffer.limit());
+            assertTrue(sampleInfo.flags != -1);
+            assertTrue(sampleInfo.presentationTimeUs != -1);
+            buffer.position(0);
+            buffer.putInt(sampleInfo.size)
+                    .putInt(sampleInfo.flags)
+                    .putLong(sampleInfo.presentationTimeUs);
+            buffer.flip();
+            checksum.update(buffer);
+            sampleCount++;
+            if (!extractor.advance()) {
+                assertTrue(isExtractorOKonEOS(extractor));
+                break;
+            }
+        }
+        for (int trackID = 0; trackID < extractor.getTrackCount(); trackID++) {
+            extractor.unselectTrack(trackID);
+        }
+        return checksum.getValue();
+    }
+
+    private static native long nativeReadAllData(String srcPath, String mime, int sampleLimit,
+            String[] keys, String[] values, boolean isSrcUrl);
+
     /**
      * Tests setDataSource(...) Api by observing the extractor behavior after its successful
      * instantiation using a media stream.
@@ -388,9 +484,9 @@
         public TestName testName = new TestName();
 
         private static final String mInpMedia = "ForBiggerEscapes.mp4";
-        private static final String mInpMediaUrl =
-                "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4";
-
+        private static final String mResString = "raw/forbiggerescapes";
+        private CtsTestServer mWebServer;
+        private String mInpMediaUrl;
         private MediaExtractor mRefExtractor;
 
         static {
@@ -401,12 +497,20 @@
         public void setUp() throws IOException {
             mRefExtractor = new MediaExtractor();
             mRefExtractor.setDataSource(mInpPrefix + mInpMedia);
+            try {
+                Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+                mWebServer = new CtsTestServer(context);
+                mInpMediaUrl = mWebServer.getAssetUrl(mResString);
+            } catch (Exception e) {
+                fail(e.getMessage());
+            }
         }
 
         @After
         public void tearDown() {
             mRefExtractor.release();
             mRefExtractor = null;
+            mWebServer.shutdown();
         }
 
         private static boolean areMetricsIdentical(MediaExtractor refExtractor,
@@ -504,7 +608,11 @@
                     !isSeekOk(mRefExtractor, testExtractor)) {
                 fail("setDataSource failed: " + testName.getMethodName());
             }
+            long sdkChecksum = readAllData(testExtractor, null, Integer.MAX_VALUE);
+            long ndkChecksum = nativeReadAllData(mInpPrefix + mInpMedia, "",
+                    Integer.MAX_VALUE, null, null, false);
             testExtractor.release();
+            assertEquals("SDK and NDK checksums mismatch", sdkChecksum, ndkChecksum);
         }
 
         @Test
@@ -556,7 +664,7 @@
         @Test
         public void testContextUri() throws IOException {
             Context context = InstrumentationRegistry.getInstrumentation().getContext();
-            String path = "android.resource://android.mediav2.cts/" + R.raw.forbiggerescapes;
+            String path = "android.resource://android.mediav2.cts/" + mResString;
             MediaExtractor testExtractor = new MediaExtractor();
             testExtractor.setDataSource(context, Uri.parse(path), null);
             assertTrue(testExtractor.getCachedDuration() < 0);
@@ -568,10 +676,19 @@
             testExtractor.release();
         }
 
-        @Test
-        public void testUrlDataSource() throws Exception {
+        private void checkExtractorOkForUrlDS(Map<String, String> headers) throws Exception {
             MediaExtractor testExtractor = new MediaExtractor();
-            testExtractor.setDataSource(mInpMediaUrl, null);
+            testExtractor.setDataSource(mInpMediaUrl, headers);
+            HttpRequest req = mWebServer.getLastRequest(mResString);
+            if (headers != null) {
+                for (String key : headers.keySet()) {
+                    String value = headers.get(key);
+                    Header[] header = req.getHeaders(key);
+                    assertTrue(
+                            "expecting " + key + ":" + value + ", saw " + Arrays.toString(header),
+                            header.length == 1 && header[0].getValue().equals(value));
+                }
+            }
             if (!isMediaSimilar(mRefExtractor, testExtractor, null, Integer.MAX_VALUE) ||
                     !areMetricsIdentical(mRefExtractor, testExtractor) ||
                     !isSeekOk(mRefExtractor, testExtractor)) {
@@ -593,6 +710,32 @@
             testExtractor.release();
         }
 
+        @Test
+        public void testUrlDataSource() throws Exception {
+            checkExtractorOkForUrlDS(null);
+
+            Map<String, String> headers = new HashMap<>();
+            checkExtractorOkForUrlDS(headers);
+
+            String[] keys = new String[]{"From", "Client", "Location"};
+            String[] values = new String[]{"alcor@bigdipper.asm", "CtsTestServer", "UrsaMajor"};
+            for (int i = 0; i < keys.length; i++) {
+                headers.put(keys[i], values[i]);
+            }
+            checkExtractorOkForUrlDS(headers);
+
+            MediaExtractor testExtractor = new MediaExtractor();
+            testExtractor.setDataSource(mInpMediaUrl, headers);
+            long sdkChecksum = readAllData(testExtractor, null, Integer.MAX_VALUE);
+            testExtractor.release();
+            long ndkChecksum = nativeReadAllData(mInpMediaUrl, "", Integer.MAX_VALUE, keys,
+                    values, true);
+            assertEquals("SDK and NDK checksums mismatch", sdkChecksum, ndkChecksum);
+            ndkChecksum = nativeReadAllData(mInpMediaUrl, "", Integer.MAX_VALUE, new String[0],
+                    new String[0], true);
+            assertEquals("SDK and NDK checksums mismatch", sdkChecksum, ndkChecksum);
+        }
+
         private native boolean nativeTestDataSource(String srcPath, String srcUrl);
 
         @Test
@@ -626,17 +769,25 @@
             return Arrays.asList(new Object[][]{
                     {MediaFormat.MIMETYPE_VIDEO_MPEG2, new String[]{
                             "bbb_cif_768kbps_30fps_mpeg2_stereo_48kHz_192kbps_mp3.mp4",
-                            "bbb_cif_768kbps_30fps_mpeg2.mkv",}},
+                            "bbb_cif_768kbps_30fps_mpeg2.mkv",
+                            /* TODO(b/162919907)
+                            "bbb_cif_768kbps_30fps_mpeg2.vob",*/
+                            /* TODO(b/162715861)
+                            "bbb_cif_768kbps_30fps_mpeg2.ts" */}},
                     {MediaFormat.MIMETYPE_VIDEO_H263, new String[]{
                             "bbb_cif_768kbps_30fps_h263.mp4",
+                            "bbb_cif_768kbps_30fps_h263_stereo_48kHz_192kbps_flac.mkv",
                             "bbb_cif_768kbps_30fps_h263_mono_8kHz_12kbps_amrnb.3gp",}},
                     {MediaFormat.MIMETYPE_VIDEO_MPEG4, new String[]{
+                            "bbb_cif_768kbps_30fps_mpeg4.mkv",
                             "bbb_cif_768kbps_30fps_mpeg4_stereo_48kHz_192kbps_flac.mp4",
                             "bbb_cif_768kbps_30fps_mpeg4_mono_16kHz_20kbps_amrwb.3gp",}},
                     {MediaFormat.MIMETYPE_VIDEO_AVC, new String[]{
                             "bbb_cif_768kbps_30fps_avc_stereo_48kHz_192kbps_vorbis.mp4",
                             "bbb_cif_768kbps_30fps_avc_stereo_48kHz_192kbps_aac.mkv",
-                            "bbb_cif_768kbps_30fps_avc_stereo_48kHz_192kbps_aac.3gp",}},
+                            "bbb_cif_768kbps_30fps_avc_stereo_48kHz_192kbps_aac.3gp",
+                            /* TODO(b/162715861)
+                            "bbb_cif_768kbps_30fps_avc.ts",*/}},
                     {MediaFormat.MIMETYPE_VIDEO_HEVC, new String[]{
                             "bbb_cif_768kbps_30fps_hevc_stereo_48kHz_192kbps_opus.mp4",
                             "bbb_cif_768kbps_30fps_hevc_stereo_48kHz_192kbps_mp3.mkv",}},
@@ -667,7 +818,8 @@
                     {MediaFormat.MIMETYPE_AUDIO_AAC, new String[]{
                             "bbb_stereo_48kHz_192kbps_aac.mp4",
                             "bbb_cif_768kbps_30fps_avc_stereo_48kHz_192kbps_aac.3gp",
-                            "bbb_cif_768kbps_30fps_avc_stereo_48kHz_192kbps_aac.mkv",}},
+                            "bbb_cif_768kbps_30fps_avc_stereo_48kHz_192kbps_aac.mkv",
+                            "bbb_stereo_48kHz_128kbps_aac.ts",}},
                     {MediaFormat.MIMETYPE_AUDIO_AMR_NB, new String[]{
                             "bbb_cif_768kbps_30fps_h263_mono_8kHz_12kbps_amrnb.3gp",
                             "bbb_mono_8kHz_12kbps_amrnb.amr",}},
@@ -677,6 +829,18 @@
                     {MediaFormat.MIMETYPE_AUDIO_FLAC, new String[]{
                             "bbb_cif_768kbps_30fps_mpeg4_stereo_48kHz_192kbps_flac.mp4",
                             "bbb_cif_768kbps_30fps_h263_stereo_48kHz_192kbps_flac.mkv",}},
+                    {MediaFormat.MIMETYPE_AUDIO_RAW, new String[]{
+                            "bbb_stereo_48kHz_192kbps_flac.flac",}},
+                    {MediaFormat.MIMETYPE_AUDIO_RAW, new String[]{"canon.mid",}},
+                    {MediaFormat.MIMETYPE_AUDIO_AC3, new String[]{
+                            "testac3mp4.mp4", "testac3ts.ts",}},
+                    {MediaFormat.MIMETYPE_AUDIO_AC4, new String[]{"multi0.mp4", "multi0.ts",}},
+                    {MediaFormat.MIMETYPE_AUDIO_EAC3, new String[]{
+                            "testeac3mp4.mp4", "testeac3ts.ts",}},
+                    {MediaFormat.MIMETYPE_AUDIO_RAW, new String[]{"bbb_1ch_16kHz.wav",}},
+                    {MediaFormat.MIMETYPE_AUDIO_G711_ALAW, new String[]{"bbb_2ch_8kHz_alaw.wav",}},
+                    {MediaFormat.MIMETYPE_AUDIO_G711_MLAW, new String[]{"bbb_2ch_8kHz_mulaw.wav",}},
+                    {MediaFormat.MIMETYPE_AUDIO_MSGSM, new String[]{"bbb_1ch_8kHz_gsm.wav",}},
             });
         }
 
@@ -852,6 +1016,16 @@
             return errCnt;
         }
 
+        private boolean isFileSeekable(String srcFile) throws IOException {
+            MediaExtractor ext = new MediaExtractor();
+            ext.setDataSource(mInpPrefix + srcFile);
+            String format = ext.getMetrics().getString(MediaExtractor.MetricsConstants.FORMAT);
+            ext.release();
+            // MPEG2TS and MPEG2PS files are non-seekable
+            return !(format.equalsIgnoreCase("MPEG2TSExtractor") ||
+                    format.equalsIgnoreCase("MPEG2PSExtractor"));
+        }
+
         /**
          * Audio, Video codecs support a variety of file-types/container formats. For example,
          * Vorbis supports OGG, MP4, WEBM and MKV. H.263 supports 3GPP, WEBM and MKV. For every
@@ -863,13 +1037,20 @@
         @Test
         public void testExtract() throws IOException {
             assumeTrue(shouldRunTest(mMime));
-            assertTrue(mSrcFiles.length > 1);
+            MediaExtractor refExtractor = new MediaExtractor();
+            refExtractor.setDataSource(mInpPrefix + mSrcFiles[0]);
+            long sdkChecksum = readAllData(refExtractor, mMime, Integer.MAX_VALUE);
+            long ndkChecksum = nativeReadAllData(mInpPrefix + mSrcFiles[0], mMime,
+                    Integer.MAX_VALUE, null, null, false);
+            assertEquals("SDK and NDK checksums mismatch", sdkChecksum, ndkChecksum);
+            if (mSrcFiles.length == 1) {
+                refExtractor.release();
+                return;
+            }
             assumeTrue("TODO(b/146925481)", !mMime.equals(MediaFormat.MIMETYPE_AUDIO_VORBIS));
             assumeTrue("TODO(b/146925481)", !mMime.equals(MediaFormat.MIMETYPE_AUDIO_OPUS));
             assumeTrue("TODO(b/146925481)", !mMime.equals(MediaFormat.MIMETYPE_AUDIO_MPEG));
             assumeTrue("TODO(b/146925481)", !mMime.equals(MediaFormat.MIMETYPE_AUDIO_AAC));
-            MediaExtractor refExtractor = new MediaExtractor();
-            refExtractor.setDataSource(mInpPrefix + mSrcFiles[0]);
             boolean isOk = true;
             for (int i = 1; i < mSrcFiles.length && isOk; i++) {
                 MediaExtractor testExtractor = new MediaExtractor();
@@ -897,9 +1078,10 @@
         @Test
         @Ignore("TODO(b/146420831)")
         public void testSeek() throws IOException {
-            assumeTrue(shouldRunTest(mMime));
+            assumeTrue(shouldRunTest(mMime) && !mMime.equals(MediaFormat.MIMETYPE_AUDIO_RAW));
             boolean isOk = true;
             for (String srcFile : mSrcFiles) {
+                if (!isFileSeekable(srcFile)) continue;
                 ArrayList<SeekTestParams> seekTestArgs =
                         generateSeekTestArgs(srcFile, mMime, false);
                 assertTrue("Mime is null.", seekTestArgs != null);
@@ -929,6 +1111,7 @@
             assumeTrue(shouldRunTest(mMime));
             boolean isOk = true;
             for (String srcFile : mSrcFiles) {
+                if (!isFileSeekable(srcFile)) continue;
                 ArrayList<SeekTestParams> seekTestArgs = generateSeekTestArgs(srcFile, mMime, true);
                 assertTrue("Mime is null.", seekTestArgs != null);
                 assertTrue("No samples found.", !seekTestArgs.isEmpty());
@@ -961,6 +1144,7 @@
             assumeTrue("TODO(b/146925481)", !mMime.equals(MediaFormat.MIMETYPE_AUDIO_AAC));
             boolean isOk = true;
             for (String srcFile : mSrcFiles) {
+                if (!isFileSeekable(srcFile)) continue;
                 MediaExtractor extractor = new MediaExtractor();
                 extractor.setDataSource(mInpPrefix + srcFile);
                 MediaCodec.BufferInfo sampleInfoAtZero = new MediaCodec.BufferInfo();
@@ -1039,7 +1223,7 @@
         @Test
         public void testExtractNative() {
             assumeTrue(shouldRunTest(mMime));
-            assertTrue(mSrcFiles.length > 1);
+            if (mSrcFiles.length == 1) return;
             assumeTrue("TODO(b/146925481)", !mMime.equals(MediaFormat.MIMETYPE_AUDIO_VORBIS));
             assumeTrue("TODO(b/146925481)", !mMime.equals(MediaFormat.MIMETYPE_AUDIO_OPUS));
             assumeTrue("TODO(b/146925481)", !mMime.equals(MediaFormat.MIMETYPE_AUDIO_MPEG));
@@ -1062,10 +1246,11 @@
         @LargeTest
         @Test
         @Ignore("TODO(b/146420831)")
-        public void testSeekNative() {
-            assumeTrue(shouldRunTest(mMime));
+        public void testSeekNative() throws IOException {
+            assumeTrue(shouldRunTest(mMime) && !mMime.equals(MediaFormat.MIMETYPE_AUDIO_RAW));
             boolean isOk = true;
             for (String srcFile : mSrcFiles) {
+                if (!isFileSeekable(srcFile)) continue;
                 if (!nativeTestSeek(mInpPrefix + srcFile, mMime)) {
                     if (!codecListSupp.contains(mMime)) {
                         isOk = false;
@@ -1078,10 +1263,11 @@
 
         @LargeTest
         @Test
-        public void testSeekFlakinessNative() {
+        public void testSeekFlakinessNative() throws IOException {
             assumeTrue(shouldRunTest(mMime));
             boolean isOk = true;
             for (String srcFile : mSrcFiles) {
+                if (!isFileSeekable(srcFile)) continue;
                 if (!nativeTestSeekFlakiness(mInpPrefix + srcFile, mMime)) {
                     if (!codecListSupp.contains(mMime)) {
                         isOk = false;
@@ -1094,13 +1280,14 @@
 
         @SmallTest
         @Test
-        public void testSeekToZeroNative() {
+        public void testSeekToZeroNative() throws IOException {
             assumeTrue(shouldRunTest(mMime));
             assumeTrue("TODO(b/146925481)", !mMime.equals(MediaFormat.MIMETYPE_AUDIO_VORBIS));
             assumeTrue("TODO(b/146925481)", !mMime.equals(MediaFormat.MIMETYPE_AUDIO_MPEG));
             assumeTrue("TODO(b/146925481)", !mMime.equals(MediaFormat.MIMETYPE_AUDIO_AAC));
             boolean isOk = true;
             for (String srcFile : mSrcFiles) {
+                if (!isFileSeekable(srcFile)) continue;
                 if (!nativeTestSeekToZero(mInpPrefix + srcFile, mMime)) {
                     if (!codecListSupp.contains(mMime)) {
                         isOk = false;
@@ -1121,7 +1308,434 @@
                     isOk = false;
                     break;
                 }
-                assertTrue(testName.getMethodName() + " failed for mime: " + mMime, isOk);
+            }
+            assertTrue(testName.getMethodName() + " failed for mime: " + mMime, isOk);
+        }
+    }
+
+    /**
+     * Encloses extractor test for validating extractor output for extractors which directly
+     * decode instead of extracting.
+     */
+    @RunWith(Parameterized.class)
+    public static class FusedExtractorDecoderTest {
+        private final String mMime;
+        private final String mRefFile;
+        private final String mTestFile;
+
+        public FusedExtractorDecoderTest(String mime, String refFile, String testFile) {
+            mMime = mime;
+            mRefFile = refFile;
+            mTestFile = testFile;
+        }
+
+        @Parameterized.Parameters(name = "{index}({0})")
+        public static Collection<Object[]> input() {
+            return Arrays.asList(new Object[][]{
+                    {MediaFormat.MIMETYPE_AUDIO_FLAC,
+                            "bbb_cif_768kbps_30fps_mpeg4_stereo_48kHz_192kbps_flac.mp4",
+                            "bbb_stereo_48kHz_192kbps_flac.flac"},
+                    /* TODO(b/163566531)
+                    {MediaFormat.MIMETYPE_AUDIO_RAW, "bbb_1ch_16kHz.mkv", "bbb_1ch_16kHz.wav"},*/
+            });
+        }
+
+        @LargeTest
+        @Test
+        public void testExtractDecodeAndValidate() throws IOException, InterruptedException {
+            MediaExtractor testExtractor = new MediaExtractor();
+            testExtractor.setDataSource(mInpPrefix + mTestFile);
+            MediaFormat format = testExtractor.getTrackFormat(0);
+            String mime = format.getString(MediaFormat.KEY_MIME);
+            if (mime.equals(MediaFormat.MIMETYPE_AUDIO_RAW)) {
+                ArrayList<String> listOfDecoders =
+                        CodecTestBase.selectCodecs(mMime, null, null, false);
+                assertTrue("no suitable codecs found for mime: " + mMime,
+                        !listOfDecoders.isEmpty());
+                CodecDecoderTestBase cdtb = new CodecDecoderTestBase(mMime, mRefFile);
+                cdtb.decodeToMemory(mRefFile, listOfDecoders.get(0), 0,
+                        MediaExtractor.SEEK_TO_CLOSEST_SYNC, Integer.MAX_VALUE);
+                String log = String.format("test file: %s, ref file: %s:: ", mTestFile, mRefFile);
+                assertTrue(log + "no output received", 0 != cdtb.mOutputCount);
+                final ByteBuffer refBuffer = cdtb.mOutputBuff.getBuffer();
+
+                testExtractor.selectTrack(0);
+                ByteBuffer testBuffer = ByteBuffer.allocate(refBuffer.limit());
+                int bufOffset = 0;
+                while (true) {
+                    long bytesRead = testExtractor.readSampleData(testBuffer, bufOffset);
+                    if (bytesRead == -1) break;
+                    bufOffset += bytesRead;
+                    testExtractor.advance();
+                }
+                testBuffer.rewind();
+                assertEquals(log + "Output mismatch", 0, refBuffer.compareTo(testBuffer));
+                assertTrue(log + "Output formats mismatch",
+                        cdtb.isFormatSimilar(cdtb.mOutFormat, format));
+            } else if (mime.equals(mMime)) {
+                MediaExtractor refExtractor = new MediaExtractor();
+                refExtractor.setDataSource(mInpPrefix + mRefFile);
+                if (!isMediaSimilar(refExtractor, testExtractor, mMime, Integer.MAX_VALUE)) {
+                    fail("Files: " + mRefFile + ", " + mTestFile +
+                            " are different from extractor perspective");
+                }
+                refExtractor.release();
+            } else {
+                fail("unexpected mime: " + mime);
+            }
+            testExtractor.release();
+        }
+    }
+
+    /**
+     * Test if extractor populates key-value pairs correctly
+     */
+    @RunWith(Parameterized.class)
+    public static class ValidateKeyValuePairs {
+        private static final String mInpPrefix = WorkDir.getMediaDirString();
+        private final String mMime;
+        private final String[] mInpFiles;
+        private final int mProfile;
+        private final int mLevel;
+        private final int mWR;
+        private final int mHCh;
+
+        public ValidateKeyValuePairs(String mime, String[] inpFiles, int profile, int level, int wr,
+                int hCh) {
+            mMime = mime;
+            mInpFiles = inpFiles;
+            mProfile = profile;
+            mLevel = level;
+            mWR = wr;
+            mHCh = hCh;
+        }
+
+        @Parameterized.Parameters(name = "{index}({0})")
+        public static Collection<Object[]> input() {
+            // mime, clips, profile, level, width/sample rate, height/channel count
+            List<Object[]> exhaustiveArgsList = new ArrayList<>();
+
+            if (hasDecoder(MediaFormat.MIMETYPE_VIDEO_MPEG2)) {
+                // profile and level constraints as per sec 2.3.2 of cdd
+                /* TODO(b/159582475)
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_MPEG2, new String[]{
+                        "bbb_1920x1080_mpeg2_main_high.mp4",
+                        "bbb_1920x1080_mpeg2_main_high.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.MPEG2ProfileMain,
+                        MediaCodecInfo.CodecProfileLevel.MPEG2LevelHL, 1920, 1080});*/
+            }
+
+            if (hasDecoder(MediaFormat.MIMETYPE_VIDEO_AVC)) {
+                // profile and level constraints as per sec 2.3.2 of cdd
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_AVC, new String[]{
+                        "bbb_1920x1080_avc_baseline_l42.mp4",
+                        "bbb_1920x1080_avc_baseline_l42.mkv",
+                        "bbb_1920x1080_avc_baseline_l42.3gp"},
+                        MediaCodecInfo.CodecProfileLevel.AVCProfileConstrainedBaseline,
+                        MediaCodecInfo.CodecProfileLevel.AVCLevel42, 1920, 1080});
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_AVC, new String[]{
+                        "bbb_1920x1080_avc_main_l42.mp4",
+                        "bbb_1920x1080_avc_main_l42.mkv",
+                        "bbb_1920x1080_avc_main_l42.3gp"},
+                        MediaCodecInfo.CodecProfileLevel.AVCProfileMain,
+                        MediaCodecInfo.CodecProfileLevel.AVCLevel42, 1920, 1080});
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_AVC, new String[]{
+                        "bbb_1920x1080_avc_high_l42.mp4",
+                        "bbb_1920x1080_avc_high_l42.mkv",
+                        "bbb_1920x1080_avc_high_l42.3gp"},
+                        MediaCodecInfo.CodecProfileLevel.AVCProfileHigh,
+                        MediaCodecInfo.CodecProfileLevel.AVCLevel42, 1920, 1080});
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_AVC, new String[]{
+                        "video_dovi_1920x1080_60fps_dvav_09.mp4"},
+                        MediaCodecInfo.CodecProfileLevel.AVCProfileHigh,
+                        MediaCodecInfo.CodecProfileLevel.AVCLevel42, 1920, 1080});
+                // profile/level constraints for avc as per sec 5.3.4 of cdd
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_AVC, new String[]{
+                        "bbb_1920x1080_avc_baseline_l40.mp4",
+                        "bbb_1920x1080_avc_baseline_l40.mkv",
+                        "bbb_1920x1080_avc_baseline_l40.3gp"},
+                        MediaCodecInfo.CodecProfileLevel.AVCProfileConstrainedBaseline,
+                        MediaCodecInfo.CodecProfileLevel.AVCLevel4, 1920, 1080});
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_AVC, new String[]{
+                        "bbb_1920x1080_avc_main_l40.mp4",
+                        "bbb_1920x1080_avc_main_l40.mkv",
+                        "bbb_1920x1080_avc_main_l40.3gp"},
+                        MediaCodecInfo.CodecProfileLevel.AVCProfileMain,
+                        MediaCodecInfo.CodecProfileLevel.AVCLevel4, 1920, 1080});
+            }
+
+            if (hasDecoder(MediaFormat.MIMETYPE_VIDEO_HEVC)) {
+                // profile and level constraints as per sec 2.3.2 of cdd
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_HEVC, new String[]{
+                        "bbb_1920x1080_hevc_main_l41.mp4",
+                        "bbb_1920x1080_hevc_main_l41.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.HEVCProfileMain,
+                        MediaCodecInfo.CodecProfileLevel.HEVCMainTierLevel41, 1920, 1080});
+                // profile/level constraints for hevc as per sec 5.3.5 of cdd
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_HEVC, new String[]{
+                        "bbb_1920x1080_hevc_main_l40.mp4",
+                        "bbb_1920x1080_hevc_main_l40.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.HEVCProfileMain,
+                        MediaCodecInfo.CodecProfileLevel.HEVCMainTierLevel4, 1920, 1080});
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_HEVC, new String[]{
+                        "video_dovi_1920x1080_30fps_dvhe_04.mp4"},
+                        MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10,
+                        MediaCodecInfo.CodecProfileLevel.HEVCMainTierLevel4, 1920, 1080});
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_HEVC, new String[]{
+                        "video_dovi_1920x1080_60fps_dvhe_08.mp4"},
+                        MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10,
+                        MediaCodecInfo.CodecProfileLevel.HEVCMainTierLevel41, 1920, 1080});
+            }
+
+            if (hasDecoder(MediaFormat.MIMETYPE_VIDEO_VP9)) {
+                // profile and level constraints as per sec 2.3.2 of cdd
+                /* TODO(b/159582475)
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_VP9, new String[]{
+                        "bbb_1920x1080_vp9_main_l41.webm",
+                        "bbb_1920x1080_vp9_main_l41.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.VP9Profile0,
+                        MediaCodecInfo.CodecProfileLevel.VP9Level41, 1920, 1080});*/
+                // profile/level constraints for vp9 as per sec 5.3.6 of cdd
+                /* TODO(b/159582475)
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_VP9, new String[]{
+                        "bbb_1920x1080_vp9_main_l40.webm",
+                        "bbb_1920x1080_vp9_main_l40.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.VP9Profile0,
+                        MediaCodecInfo.CodecProfileLevel.VP9Level4, 1920, 1080});*/
+            }
+
+            if (hasDecoder(MediaFormat.MIMETYPE_VIDEO_H263)) {
+                // profile/level constraints for h263 as per sec 5.3.2 of cdd
+                /* TODO(b/159582475)
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_H263, new String[]{
+                        "bbb_352x288_384kbps_30fps_h263_baseline_l3.3gp",
+                        "bbb_352x288_384kbps_30fps_h263_baseline_l3.mp4",
+                        "bbb_352x288_384kbps_30fps_h263_baseline_l3.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.H263ProfileBaseline,
+                        MediaCodecInfo.CodecProfileLevel.H263Level30, 352, 288});*/
+            }
+
+            if (hasDecoder(MediaFormat.MIMETYPE_VIDEO_MPEG4)) {
+                // profile/level constraints for mpeg4 as per sec 5.3.3 of cdd
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_MPEG4, new String[]{
+                        "bbb_352x288_384kbps_30fps_mpeg4_simple_l3.mp4",
+                        "bbb_352x288_384kbps_30fps_mpeg4_simple_l3.3gp",
+                        "bbb_352x288_384kbps_30fps_mpeg4_simple_l3.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.MPEG4ProfileSimple,
+                        MediaCodecInfo.CodecProfileLevel.MPEG4Level3, 352, 288});
+            }
+
+            if (hasDecoder(MediaFormat.MIMETYPE_AUDIO_AAC)) {
+                // profile and level constraints for devices that have audio output as per sec 2.2.2,
+                // sec 2.3.2, sec 2.5.2, sec 5.1.2 of cdd
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_AUDIO_AAC, new String[]{
+                        "bbb_stereo_44kHz_192kbps_aac_lc.mp4",
+                        "bbb_stereo_44kHz_192kbps_aac_lc.3gp",
+                        "bbb_stereo_44kHz_192kbps_aac_lc.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.AACObjectLC, 0, 44100, 2});
+                /* TODO(b/159582475)
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_AUDIO_AAC, new String[]{
+                        "bbb_stereo_44kHz_192kbps_aac_he.mp4",
+                        "bbb_stereo_44kHz_192kbps_aac_he.3gp",
+                        "bbb_stereo_44kHz_192kbps_aac_he.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.AACObjectHE, 0, 44100, 2});*/
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_AUDIO_AAC, new String[] {
+                        "bbb_stereo_44kHz_192kbps_aac_eld.mp4",
+                        "bbb_stereo_44kHz_192kbps_aac_eld.3gp",
+                        "bbb_stereo_44kHz_192kbps_aac_eld.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.AACObjectELD, 0, 44100, 2});
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_AUDIO_AAC, new String[]{
+                        "bbb_stereo_44kHz_192kbps_aac_ld.mp4",
+                        "bbb_stereo_44kHz_192kbps_aac_ld.3gp",
+                        "bbb_stereo_44kHz_192kbps_aac_ld.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.AACObjectLD, 0, 44100, 2});
+                /*TODO(b/159582475)
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_AUDIO_AAC, new String[]{
+                        "bbb_stereo_44kHz_192kbps_aac_hev2.mp4",
+                        "bbb_stereo_44kHz_192kbps_aac_hev2.3gp",
+                        "bbb_stereo_44kHz_192kbps_aac_hev2.mkv"},
+                        MediaCodecInfo.CodecProfileLevel.AACObjectHE_PS, 0, 44100, 2});*/
+            }
+
+            // Miscellaneous
+            if (hasDecoder(MediaFormat.MIMETYPE_VIDEO_DOLBY_VISION)) {
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_DOLBY_VISION,
+                        new String[]{"video_dovi_1920x1080_30fps_dvhe_04.mp4"},
+                        MediaCodecInfo.CodecProfileLevel.DolbyVisionProfileDvheDtr,
+                        MediaCodecInfo.CodecProfileLevel.DolbyVisionLevelFhd30, 1920, 1080});
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_DOLBY_VISION,
+                        new String[]{"video_dovi_1920x1080_60fps_dvhe_05.mp4"},
+                        MediaCodecInfo.CodecProfileLevel.DolbyVisionProfileDvheStn,
+                        MediaCodecInfo.CodecProfileLevel.DolbyVisionLevelFhd60, 1920, 1080});
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_DOLBY_VISION,
+                        new String[]{"video_dovi_1920x1080_60fps_dvhe_08.mp4"},
+                        MediaCodecInfo.CodecProfileLevel.DolbyVisionProfileDvheSt,
+                        MediaCodecInfo.CodecProfileLevel.DolbyVisionLevelFhd60, 1920, 1080});
+                exhaustiveArgsList.add(new Object[]{MediaFormat.MIMETYPE_VIDEO_DOLBY_VISION,
+                        new String[]{"video_dovi_1920x1080_60fps_dvav_09.mp4"},
+                        MediaCodecInfo.CodecProfileLevel.DolbyVisionProfileDvavSe,
+                        MediaCodecInfo.CodecProfileLevel.DolbyVisionLevelFhd60, 1920, 1080});
+            }
+
+            return exhaustiveArgsList;
+        }
+
+        @Test
+        public void validateKeyValuePairs() throws IOException {
+            for (String file : mInpFiles) {
+                MediaFormat format = null;
+                MediaExtractor extractor = new MediaExtractor();
+                extractor.setDataSource(mInpPrefix + file);
+                for (int trackID = 0; trackID < extractor.getTrackCount(); trackID++) {
+                    MediaFormat fmt = extractor.getTrackFormat(trackID);
+                    if (mMime.equalsIgnoreCase(fmt.getString(MediaFormat.KEY_MIME))) {
+                        format = fmt;
+                        break;
+                    }
+                }
+                extractor.release();
+                assertTrue(format != null);
+                if (mMime.equals(MediaFormat.MIMETYPE_AUDIO_AAC)) {
+                    assertTrue(format.containsKey(MediaFormat.KEY_AAC_PROFILE) ||
+                            format.containsKey(MediaFormat.KEY_PROFILE));
+                    if (format.containsKey(MediaFormat.KEY_AAC_PROFILE)) {
+                        assertEquals(mProfile, format.getInteger(MediaFormat.KEY_AAC_PROFILE));
+                    }
+                    if (format.containsKey(MediaFormat.KEY_PROFILE)) {
+                        assertEquals(mProfile, format.getInteger(MediaFormat.KEY_PROFILE));
+                    }
+                } else {
+                    assertEquals(mProfile, format.getInteger(MediaFormat.KEY_PROFILE));
+                    assertEquals(mLevel, format.getInteger(MediaFormat.KEY_LEVEL));
+                }
+                if (mMime.startsWith("audio/")) {
+                    assertEquals(mWR, format.getInteger(MediaFormat.KEY_SAMPLE_RATE));
+                    assertEquals(mHCh, format.getInteger(MediaFormat.KEY_CHANNEL_COUNT));
+                } else if (mMime.startsWith("video/")) {
+                    assertEquals(mWR, format.getInteger(MediaFormat.KEY_WIDTH));
+                    assertEquals(mHCh, format.getInteger(MediaFormat.KEY_HEIGHT));
+                }
+            }
+        }
+    }
+
+    /**
+     * Makes sure if PTS(order) of a file matches the expected values in the corresponding text
+     * file with just PTS values.
+     */
+    @RunWith(Parameterized.class)
+    public static class ExtractorTimeStampTest {
+        private final String mRefFile;
+        private final String mPTSListFile;
+        private int mTrackIndex;
+        // Allowing tolerance of +1/-1 for rounding error.
+        private static final int PTS_TOLERANCE = 1;
+
+        public ExtractorTimeStampTest(String refFile, String textFile, int trackIndex) {
+            mRefFile = refFile;
+            mPTSListFile = textFile;
+            mTrackIndex = trackIndex;
+        }
+
+        @Parameterized.Parameters
+        public static Collection<Object[]> input() {
+            final List<Object[]> exhaustiveArgsList = Arrays.asList(new Object[][]{
+                    {"bbb_384x216_768kbps_30fps_avc_2b.mp4",
+                            "pts_bbb_384x216_768kbps_30fps_avc_2b.txt", 0},
+                    {"bbb_384x216_768kbps_25fps_avc_7b.mp4",
+                            "pts_bbb_384x216_768kbps_25fps_avc_7b.txt", 0},
+                    {"bbb_384x216_768kbps_24fps_avc_5b.mkv",
+                            "pts_bbb_384x216_768kbps_24fps_avc_5b.txt", 0},
+                    {"bbb_384x216_768kbps_30fps_avc_badapt.mkv",
+                            "pts_bbb_384x216_768kbps_30fps_avc_badapt.txt", 0},
+                    {"bbb_384x216_768kbps_30fps_avc_2b.3gp",
+                            "pts_bbb_384x216_768kbps_30fps_avc_2b.txt", 0},
+                    {"bbb_384x216_768kbps_25fps_avc_7b.3gp",
+                            "pts_bbb_384x216_768kbps_25fps_avc_7b.txt", 0},
+                    {"bbb_384x216_768kbps_30fps_avc_badapt_bbb_480x360_768kbps_24fps_avc_5b.mkv",
+                            "pts_bbb_384x216_768kbps_30fps_avc_badapt.txt", 0},
+                    {"bbb_384x216_768kbps_30fps_avc_badapt_bbb_480x360_768kbps_24fps_avc_5b.mkv",
+                            "pts_bbb_480x360_768kbps_24fps_avc_5b.txt", 1},
+                    {"bbb_384x216_768kbps_30fps_avc_2b_bbb_cif_768kbps_25fps_avc_7b.mp4",
+                            "pts_bbb_384x216_768kbps_30fps_avc_2b.txt", 0},
+                    {"bbb_384x216_768kbps_30fps_avc_2b_bbb_cif_768kbps_25fps_avc_7b.mp4",
+                            "pts_bbb_cif_768kbps_25fps_avc_7b.txt", 1},
+                    {"bbb_384x216_768kbps_30fps_hevc_2b.mp4",
+                            "pts_bbb_384x216_768kbps_30fps_hevc_2b.txt", 0},
+                    {"bbb_384x216_768kbps_25fps_hevc_7b.mp4",
+                            "pts_bbb_384x216_768kbps_25fps_hevc_7b.txt", 0},
+                    {"bbb_384x216_768kbps_24fps_hevc_5b.mkv",
+                            "pts_bbb_384x216_768kbps_24fps_hevc_5b.txt", 0},
+                    {"bbb_384x216_768kbps_30fps_hevc_badapt.mkv",
+                            "pts_bbb_384x216_768kbps_30fps_hevc_badapt.txt", 0},
+                    {"bbb_384x216_768kbps_30fps_hevc_badapt_bbb_480x360_768kbps_24fps_hevc_5b.mkv",
+                            "pts_bbb_384x216_768kbps_30fps_hevc_badapt.txt", 0},
+                    {"bbb_384x216_768kbps_30fps_hevc_badapt_bbb_480x360_768kbps_24fps_hevc_5b.mkv",
+                            "pts_bbb_480x360_768kbps_24fps_hevc_5b.txt", 1},
+                    {"bbb_384x216_768kbps_30fps_hevc_2b_bbb_cif_768kbps_25fps_hevc_7b.mp4",
+                            "pts_bbb_384x216_768kbps_30fps_hevc_2b.txt", 0},
+                    {"bbb_384x216_768kbps_30fps_hevc_2b_bbb_cif_768kbps_25fps_hevc_7b.mp4",
+                            "pts_bbb_cif_768kbps_25fps_hevc_7b.txt", 1},
+                    {"bbb_384x216_768kbps_30fps_mpeg2_2b.mp4",
+                            "pts_bbb_384x216_768kbps_30fps_mpeg2_2b.txt", 0},
+                    {"bbb_384x216_768kbps_25fps_mpeg2_5b.mp4",
+                            "pts_bbb_384x216_768kbps_25fps_mpeg2_5b.txt", 0},
+                    {"bbb_384x216_768kbps_24fps_mpeg2_5b.mkv",
+                            "pts_bbb_384x216_768kbps_24fps_mpeg2_5b.txt", 0},
+                    {"bbb_384x216_768kbps_30fps_mpeg2_2b.ts",
+                            "pts_bbb_384x216_768kbps_30fps_mpeg2_2b.txt", 0},
+                    {"bbb_384x216_768kbps_25fps_mpeg2_7b.ts",
+                            "pts_bbb_384x216_768kbps_25fps_mpeg2_7b.txt", 0},
+                    {"bbb_cif_768kbps_30fps_vp8_stereo_48kHz_192kbps_vorbis.webm",
+                            "pts_bbb_cif_768kbps_30fps_vp8.txt", 0},
+                    {"bbb_cif_768kbps_30fps_vp8_stereo_48kHz_192kbps_vorbis.mkv",
+                            "pts_bbb_cif_768kbps_30fps_vp8.txt", 0},
+                    {"bbb_cif_768kbps_30fps_vp8_stereo_48kHz_192kbps_vorbis.webm",
+                            "pts_stereo_48kHz_192kbps_vorbis.txt", 1},
+                    {"bbb_cif_768kbps_30fps_vp8_stereo_48kHz_192kbps_vorbis.mkv",
+                            "pts_stereo_48kHz_192kbps_vorbis.txt", 1},
+                    {"bbb_340x280_768kbps_30fps_split_non_display_frame_vp9.webm",
+                            "pts_bbb_340x280_768kbps_30fps_split_non_display_frame_vp9.txt", 0},
+                    {"bbb_cif_768kbps_30fps_vp9_stereo_48kHz_192kbps_opus.webm",
+                            "pts_bbb_cif_768kbps_30fps_vp9.txt", 0},
+                    {"bbb_cif_768kbps_30fps_vp9_stereo_48kHz_192kbps_opus.mkv",
+                            "pts_bbb_cif_768kbps_30fps_vp9.txt", 0},
+                    {"bbb_cif_768kbps_30fps_av1.mp4",
+                            "pts_bbb_cif_768kbps_30fps_av1.txt", 0},
+                    {"bbb_cif_768kbps_30fps_av1.mkv",
+                            "pts_bbb_cif_768kbps_30fps_av1.txt", 0},
+                    {"bbb_cif_768kbps_30fps_av1.webm",
+                            "pts_bbb_cif_768kbps_30fps_av1.txt", 0},
+                    {"binary_counter_320x240_30fps_600frames.mp4",
+                            "pts_binary_counter_320x240_30fps_600frames.txt", 0},
+            });
+            return exhaustiveArgsList;
+        }
+
+        @LargeTest
+        @Test
+        public void testPresentationTimeStampsMatch() throws IOException {
+            try (FileInputStream file = new FileInputStream(mInpPrefix + mPTSListFile);
+                 InputStreamReader input = new InputStreamReader(file);
+                 Reader txtRdr = new BufferedReader(input)) {
+                StreamTokenizer strTok = new StreamTokenizer(txtRdr);
+                strTok.parseNumbers();
+
+                MediaExtractor extractor = new MediaExtractor();
+                extractor.setDataSource(mInpPrefix + mRefFile);
+                assertTrue(mTrackIndex < extractor.getTrackCount());
+                extractor.selectTrack(mTrackIndex);
+                while (true) {
+                    if (strTok.nextToken() == StreamTokenizer.TT_EOF) break;
+                    assertTrue("PTS mismatch exp/got: " + (long) strTok.nval + "/" +
+                                    extractor.getSampleTime(),
+                            Math.abs(extractor.getSampleTime() - (long) strTok.nval) <=
+                                    PTS_TOLERANCE);
+                    if (!extractor.advance()) break;
+                }
+                assertEquals(StreamTokenizer.TT_EOF, strTok.nextToken());
+                assertTrue(!extractor.advance());
+                extractor.release();
             }
         }
     }
diff --git a/tests/media/src/android/mediav2/cts/ExtractorUnitTest.java b/tests/media/src/android/mediav2/cts/ExtractorUnitTest.java
index cee70e0..8cc987e 100644
--- a/tests/media/src/android/mediav2/cts/ExtractorUnitTest.java
+++ b/tests/media/src/android/mediav2/cts/ExtractorUnitTest.java
@@ -681,23 +681,12 @@
         public void testIfInvalidDataSourceIsRejectedBySetDataSource() throws IOException {
             MediaExtractor extractor = new MediaExtractor();
             TestMediaDataSource dataSource =
-                    TestMediaDataSource.fromString(mInpPrefix + mInpMedia, true, false);
+                    TestMediaDataSource.fromString(mInpPrefix + mInpMedia, false, true);
             try {
-                try {
-                    extractor.setDataSource(dataSource);
-                    fail("setDataSource succeeds with malformed media data source");
-                } catch (Exception e) {
-                    // expected
-                }
-                assertTrue(dataSource.isClosed());
-                dataSource = TestMediaDataSource.fromString(mInpPrefix + mInpMedia, false, true);
-
-                try {
-                    extractor.setDataSource(dataSource);
-                    fail("setDataSource succeeds with malformed media data source");
-                } catch (Exception e) {
-                    // expected
-                }
+                extractor.setDataSource(dataSource);
+                fail("setDataSource succeeds with malformed media data source");
+            } catch (Exception e) {
+                // expected
             } finally {
                 assertTrue(dataSource.isClosed());
                 extractor.release();
diff --git a/tests/media/src/android/mediav2/cts/MuxerTest.java b/tests/media/src/android/mediav2/cts/MuxerTest.java
index 4bad587..dd5f795 100644
--- a/tests/media/src/android/mediav2/cts/MuxerTest.java
+++ b/tests/media/src/android/mediav2/cts/MuxerTest.java
@@ -262,9 +262,16 @@
         return mTrackCount;
     }
 
-    // offset pts of samples from index sampleOffset till the end by tsOffset
-    void offsetTimeStamp(int trackID, long tsOffset, int sampleOffset) {
-        if (trackID < mTrackCount) {
+    // offset pts of samples from index sampleOffset till the end by tsOffset for each audio and
+    // video track
+    void offsetTimeStamp(long tsAudioOffset, long tsVideoOffset, int sampleOffset) {
+        for (int trackID = 0; trackID < mTrackCount; trackID++) {
+            long tsOffset = 0;
+            if (mFormat.get(trackID).getString(MediaFormat.KEY_MIME).startsWith("video/")) {
+                tsOffset = tsVideoOffset;
+            } else if (mFormat.get(trackID).getString(MediaFormat.KEY_MIME).startsWith("audio/")) {
+                tsOffset = tsAudioOffset;
+            }
             for (int i = sampleOffset; i < mBufferInfo.get(trackID).size(); i++) {
                 MediaCodec.BufferInfo bufferInfo = mBufferInfo.get(trackID).get(i);
                 bufferInfo.presentationTimeUs += tsOffset;
@@ -289,7 +296,7 @@
                 MediaFormat thatFormat = that.mFormat.get(j);
                 String thatMime = thatFormat.getString(MediaFormat.KEY_MIME);
                 if (thisMime != null && thisMime.equals(thatMime)) {
-                    if (!ExtractorTest.isCSDIdentical(thisFormat, thatFormat)) continue;
+                    if (!ExtractorTest.isFormatSimilar(thisFormat, thatFormat)) continue;
                     if (mBufferInfo.get(i).size() == that.mBufferInfo.get(j).size()) {
                         long tolerance = thisMime.startsWith("video/") ? STTS_TOLERANCE_US : 0;
                         // TODO(b/157008437) - muxed file pts is +1us of target pts
@@ -357,6 +364,20 @@
     private static boolean[] muxSelector = new boolean[MUXER_OUTPUT_LAST + 1];
     private static HashMap<Integer, String> formatStringPair = new HashMap<>();
 
+    static final List<String> codecListforTypeMp4 =
+            Arrays.asList(MediaFormat.MIMETYPE_VIDEO_MPEG4, MediaFormat.MIMETYPE_VIDEO_H263,
+                    MediaFormat.MIMETYPE_VIDEO_AVC, MediaFormat.MIMETYPE_VIDEO_HEVC,
+                    MediaFormat.MIMETYPE_AUDIO_AAC);
+    static final List<String> codecListforTypeWebm =
+            Arrays.asList(MediaFormat.MIMETYPE_VIDEO_VP8, MediaFormat.MIMETYPE_VIDEO_VP9,
+                    MediaFormat.MIMETYPE_AUDIO_VORBIS, MediaFormat.MIMETYPE_AUDIO_OPUS);
+    static final List<String> codecListforType3gp =
+            Arrays.asList(MediaFormat.MIMETYPE_VIDEO_MPEG4, MediaFormat.MIMETYPE_VIDEO_H263,
+                    MediaFormat.MIMETYPE_VIDEO_AVC, MediaFormat.MIMETYPE_AUDIO_AAC,
+                    MediaFormat.MIMETYPE_AUDIO_AMR_NB, MediaFormat.MIMETYPE_AUDIO_AMR_WB);
+    static final List<String> codecListforTypeOgg =
+            Arrays.asList(MediaFormat.MIMETYPE_AUDIO_OPUS);
+
     static {
         android.os.Bundle args = InstrumentationRegistry.getArguments();
         final String defSel = "mp4;webm;3gp;ogg";
@@ -380,6 +401,20 @@
         return muxSelector[format];
     }
 
+    static boolean isCodecContainerPairValid(String mime, int format) {
+        boolean result = false;
+        if (format == MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4)
+            result = codecListforTypeMp4.contains(mime) || mime.startsWith("application/");
+        else if (format == MediaMuxer.OutputFormat.MUXER_OUTPUT_WEBM) {
+            return codecListforTypeWebm.contains(mime);
+        } else if (format == MediaMuxer.OutputFormat.MUXER_OUTPUT_3GPP) {
+            result = codecListforType3gp.contains(mime);
+        } else if (format == MediaMuxer.OutputFormat.MUXER_OUTPUT_OGG) {
+            result = codecListforTypeOgg.contains(mime);
+        }
+        return result;
+    }
+
     /**
      * Tests MediaMuxer API that are dependent on MediaMuxer.OutputFormat. setLocation,
      * setOrientationHint are dependent on the mime type and OutputFormat. Legality of these APIs
@@ -700,8 +735,8 @@
         public static Collection<Object[]> input() {
             return Arrays.asList(new Object[][]{
                     // audio, video are 3 sec
-                    {MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4, "bbb_cif_768kbps_30fps_mpeg4" +
-                            ".mkv", "bbb_stereo_48kHz_192kbps_aac.mp4", "mp4"},
+                    {MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4, "bbb_cif_768kbps_30fps_h263" +
+                            ".mp4", "bbb_stereo_48kHz_192kbps_aac.mp4", "mp4"},
                     {MediaMuxer.OutputFormat.MUXER_OUTPUT_WEBM, "bbb_cif_768kbps_30fps_vp9.mkv"
                             , "bbb_stereo_48kHz_192kbps_vorbis.ogg", "webm"},
                     {MediaMuxer.OutputFormat.MUXER_OUTPUT_3GPP, "bbb_cif_768kbps_30fps_h263.mp4"
@@ -716,8 +751,8 @@
                             , "bbb_mono_16kHz_20kbps_amrwb.amr", "3gpp"},
 
                     // audio 10 sec, video 3 sec
-                    {MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4, "bbb_cif_768kbps_30fps_mpeg4" +
-                            ".mkv", "bbb_stereo_48kHz_128kbps_aac.mp4", "mp4"},
+                    {MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4, "bbb_cif_768kbps_30fps_h263" +
+                            ".mp4", "bbb_stereo_48kHz_128kbps_aac.mp4", "mp4"},
                     {MediaMuxer.OutputFormat.MUXER_OUTPUT_WEBM, "bbb_cif_768kbps_30fps_vp9.mkv"
                             , "bbb_stereo_48kHz_128kbps_vorbis.ogg", "webm"},
                     {MediaMuxer.OutputFormat.MUXER_OUTPUT_3GPP, "bbb_cif_768kbps_30fps_h263.mp4"
@@ -740,7 +775,8 @@
             Assume.assumeTrue("TODO(b/146423022)",
                     mOutFormat != MediaMuxer.OutputFormat.MUXER_OUTPUT_WEBM);
             // number of times to repeat {mSrcFileA, mSrcFileB} in Output
-            final int[][] numTracks = {{2, 0}, {0, 2}, {1, 2}, {2, 1}};
+            // values should be in sync with nativeTestMultiTrack
+            final int[][] numTracks = {{2, 0}, {0, 2}, {1, 2}, {2, 1}, {2, 2}};
 
             MuxerTestHelper mediaInfoA = new MuxerTestHelper(mInpPathA);
             MuxerTestHelper mediaInfoB = new MuxerTestHelper(mInpPathB);
@@ -860,7 +896,9 @@
 
         @Test
         public void testOffsetPresentationTime() throws IOException {
-            final int OFFSET_TS = 111000;
+            // values sohuld be in sync with nativeTestOffsetPts
+            final long[] OFFSET_TS_AUDIO_US = {-23220L, 0L, 200000L, 400000L};
+            final long[] OFFSET_TS_VIDEO_US = {0L, 200000L, 400000L};
             Assume.assumeTrue(shouldRunTest(mOutFormat));
             Assume.assumeTrue("TODO(b/148978457)",
                     mOutFormat != MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
@@ -870,24 +908,27 @@
                     mOutFormat != MediaMuxer.OutputFormat.MUXER_OUTPUT_WEBM);
             Assume.assumeTrue("TODO(b/146421018)",
                     mOutFormat != MediaMuxer.OutputFormat.MUXER_OUTPUT_OGG);
-            assertTrue(OFFSET_TS > MuxerTestHelper.STTS_TOLERANCE_US);
             MuxerTestHelper mediaInfo = new MuxerTestHelper(mInpPath);
-            for (int trackID = 0; trackID < mediaInfo.getTrackCount(); trackID++) {
-                for (int i = 0; i < mOffsetIndices.length; i++) {
-                    mediaInfo.offsetTimeStamp(trackID, OFFSET_TS, mOffsetIndices[i]);
-                }
-                MediaMuxer muxer = new MediaMuxer(mOutPath, mOutFormat);
-                mediaInfo.muxMedia(muxer);
-                muxer.release();
-                MuxerTestHelper outInfo = new MuxerTestHelper(mOutPath);
-                if (!outInfo.isSubsetOf(mediaInfo)) {
-                    String msg = String.format(
-                            "testOffsetPresentationTime: inp: %s, fmt: %d, trackID %d", mSrcFile,
-                            mOutFormat, trackID);
-                    fail(msg + "error! output != input");
-                }
-                for (int i = mOffsetIndices.length - 1; i >= 0; i--) {
-                    mediaInfo.offsetTimeStamp(trackID, -OFFSET_TS, mOffsetIndices[i]);
+            for (long audioOffsetUs : OFFSET_TS_AUDIO_US) {
+                for (long videoOffsetUs : OFFSET_TS_VIDEO_US) {
+                    for (int i = 0; i < mOffsetIndices.length; i++) {
+                        mediaInfo.offsetTimeStamp(audioOffsetUs, videoOffsetUs, mOffsetIndices[i]);
+                    }
+                    MediaMuxer muxer = new MediaMuxer(mOutPath, mOutFormat);
+                    mediaInfo.muxMedia(muxer);
+                    muxer.release();
+                    MuxerTestHelper outInfo = new MuxerTestHelper(mOutPath);
+                    if (!outInfo.isSubsetOf(mediaInfo)) {
+                        String msg = String.format(
+                                "testOffsetPresentationTime: inp: %s, fmt: %d, audioOffsetUs %d, " +
+                                        "videoOffsetUs %d ",
+                                mSrcFile, mOutFormat, audioOffsetUs, videoOffsetUs);
+                        fail(msg + "error! output != input");
+                    }
+                    for (int i = mOffsetIndices.length - 1; i >= 0; i--) {
+                        mediaInfo.offsetTimeStamp(-audioOffsetUs, -videoOffsetUs,
+                                mOffsetIndices[i]);
+                    }
                 }
             }
         }
@@ -916,19 +957,6 @@
     @LargeTest
     @RunWith(Parameterized.class)
     public static class TestSimpleMux {
-        private final List<String> codecListforTypeMp4 =
-                Arrays.asList(MediaFormat.MIMETYPE_VIDEO_MPEG4, MediaFormat.MIMETYPE_VIDEO_H263,
-                        MediaFormat.MIMETYPE_VIDEO_AVC, MediaFormat.MIMETYPE_VIDEO_HEVC,
-                        MediaFormat.MIMETYPE_AUDIO_AAC);
-        private final List<String> codecListforTypeWebm =
-                Arrays.asList(MediaFormat.MIMETYPE_VIDEO_VP8, MediaFormat.MIMETYPE_VIDEO_VP9,
-                        MediaFormat.MIMETYPE_AUDIO_VORBIS, MediaFormat.MIMETYPE_AUDIO_OPUS);
-        private final List<String> codecListforType3gp =
-                Arrays.asList(MediaFormat.MIMETYPE_VIDEO_MPEG4, MediaFormat.MIMETYPE_VIDEO_H263,
-                        MediaFormat.MIMETYPE_VIDEO_AVC, MediaFormat.MIMETYPE_AUDIO_AAC,
-                        MediaFormat.MIMETYPE_AUDIO_AMR_NB, MediaFormat.MIMETYPE_AUDIO_AMR_WB);
-        private final List<String> codecListforTypeOgg =
-                Arrays.asList(MediaFormat.MIMETYPE_AUDIO_OPUS);
         private String mMime;
         private String mSrcFile;
         private String mInpPath;
@@ -954,20 +982,6 @@
             new File(mOutPath).delete();
         }
 
-        private boolean isCodecContainerPairValid(int format) {
-            boolean result = false;
-            if (format == MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4)
-                result = codecListforTypeMp4.contains(mMime) || mMime.startsWith("application/");
-            else if (format == MediaMuxer.OutputFormat.MUXER_OUTPUT_WEBM) {
-                return codecListforTypeWebm.contains(mMime);
-            } else if (format == MediaMuxer.OutputFormat.MUXER_OUTPUT_3GPP) {
-                result = codecListforType3gp.contains(mMime);
-            } else if (format == MediaMuxer.OutputFormat.MUXER_OUTPUT_OGG) {
-                result = codecListforTypeOgg.contains(mMime);
-            }
-            return result;
-        }
-
         private boolean doesCodecRequireCSD(String aMime) {
             return (aMime == MediaFormat.MIMETYPE_VIDEO_AVC ||
                     aMime == MediaFormat.MIMETYPE_VIDEO_HEVC ||
@@ -1036,7 +1050,7 @@
                         fail(msg + "error! output != clone(input)");
                     }
                 } catch (Exception e) {
-                    if (isCodecContainerPairValid(format)) {
+                    if (isCodecContainerPairValid(mMime, format)) {
                         fail(msg + "error! incompatible mime and output format");
                     }
                 } finally {
diff --git a/tests/media/src/android/mediav2/cts/WorkDir.java b/tests/media/src/android/mediav2/cts/WorkDir.java
index a5e635c..ee0339c 100644
--- a/tests/media/src/android/mediav2/cts/WorkDir.java
+++ b/tests/media/src/android/mediav2/cts/WorkDir.java
@@ -40,7 +40,7 @@
             // user has specified the mediaDirString via instrumentation-arg
             return mediaDirString + ((mediaDirString.endsWith("/")) ? "" : "/");
         } else {
-            return (getTopDirString() + "test/CtsMediaV2TestCases-1.2/");
+            return (getTopDirString() + "test/CtsMediaV2TestCases-1.9/");
         }
     }
 }
\ No newline at end of file
diff --git a/tests/mocking/Android.bp b/tests/mocking/Android.bp
index 1ff8e44..2c000b3 100644
--- a/tests/mocking/Android.bp
+++ b/tests/mocking/Android.bp
@@ -15,7 +15,7 @@
 android_test {
     name: "CtsMockingTestCases",
     defaults: ["cts_defaults"],
-    libs: ["android.test.runner.stubs"],
+    libs: ["android.test.runner"],
     static_libs: [
         "mockito-target",
         "androidx.test.rules",
@@ -24,7 +24,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/tests/mocking/debuggable/Android.bp b/tests/mocking/debuggable/Android.bp
index 9fd7383..aa8cda7 100644
--- a/tests/mocking/debuggable/Android.bp
+++ b/tests/mocking/debuggable/Android.bp
@@ -15,7 +15,7 @@
 android_test {
     name: "CtsMockingDebuggableTestCases",
     defaults: ["cts_defaults"],
-    libs: ["android.test.runner.stubs"],
+    libs: ["android.test.runner"],
     static_libs: [
         "mockito-target",
         "androidx.test.rules",
@@ -24,7 +24,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/tests/mocking/extended/Android.bp b/tests/mocking/extended/Android.bp
index d70d58c..da3a33c 100644
--- a/tests/mocking/extended/Android.bp
+++ b/tests/mocking/extended/Android.bp
@@ -18,7 +18,7 @@
 android_test_helper_app {
     name: "CtsExtendedMockingTestCases",
     defaults: ["cts_defaults"],
-    libs: ["android.test.runner.stubs"],
+    libs: ["android.test.runner"],
     static_libs: [
         "mockito-target-extended",
         "androidx.test.rules",
@@ -36,7 +36,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/tests/mocking/inline/Android.bp b/tests/mocking/inline/Android.bp
index 643b0a7..6a57df4 100644
--- a/tests/mocking/inline/Android.bp
+++ b/tests/mocking/inline/Android.bp
@@ -15,7 +15,7 @@
 android_test {
     name: "CtsInlineMockingTestCases",
     defaults: ["cts_defaults"],
-    libs: ["android.test.runner.stubs"],
+    libs: ["android.test.runner"],
     static_libs: [
         "mockito-target-inline",
         "androidx.test.rules",
@@ -31,7 +31,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/tests/netlegacy22.api/Android.mk b/tests/netlegacy22.api/Android.mk
index 852803f..53c910d 100644
--- a/tests/netlegacy22.api/Android.mk
+++ b/tests/netlegacy22.api/Android.mk
@@ -30,6 +30,6 @@
 LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner-axt compatibility-device-util-axt
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/netlegacy22.permission/Android.bp b/tests/netlegacy22.permission/Android.bp
index 778ada2..65948a6 100644
--- a/tests/netlegacy22.permission/Android.bp
+++ b/tests/netlegacy22.permission/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/netsecpolicy/Android.bp b/tests/netsecpolicy/Android.bp
index 42b3675..b54debb 100644
--- a/tests/netsecpolicy/Android.bp
+++ b/tests/netsecpolicy/Android.bp
@@ -18,7 +18,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
@@ -32,7 +31,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
@@ -46,7 +44,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/tests/openglperf2/Android.mk b/tests/openglperf2/Android.mk
index 98e5d01..a6de6c8 100644
--- a/tests/openglperf2/Android.mk
+++ b/tests/openglperf2/Android.mk
@@ -30,7 +30,7 @@
 LOCAL_PACKAGE_NAME := CtsOpenGlPerf2TestCases
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_SDK_VERSION := 16
 #LOCAL_MIN_SDK_VERSION := 16
diff --git a/tests/openglperf2/jni/Android.bp b/tests/openglperf2/jni/Android.bp
index ad48757..e6a3a9a 100644
--- a/tests/openglperf2/jni/Android.bp
+++ b/tests/openglperf2/jni/Android.bp
@@ -29,6 +29,8 @@
     // Get all cpp files but not hidden files
     srcs: ["**/*.cpp"],
 
+    header_libs: ["jni_headers"],
+
     shared_libs: [
         "libEGL",
         "libGLESv2",
diff --git a/tests/pdf/Android.bp b/tests/pdf/Android.bp
index 0a5fe52..66f91d5 100644
--- a/tests/pdf/Android.bp
+++ b/tests/pdf/Android.bp
@@ -16,7 +16,7 @@
     name: "CtsPdfTestCases",
     defaults: ["cts_defaults"],
     compile_multilib: "both",
-    libs: ["android.test.runner.stubs"],
+    libs: ["android.test.runner"],
     static_libs: [
         "androidx.test.rules",
         "mockito-target-minus-junit4",
@@ -29,7 +29,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/providerui/Android.bp b/tests/providerui/Android.bp
index 2da32b6..edc4bd0 100644
--- a/tests/providerui/Android.bp
+++ b/tests/providerui/Android.bp
@@ -16,8 +16,8 @@
     name: "CtsProviderUiTestCases",
     defaults: ["cts_defaults"],
     libs: [
-        "android.test.base.stubs",
-        "android.test.runner.stubs",
+        "android.test.base",
+        "android.test.runner",
     ],
     static_libs: [
         "compatibility-device-util-axt",
@@ -26,11 +26,11 @@
         "junit",
         "androidx.legacy_legacy-support-v4",
     ],
-    srcs: ["src/**/*.java"],
+    srcs: ["src/**/*.java",
+           ":CtsProviderTestUtils"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/providerui/src/android/providerui/cts/MediaStoreUiTest.java b/tests/providerui/src/android/providerui/cts/MediaStoreUiTest.java
index 1be5e10..6778b69 100644
--- a/tests/providerui/src/android/providerui/cts/MediaStoreUiTest.java
+++ b/tests/providerui/src/android/providerui/cts/MediaStoreUiTest.java
@@ -39,6 +39,7 @@
 import android.os.storage.StorageVolume;
 import android.os.UserManager;
 import android.provider.MediaStore;
+import android.provider.cts.ProviderTestUtils;
 import android.providerui.cts.GetResultActivity.Result;
 import android.support.test.uiautomator.By;
 import android.support.test.uiautomator.BySelector;
@@ -90,7 +91,7 @@
 
     @Parameters
     public static Iterable<? extends Object> data() {
-        return MediaStore.getExternalVolumeNames(InstrumentationRegistry.getTargetContext());
+        return ProviderTestUtils.getSharedVolumeNames();
     }
 
     @Before
diff --git a/tests/quickaccesswallet/Android.bp b/tests/quickaccesswallet/Android.bp
index f95bfbf..1572e69 100644
--- a/tests/quickaccesswallet/Android.bp
+++ b/tests/quickaccesswallet/Android.bp
@@ -28,8 +28,8 @@
         "compatibility-device-util-axt",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     // Tag this module as a cts test artifact
diff --git a/tests/sample/Android.bp b/tests/sample/Android.bp
index 1114672..d2c02da 100644
--- a/tests/sample/Android.bp
+++ b/tests/sample/Android.bp
@@ -26,14 +26,13 @@
         "androidx.test.rules",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/sample/src/android/sample/cts/SampleDeviceReportLogTest.java b/tests/sample/src/android/sample/cts/SampleDeviceReportLogTest.java
index a3a6bd1..a71fd97 100644
--- a/tests/sample/src/android/sample/cts/SampleDeviceReportLogTest.java
+++ b/tests/sample/src/android/sample/cts/SampleDeviceReportLogTest.java
@@ -25,7 +25,7 @@
 /**
  * A simple compatibility test which includes results in the report.
  *
- * This class has 3 dummy tests that create report logs and log dummy metrics.
+ * This class has 3 no-op tests that create report logs and log fake metrics.
  */
 public class SampleDeviceReportLogTest
         extends ActivityInstrumentationTestCase2<SampleDeviceActivity> {
diff --git a/tests/sensor/Android.mk b/tests/sensor/Android.mk
index 22cc4b1..d198b04 100644
--- a/tests/sensor/Android.mk
+++ b/tests/sensor/Android.mk
@@ -53,7 +53,7 @@
     jni/android_hardware_cts_SensorNativeTest.cpp \
     jni/nativeTestHelper.cpp
 
-LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
+LOCAL_HEADER_LIBRARIES := jni_headers
 
 LOCAL_SHARED_LIBRARIES := libandroid liblog
 
@@ -73,7 +73,7 @@
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 # include both the 32 and 64 bit versions
 LOCAL_MULTILIB := both
diff --git a/tests/sensor/src/android/hardware/cts/SensorParameterRangeTest.java b/tests/sensor/src/android/hardware/cts/SensorParameterRangeTest.java
index 921b0cc..be5d6d7 100644
--- a/tests/sensor/src/android/hardware/cts/SensorParameterRangeTest.java
+++ b/tests/sensor/src/android/hardware/cts/SensorParameterRangeTest.java
@@ -43,6 +43,7 @@
 
     private static final double ACCELEROMETER_MAX_RANGE = 4 * 9.80; // 4g - ε
     private static final double ACCELEROMETER_MAX_FREQUENCY = 50.0;
+    private static final double ACCELEROMETER_AUTOMOTIVE_MAX_FREQUENCY = 100.0;
     private static final double ACCELEROMETER_HIFI_MAX_RANGE = 8 * 9.80; // 8g - ε
     private static final double ACCELEROMETER_HIFI_MIN_FREQUENCY = 12.50;
     private static final double ACCELEROMETER_HIFI_MAX_FREQUENCY = 400.0;
@@ -50,13 +51,15 @@
 
     private static final double GYRO_MAX_RANGE = 1000 / 57.295 - 1.0; // 1000 degrees/sec - ε
     private static final double GYRO_MAX_FREQUENCY = 50.0;
+    private static final double GYRO_AUTOMOTIVE_MAX_RANGE = 250 / 57.295 - 1.0; // 250 degrees/sec - ε
+    private static final double GYRO_AUTOMOTIVE_MAX_FREQUENCY = 100.0;
     private static final double GYRO_HIFI_MAX_RANGE = 1000 / 57.295 - 1.0; // 1000 degrees/sec - ε
     private static final double GYRO_HIFI_MIN_FREQUENCY = 12.50;
     private static final double GYRO_HIFI_MAX_FREQUENCY = 400.0;
     private static final double GYRO_HIFI_MAX_FREQUENCY_BEFORE_N = 200.0;
 
     private static final double MAGNETOMETER_MAX_RANGE = 900.0;   // micro telsa
-    private static final double MAGNETOMETER_MAX_FREQUENCY = 50.0;
+    private static final double MAGNETOMETER_MAX_FREQUENCY = 10.0;
     private static final double MAGNETOMETER_HIFI_MAX_RANGE = 900.0;   // micro telsa
     private static final double MAGNETOMETER_HIFI_MIN_FREQUENCY = 5.0;
     private static final double MAGNETOMETER_HIFI_MAX_FREQUENCY = 50.0;
@@ -75,6 +78,7 @@
     private static final int PROXIMITY_SENSOR_MIN_FIFO_LENGTH = 100;
     private static final int STEP_DETECTOR_MIN_FIFO_LENGTH = 100;
 
+    private boolean mIsAutomotive;
     private boolean mHasHifiSensors;
     private boolean mHasProximitySensor;
     private boolean mVrModeHighPerformance;
@@ -84,6 +88,7 @@
     public void setUp() {
         PackageManager pm = getContext().getPackageManager();
         mSensorManager = (SensorManager) getContext().getSystemService(Context.SENSOR_SERVICE);
+        mIsAutomotive = pm.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE);
         mHasHifiSensors = pm.hasSystemFeature(PackageManager.FEATURE_HIFI_SENSORS);
         mHasProximitySensor = pm.hasSystemFeature(PackageManager.FEATURE_SENSOR_PROXIMITY);
         mVrModeHighPerformance = pm.hasSystemFeature(PackageManager.FEATURE_VR_MODE_HIGH_PERFORMANCE);
@@ -94,10 +99,14 @@
                 ACCELEROMETER_HIFI_MAX_FREQUENCY :
                 ACCELEROMETER_HIFI_MAX_FREQUENCY_BEFORE_N;
 
+        double accelerometerMaxFrequency = mIsAutomotive ?
+                ACCELEROMETER_AUTOMOTIVE_MAX_FREQUENCY :
+                ACCELEROMETER_MAX_FREQUENCY;
+
         checkSensorRangeAndFrequency(
                 Sensor.TYPE_ACCELEROMETER,
                 ACCELEROMETER_MAX_RANGE,
-                ACCELEROMETER_MAX_FREQUENCY,
+                accelerometerMaxFrequency,
                 ACCELEROMETER_HIFI_MAX_RANGE,
                 ACCELEROMETER_HIFI_MIN_FREQUENCY,
                 hifiMaxFrequency);
@@ -108,10 +117,19 @@
                 GYRO_HIFI_MAX_FREQUENCY :
                 GYRO_HIFI_MAX_FREQUENCY_BEFORE_N;
 
+        double gyroMaxRange = mIsAutomotive &&
+                ApiLevelUtil.isAtLeast(Build.VERSION_CODES.Q) ?
+                GYRO_AUTOMOTIVE_MAX_RANGE :
+                GYRO_MAX_RANGE;
+
+        double gyroMaxFrequency = mIsAutomotive ?
+                GYRO_AUTOMOTIVE_MAX_FREQUENCY :
+                GYRO_MAX_FREQUENCY;
+
         checkSensorRangeAndFrequency(
                 Sensor.TYPE_GYROSCOPE,
-                GYRO_MAX_RANGE,
-                GYRO_MAX_FREQUENCY,
+                gyroMaxRange,
+                gyroMaxFrequency,
                 GYRO_HIFI_MAX_RANGE,
                 GYRO_HIFI_MIN_FREQUENCY,
                 hifiMaxFrequency);
diff --git a/tests/signature/Android.mk b/tests/signature/Android.mk
deleted file mode 100644
index 94e082e..0000000
--- a/tests/signature/Android.mk
+++ /dev/null
@@ -1,16 +0,0 @@
-# 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.
-
-LOCAL_PATH:= $(call my-dir)
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/signature/TEST_MAPPING b/tests/signature/TEST_MAPPING
index 810f3f7..1217e0c 100644
--- a/tests/signature/TEST_MAPPING
+++ b/tests/signature/TEST_MAPPING
@@ -31,7 +31,7 @@
         "name": "CtsHiddenApiKillswitchDebugClassTestCases"
     },
     {
-        "name": "CtsHiddenApiKillswitchWhitelistTestCases"
+        "name": "CtsHiddenApiKillswitchSdklistTestCases"
     },
     {
         "name": "CtsHiddenApiKillswitchWildcardTestCases"
@@ -52,19 +52,19 @@
   ],
   "postsubmit": [
     {
-      "name": "CtsHiddenApiBlacklistApi27TestCases"
+      "name": "CtsHiddenApiBlocklistApi27TestCases"
     },
     {
-        "name": "CtsHiddenApiBlacklistApi28TestCases"
+        "name": "CtsHiddenApiBlocklistApi28TestCases"
     },
     {
-      "name": "CtsHiddenApiBlacklistCurrentApiTestCases"
+      "name": "CtsHiddenApiBlocklistCurrentApiTestCases"
     },
     {
-      "name": "CtsHiddenApiBlacklistTestApiTestCases"
+      "name": "CtsHiddenApiBlocklistTestApiTestCases"
     },
     {
-      "name": "CtsHiddenApiBlacklistDebugClassTestCases"
+      "name": "CtsHiddenApiBlocklistDebugClassTestCases"
     }
   ]
 }
diff --git a/tests/signature/api-check/Android.bp b/tests/signature/api-check/Android.bp
index ceb82a4..d4dfc5f 100644
--- a/tests/signature/api-check/Android.bp
+++ b/tests/signature/api-check/Android.bp
@@ -72,12 +72,20 @@
     filename: "hiddenapi-flags.csv",
 }
 
-// Defaults for hiddenapi blacklist checks.
+filegroup {
+    name: "cts-api-hiddenapi-filter-csv",
+    srcs: [
+        "hiddenapi-filter.csv",
+    ],
+}
+
+// Defaults for hiddenapi blocklist checks.
 java_defaults {
-    name: "hiddenapi-blacklist-check-defaults",
+    name: "hiddenapi-blocklist-check-defaults",
     defaults: ["signature-api-check-defaults"],
     java_resources: [
         ":cts-hiddenapi-flags-csv",
+        ":cts-api-hiddenapi-filter-csv"
     ],
     jni_libs: [
         "libcts_dexchecker",
diff --git a/tests/signature/api-check/Android.mk b/tests/signature/api-check/Android.mk
deleted file mode 100644
index 337f5b9..0000000
--- a/tests/signature/api-check/Android.mk
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright (C) 2017 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.
-
-LOCAL_PATH:= $(call my-dir)
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/signature/api-check/OWNERS b/tests/signature/api-check/OWNERS
index 9cedf986..c8305d1 100644
--- a/tests/signature/api-check/OWNERS
+++ b/tests/signature/api-check/OWNERS
@@ -1,8 +1,7 @@
 # Bug component: 24949
 platform-compat-eng+reviews@google.com
 andreionea@google.com
-atrost@google.com
 mathewi@google.com
 ngeoffray@google.com
 paulduffin@google.com
-satayev@google.com
\ No newline at end of file
+satayev@google.com
diff --git a/tests/signature/api-check/android-test-base-28-api/Android.bp b/tests/signature/api-check/android-test-base-28-api/Android.bp
index 31263b4..8717b17 100644
--- a/tests/signature/api-check/android-test-base-28-api/Android.bp
+++ b/tests/signature/api-check/android-test-base-28-api/Android.bp
@@ -25,7 +25,6 @@
     use_embedded_native_libs: false,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/signature/api-check/android-test-base-28-api/AndroidTest.xml b/tests/signature/api-check/android-test-base-28-api/AndroidTest.xml
index e048dc3..fb25987 100644
--- a/tests/signature/api-check/android-test-base-28-api/AndroidTest.xml
+++ b/tests/signature/api-check/android-test-base-28-api/AndroidTest.xml
@@ -29,5 +29,7 @@
         <option name="class" value="android.signature.cts.api.api28.test.SignatureTest" />
         <option name="instrumentation-arg" key="expected-api-files" value="android-test-base-current.api.gz" />
         <option name="runtime-hint" value="5s" />
+        <!-- Disable hidden API checks (http://b/171459260). -->
+        <option name="hidden-api-checks" value="false" />
     </test>
 </configuration>
diff --git a/tests/signature/api-check/android-test-base-current-api/Android.bp b/tests/signature/api-check/android-test-base-current-api/Android.bp
index 8ef01a1..52ed46b 100644
--- a/tests/signature/api-check/android-test-base-current-api/Android.bp
+++ b/tests/signature/api-check/android-test-base-current-api/Android.bp
@@ -24,7 +24,6 @@
     use_embedded_native_libs: false,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/signature/api-check/android-test-base-current-api/AndroidTest.xml b/tests/signature/api-check/android-test-base-current-api/AndroidTest.xml
index 30da659..442d96c 100644
--- a/tests/signature/api-check/android-test-base-current-api/AndroidTest.xml
+++ b/tests/signature/api-check/android-test-base-current-api/AndroidTest.xml
@@ -29,5 +29,7 @@
         <option name="class" value="android.signature.cts.api.current.test.SignatureTest" />
         <option name="instrumentation-arg" key="expected-api-files" value="android-test-base-current.api.gz" />
         <option name="runtime-hint" value="5s" />
+        <!-- Disable hidden API checks (http://b/171459260). -->
+        <option name="hidden-api-checks" value="false" />
     </test>
 </configuration>
diff --git a/tests/signature/api-check/android-test-mock-current-api/Android.bp b/tests/signature/api-check/android-test-mock-current-api/Android.bp
index 44c7a8a..d017870 100644
--- a/tests/signature/api-check/android-test-mock-current-api/Android.bp
+++ b/tests/signature/api-check/android-test-mock-current-api/Android.bp
@@ -24,7 +24,6 @@
     use_embedded_native_libs: false,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/signature/api-check/android-test-mock-current-api/AndroidTest.xml b/tests/signature/api-check/android-test-mock-current-api/AndroidTest.xml
index f8ab351..3b33934 100644
--- a/tests/signature/api-check/android-test-mock-current-api/AndroidTest.xml
+++ b/tests/signature/api-check/android-test-mock-current-api/AndroidTest.xml
@@ -29,5 +29,7 @@
         <option name="class" value="android.signature.cts.api.current.mock.SignatureTest" />
         <option name="instrumentation-arg" key="expected-api-files" value="android-test-mock-current.api.gz" />
         <option name="runtime-hint" value="5s" />
+        <!-- Disable hidden API checks (http://b/171459260). -->
+        <option name="hidden-api-checks" value="false" />
     </test>
 </configuration>
diff --git a/tests/signature/api-check/android-test-runner-current-api/Android.bp b/tests/signature/api-check/android-test-runner-current-api/Android.bp
index 80d2803..d8fdad2 100644
--- a/tests/signature/api-check/android-test-runner-current-api/Android.bp
+++ b/tests/signature/api-check/android-test-runner-current-api/Android.bp
@@ -26,7 +26,6 @@
     use_embedded_native_libs: false,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/signature/api-check/android-test-runner-current-api/AndroidTest.xml b/tests/signature/api-check/android-test-runner-current-api/AndroidTest.xml
index 5c18209..015caf0 100644
--- a/tests/signature/api-check/android-test-runner-current-api/AndroidTest.xml
+++ b/tests/signature/api-check/android-test-runner-current-api/AndroidTest.xml
@@ -29,5 +29,7 @@
         <option name="class" value="android.signature.cts.api.current.runner.SignatureTest" />
         <option name="instrumentation-arg" key="expected-api-files" value="android-test-base-current.api.gz,android-test-mock-current.api.gz,android-test-runner-current.api.gz" />
         <option name="runtime-hint" value="5s" />
+        <!-- Disable hidden API checks (http://b/171459260). -->
+        <option name="hidden-api-checks" value="false" />
     </test>
 </configuration>
diff --git a/tests/signature/api-check/apache-http-legacy-27-api/Android.bp b/tests/signature/api-check/apache-http-legacy-27-api/Android.bp
index d649145..aca1897 100644
--- a/tests/signature/api-check/apache-http-legacy-27-api/Android.bp
+++ b/tests/signature/api-check/apache-http-legacy-27-api/Android.bp
@@ -26,7 +26,6 @@
     use_embedded_native_libs: false,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/signature/api-check/apache-http-legacy-27-api/AndroidTest.xml b/tests/signature/api-check/apache-http-legacy-27-api/AndroidTest.xml
index ff5cff8..0fc1925 100644
--- a/tests/signature/api-check/apache-http-legacy-27-api/AndroidTest.xml
+++ b/tests/signature/api-check/apache-http-legacy-27-api/AndroidTest.xml
@@ -30,5 +30,7 @@
         <option name="instrumentation-arg" key="base-api-files" value="current.api.gz" />
         <option name="instrumentation-arg" key="expected-api-files" value="apache-http-legacy-current.api.gz" />
         <option name="runtime-hint" value="5s" />
+        <!-- Disable hidden API checks (http://b/171459260). -->
+        <option name="hidden-api-checks" value="false" />
     </test>
 </configuration>
diff --git a/tests/signature/api-check/apache-http-legacy-current-api/Android.bp b/tests/signature/api-check/apache-http-legacy-current-api/Android.bp
index ffda5cc..9ae437a 100644
--- a/tests/signature/api-check/apache-http-legacy-current-api/Android.bp
+++ b/tests/signature/api-check/apache-http-legacy-current-api/Android.bp
@@ -24,7 +24,6 @@
     use_embedded_native_libs: false,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/signature/api-check/apache-http-legacy-current-api/AndroidTest.xml b/tests/signature/api-check/apache-http-legacy-current-api/AndroidTest.xml
index 5b15e41..89b7748 100644
--- a/tests/signature/api-check/apache-http-legacy-current-api/AndroidTest.xml
+++ b/tests/signature/api-check/apache-http-legacy-current-api/AndroidTest.xml
@@ -29,5 +29,7 @@
         <option name="class" value="android.signature.cts.api.current.http.SignatureTest" />
         <option name="instrumentation-arg" key="unexpected-api-files" value="apache-http-legacy-current.api.gz" />
         <option name="runtime-hint" value="5s" />
+        <!-- Disable hidden API checks (http://b/171459260). -->
+        <option name="hidden-api-checks" value="false" />
     </test>
 </configuration>
diff --git a/tests/signature/api-check/apache-http-legacy-uses-library-api/Android.bp b/tests/signature/api-check/apache-http-legacy-uses-library-api/Android.bp
index f811f85..2b414c3 100644
--- a/tests/signature/api-check/apache-http-legacy-uses-library-api/Android.bp
+++ b/tests/signature/api-check/apache-http-legacy-uses-library-api/Android.bp
@@ -25,7 +25,6 @@
     use_embedded_native_libs: false,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/signature/api-check/apache-http-legacy-uses-library-api/AndroidTest.xml b/tests/signature/api-check/apache-http-legacy-uses-library-api/AndroidTest.xml
index 7216d25..12dcf9b 100644
--- a/tests/signature/api-check/apache-http-legacy-uses-library-api/AndroidTest.xml
+++ b/tests/signature/api-check/apache-http-legacy-uses-library-api/AndroidTest.xml
@@ -30,5 +30,7 @@
         <option name="instrumentation-arg" key="base-api-files" value="current.api.gz" />
         <option name="instrumentation-arg" key="expected-api-files" value="apache-http-legacy-current.api.gz" />
         <option name="runtime-hint" value="5s" />
+        <!-- Disable hidden API checks (http://b/171459260). -->
+        <option name="hidden-api-checks" value="false" />
     </test>
 </configuration>
diff --git a/tests/signature/api-check/build_signature_apk.mk b/tests/signature/api-check/build_signature_apk.mk
index ab6169e..ae8e2b5 100644
--- a/tests/signature/api-check/build_signature_apk.mk
+++ b/tests/signature/api-check/build_signature_apk.mk
@@ -24,7 +24,7 @@
 LOCAL_MODULE_TAGS := tests
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_SDK_VERSION := current
 
diff --git a/tests/signature/api-check/current-api/Android.bp b/tests/signature/api-check/current-api/Android.bp
index 61656c3..04eced6 100644
--- a/tests/signature/api-check/current-api/Android.bp
+++ b/tests/signature/api-check/current-api/Android.bp
@@ -27,7 +27,6 @@
     use_embedded_native_libs: false,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/signature/api-check/current-api/AndroidTest.xml b/tests/signature/api-check/current-api/AndroidTest.xml
index f14a503..8d39bd7 100644
--- a/tests/signature/api-check/current-api/AndroidTest.xml
+++ b/tests/signature/api-check/current-api/AndroidTest.xml
@@ -31,5 +31,7 @@
         <option name="instrumentation-arg" key="expected-api-files" value="current.api.gz" />
         <option name="instrumentation-arg" key="unexpected-api-files" value="android-test-base-current.api.gz,android-test-mock-current.api.gz,android-test-runner-current.api.gz" />
         <option name="runtime-hint" value="30s" />
+        <!-- Disable hidden API checks (http://b/171459260). -->
+        <option name="hidden-api-checks" value="false" />
     </test>
 </configuration>
diff --git a/tests/signature/api-check/hidden-api-blacklist-27-api/Android.bp b/tests/signature/api-check/hidden-api-blacklist-27-api/Android.bp
deleted file mode 100644
index 71a6902..0000000
--- a/tests/signature/api-check/hidden-api-blacklist-27-api/Android.bp
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (C) 2018 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.
-
-android_test {
-    name: "CtsHiddenApiBlacklistApi27TestCases",
-    defaults: [
-        "hiddenapi-blacklist-check-defaults",
-    ],
-    min_sdk_version: "27",
-
-    use_embedded_native_libs: false,
-    test_suites: [
-        "cts",
-        "vts10",
-        "general-tests",
-    ],
-}
diff --git a/tests/signature/api-check/hidden-api-blacklist-27-api/AndroidManifest.xml b/tests/signature/api-check/hidden-api-blacklist-27-api/AndroidManifest.xml
deleted file mode 100644
index 144d631..0000000
--- a/tests/signature/api-check/hidden-api-blacklist-27-api/AndroidManifest.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Copyright (C) 2018 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.signature.cts.api.hiddenapi_blacklist_api_27"
-          android:targetSandboxVersion="2">
-    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
-    <uses-sdk android:minSdkVersion="27" android:targetSdkVersion="27" />
-
-    <application android:extractNativeLibs="true" android:largeHeap="true"/>
-
-    <instrumentation
-        android:name="repackaged.android.test.InstrumentationTestRunner"
-        android:targetPackage="android.signature.cts.api.hiddenapi_blacklist_api_27"
-        android:label="Hidden API Blacklist Test for SDK level 27"/>
-</manifest>
diff --git a/tests/signature/api-check/hidden-api-blacklist-27-api/AndroidTest.xml b/tests/signature/api-check/hidden-api-blacklist-27-api/AndroidTest.xml
deleted file mode 100644
index d0ccc92..0000000
--- a/tests/signature/api-check/hidden-api-blacklist-27-api/AndroidTest.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 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.
--->
-<configuration description="Config for CTS Hidden API Signature test cases">
-    <option name="test-suite-tag" value="cts" />
-    <option name="config-descriptor:metadata" key="component" value="systems" />
-    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
-    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
-    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
-    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
-        <option name="cleanup-apks" value="true" />
-        <option name="test-file-name" value="CtsHiddenApiBlacklistApi27TestCases.apk" />
-    </target_preparer>
-    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
-        <option name="package" value="android.signature.cts.api.hiddenapi_blacklist_api_27" />
-        <option name="runner" value="repackaged.android.test.InstrumentationTestRunner" />
-        <option name="class" value="android.signature.cts.api.api27.HiddenApiTest" />
-        <option name="instrumentation-arg" key="hiddenapi-files" value="hiddenapi-flags.csv" />
-        <option name="instrumentation-arg" key="hiddenapi-test-flags" value="blacklist" />
-        <option name="test-api-access" value="false" />
-        <option name="runtime-hint" value="30s" />
-    </test>
-</configuration>
diff --git a/tests/signature/api-check/hidden-api-blacklist-28-api/Android.bp b/tests/signature/api-check/hidden-api-blacklist-28-api/Android.bp
deleted file mode 100644
index 5671a40..0000000
--- a/tests/signature/api-check/hidden-api-blacklist-28-api/Android.bp
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (C) 2018 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.
-
-android_test {
-    name: "CtsHiddenApiBlacklistApi28TestCases",
-    defaults: [
-        "hiddenapi-blacklist-check-defaults",
-    ],
-    min_sdk_version: "27",
-
-    use_embedded_native_libs: false,
-    test_suites: [
-        "cts",
-        "vts10",
-        "general-tests",
-    ],
-}
diff --git a/tests/signature/api-check/hidden-api-blacklist-28-api/AndroidManifest.xml b/tests/signature/api-check/hidden-api-blacklist-28-api/AndroidManifest.xml
deleted file mode 100644
index 919cd00..0000000
--- a/tests/signature/api-check/hidden-api-blacklist-28-api/AndroidManifest.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Copyright (C) 2018 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.signature.cts.api.hiddenapi_blacklist_api_28"
-          android:targetSandboxVersion="2">
-    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
-    <uses-sdk android:minSdkVersion="27" android:targetSdkVersion="28" />
-
-    <application android:extractNativeLibs="true" android:largeHeap="true"/>
-
-    <instrumentation
-        android:name="repackaged.android.test.InstrumentationTestRunner"
-        android:targetPackage="android.signature.cts.api.hiddenapi_blacklist_api_28"
-        android:label="Hidden API Blacklist Test for SDK level 28"/>
-</manifest>
diff --git a/tests/signature/api-check/hidden-api-blacklist-28-api/AndroidTest.xml b/tests/signature/api-check/hidden-api-blacklist-28-api/AndroidTest.xml
deleted file mode 100644
index b0ceb1b..0000000
--- a/tests/signature/api-check/hidden-api-blacklist-28-api/AndroidTest.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 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.
--->
-<configuration description="Config for CTS Hidden API Signature test cases">
-    <option name="test-suite-tag" value="cts" />
-    <option name="config-descriptor:metadata" key="component" value="systems" />
-    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
-    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
-    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
-    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
-        <option name="cleanup-apks" value="true" />
-        <option name="test-file-name" value="CtsHiddenApiBlacklistApi28TestCases.apk" />
-    </target_preparer>
-    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
-        <option name="package" value="android.signature.cts.api.hiddenapi_blacklist_api_28" />
-        <option name="runner" value="repackaged.android.test.InstrumentationTestRunner" />
-        <option name="class" value="android.signature.cts.api.api28.HiddenApiTest" />
-        <option name="instrumentation-arg" key="hiddenapi-files" value="hiddenapi-flags.csv" />
-        <option name="instrumentation-arg" key="hiddenapi-test-flags" value="blacklist,greylist-max-o" />
-        <option name="test-api-access" value="false" />
-        <option name="runtime-hint" value="30s" />
-    </test>
-</configuration>
diff --git a/tests/signature/api-check/hidden-api-blacklist-current-api/Android.bp b/tests/signature/api-check/hidden-api-blacklist-current-api/Android.bp
deleted file mode 100644
index ec730b0..0000000
--- a/tests/signature/api-check/hidden-api-blacklist-current-api/Android.bp
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (C) 2018 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.
-
-android_test {
-    name: "CtsHiddenApiBlacklistCurrentApiTestCases",
-    defaults: [
-        "hiddenapi-blacklist-check-defaults",
-    ],
-
-    use_embedded_native_libs: false,
-    test_suites: [
-        "cts",
-        "vts10",
-        "general-tests",
-    ],
-}
diff --git a/tests/signature/api-check/hidden-api-blacklist-current-api/AndroidManifest.xml b/tests/signature/api-check/hidden-api-blacklist-current-api/AndroidManifest.xml
deleted file mode 100644
index a17daac..0000000
--- a/tests/signature/api-check/hidden-api-blacklist-current-api/AndroidManifest.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Copyright (C) 2018 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.signature.cts.api.hiddenapi_blacklist_current"
-          android:targetSandboxVersion="2">
-    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
-
-    <application android:extractNativeLibs="true" android:largeHeap="true"/>
-
-    <instrumentation
-        android:name="repackaged.android.test.InstrumentationTestRunner"
-        android:targetPackage="android.signature.cts.api.hiddenapi_blacklist_current"
-        android:label="Hidden API Blacklist Test for current SDK"/>
-</manifest>
diff --git a/tests/signature/api-check/hidden-api-blacklist-current-api/AndroidTest.xml b/tests/signature/api-check/hidden-api-blacklist-current-api/AndroidTest.xml
deleted file mode 100644
index 863295f..0000000
--- a/tests/signature/api-check/hidden-api-blacklist-current-api/AndroidTest.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 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.
--->
-<configuration description="Config for CTS Hidden API Signature test cases">
-    <option name="test-suite-tag" value="cts" />
-    <option name="config-descriptor:metadata" key="component" value="systems" />
-    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
-    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
-    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
-    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
-        <option name="cleanup-apks" value="true" />
-        <option name="test-file-name" value="CtsHiddenApiBlacklistCurrentApiTestCases.apk" />
-    </target_preparer>
-    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
-        <option name="package" value="android.signature.cts.api.hiddenapi_blacklist_current" />
-        <option name="runner" value="repackaged.android.test.InstrumentationTestRunner" />
-        <option name="class" value="android.signature.cts.api.current.HiddenApiTest" />
-        <option name="instrumentation-arg" key="hiddenapi-files" value="hiddenapi-flags.csv" />
-        <option name="instrumentation-arg" key="hiddenapi-test-flags" value="blacklist,greylist-max-o,greylist-max-p" />
-        <option name="test-api-access" value="false" />
-        <option name="runtime-hint" value="30s" />
-    </test>
-</configuration>
diff --git a/tests/signature/api-check/hidden-api-blacklist-debug-class/Android.bp b/tests/signature/api-check/hidden-api-blacklist-debug-class/Android.bp
deleted file mode 100644
index bfb5c8f..0000000
--- a/tests/signature/api-check/hidden-api-blacklist-debug-class/Android.bp
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (C) 2018 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.
-
-android_test {
-    name: "CtsHiddenApiBlacklistDebugClassTestCases",
-    defaults: [
-        "hiddenapi-blacklist-check-defaults",
-    ],
-
-    use_embedded_native_libs: false,
-    test_suites: [
-        "cts",
-        "vts10",
-        "general-tests",
-    ],
-}
diff --git a/tests/signature/api-check/hidden-api-blacklist-debug-class/AndroidManifest.xml b/tests/signature/api-check/hidden-api-blacklist-debug-class/AndroidManifest.xml
deleted file mode 100644
index 8646c80..0000000
--- a/tests/signature/api-check/hidden-api-blacklist-debug-class/AndroidManifest.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Copyright (C) 2018 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.signature.cts.api.hiddenapi_blacklist_debug_class"
-          android:targetSandboxVersion="2">
-    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
-
-    <application android:extractNativeLibs="true" android:largeHeap="true"/>
-
-    <instrumentation
-        android:name="repackaged.android.test.InstrumentationTestRunner"
-        android:targetPackage="android.signature.cts.api.hiddenapi_blacklist_debug_class"
-        android:label="Hidden API Blacklist Test with Debug Class Exempt"/>
-</manifest>
diff --git a/tests/signature/api-check/hidden-api-blacklist-debug-class/AndroidTest.xml b/tests/signature/api-check/hidden-api-blacklist-debug-class/AndroidTest.xml
deleted file mode 100644
index 96d3fe1..0000000
--- a/tests/signature/api-check/hidden-api-blacklist-debug-class/AndroidTest.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 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.
--->
-<configuration description="Config for CTS Hidden API Signature test cases">
-    <option name="test-suite-tag" value="cts" />
-    <option name="config-descriptor:metadata" key="component" value="systems" />
-    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
-    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
-    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
-    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
-        <option name="cleanup-apks" value="true" />
-        <option name="test-file-name" value="CtsHiddenApiBlacklistDebugClassTestCases.apk" />
-    </target_preparer>
-    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
-        <option name="package" value="android.signature.cts.api.hiddenapi_blacklist_debug_class" />
-        <option name="runner" value="repackaged.android.test.InstrumentationTestRunner" />
-        <option name="class" value="android.signature.cts.api.DebugClassHiddenApiTest" />
-        <option name="instrumentation-arg" key="hiddenapi-files" value="hiddenapi-flags.csv" />
-        <option name="instrumentation-arg" key="hiddenapi-test-flags" value="blacklist,greylist-max-o,greylist-max-p" />
-        <option name="test-api-access" value="false" />
-        <option name="runtime-hint" value="30s" />
-    </test>
-</configuration>
diff --git a/tests/signature/api-check/hidden-api-blacklist-test-api/Android.bp b/tests/signature/api-check/hidden-api-blacklist-test-api/Android.bp
deleted file mode 100644
index 6ff5cea..0000000
--- a/tests/signature/api-check/hidden-api-blacklist-test-api/Android.bp
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (C) 2019 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.
-
-android_test {
-    name: "CtsHiddenApiBlacklistTestApiTestCases",
-    defaults: [
-        "hiddenapi-blacklist-check-defaults",
-    ],
-    use_embedded_native_libs: false,
-    test_suites: [
-        "cts",
-        "vts10",
-        "general-tests",
-    ],
-}
diff --git a/tests/signature/api-check/hidden-api-blacklist-test-api/AndroidManifest.xml b/tests/signature/api-check/hidden-api-blacklist-test-api/AndroidManifest.xml
deleted file mode 100644
index 076f99d..0000000
--- a/tests/signature/api-check/hidden-api-blacklist-test-api/AndroidManifest.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 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.signature.cts.api.hiddenapi_blacklist_test"
-          android:targetSandboxVersion="2">
-    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
-
-    <application android:extractNativeLibs="true" android:largeHeap="true"/>
-
-    <instrumentation android:name="repackaged.android.test.InstrumentationTestRunner"
-                     android:targetPackage="android.signature.cts.api.hiddenapi_blacklist_test"
-                     android:label="Hidden API Blacklist Test for test SDK"/>
-
-</manifest>
diff --git a/tests/signature/api-check/hidden-api-blacklist-test-api/AndroidTest.xml b/tests/signature/api-check/hidden-api-blacklist-test-api/AndroidTest.xml
deleted file mode 100644
index 313b8b3..0000000
--- a/tests/signature/api-check/hidden-api-blacklist-test-api/AndroidTest.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2019 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.
-  -->
-<configuration description="Config for CTS Hidden API Signature test cases">
-    <option name="test-suite-tag" value="cts" />
-    <option name="config-descriptor:metadata" key="component" value="systems" />
-    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
-    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
-    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
-    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
-        <option name="cleanup-apks" value="true" />
-        <option name="test-file-name" value="CtsHiddenApiBlacklistTestApiTestCases.apk" />
-    </target_preparer>
-    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
-        <option name="package" value="android.signature.cts.api.hiddenapi_blacklist_test" />
-        <option name="runner" value="repackaged.android.test.InstrumentationTestRunner" />
-        <option name="class" value="android.signature.cts.api.test.HiddenApiTest" />
-        <option name="instrumentation-arg" key="hiddenapi-files" value="hiddenapi-flags.csv" />
-        <option name="test-api-access" value="false" />
-        <option name="runtime-hint" value="30s" />
-    </test>
-</configuration>
diff --git a/tests/signature/api-check/hidden-api-blacklist-test-api/OWNERS b/tests/signature/api-check/hidden-api-blacklist-test-api/OWNERS
deleted file mode 100644
index f9ba708..0000000
--- a/tests/signature/api-check/hidden-api-blacklist-test-api/OWNERS
+++ /dev/null
@@ -1,10 +0,0 @@
-# Bug component: 610774
-
-# Use this reviewer by default.
-platform-compat-eng+reviews@google.com
-
-andreionea@google.com
-atrost@google.com
-mathewi@google.com
-ngeoffray@google.com
-satayev@google.com
diff --git a/tests/signature/api-check/hidden-api-blacklist-test-api/src/android/signature/cts/api/test/HiddenApiTest.java b/tests/signature/api-check/hidden-api-blacklist-test-api/src/android/signature/cts/api/test/HiddenApiTest.java
deleted file mode 100644
index 29bc4b7..0000000
--- a/tests/signature/api-check/hidden-api-blacklist-test-api/src/android/signature/cts/api/test/HiddenApiTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2019 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.signature.cts.api.test;
-
-import android.os.Bundle;
-import android.signature.cts.DexApiDocumentParser;
-import android.signature.cts.DexField;
-import android.signature.cts.DexMember;
-import android.signature.cts.DexMemberChecker;
-import android.signature.cts.DexMethod;
-import android.signature.cts.FailureType;
-import android.signature.cts.VirtualPath;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.channels.FileChannel;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.StandardOpenOption;
-import java.util.EnumSet;
-import java.util.Set;
-import java.util.function.Predicate;
-import java.util.stream.Stream;
-
-public class HiddenApiTest extends android.signature.cts.api.HiddenApiTest {
-
-    @Override
-    protected boolean shouldTestMember(DexMember member) {
-        Set<String> flags = member.getHiddenapiFlags();
-        return flags.contains("test-api") && flags.contains("blacklist");
-    }
-
-}
diff --git a/tests/signature/api-check/hidden-api-blocklist-27-api/Android.bp b/tests/signature/api-check/hidden-api-blocklist-27-api/Android.bp
new file mode 100644
index 0000000..bf603a7
--- /dev/null
+++ b/tests/signature/api-check/hidden-api-blocklist-27-api/Android.bp
@@ -0,0 +1,27 @@
+// Copyright (C) 2018 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.
+
+android_test {
+    name: "CtsHiddenApiBlocklistApi27TestCases",
+    defaults: [
+        "hiddenapi-blocklist-check-defaults",
+    ],
+    min_sdk_version: "27",
+
+    use_embedded_native_libs: false,
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+}
diff --git a/tests/signature/api-check/hidden-api-blocklist-27-api/AndroidManifest.xml b/tests/signature/api-check/hidden-api-blocklist-27-api/AndroidManifest.xml
new file mode 100644
index 0000000..84c73fc
--- /dev/null
+++ b/tests/signature/api-check/hidden-api-blocklist-27-api/AndroidManifest.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2018 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.signature.cts.api.hiddenapi_blocklist_api_27"
+          android:targetSandboxVersion="2">
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
+    <uses-sdk android:minSdkVersion="27" android:targetSdkVersion="27" />
+
+    <application android:extractNativeLibs="true" android:largeHeap="true"/>
+
+    <instrumentation
+        android:name="repackaged.android.test.InstrumentationTestRunner"
+        android:targetPackage="android.signature.cts.api.hiddenapi_blocklist_api_27"
+        android:label="Hidden API Blocklist Test for SDK level 27"/>
+</manifest>
diff --git a/tests/signature/api-check/hidden-api-blocklist-27-api/AndroidTest.xml b/tests/signature/api-check/hidden-api-blocklist-27-api/AndroidTest.xml
new file mode 100644
index 0000000..fdf5bfa
--- /dev/null
+++ b/tests/signature/api-check/hidden-api-blocklist-27-api/AndroidTest.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 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.
+-->
+<configuration description="Config for CTS Hidden API Signature test cases">
+    <option name="test-suite-tag" value="cts" />
+    <option name="config-descriptor:metadata" key="component" value="systems" />
+    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
+    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
+    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
+    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+        <option name="cleanup-apks" value="true" />
+        <option name="test-file-name" value="CtsHiddenApiBlocklistApi27TestCases.apk" />
+    </target_preparer>
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+        <option name="package" value="android.signature.cts.api.hiddenapi_blocklist_api_27" />
+        <option name="runner" value="repackaged.android.test.InstrumentationTestRunner" />
+        <option name="class" value="android.signature.cts.api.api27.HiddenApiTest" />
+        <option name="instrumentation-arg" key="hiddenapi-files" value="hiddenapi-flags.csv" />
+        <option name="instrumentation-arg" key="hiddenapi-test-flags" value="blocked" />
+        <option name="instrumentation-arg" key="hiddenapi-filter-file" value="hiddenapi-filter.csv" />
+        <option name="test-api-access" value="false" />
+        <option name="runtime-hint" value="30s" />
+    </test>
+</configuration>
diff --git a/tests/signature/api-check/hidden-api-blacklist-27-api/OWNERS b/tests/signature/api-check/hidden-api-blocklist-27-api/OWNERS
similarity index 100%
rename from tests/signature/api-check/hidden-api-blacklist-27-api/OWNERS
rename to tests/signature/api-check/hidden-api-blocklist-27-api/OWNERS
diff --git a/tests/signature/api-check/hidden-api-blocklist-27-api/TEST_MAPPING b/tests/signature/api-check/hidden-api-blocklist-27-api/TEST_MAPPING
new file mode 100644
index 0000000..23bb800
--- /dev/null
+++ b/tests/signature/api-check/hidden-api-blocklist-27-api/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+  "presubmit": [
+    {
+      "name": "CtsHiddenApiBlocklistApi27TestCases"
+    }
+  ]
+}
diff --git a/tests/signature/api-check/hidden-api-blacklist-27-api/src/android/signature/cts/api/api27/HiddenApiTest.java b/tests/signature/api-check/hidden-api-blocklist-27-api/src/android/signature/cts/api/api27/HiddenApiTest.java
similarity index 100%
rename from tests/signature/api-check/hidden-api-blacklist-27-api/src/android/signature/cts/api/api27/HiddenApiTest.java
rename to tests/signature/api-check/hidden-api-blocklist-27-api/src/android/signature/cts/api/api27/HiddenApiTest.java
diff --git a/tests/signature/api-check/hidden-api-blocklist-28-api/Android.bp b/tests/signature/api-check/hidden-api-blocklist-28-api/Android.bp
new file mode 100644
index 0000000..8aa4d36
--- /dev/null
+++ b/tests/signature/api-check/hidden-api-blocklist-28-api/Android.bp
@@ -0,0 +1,27 @@
+// Copyright (C) 2018 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.
+
+android_test {
+    name: "CtsHiddenApiBlocklistApi28TestCases",
+    defaults: [
+        "hiddenapi-blocklist-check-defaults",
+    ],
+    min_sdk_version: "27",
+
+    use_embedded_native_libs: false,
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+}
diff --git a/tests/signature/api-check/hidden-api-blocklist-28-api/AndroidManifest.xml b/tests/signature/api-check/hidden-api-blocklist-28-api/AndroidManifest.xml
new file mode 100644
index 0000000..81c473a
--- /dev/null
+++ b/tests/signature/api-check/hidden-api-blocklist-28-api/AndroidManifest.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2018 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.signature.cts.api.hiddenapi_blocklist_api_28"
+          android:targetSandboxVersion="2">
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
+    <uses-sdk android:minSdkVersion="27" android:targetSdkVersion="28" />
+
+    <application android:extractNativeLibs="true" android:largeHeap="true"/>
+
+    <instrumentation
+        android:name="repackaged.android.test.InstrumentationTestRunner"
+        android:targetPackage="android.signature.cts.api.hiddenapi_blocklist_api_28"
+        android:label="Hidden API Blocklist Test for SDK level 28"/>
+</manifest>
diff --git a/tests/signature/api-check/hidden-api-blocklist-28-api/AndroidTest.xml b/tests/signature/api-check/hidden-api-blocklist-28-api/AndroidTest.xml
new file mode 100644
index 0000000..30d29f0
--- /dev/null
+++ b/tests/signature/api-check/hidden-api-blocklist-28-api/AndroidTest.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 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.
+-->
+<configuration description="Config for CTS Hidden API Signature test cases">
+    <option name="test-suite-tag" value="cts" />
+    <option name="config-descriptor:metadata" key="component" value="systems" />
+    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
+    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
+    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
+    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+        <option name="cleanup-apks" value="true" />
+        <option name="test-file-name" value="CtsHiddenApiBlocklistApi28TestCases.apk" />
+    </target_preparer>
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+        <option name="package" value="android.signature.cts.api.hiddenapi_blocklist_api_28" />
+        <option name="runner" value="repackaged.android.test.InstrumentationTestRunner" />
+        <option name="class" value="android.signature.cts.api.api28.HiddenApiTest" />
+        <option name="instrumentation-arg" key="hiddenapi-files" value="hiddenapi-flags.csv" />
+        <option name="instrumentation-arg" key="hiddenapi-test-flags" value="blocked,max-target-o" />
+        <option name="instrumentation-arg" key="hiddenapi-filter-file" value="hiddenapi-filter.csv" />
+        <option name="test-api-access" value="false" />
+        <option name="runtime-hint" value="30s" />
+    </test>
+</configuration>
diff --git a/tests/signature/api-check/hidden-api-blacklist-28-api/OWNERS b/tests/signature/api-check/hidden-api-blocklist-28-api/OWNERS
similarity index 100%
rename from tests/signature/api-check/hidden-api-blacklist-28-api/OWNERS
rename to tests/signature/api-check/hidden-api-blocklist-28-api/OWNERS
diff --git a/tests/signature/api-check/hidden-api-blacklist-28-api/src/android/signature/cts/api/api28/HiddenApiTest.java b/tests/signature/api-check/hidden-api-blocklist-28-api/src/android/signature/cts/api/api28/HiddenApiTest.java
similarity index 100%
rename from tests/signature/api-check/hidden-api-blacklist-28-api/src/android/signature/cts/api/api28/HiddenApiTest.java
rename to tests/signature/api-check/hidden-api-blocklist-28-api/src/android/signature/cts/api/api28/HiddenApiTest.java
diff --git a/tests/signature/api-check/hidden-api-blocklist-current-api/Android.bp b/tests/signature/api-check/hidden-api-blocklist-current-api/Android.bp
new file mode 100644
index 0000000..a0031cb
--- /dev/null
+++ b/tests/signature/api-check/hidden-api-blocklist-current-api/Android.bp
@@ -0,0 +1,26 @@
+// Copyright (C) 2018 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.
+
+android_test {
+    name: "CtsHiddenApiBlocklistCurrentApiTestCases",
+    defaults: [
+        "hiddenapi-blocklist-check-defaults",
+    ],
+
+    use_embedded_native_libs: false,
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+}
diff --git a/tests/signature/api-check/hidden-api-blocklist-current-api/AndroidManifest.xml b/tests/signature/api-check/hidden-api-blocklist-current-api/AndroidManifest.xml
new file mode 100644
index 0000000..35047d5
--- /dev/null
+++ b/tests/signature/api-check/hidden-api-blocklist-current-api/AndroidManifest.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2018 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.signature.cts.api.hiddenapi_blocklist_current"
+          android:targetSandboxVersion="2">
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
+
+    <application android:extractNativeLibs="true" android:largeHeap="true"/>
+
+    <instrumentation
+        android:name="repackaged.android.test.InstrumentationTestRunner"
+        android:targetPackage="android.signature.cts.api.hiddenapi_blocklist_current"
+        android:label="Hidden API Blocklist Test for current SDK"/>
+</manifest>
diff --git a/tests/signature/api-check/hidden-api-blocklist-current-api/AndroidTest.xml b/tests/signature/api-check/hidden-api-blocklist-current-api/AndroidTest.xml
new file mode 100644
index 0000000..7063418
--- /dev/null
+++ b/tests/signature/api-check/hidden-api-blocklist-current-api/AndroidTest.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 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.
+-->
+<configuration description="Config for CTS Hidden API Signature test cases">
+    <option name="test-suite-tag" value="cts" />
+    <option name="config-descriptor:metadata" key="component" value="systems" />
+    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
+    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
+    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
+    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+        <option name="cleanup-apks" value="true" />
+        <option name="test-file-name" value="CtsHiddenApiBlocklistCurrentApiTestCases.apk" />
+    </target_preparer>
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+        <option name="package" value="android.signature.cts.api.hiddenapi_blocklist_current" />
+        <option name="runner" value="repackaged.android.test.InstrumentationTestRunner" />
+        <option name="class" value="android.signature.cts.api.current.HiddenApiTest" />
+        <option name="instrumentation-arg" key="hiddenapi-files" value="hiddenapi-flags.csv" />
+        <option name="instrumentation-arg" key="hiddenapi-test-flags" value="blocked,max-target-o,max-target-p" />
+        <option name="instrumentation-arg" key="hiddenapi-filter-file" value="hiddenapi-filter.csv" />
+        <option name="test-api-access" value="false" />
+        <option name="runtime-hint" value="30s" />
+    </test>
+</configuration>
diff --git a/tests/signature/api-check/hidden-api-blacklist-current-api/OWNERS b/tests/signature/api-check/hidden-api-blocklist-current-api/OWNERS
similarity index 100%
rename from tests/signature/api-check/hidden-api-blacklist-current-api/OWNERS
rename to tests/signature/api-check/hidden-api-blocklist-current-api/OWNERS
diff --git a/tests/signature/api-check/hidden-api-blacklist-current-api/src/android/signature/cts/api/current/HiddenApiTest.java b/tests/signature/api-check/hidden-api-blocklist-current-api/src/android/signature/cts/api/current/HiddenApiTest.java
similarity index 100%
rename from tests/signature/api-check/hidden-api-blacklist-current-api/src/android/signature/cts/api/current/HiddenApiTest.java
rename to tests/signature/api-check/hidden-api-blocklist-current-api/src/android/signature/cts/api/current/HiddenApiTest.java
diff --git a/tests/signature/api-check/hidden-api-blocklist-debug-class/Android.bp b/tests/signature/api-check/hidden-api-blocklist-debug-class/Android.bp
new file mode 100644
index 0000000..c21810a
--- /dev/null
+++ b/tests/signature/api-check/hidden-api-blocklist-debug-class/Android.bp
@@ -0,0 +1,26 @@
+// Copyright (C) 2018 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.
+
+android_test {
+    name: "CtsHiddenApiBlocklistDebugClassTestCases",
+    defaults: [
+        "hiddenapi-blocklist-check-defaults",
+    ],
+
+    use_embedded_native_libs: false,
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+}
diff --git a/tests/signature/api-check/hidden-api-blocklist-debug-class/AndroidManifest.xml b/tests/signature/api-check/hidden-api-blocklist-debug-class/AndroidManifest.xml
new file mode 100644
index 0000000..21b1756
--- /dev/null
+++ b/tests/signature/api-check/hidden-api-blocklist-debug-class/AndroidManifest.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2018 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.signature.cts.api.hiddenapi_blocklist_debug_class"
+          android:targetSandboxVersion="2">
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
+
+    <application android:extractNativeLibs="true" android:largeHeap="true"/>
+
+    <instrumentation
+        android:name="repackaged.android.test.InstrumentationTestRunner"
+        android:targetPackage="android.signature.cts.api.hiddenapi_blocklist_debug_class"
+        android:label="Hidden API Blocklist Test with Debug Class Exempt"/>
+</manifest>
diff --git a/tests/signature/api-check/hidden-api-blocklist-debug-class/AndroidTest.xml b/tests/signature/api-check/hidden-api-blocklist-debug-class/AndroidTest.xml
new file mode 100644
index 0000000..2ab58bd
--- /dev/null
+++ b/tests/signature/api-check/hidden-api-blocklist-debug-class/AndroidTest.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 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.
+-->
+<configuration description="Config for CTS Hidden API Signature test cases">
+    <option name="test-suite-tag" value="cts" />
+    <option name="config-descriptor:metadata" key="component" value="systems" />
+    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
+    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
+    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
+    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+        <option name="cleanup-apks" value="true" />
+        <option name="test-file-name" value="CtsHiddenApiBlocklistDebugClassTestCases.apk" />
+    </target_preparer>
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+        <option name="package" value="android.signature.cts.api.hiddenapi_blocklist_debug_class" />
+        <option name="runner" value="repackaged.android.test.InstrumentationTestRunner" />
+        <option name="class" value="android.signature.cts.api.DebugClassHiddenApiTest" />
+        <option name="instrumentation-arg" key="hiddenapi-files" value="hiddenapi-flags.csv" />
+        <option name="instrumentation-arg" key="hiddenapi-test-flags" value="blocked,max-target-o,max-target-p" />
+        <option name="instrumentation-arg" key="hiddenapi-filter-file" value="hiddenapi-filter.csv" />
+        <option name="test-api-access" value="false" />
+        <option name="runtime-hint" value="30s" />
+    </test>
+</configuration>
diff --git a/tests/signature/api-check/hidden-api-blacklist-debug-class/OWNERS b/tests/signature/api-check/hidden-api-blocklist-debug-class/OWNERS
similarity index 100%
rename from tests/signature/api-check/hidden-api-blacklist-debug-class/OWNERS
rename to tests/signature/api-check/hidden-api-blocklist-debug-class/OWNERS
diff --git a/tests/signature/api-check/hidden-api-blocklist-test-api/Android.bp b/tests/signature/api-check/hidden-api-blocklist-test-api/Android.bp
new file mode 100644
index 0000000..89621ca
--- /dev/null
+++ b/tests/signature/api-check/hidden-api-blocklist-test-api/Android.bp
@@ -0,0 +1,25 @@
+// Copyright (C) 2019 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.
+
+android_test {
+    name: "CtsHiddenApiBlocklistTestApiTestCases",
+    defaults: [
+        "hiddenapi-blocklist-check-defaults",
+    ],
+    use_embedded_native_libs: false,
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+}
diff --git a/tests/signature/api-check/hidden-api-blocklist-test-api/AndroidManifest.xml b/tests/signature/api-check/hidden-api-blocklist-test-api/AndroidManifest.xml
new file mode 100644
index 0000000..1696c0a
--- /dev/null
+++ b/tests/signature/api-check/hidden-api-blocklist-test-api/AndroidManifest.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2019 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.signature.cts.api.hiddenapi_blocklist_test"
+          android:targetSandboxVersion="2">
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
+
+    <application android:extractNativeLibs="true" android:largeHeap="true"/>
+
+    <instrumentation android:name="repackaged.android.test.InstrumentationTestRunner"
+                     android:targetPackage="android.signature.cts.api.hiddenapi_blocklist_test"
+                     android:label="Hidden API Blocklist Test for test SDK"/>
+
+</manifest>
diff --git a/tests/signature/api-check/hidden-api-blocklist-test-api/AndroidTest.xml b/tests/signature/api-check/hidden-api-blocklist-test-api/AndroidTest.xml
new file mode 100644
index 0000000..b08abec
--- /dev/null
+++ b/tests/signature/api-check/hidden-api-blocklist-test-api/AndroidTest.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2019 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.
+  -->
+<configuration description="Config for CTS Hidden API Signature test cases">
+    <option name="test-suite-tag" value="cts" />
+    <option name="config-descriptor:metadata" key="component" value="systems" />
+    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
+    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
+    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
+    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+        <option name="cleanup-apks" value="true" />
+        <option name="test-file-name" value="CtsHiddenApiBlocklistTestApiTestCases.apk" />
+    </target_preparer>
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+        <option name="package" value="android.signature.cts.api.hiddenapi_blocklist_test" />
+        <option name="runner" value="repackaged.android.test.InstrumentationTestRunner" />
+        <option name="class" value="android.signature.cts.api.test.HiddenApiTest" />
+        <option name="instrumentation-arg" key="hiddenapi-files" value="hiddenapi-flags.csv" />
+        <option name="test-api-access" value="false" />
+        <option name="runtime-hint" value="30s" />
+    </test>
+</configuration>
diff --git a/tests/signature/api-check/hidden-api-blocklist-test-api/OWNERS b/tests/signature/api-check/hidden-api-blocklist-test-api/OWNERS
new file mode 100644
index 0000000..66ea541
--- /dev/null
+++ b/tests/signature/api-check/hidden-api-blocklist-test-api/OWNERS
@@ -0,0 +1,9 @@
+# Bug component: 610774
+
+# Use this reviewer by default.
+platform-compat-eng+reviews@google.com
+
+andreionea@google.com
+mathewi@google.com
+ngeoffray@google.com
+satayev@google.com
diff --git a/tests/signature/api-check/hidden-api-blocklist-test-api/src/android/signature/cts/api/test/HiddenApiTest.java b/tests/signature/api-check/hidden-api-blocklist-test-api/src/android/signature/cts/api/test/HiddenApiTest.java
new file mode 100644
index 0000000..7cefb5c
--- /dev/null
+++ b/tests/signature/api-check/hidden-api-blocklist-test-api/src/android/signature/cts/api/test/HiddenApiTest.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2019 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.signature.cts.api.test;
+
+import android.os.Bundle;
+import android.signature.cts.DexApiDocumentParser;
+import android.signature.cts.DexField;
+import android.signature.cts.DexMember;
+import android.signature.cts.DexMemberChecker;
+import android.signature.cts.DexMethod;
+import android.signature.cts.FailureType;
+import android.signature.cts.VirtualPath;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
+import java.util.EnumSet;
+import java.util.Set;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
+
+public class HiddenApiTest extends android.signature.cts.api.HiddenApiTest {
+
+    @Override
+    protected boolean shouldTestMember(DexMember member) {
+        Set<String> flags = member.getHiddenapiFlags();
+        return flags.contains("test-api") && flags.contains("blocked");
+    }
+
+}
diff --git a/tests/signature/api-check/hidden-api-killswitch-debug-class/Android.bp b/tests/signature/api-check/hidden-api-killswitch-debug-class/Android.bp
index 08ead17..5e88438 100644
--- a/tests/signature/api-check/hidden-api-killswitch-debug-class/Android.bp
+++ b/tests/signature/api-check/hidden-api-killswitch-debug-class/Android.bp
@@ -19,7 +19,6 @@
     use_embedded_native_libs: false,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/signature/api-check/hidden-api-killswitch-sdklist/Android.bp b/tests/signature/api-check/hidden-api-killswitch-sdklist/Android.bp
new file mode 100644
index 0000000..b5c594b
--- /dev/null
+++ b/tests/signature/api-check/hidden-api-killswitch-sdklist/Android.bp
@@ -0,0 +1,24 @@
+// Copyright (C) 2018 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.
+
+android_test {
+    name: "CtsHiddenApiKillswitchSdkListTestCases",
+    defaults: ["hiddenapi-killswitch-check-defaults"],
+
+    use_embedded_native_libs: false,
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+}
diff --git a/tests/signature/api-check/hidden-api-killswitch-sdklist/AndroidManifest.xml b/tests/signature/api-check/hidden-api-killswitch-sdklist/AndroidManifest.xml
new file mode 100644
index 0000000..ea1eb84
--- /dev/null
+++ b/tests/signature/api-check/hidden-api-killswitch-sdklist/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2018 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.signature.cts.api.killswitch_sdklist"
+          android:targetSandboxVersion="2">
+
+    <application android:debuggable="true"
+                 android:extractNativeLibs="true"
+                 android:largeHeap="true"/>
+
+    <instrumentation android:name="repackaged.android.test.InstrumentationTestRunner"
+                     android:targetPackage="android.signature.cts.api.killswitch_sdklist"
+                     android:label="Hidden API Killswitch SDK list Test"/>
+</manifest>
diff --git a/tests/signature/api-check/hidden-api-killswitch-sdklist/AndroidTest.xml b/tests/signature/api-check/hidden-api-killswitch-sdklist/AndroidTest.xml
new file mode 100644
index 0000000..a9b1035
--- /dev/null
+++ b/tests/signature/api-check/hidden-api-killswitch-sdklist/AndroidTest.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 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.
+-->
+<configuration description="Config for CTS Hidden API Signature test cases">
+    <option name="test-suite-tag" value="cts" />
+    <option name="config-descriptor:metadata" key="component" value="systems" />
+    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
+    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
+    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
+    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
+        <!-- Mark all APIs as sdk before running the test, then reset this afterwards. The test
+             is intended to verify the behaviour when all APIs are in the SDK. -->
+        <option name="run-command" value="settings put global hidden_api_blacklist_exemptions L" />
+        <option name="teardown-command" value="settings delete global hidden_api_blacklist_exemptions" />
+    </target_preparer>
+    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+        <option name="cleanup-apks" value="true" />
+        <option name="test-file-name" value="CtsHiddenApiKillswitchSdkListTestCases.apk" />
+    </target_preparer>
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+        <option name="package" value="android.signature.cts.api.killswitch_sdklist" />
+        <option name="runner" value="repackaged.android.test.InstrumentationTestRunner" />
+        <option name="class" value="android.signature.cts.api.SdkListKillswitchTest" />
+        <option name="runtime-hint" value="60s" />
+    </test>
+
+    <!-- Controller that will skip the module if a native bridge situation is detected -->
+    <!-- For example: module wants to run arm32 and device is x86 -->
+    <object type="module_controller" class="com.android.tradefed.testtype.suite.module.NativeBridgeModuleController" />
+</configuration>
diff --git a/tests/signature/api-check/hidden-api-killswitch-whitelist/OWNERS b/tests/signature/api-check/hidden-api-killswitch-sdklist/OWNERS
similarity index 100%
rename from tests/signature/api-check/hidden-api-killswitch-whitelist/OWNERS
rename to tests/signature/api-check/hidden-api-killswitch-sdklist/OWNERS
diff --git a/tests/signature/api-check/hidden-api-killswitch-whitelist/Android.bp b/tests/signature/api-check/hidden-api-killswitch-whitelist/Android.bp
deleted file mode 100644
index 5fe8f1d..0000000
--- a/tests/signature/api-check/hidden-api-killswitch-whitelist/Android.bp
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (C) 2018 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.
-
-android_test {
-    name: "CtsHiddenApiKillswitchWhitelistTestCases",
-    defaults: ["hiddenapi-killswitch-check-defaults"],
-
-    use_embedded_native_libs: false,
-    test_suites: [
-        "cts",
-        "vts10",
-        "general-tests",
-    ],
-}
diff --git a/tests/signature/api-check/hidden-api-killswitch-whitelist/AndroidManifest.xml b/tests/signature/api-check/hidden-api-killswitch-whitelist/AndroidManifest.xml
deleted file mode 100644
index 54f61f9..0000000
--- a/tests/signature/api-check/hidden-api-killswitch-whitelist/AndroidManifest.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Copyright (C) 2018 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.signature.cts.api.killswitch_whitelist"
-          android:targetSandboxVersion="2">
-
-    <application android:debuggable="true"
-                 android:extractNativeLibs="true"
-                 android:largeHeap="true"/>
-
-    <instrumentation android:name="repackaged.android.test.InstrumentationTestRunner"
-                     android:targetPackage="android.signature.cts.api.killswitch_whitelist"
-                     android:label="Hidden API Killswitch Whitelist Test"/>
-</manifest>
diff --git a/tests/signature/api-check/hidden-api-killswitch-whitelist/AndroidTest.xml b/tests/signature/api-check/hidden-api-killswitch-whitelist/AndroidTest.xml
deleted file mode 100644
index 9579126..0000000
--- a/tests/signature/api-check/hidden-api-killswitch-whitelist/AndroidTest.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 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.
--->
-<configuration description="Config for CTS Hidden API Signature test cases">
-    <option name="test-suite-tag" value="cts" />
-    <option name="config-descriptor:metadata" key="component" value="systems" />
-    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
-    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
-    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
-    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
-        <!-- Whitelist all APIs before running the test, then reset this afterwards. The test
-             is intended to verify the behaviour when all APIs are whitelisted. -->
-        <option name="run-command" value="settings put global hidden_api_blacklist_exemptions L" />
-        <option name="teardown-command" value="settings delete global hidden_api_blacklist_exemptions" />
-    </target_preparer>
-    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
-        <option name="cleanup-apks" value="true" />
-        <option name="test-file-name" value="CtsHiddenApiKillswitchWhitelistTestCases.apk" />
-    </target_preparer>
-    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
-        <option name="package" value="android.signature.cts.api.killswitch_whitelist" />
-        <option name="runner" value="repackaged.android.test.InstrumentationTestRunner" />
-        <option name="class" value="android.signature.cts.api.WhitelistKillswitchTest" />
-        <option name="runtime-hint" value="60s" />
-    </test>
-
-    <!-- Controller that will skip the module if a native bridge situation is detected -->
-    <!-- For example: module wants to run arm32 and device is x86 -->
-    <object type="module_controller" class="com.android.tradefed.testtype.suite.module.NativeBridgeModuleController" />
-</configuration>
diff --git a/tests/signature/api-check/hidden-api-killswitch-wildcard/Android.bp b/tests/signature/api-check/hidden-api-killswitch-wildcard/Android.bp
index 221006c..599a8a1 100644
--- a/tests/signature/api-check/hidden-api-killswitch-wildcard/Android.bp
+++ b/tests/signature/api-check/hidden-api-killswitch-wildcard/Android.bp
@@ -19,7 +19,6 @@
     use_embedded_native_libs: false,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/signature/api-check/hiddenapi-filter.csv b/tests/signature/api-check/hiddenapi-filter.csv
new file mode 100644
index 0000000..da8fdb7
--- /dev/null
+++ b/tests/signature/api-check/hiddenapi-filter.csv
@@ -0,0 +1,38 @@
+# These APIs were reverted from the blocklist to the non-SDK API list (b/168812851)
+Landroid/bluetooth/BluetoothCodecConfig;-><init>(I)V
+Landroid/bluetooth/BluetoothCodecConfig;-><init>(IIIIIJJJJ)V
+Landroid/bluetooth/BluetoothCodecConfig;->BITS_PER_SAMPLE_16:I
+Landroid/bluetooth/BluetoothCodecConfig;->BITS_PER_SAMPLE_24:I
+Landroid/bluetooth/BluetoothCodecConfig;->BITS_PER_SAMPLE_32:I
+Landroid/bluetooth/BluetoothCodecConfig;->BITS_PER_SAMPLE_NONE:I
+Landroid/bluetooth/BluetoothCodecConfig;->CHANNEL_MODE_MONO:I
+Landroid/bluetooth/BluetoothCodecConfig;->CHANNEL_MODE_NONE:I
+Landroid/bluetooth/BluetoothCodecConfig;->CHANNEL_MODE_STEREO:I
+Landroid/bluetooth/BluetoothCodecConfig;->CODEC_PRIORITY_DEFAULT:I
+Landroid/bluetooth/BluetoothCodecConfig;->CODEC_PRIORITY_DISABLED:I
+Landroid/bluetooth/BluetoothCodecConfig;->CODEC_PRIORITY_HIGHEST:I
+Landroid/bluetooth/BluetoothCodecConfig;->SAMPLE_RATE_176400:I
+Landroid/bluetooth/BluetoothCodecConfig;->SAMPLE_RATE_192000:I
+Landroid/bluetooth/BluetoothCodecConfig;->SAMPLE_RATE_44100:I
+Landroid/bluetooth/BluetoothCodecConfig;->SAMPLE_RATE_48000:I
+Landroid/bluetooth/BluetoothCodecConfig;->SAMPLE_RATE_88200:I
+Landroid/bluetooth/BluetoothCodecConfig;->SAMPLE_RATE_96000:I
+Landroid/bluetooth/BluetoothCodecConfig;->SAMPLE_RATE_NONE:I
+Landroid/bluetooth/BluetoothCodecConfig;->SOURCE_CODEC_TYPE_AAC:I
+Landroid/bluetooth/BluetoothCodecConfig;->SOURCE_CODEC_TYPE_APTX:I
+Landroid/bluetooth/BluetoothCodecConfig;->SOURCE_CODEC_TYPE_APTX_HD:I
+Landroid/bluetooth/BluetoothCodecConfig;->SOURCE_CODEC_TYPE_INVALID:I
+Landroid/bluetooth/BluetoothCodecConfig;->SOURCE_CODEC_TYPE_LDAC:I
+Landroid/bluetooth/BluetoothCodecConfig;->SOURCE_CODEC_TYPE_MAX:I
+Landroid/bluetooth/BluetoothCodecConfig;->SOURCE_CODEC_TYPE_SBC:I
+Landroid/bluetooth/BluetoothCodecConfig;->getBitsPerSample()I
+Landroid/bluetooth/BluetoothCodecConfig;->getCodecPriority()I
+Landroid/bluetooth/BluetoothCodecConfig;->getCodecSpecific1()J
+Landroid/bluetooth/BluetoothCodecConfig;->getCodecType()I
+Landroid/bluetooth/BluetoothCodecConfig;->getSampleRate()I
+Landroid/bluetooth/BluetoothCodecStatus;->EXTRA_CODEC_STATUS:Ljava/lang/String;
+Landroid/bluetooth/BluetoothCodecStatus;->getCodecConfig()Landroid/bluetooth/BluetoothCodecConfig;
+Landroid/bluetooth/BluetoothCodecStatus;->getCodecsLocalCapabilities()[Landroid/bluetooth/BluetoothCodecConfig;
+Landroid/bluetooth/BluetoothCodecStatus;->getCodecsSelectableCapabilities()[Landroid/bluetooth/BluetoothCodecConfig;
+# This API was moved from blocklist to unsupported list (b/159022482)
+Landroid/telephony/SmsManager;->deleteMessageFromIcc(I)Z
diff --git a/tests/signature/api-check/shared-libs-api/AndroidTest.xml b/tests/signature/api-check/shared-libs-api/AndroidTest.xml
index a679079..d13aa54 100644
--- a/tests/signature/api-check/shared-libs-api/AndroidTest.xml
+++ b/tests/signature/api-check/shared-libs-api/AndroidTest.xml
@@ -29,5 +29,7 @@
         <option name="class" value="android.signature.cts.api.SignatureMultiLibsTest" />
         <option name="instrumentation-arg" key="expected-api-files" value="shared-libs-all.api.zip" />
         <option name="runtime-hint" value="30s" />
+        <!-- Disable hidden API checks (http://b/171459260). -->
+        <option name="hidden-api-checks" value="false" />
     </test>
 </configuration>
diff --git a/tests/signature/api-check/src/java/android/signature/cts/api/AbstractApiTest.java b/tests/signature/api-check/src/java/android/signature/cts/api/AbstractApiTest.java
index 7e8c6d6..1e96910 100644
--- a/tests/signature/api-check/src/java/android/signature/cts/api/AbstractApiTest.java
+++ b/tests/signature/api-check/src/java/android/signature/cts/api/AbstractApiTest.java
@@ -16,6 +16,7 @@
 package android.signature.cts.api;
 
 import android.os.Bundle;
+import android.provider.Settings;
 import android.signature.cts.ApiDocumentParser;
 import android.signature.cts.ClassProvider;
 import android.signature.cts.ExcludingClassProvider;
@@ -51,6 +52,18 @@
 
     ClassProvider classProvider;
 
+    protected String getGlobalExemptions() {
+        return Settings.Global.getString(
+                getInstrumentation().getContext().getContentResolver(),
+                Settings.Global.HIDDEN_API_BLACKLIST_EXEMPTIONS);
+    }
+
+    protected String getGlobalHiddenApiPolicy() {
+        return Settings.Global.getString(
+                getInstrumentation().getContext().getContentResolver(),
+                Settings.Global.HIDDEN_API_POLICY);
+    }
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
@@ -60,6 +73,19 @@
         Bundle instrumentationArgs =
                 ((InstrumentationTestRunner) getInstrumentation()).getArguments();
 
+        // Check that the device is in the correct state for running this test.
+        assertEquals(
+                String.format("Device in bad state: %s is not as expected",
+                        Settings.Global.HIDDEN_API_BLACKLIST_EXEMPTIONS),
+                getExpectedBlocklistExemptions(),
+                getGlobalExemptions());
+        assertEquals(
+                String.format("Device in bad state: %s is not as expected",
+                        Settings.Global.HIDDEN_API_POLICY),
+                null,
+                getGlobalHiddenApiPolicy());
+
+
         // Prepare for a class provider that loads classes from bootclasspath but filters
         // out known inaccessible classes.
         // Note that com.android.internal.R.* inner classes are also excluded as they are
@@ -71,6 +97,10 @@
         initializeFromArgs(instrumentationArgs);
     }
 
+    protected String getExpectedBlocklistExemptions() {
+        return null;
+    }
+
     protected void initializeFromArgs(Bundle instrumentationArgs) throws Exception {
 
     }
@@ -90,16 +120,7 @@
             mResultObserver.notifyFailure(FailureType.CAUGHT_EXCEPTION, e.getClass().getName(),
                     writer.toString());
         }
-        if (mResultObserver.mDidFail) {
-            StringBuilder errorString = mResultObserver.mErrorString;
-            ClassLoader classLoader = getClass().getClassLoader();
-            errorString.append("\nClassLoader hierarchy\n");
-            while (classLoader != null) {
-                errorString.append("    ").append(classLoader).append("\n");
-                classLoader = classLoader.getParent();
-            }
-            fail(errorString.toString());
-        }
+        mResultObserver.onTestComplete(); // Will throw is there are failures
     }
 
     static String[] getCommaSeparatedList(Bundle instrumentationArgs, String key) {
diff --git a/tests/signature/api-check/src/java/android/signature/cts/api/BaseKillswitchTest.java b/tests/signature/api-check/src/java/android/signature/cts/api/BaseKillswitchTest.java
index 4800851..2337ced 100644
--- a/tests/signature/api-check/src/java/android/signature/cts/api/BaseKillswitchTest.java
+++ b/tests/signature/api-check/src/java/android/signature/cts/api/BaseKillswitchTest.java
@@ -37,12 +37,6 @@
         DexMemberChecker.init();
     }
 
-    protected String getGlobalExemptions() {
-      return Settings.Global.getString(
-          getInstrumentation().getContext().getContentResolver(),
-          Settings.Global.HIDDEN_API_BLACKLIST_EXEMPTIONS);
-    }
-
     // We have four methods to split up the load, keeping individual test runs small.
     // Tests shared by all the subclasses.
 
diff --git a/tests/signature/api-check/src/java/android/signature/cts/api/HiddenApiTest.java b/tests/signature/api-check/src/java/android/signature/cts/api/HiddenApiTest.java
index feca46d..43cca41 100644
--- a/tests/signature/api-check/src/java/android/signature/cts/api/HiddenApiTest.java
+++ b/tests/signature/api-check/src/java/android/signature/cts/api/HiddenApiTest.java
@@ -26,7 +26,10 @@
 import android.signature.cts.VirtualPath;
 
 import java.io.BufferedReader;
+import java.io.IOException;
 import java.io.InputStreamReader;
+import java.text.ParseException;
+import java.util.HashSet;
 import java.util.Set;
 import java.util.function.Predicate;
 
@@ -37,17 +40,22 @@
 
     private String[] hiddenapiFiles;
     private String[] hiddenapiTestFlags;
+    private String hiddenapiFilterFile;
+    private Set<String> hiddenapiFilterSet;
 
     @Override
     protected void initializeFromArgs(Bundle instrumentationArgs) {
         hiddenapiFiles = getCommaSeparatedList(instrumentationArgs, "hiddenapi-files");
         hiddenapiTestFlags = getCommaSeparatedList(instrumentationArgs, "hiddenapi-test-flags");
+        hiddenapiFilterFile = instrumentationArgs.getString("hiddenapi-filter-file");
+        hiddenapiFilterSet = new HashSet<>();
     }
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         DexMemberChecker.init();
+        loadFilters();
     }
 
     // We have four methods to split up the load, keeping individual test runs small.
@@ -146,7 +154,8 @@
                 String line = reader.readLine();
                 while (line != null) {
                     DexMember dexMember = DexApiDocumentParser.parseLine(line, lineIndex);
-                    if (memberFilter.test(dexMember) && shouldTestMember(dexMember)) {
+                    if (memberFilter.test(dexMember) && shouldTestMember(dexMember)
+                            && !isFiltered(line)) {
                         DexMemberChecker.checkSingleMember(dexMember, reflection, jni,
                                 observer);
                     }
@@ -167,4 +176,42 @@
         return false;
     }
 
+    /**
+     * Checks whether this method/field is included in the filter file. If so, we should not test
+     * it. If not, we should test it.
+     *
+     * @param line is the line from the hiddenapi-flags.csv indicating which method/field to check
+     * @return true if the method/field is to be filtered out, false otherwise
+     */
+    private boolean isFiltered(String line) {
+        if (line == null) {
+            return false;
+        }
+        // Need to remove which list the method/field is a part of (at the end of the line)
+        int commaIndex = line.indexOf(',');
+        return commaIndex > 0 && hiddenapiFilterSet.contains(line.substring(0, commaIndex));
+    }
+
+    /**
+     * Loads the filter file and inserts each line of the file into a Set
+     *
+     * @throws IOException if the filter file does not exist
+     */
+    private void loadFilters() throws IOException {
+        // Avoids testing members in filter file (only a single filter file can be supplied)
+        if (hiddenapiFilterFile != null) {
+            VirtualPath.ResourcePath resourcePath =
+                    VirtualPath.get(getClass().getClassLoader(), hiddenapiFilterFile);
+            BufferedReader reader = new BufferedReader(
+                    new InputStreamReader(resourcePath.newInputStream()));
+            String filterFileLine = reader.readLine();
+            while (filterFileLine != null) {
+                if (!filterFileLine.startsWith("#")) {
+                    hiddenapiFilterSet.add(filterFileLine);
+                }
+                filterFileLine = reader.readLine();
+            }
+        }
+    }
+
 }
diff --git a/tests/signature/api-check/src/java/android/signature/cts/api/SdkListKillswitchTest.java b/tests/signature/api-check/src/java/android/signature/cts/api/SdkListKillswitchTest.java
new file mode 100644
index 0000000..9e85b92
--- /dev/null
+++ b/tests/signature/api-check/src/java/android/signature/cts/api/SdkListKillswitchTest.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2018 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.signature.cts.api;
+
+public class SdkListKillswitchTest extends BaseKillswitchTest {
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mErrorMessageAppendix = " when global setting hidden_api_blacklist_exemptions is \"L\"";
+    }
+
+    @Override
+    protected String getExpectedBlocklistExemptions() {
+        return "L";
+    }
+}
diff --git a/tests/signature/api-check/src/java/android/signature/cts/api/TestResultObserver.java b/tests/signature/api-check/src/java/android/signature/cts/api/TestResultObserver.java
index 715cf2f..5b74951 100644
--- a/tests/signature/api-check/src/java/android/signature/cts/api/TestResultObserver.java
+++ b/tests/signature/api-check/src/java/android/signature/cts/api/TestResultObserver.java
@@ -19,15 +19,18 @@
 import android.signature.cts.FailureType;
 import android.signature.cts.ResultObserver;
 
+import repackaged.junit.framework.Assert;
+import repackaged.junit.framework.TestCase;
+
 /**
  * Keeps track of any reported failures.
  */
 class TestResultObserver implements ResultObserver {
 
-    boolean mDidFail = false;
-    int failures = 0;
+    private boolean mDidFail = false;
+    private int failures = 0;
 
-    StringBuilder mErrorString = new StringBuilder();
+    private StringBuilder mErrorString = new StringBuilder();
 
     @Override
     public void notifyFailure(FailureType type, String name, String errorMessage) {
@@ -41,7 +44,26 @@
             mErrorString.append("\tError: ");
             mErrorString.append(errorMessage);
         } else if (failures == 101) {
-            mErrorString.append("\nMore than 100 failures, more errors will be elided.");
+            mErrorString.append("\nMore than 100 failures, aborting test.");
+            finalizeErrorString();
+            Assert.fail(mErrorString.toString());
         }
     }
+
+    private void finalizeErrorString() {
+        ClassLoader classLoader = getClass().getClassLoader();
+        mErrorString.append("\nClassLoader hierarchy\n");
+        while (classLoader != null) {
+            mErrorString.append("    ").append(classLoader).append("\n");
+            classLoader = classLoader.getParent();
+        }
+    }
+
+    public void onTestComplete() {
+        if (mDidFail) {
+            finalizeErrorString();
+            Assert.fail(mErrorString.toString());
+        }
+
+    }
 }
diff --git a/tests/signature/api-check/src/java/android/signature/cts/api/WhitelistKillswitchTest.java b/tests/signature/api-check/src/java/android/signature/cts/api/WhitelistKillswitchTest.java
deleted file mode 100644
index 52e93d2..0000000
--- a/tests/signature/api-check/src/java/android/signature/cts/api/WhitelistKillswitchTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2018 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.signature.cts.api;
-
-public class WhitelistKillswitchTest extends BaseKillswitchTest {
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        String exemptions = getGlobalExemptions();
-        mErrorMessageAppendix = " when global setting hidden_api_blacklist_exemptions is "
-            + "\"" + exemptions + "\"";
-
-        // precondition check: make sure global setting has been configured properly.
-        // This should be done via an adb command, configured in AndroidTest.xml.
-        assertEquals("L", exemptions);
-    }
-}
diff --git a/tests/signature/api-check/src/java/android/signature/cts/api/WildcardKillswitchTest.java b/tests/signature/api-check/src/java/android/signature/cts/api/WildcardKillswitchTest.java
index b7aa0dd..1cdd7d9 100644
--- a/tests/signature/api-check/src/java/android/signature/cts/api/WildcardKillswitchTest.java
+++ b/tests/signature/api-check/src/java/android/signature/cts/api/WildcardKillswitchTest.java
@@ -20,13 +20,11 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
+        mErrorMessageAppendix = " when global setting hidden_api_blacklist_exemptions is \"*\"";
+    }
 
-        String exemptions = getGlobalExemptions();
-        mErrorMessageAppendix = " when global setting hidden_api_blacklist_exemptions is "
-            + "\"" + exemptions + "\"";
-
-        // precondition check: make sure global setting has been configured properly.
-        // This should be done via an adb command, configured in AndroidTest.xml.
-        assertEquals("*", exemptions);
+    @Override
+    protected String getExpectedBlocklistExemptions() {
+        return "*";
     }
 }
diff --git a/tests/signature/api-check/system-annotation/Android.bp b/tests/signature/api-check/system-annotation/Android.bp
index 6b63792..c0364bf 100644
--- a/tests/signature/api-check/system-annotation/Android.bp
+++ b/tests/signature/api-check/system-annotation/Android.bp
@@ -31,7 +31,6 @@
     use_embedded_native_libs: false,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/signature/api-check/system-api/Android.mk b/tests/signature/api-check/system-api/Android.mk
index b633daa..c37915b 100644
--- a/tests/signature/api-check/system-api/Android.mk
+++ b/tests/signature/api-check/system-api/Android.mk
@@ -29,7 +29,7 @@
 LOCAL_MODULE_STEM := system-all.api.zip
 LOCAL_MODULE_CLASS := ETC
 LOCAL_MODULE_PATH = $(TARGET_OUT_DATA_ETC)
-LOCAL_COMPATIBILITY_SUITE := arcts cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := arcts cts general-tests
 include $(BUILD_SYSTEM)/base_rules.mk
 $(LOCAL_BUILT_MODULE): $(SOONG_ZIP)
 $(LOCAL_BUILT_MODULE): PRIVATE_SYSTEM_API_FILES := $(all_system_api_files)
diff --git a/tests/signature/api-check/system-api/AndroidTest.xml b/tests/signature/api-check/system-api/AndroidTest.xml
index 904dce1..e885473 100644
--- a/tests/signature/api-check/system-api/AndroidTest.xml
+++ b/tests/signature/api-check/system-api/AndroidTest.xml
@@ -31,5 +31,7 @@
         <option name="instrumentation-arg" key="expected-api-files" value="system-current.api.gz,system-removed.api.gz,system-all.api.zip" />
         <option name="instrumentation-arg" key="unexpected-api-files" value="android-test-mock-current.api.gz,android-test-runner-current.api.gz" />
         <option name="runtime-hint" value="30s" />
+        <!-- Disable hidden API checks (http://b/171459260). -->
+        <option name="hidden-api-checks" value="false" />
     </test>
 </configuration>
diff --git a/tests/signature/dex-checker/Android.bp b/tests/signature/dex-checker/Android.bp
index 44c8571..1e4f649 100644
--- a/tests/signature/dex-checker/Android.bp
+++ b/tests/signature/dex-checker/Android.bp
@@ -20,6 +20,7 @@
         "-Wall",
         "-Werror",
     ],
+    header_libs: ["jni_headers"],
     sdk_version: "current",
     stl: "c++_static",
 }
diff --git a/tests/signature/intent-check/Android.bp b/tests/signature/intent-check/Android.bp
index 82fb79e..fc26be9 100644
--- a/tests/signature/intent-check/Android.bp
+++ b/tests/signature/intent-check/Android.bp
@@ -26,7 +26,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/tests/signature/lib/android/src/android/signature/cts/XmlApiParser.java b/tests/signature/lib/android/src/android/signature/cts/XmlApiParser.java
index c149492..c8641cd 100644
--- a/tests/signature/lib/android/src/android/signature/cts/XmlApiParser.java
+++ b/tests/signature/lib/android/src/android/signature/cts/XmlApiParser.java
@@ -541,7 +541,9 @@
     }
 
     private void logd(String msg) {
-        Log.d(tag, msg);
+        if (Log.isLoggable(tag, Log.DEBUG)) {
+            Log.d(tag, msg);
+        }
     }
 
     // This unescapes the string format used by doclava and so needs to be kept in sync with any
diff --git a/tests/signature/lib/common/src/android/signature/cts/InterfaceChecker.java b/tests/signature/lib/common/src/android/signature/cts/InterfaceChecker.java
index 66492ff..e0da595 100644
--- a/tests/signature/lib/common/src/android/signature/cts/InterfaceChecker.java
+++ b/tests/signature/lib/common/src/android/signature/cts/InterfaceChecker.java
@@ -44,24 +44,39 @@
  */
 class InterfaceChecker {
 
-    private static final Set<String> HIDDEN_INTERFACE_METHOD_WHITELIST = new HashSet<>();
+    private static final Set<String> HIDDEN_INTERFACE_METHOD_ALLOW_LIST = new HashSet<>();
     static {
         // Interfaces that define @hide or @SystemApi or @TestApi methods will by definition contain
-        // methods that do not appear in current.txt. Interfaces added to this
-        // list are probably not meant to be implemented in an application.
-        HIDDEN_INTERFACE_METHOD_WHITELIST.add("public abstract boolean android.companion.DeviceFilter.matches(D)");
-        HIDDEN_INTERFACE_METHOD_WHITELIST.add("public static <D> boolean android.companion.DeviceFilter.matches(android.companion.DeviceFilter<D>,D)");
-        HIDDEN_INTERFACE_METHOD_WHITELIST.add("public abstract java.lang.String android.companion.DeviceFilter.getDeviceDisplayName(D)");
-        HIDDEN_INTERFACE_METHOD_WHITELIST.add("public abstract int android.companion.DeviceFilter.getMediumType()");
-        HIDDEN_INTERFACE_METHOD_WHITELIST.add("public abstract void android.nfc.tech.TagTechnology.reconnect() throws java.io.IOException");
-        HIDDEN_INTERFACE_METHOD_WHITELIST.add("public abstract void android.os.IBinder.shellCommand(java.io.FileDescriptor,java.io.FileDescriptor,java.io.FileDescriptor,java.lang.String[],android.os.ShellCallback,android.os.ResultReceiver) throws android.os.RemoteException");
-        HIDDEN_INTERFACE_METHOD_WHITELIST.add("public abstract int android.text.ParcelableSpan.getSpanTypeIdInternal()");
-        HIDDEN_INTERFACE_METHOD_WHITELIST.add("public abstract void android.text.ParcelableSpan.writeToParcelInternal(android.os.Parcel,int)");
-        HIDDEN_INTERFACE_METHOD_WHITELIST.add("public abstract void android.view.WindowManager.requestAppKeyboardShortcuts(android.view.WindowManager$KeyboardShortcutsReceiver,int)");
-        HIDDEN_INTERFACE_METHOD_WHITELIST.add("public abstract boolean javax.microedition.khronos.egl.EGL10.eglReleaseThread()");
-        HIDDEN_INTERFACE_METHOD_WHITELIST.add("public abstract void org.w3c.dom.ls.LSSerializer.setFilter(org.w3c.dom.ls.LSSerializerFilter)");
-        HIDDEN_INTERFACE_METHOD_WHITELIST.add("public abstract org.w3c.dom.ls.LSSerializerFilter org.w3c.dom.ls.LSSerializer.getFilter()");
-        HIDDEN_INTERFACE_METHOD_WHITELIST.add("public abstract android.graphics.Region android.view.WindowManager.getCurrentImeTouchRegion()");
+        // methods that do not appear in current.txt but do appear at runtime. That means that those
+        // interfaces will fail compatibility checking because a developer could never implement all
+        // the methods in the interface. However, some interfaces are not intended to be implemented
+        // by a developer and so additional methods in the runtime class will not cause
+        // compatibility errors. Unfortunately, this checker has no way to determine from the
+        // interface whether an interface is intended to be implemented by a developer and for
+        // safety's sake assumes that all interfaces are.
+        //
+        // Additional methods that are provided by the runtime but are not in the API specification
+        // must be listed here to prevent them from being reported as errors.
+        //
+        // TODO(b/71886491): Avoid the need for this allow list.
+        HIDDEN_INTERFACE_METHOD_ALLOW_LIST.add("public abstract boolean android.companion.DeviceFilter.matches(D)");
+        HIDDEN_INTERFACE_METHOD_ALLOW_LIST.add("public static <D> boolean android.companion.DeviceFilter.matches(android.companion.DeviceFilter<D>,D)");
+        HIDDEN_INTERFACE_METHOD_ALLOW_LIST.add("public abstract java.lang.String android.companion.DeviceFilter.getDeviceDisplayName(D)");
+        HIDDEN_INTERFACE_METHOD_ALLOW_LIST.add("public abstract int android.companion.DeviceFilter.getMediumType()");
+        HIDDEN_INTERFACE_METHOD_ALLOW_LIST.add("public abstract void android.nfc.tech.TagTechnology.reconnect() throws java.io.IOException");
+        HIDDEN_INTERFACE_METHOD_ALLOW_LIST.add("public abstract void android.os.IBinder.shellCommand(java.io.FileDescriptor,java.io.FileDescriptor,java.io.FileDescriptor,java.lang.String[],android.os.ShellCallback,android.os.ResultReceiver) throws android.os.RemoteException");
+        HIDDEN_INTERFACE_METHOD_ALLOW_LIST.add("public abstract int android.text.ParcelableSpan.getSpanTypeIdInternal()");
+        HIDDEN_INTERFACE_METHOD_ALLOW_LIST.add("public abstract void android.text.ParcelableSpan.writeToParcelInternal(android.os.Parcel,int)");
+        HIDDEN_INTERFACE_METHOD_ALLOW_LIST.add("public abstract void android.view.WindowManager.requestAppKeyboardShortcuts(android.view.WindowManager$KeyboardShortcutsReceiver,int)");
+        HIDDEN_INTERFACE_METHOD_ALLOW_LIST.add("public abstract boolean javax.microedition.khronos.egl.EGL10.eglReleaseThread()");
+        HIDDEN_INTERFACE_METHOD_ALLOW_LIST.add("public abstract void org.w3c.dom.ls.LSSerializer.setFilter(org.w3c.dom.ls.LSSerializerFilter)");
+        HIDDEN_INTERFACE_METHOD_ALLOW_LIST.add("public abstract org.w3c.dom.ls.LSSerializerFilter org.w3c.dom.ls.LSSerializer.getFilter()");
+        HIDDEN_INTERFACE_METHOD_ALLOW_LIST.add("public abstract android.graphics.Region android.view.WindowManager.getCurrentImeTouchRegion()");
+        HIDDEN_INTERFACE_METHOD_ALLOW_LIST.add("public abstract java.util.Set<android.media.AudioMetadata$Key<?>> android.media.AudioMetadataReadMap.keySet()");
+        HIDDEN_INTERFACE_METHOD_ALLOW_LIST.add("public abstract android.view.InsetsState android.view.WindowInsetsController.getState()");
+        HIDDEN_INTERFACE_METHOD_ALLOW_LIST.add("public abstract boolean android.view.WindowInsetsController.isRequestedVisible(int)");
+        HIDDEN_INTERFACE_METHOD_ALLOW_LIST.add("public abstract void android.view.WindowInsetsController.setAnimationsDisabled(boolean)");
+        HIDDEN_INTERFACE_METHOD_ALLOW_LIST.add("public abstract void android.view.inputmethod.InputMethod.hideSoftInputWithToken(int,android.os.ResultReceiver,android.os.IBinder)");
     }
 
     private final ResultObserver resultObserver;
@@ -84,7 +99,9 @@
             if (methods.size() > 0) {
                 resultObserver.notifyFailure(FailureType.MISMATCH_INTERFACE_METHOD,
                         classDescription.getAbsoluteClassName(), "Interfaces cannot be modified: "
-                                + classDescription.getAbsoluteClassName() + ": " + methods);
+                                + classDescription.getAbsoluteClassName()
+                                + " has the following methods that are not present in the API specification:\n\t"
+                                + methods.stream().map(Method::toGenericString).collect(Collectors.joining("\n\t")));
             }
         }
     }
@@ -107,7 +124,7 @@
                 .filter(not(Method::isSynthetic))
                 .filter(not(Method::isBridge))
                 .filter(m -> !Modifier.isStatic(m.getModifiers()))
-                .filter(m -> !HIDDEN_INTERFACE_METHOD_WHITELIST.contains(m.toGenericString()))
+                .filter(m -> !HIDDEN_INTERFACE_METHOD_ALLOW_LIST.contains(m.toGenericString()))
                 .filter(m -> !findMethod(classDescription, m))
                 .collect(Collectors.toCollection(ArrayList::new));
     }
diff --git a/tests/signature/lib/common/src/android/signature/cts/ReflectionHelper.java b/tests/signature/lib/common/src/android/signature/cts/ReflectionHelper.java
index 3bed2ac..0890bc9 100644
--- a/tests/signature/lib/common/src/android/signature/cts/ReflectionHelper.java
+++ b/tests/signature/lib/common/src/android/signature/cts/ReflectionHelper.java
@@ -209,7 +209,8 @@
         // Check for varargs.  jdiff reports varargs as ..., while
         // reflection reports them as []
         int jdiffParamEndOffset = jdiffParam.indexOf("...");
-        int reflectionParamEndOffset = reflectionParam != null ? reflectionParam.indexOf("[]") : -1;
+        int reflectionParamEndOffset = reflectionParam != null
+                ? reflectionParam.lastIndexOf("[]") : -1;
         if (jdiffParamEndOffset != -1 && reflectionParamEndOffset != -1) {
             jdiffParam = jdiffParam.substring(0, jdiffParamEndOffset);
             reflectionParam = reflectionParam.substring(0, reflectionParamEndOffset);
diff --git a/tests/signature/runSignatureTests.sh b/tests/signature/runSignatureTests.sh
index 56d2679..fe7e58e 100755
--- a/tests/signature/runSignatureTests.sh
+++ b/tests/signature/runSignatureTests.sh
@@ -26,13 +26,13 @@
 
 CtsSystemApiAnnotationTestCases
 
-CtsHiddenApiBlacklistCurrentApiTestCases
-CtsHiddenApiBlacklistApi27TestCases
-CtsHiddenApiBlacklistApi28TestCases
-CtsHiddenApiBlacklistDebugClassTestCases
+CtsHiddenApiBlocklistCurrentApiTestCases
+CtsHiddenApiBlocklistApi27TestCases
+CtsHiddenApiBlocklistApi28TestCases
+CtsHiddenApiBlocklistDebugClassTestCases
 
 CtsHiddenApiKillswitchWildcardTestCases
-CtsHiddenApiKillswitchWhitelistTestCases
+CtsHiddenApiKillswitchSdkListTestCases
 CtsHiddenApiKillswitchDebugClassTestCases
 
 CtsSharedLibsApiSignatureTestCases
diff --git a/tests/simplecpu/Android.mk b/tests/simplecpu/Android.mk
index 8e61abc..7d1db20 100644
--- a/tests/simplecpu/Android.mk
+++ b/tests/simplecpu/Android.mk
@@ -30,7 +30,7 @@
 LOCAL_PACKAGE_NAME := CtsSimpleCpuTestCases
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_SDK_VERSION := 16
 
diff --git a/tests/simplecpu/jni/Android.bp b/tests/simplecpu/jni/Android.bp
index 2ed06c0..000173d 100644
--- a/tests/simplecpu/jni/Android.bp
+++ b/tests/simplecpu/jni/Android.bp
@@ -22,5 +22,6 @@
         "-Werror",
         "-Wno-unused-parameter",
     ],
+    header_libs: ["jni_headers"],
     gtest: false,
 }
diff --git a/tests/suspendapps/permission/Android.bp b/tests/suspendapps/permission/Android.bp
index 249403c..70278bc 100644
--- a/tests/suspendapps/permission/Android.bp
+++ b/tests/suspendapps/permission/Android.bp
@@ -30,7 +30,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/suspendapps/test-apps/SuspendTestApp/Android.bp b/tests/suspendapps/test-apps/SuspendTestApp/Android.bp
index 05e3e31..cade030 100644
--- a/tests/suspendapps/test-apps/SuspendTestApp/Android.bp
+++ b/tests/suspendapps/test-apps/SuspendTestApp/Android.bp
@@ -25,7 +25,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
@@ -49,7 +48,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/tests/suspendapps/test-apps/TestDeviceAdmin/Android.bp b/tests/suspendapps/test-apps/TestDeviceAdmin/Android.bp
index e8da0dd..4bd551b 100644
--- a/tests/suspendapps/test-apps/TestDeviceAdmin/Android.bp
+++ b/tests/suspendapps/test-apps/TestDeviceAdmin/Android.bp
@@ -22,7 +22,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/suspendapps/tests/Android.bp b/tests/suspendapps/tests/Android.bp
index 94bb3b6..5c56724 100644
--- a/tests/suspendapps/tests/Android.bp
+++ b/tests/suspendapps/tests/Android.bp
@@ -32,7 +32,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/Android.mk b/tests/tests/Android.mk
deleted file mode 100644
index 8bb2875..0000000
--- a/tests/tests/Android.mk
+++ /dev/null
@@ -1,16 +0,0 @@
-# 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.
-
-include $(call all-subdir-makefiles)
-
diff --git a/tests/tests/accounts/Android.bp b/tests/tests/accounts/Android.bp
index 2ec55e7..7e60638 100644
--- a/tests/tests/accounts/Android.bp
+++ b/tests/tests/accounts/Android.bp
@@ -21,8 +21,8 @@
         "platform-test-annotations",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     certificate: ":cts-testkey1",
@@ -31,7 +31,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/Android.bp b/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/Android.bp
index 9591f21..2b2980d 100644
--- a/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/Android.bp
+++ b/tests/tests/accounts/CtsUnaffiliatedAccountAuthenticators/Android.bp
@@ -26,7 +26,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     certificate: ":cts-testkey2",
diff --git a/tests/tests/animation/Android.bp b/tests/tests/animation/Android.bp
index 40e0fa5..d8cbf4d 100644
--- a/tests/tests/animation/Android.bp
+++ b/tests/tests/animation/Android.bp
@@ -25,13 +25,12 @@
         "platform-test-annotations",
     ],
 
-    libs: ["android.test.runner.stubs"],
+    libs: ["android.test.runner"],
 
     srcs: ["src/**/*.java"],
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/tests/tests/apache-http/Android.bp b/tests/tests/apache-http/Android.bp
new file mode 100644
index 0000000..9167002
--- /dev/null
+++ b/tests/tests/apache-http/Android.bp
@@ -0,0 +1,40 @@
+// Copyright (C) 2020 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.
+
+android_test {
+    name: "CtsApacheHttpTestCases",
+    defaults: ["cts_defaults"],
+    sdk_version: "test_current",
+    srcs: [
+        "src/**/*.java",
+        "src/**/*.kt",
+    ],
+    libs: [
+        "android.test.base",
+        "org.apache.http.legacy",
+    ],
+    static_libs: [
+        "compatibility-device-util-axt",
+        "mockwebserver",
+        "ctstestserver",
+    ],
+    jni_libs: [
+        "libcts_jni",
+    ],
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+    compile_multilib: "both",
+}
diff --git a/tests/tests/apache-http/AndroidManifest.xml b/tests/tests/apache-http/AndroidManifest.xml
new file mode 100644
index 0000000..8fa478b
--- /dev/null
+++ b/tests/tests/apache-http/AndroidManifest.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.apachehttp.cts">
+
+    <uses-permission android:name="android.permission.INTERNET" />
+
+    <application android:usesCleartextTraffic="true">
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <!--  self-instrumenting test package. -->
+    <instrumentation
+        android:name="androidx.test.runner.AndroidJUnitRunner"
+        android:targetPackage="android.apachehttp.cts" >
+    </instrumentation>
+</manifest>
diff --git a/tests/tests/apache-http/AndroidTest.xml b/tests/tests/apache-http/AndroidTest.xml
new file mode 100644
index 0000000..0bd9d28
--- /dev/null
+++ b/tests/tests/apache-http/AndroidTest.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+
+<configuration description="Config for CtsApacheHttpDeviceTestCases">
+    <option name="test-suite-tag" value="cts" />
+    <option name="config-descriptor:metadata" key="component" value="networking" />
+    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
+    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
+    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
+    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+        <option name="cleanup-apks" value="true" />
+        <option name="test-file-name" value="CtsApacheHttpTestCases.apk" />
+    </target_preparer>
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+        <option name="package" value="android.apachehttp.cts" />
+    </test>
+</configuration>
diff --git a/tests/tests/apache-http/OWNERS b/tests/tests/apache-http/OWNERS
new file mode 100644
index 0000000..b9032af
--- /dev/null
+++ b/tests/tests/apache-http/OWNERS
@@ -0,0 +1,2 @@
+# Bug component: 24949
+include platform/frameworks/base:/core/java/android/net/http/OWNERS
diff --git a/tests/tests/net/src/android/net/http/cts/ApacheHttpClientTest.java b/tests/tests/apache-http/src/android/net/http/cts/ApacheHttpClientTest.java
similarity index 100%
rename from tests/tests/net/src/android/net/http/cts/ApacheHttpClientTest.java
rename to tests/tests/apache-http/src/android/net/http/cts/ApacheHttpClientTest.java
diff --git a/tests/tests/net/src/android/net/http/cts/HttpResponseCacheTest.java b/tests/tests/apache-http/src/android/net/http/cts/HttpResponseCacheTest.java
similarity index 100%
rename from tests/tests/net/src/android/net/http/cts/HttpResponseCacheTest.java
rename to tests/tests/apache-http/src/android/net/http/cts/HttpResponseCacheTest.java
diff --git a/tests/tests/net/src/android/net/http/cts/SslCertificateTest.java b/tests/tests/apache-http/src/android/net/http/cts/SslCertificateTest.java
similarity index 100%
rename from tests/tests/net/src/android/net/http/cts/SslCertificateTest.java
rename to tests/tests/apache-http/src/android/net/http/cts/SslCertificateTest.java
diff --git a/tests/tests/net/src/android/net/http/cts/SslCertificate_DNameTest.java b/tests/tests/apache-http/src/android/net/http/cts/SslCertificate_DNameTest.java
similarity index 100%
rename from tests/tests/net/src/android/net/http/cts/SslCertificate_DNameTest.java
rename to tests/tests/apache-http/src/android/net/http/cts/SslCertificate_DNameTest.java
diff --git a/tests/tests/net/src/android/net/http/cts/SslErrorTest.java b/tests/tests/apache-http/src/android/net/http/cts/SslErrorTest.java
similarity index 100%
rename from tests/tests/net/src/android/net/http/cts/SslErrorTest.java
rename to tests/tests/apache-http/src/android/net/http/cts/SslErrorTest.java
diff --git a/tests/tests/net/src/android/net/http/cts/X509TrustManagerExtensionsTest.java b/tests/tests/apache-http/src/android/net/http/cts/X509TrustManagerExtensionsTest.java
similarity index 100%
rename from tests/tests/net/src/android/net/http/cts/X509TrustManagerExtensionsTest.java
rename to tests/tests/apache-http/src/android/net/http/cts/X509TrustManagerExtensionsTest.java
diff --git a/tests/tests/net/src/org/apache/http/conn/ssl/cts/AbstractVerifierTest.java b/tests/tests/apache-http/src/org/apache/http/conn/ssl/cts/AbstractVerifierTest.java
similarity index 100%
rename from tests/tests/net/src/org/apache/http/conn/ssl/cts/AbstractVerifierTest.java
rename to tests/tests/apache-http/src/org/apache/http/conn/ssl/cts/AbstractVerifierTest.java
diff --git a/tests/tests/app.usage/Android.bp b/tests/tests/app.usage/Android.bp
index 2fc66d5..75dac41 100644
--- a/tests/tests/app.usage/Android.bp
+++ b/tests/tests/app.usage/Android.bp
@@ -25,14 +25,13 @@
         "ub-uiautomator",
     ],
     libs: [
-        "android.test.base.stubs",
-        "android.test.runner.stubs",
+        "android.test.base",
+        "android.test.runner",
     ],
     srcs: ["src/**/*.java", "TestApp1/**/*.java", "TestApp1/**/*.aidl"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/app.usage/TestApp1/Android.bp b/tests/tests/app.usage/TestApp1/Android.bp
index 019d685..b1c4ced 100644
--- a/tests/tests/app.usage/TestApp1/Android.bp
+++ b/tests/tests/app.usage/TestApp1/Android.bp
@@ -25,14 +25,13 @@
         "ub-uiautomator",
     ],
     libs: [
-        "android.test.base.stubs",
-        "android.test.runner.stubs",
+        "android.test.base",
+        "android.test.runner",
     ],
     srcs: ["src/**/*.java", "aidl/**/*.aidl"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current"
diff --git a/tests/tests/app.usage/TestApp1/src/android/app/usage/cts/test1/SomeActivityWithLocus.java b/tests/tests/app.usage/TestApp1/src/android/app/usage/cts/test1/SomeActivityWithLocus.java
index dda803c..005274f 100644
--- a/tests/tests/app.usage/TestApp1/src/android/app/usage/cts/test1/SomeActivityWithLocus.java
+++ b/tests/tests/app.usage/TestApp1/src/android/app/usage/cts/test1/SomeActivityWithLocus.java
@@ -33,6 +33,7 @@
 
     @Override
     protected void onStart() {
+        super.onStart();
         setLocusContext(new LocusId("Locus11"), null);
     }
 }
diff --git a/tests/tests/app.usage/src/android/app/usage/cts/UsageReportingTest.java b/tests/tests/app.usage/src/android/app/usage/cts/UsageReportingTest.java
index a5e780c..ebb5d11 100644
--- a/tests/tests/app.usage/src/android/app/usage/cts/UsageReportingTest.java
+++ b/tests/tests/app.usage/src/android/app/usage/cts/UsageReportingTest.java
@@ -51,6 +51,8 @@
     private static final String TOKEN_0 = "SuperSecretToken";
     private static final String TOKEN_1 = "AnotherSecretToken";
 
+    private static final String DEVICE_SLEEP_COMMAND = "input keyevent KEYCODE_SLEEP";
+
     private static final int ASSERT_TIMEOUT_SECONDS = 5; // 5 seconds
 
     @Before
@@ -119,7 +121,7 @@
         assertAppOrTokenUsed(mFullToken0, true);
 
         // Send the device to sleep to get onStop called for the token reporting activities.
-        mUiDevice.sleep();
+        mUiDevice.executeShellCommand(DEVICE_SLEEP_COMMAND);
         Thread.sleep(1000);
 
         assertAppOrTokenUsed(mFullToken0, false);
@@ -203,7 +205,7 @@
 
 
         // Send the device to sleep to get onStop called for the token reporting activities.
-        mUiDevice.sleep();
+        mUiDevice.executeShellCommand(DEVICE_SLEEP_COMMAND);
         Thread.sleep(1000);
 
         assertAppOrTokenUsed(mFullToken0, false);
diff --git a/tests/tests/app/Android.bp b/tests/tests/app/Android.bp
index 2be7e4f..f090495 100644
--- a/tests/tests/app/Android.bp
+++ b/tests/tests/app/Android.bp
@@ -17,8 +17,8 @@
     defaults: ["cts_defaults"],
     platform_apis: true,
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     static_libs: [
         "ctstestrunner-axt",
@@ -29,7 +29,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/appcomponentfactory/Android.bp b/tests/tests/appcomponentfactory/Android.bp
index 7b7abe2..7c889cf 100644
--- a/tests/tests/appcomponentfactory/Android.bp
+++ b/tests/tests/appcomponentfactory/Android.bp
@@ -17,8 +17,8 @@
     defaults: ["cts_defaults"],
     sdk_version: "current",
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     static_libs: [
         "ctstestrunner-axt",
@@ -29,7 +29,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/appenumeration/Android.bp b/tests/tests/appenumeration/Android.bp
index c4f82e1..9cbbcaa 100644
--- a/tests/tests/appenumeration/Android.bp
+++ b/tests/tests/appenumeration/Android.bp
@@ -18,7 +18,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: [
diff --git a/tests/tests/appenumeration/app/source/Android.bp b/tests/tests/appenumeration/app/source/Android.bp
index dc94a29..731a19c 100644
--- a/tests/tests/appenumeration/app/source/Android.bp
+++ b/tests/tests/appenumeration/app/source/Android.bp
@@ -26,7 +26,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -38,7 +37,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -50,7 +48,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -62,7 +59,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -74,7 +70,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -86,7 +81,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -98,7 +92,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -110,7 +103,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -122,7 +114,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -134,7 +125,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -146,7 +136,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -158,7 +147,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -170,7 +158,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -182,7 +169,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -194,7 +180,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -206,7 +191,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -218,7 +202,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -230,7 +213,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -241,7 +223,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -253,7 +234,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -265,7 +245,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -277,7 +256,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -289,7 +267,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -301,7 +278,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/appenumeration/app/target/Android.bp b/tests/tests/appenumeration/app/target/Android.bp
index b3afe4b..cd1eb18 100644
--- a/tests/tests/appenumeration/app/target/Android.bp
+++ b/tests/tests/appenumeration/app/target/Android.bp
@@ -20,7 +20,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
@@ -34,7 +33,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
@@ -48,7 +46,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
@@ -62,7 +59,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
@@ -76,7 +72,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
@@ -90,7 +85,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
@@ -104,7 +98,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
@@ -118,7 +111,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
@@ -132,7 +124,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
@@ -146,7 +137,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
@@ -160,7 +150,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/appenumeration/src/android/appenumeration/cts/AppEnumerationTests.java b/tests/tests/appenumeration/src/android/appenumeration/cts/AppEnumerationTests.java
index cfd12a2..da15191 100644
--- a/tests/tests/appenumeration/src/android/appenumeration/cts/AppEnumerationTests.java
+++ b/tests/tests/appenumeration/src/android/appenumeration/cts/AppEnumerationTests.java
@@ -178,15 +178,6 @@
     }
 
     @Test
-    public void all_cannotSeeForceQueryableInstalledNormally() throws Exception {
-        assertNotVisible(QUERIES_NOTHING, TARGET_FORCEQUERYABLE_NORMAL);
-        assertNotVisible(QUERIES_ACTIVITY_ACTION, TARGET_FORCEQUERYABLE_NORMAL);
-        assertNotVisible(QUERIES_SERVICE_ACTION, TARGET_FORCEQUERYABLE_NORMAL);
-        assertNotVisible(QUERIES_PROVIDER_AUTH, TARGET_FORCEQUERYABLE_NORMAL);
-        assertNotVisible(QUERIES_PACKAGE, TARGET_FORCEQUERYABLE_NORMAL);
-    }
-
-    @Test
     public void startExplicitly_canStartNonVisible() throws Exception {
         assertNotVisible(QUERIES_NOTHING, TARGET_FILTERS);
         startExplicitIntentViaComponent(QUERIES_NOTHING, TARGET_FILTERS);
diff --git a/tests/tests/appop/Android.bp b/tests/tests/appop/Android.bp
index 20ab4bf..4779f43 100644
--- a/tests/tests/appop/Android.bp
+++ b/tests/tests/appop/Android.bp
@@ -25,6 +25,7 @@
 
     srcs: ["jni/**/*.cpp"],
 
+    header_libs: ["jni_headers"],
     shared_libs: [
         "libbinder",
         "libutils",
@@ -90,7 +91,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/appop/AppInBackground/Android.bp b/tests/tests/appop/AppInBackground/Android.bp
index b46e877..baa001a 100644
--- a/tests/tests/appop/AppInBackground/Android.bp
+++ b/tests/tests/appop/AppInBackground/Android.bp
@@ -17,7 +17,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ]
 }
diff --git a/tests/tests/appop/AppThatCanBeForcedIntoForegroundStates/Android.bp b/tests/tests/appop/AppThatCanBeForcedIntoForegroundStates/Android.bp
index cc1f836..fb06b6e 100644
--- a/tests/tests/appop/AppThatCanBeForcedIntoForegroundStates/Android.bp
+++ b/tests/tests/appop/AppThatCanBeForcedIntoForegroundStates/Android.bp
@@ -23,7 +23,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ]
 }
\ No newline at end of file
diff --git a/tests/tests/appop/AppThatUsesAppOps/Android.bp b/tests/tests/appop/AppThatUsesAppOps/Android.bp
index 0ba18c3..d4b546c 100644
--- a/tests/tests/appop/AppThatUsesAppOps/Android.bp
+++ b/tests/tests/appop/AppThatUsesAppOps/Android.bp
@@ -57,7 +57,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ]
 }
\ No newline at end of file
diff --git a/tests/tests/appop/AppToBlame1/Android.bp b/tests/tests/appop/AppToBlame1/Android.bp
index 70d1c6e..9867a6a 100644
--- a/tests/tests/appop/AppToBlame1/Android.bp
+++ b/tests/tests/appop/AppToBlame1/Android.bp
@@ -17,7 +17,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ]
 }
\ No newline at end of file
diff --git a/tests/tests/appop/AppToBlame2/Android.bp b/tests/tests/appop/AppToBlame2/Android.bp
index 85f97c9..e11008c 100644
--- a/tests/tests/appop/AppToBlame2/Android.bp
+++ b/tests/tests/appop/AppToBlame2/Android.bp
@@ -17,7 +17,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ]
 }
\ No newline at end of file
diff --git a/tests/tests/appop/AppToCollect/Android.bp b/tests/tests/appop/AppToCollect/Android.bp
index 8a1b5a8..1706aea 100644
--- a/tests/tests/appop/AppToCollect/Android.bp
+++ b/tests/tests/appop/AppToCollect/Android.bp
@@ -17,7 +17,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ]
 }
\ No newline at end of file
diff --git a/tests/tests/appop/AppWithAttributionInheritingFromExisting/Android.bp b/tests/tests/appop/AppWithAttributionInheritingFromExisting/Android.bp
index 8fd4431..10f916a 100644
--- a/tests/tests/appop/AppWithAttributionInheritingFromExisting/Android.bp
+++ b/tests/tests/appop/AppWithAttributionInheritingFromExisting/Android.bp
@@ -17,7 +17,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ]
 }
\ No newline at end of file
diff --git a/tests/tests/appop/AppWithAttributionInheritingFromSameAsOther/Android.bp b/tests/tests/appop/AppWithAttributionInheritingFromSameAsOther/Android.bp
index 8d519dc..2214391 100644
--- a/tests/tests/appop/AppWithAttributionInheritingFromSameAsOther/Android.bp
+++ b/tests/tests/appop/AppWithAttributionInheritingFromSameAsOther/Android.bp
@@ -17,7 +17,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ]
 }
\ No newline at end of file
diff --git a/tests/tests/appop/AppWithAttributionInheritingFromSelf/Android.bp b/tests/tests/appop/AppWithAttributionInheritingFromSelf/Android.bp
index eab4652..2317c70 100644
--- a/tests/tests/appop/AppWithAttributionInheritingFromSelf/Android.bp
+++ b/tests/tests/appop/AppWithAttributionInheritingFromSelf/Android.bp
@@ -17,7 +17,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ]
 }
\ No newline at end of file
diff --git a/tests/tests/appop/AppWithDuplicateAttribution/Android.bp b/tests/tests/appop/AppWithDuplicateAttribution/Android.bp
index cab076c..f1e7068 100644
--- a/tests/tests/appop/AppWithDuplicateAttribution/Android.bp
+++ b/tests/tests/appop/AppWithDuplicateAttribution/Android.bp
@@ -17,7 +17,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ]
 }
\ No newline at end of file
diff --git a/tests/tests/appop/AppWithLongAttributionTag/Android.bp b/tests/tests/appop/AppWithLongAttributionTag/Android.bp
index e82d3e5..f5afd4e 100644
--- a/tests/tests/appop/AppWithLongAttributionTag/Android.bp
+++ b/tests/tests/appop/AppWithLongAttributionTag/Android.bp
@@ -17,7 +17,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ]
 }
\ No newline at end of file
diff --git a/tests/tests/appop/AppWithTooManyAttributions/Android.bp b/tests/tests/appop/AppWithTooManyAttributions/Android.bp
index 8676715..d681b21 100644
--- a/tests/tests/appop/AppWithTooManyAttributions/Android.bp
+++ b/tests/tests/appop/AppWithTooManyAttributions/Android.bp
@@ -17,7 +17,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ]
 }
\ No newline at end of file
diff --git a/tests/tests/appop/jni/android/app/appops/cts/AppOpsLoggingTest.cpp b/tests/tests/appop/jni/android/app/appops/cts/AppOpsLoggingTest.cpp
index a403163..b5af257 100644
--- a/tests/tests/appop/jni/android/app/appops/cts/AppOpsLoggingTest.cpp
+++ b/tests/tests/appop/jni/android/app/appops/cts/AppOpsLoggingTest.cpp
@@ -36,22 +36,20 @@
     String16 callingPackageName(nativeCallingPackageName);
 
     const char *nativeAttributionTag;
-    std::unique_ptr<String16> attributionTag;
+    std::optional<String16> attributionTag;
     if (jAttributionTag != nullptr) {
         nativeAttributionTag = env->GetStringUTFChars(jAttributionTag, 0);
-        attributionTag = std::unique_ptr<String16>(new String16(nativeAttributionTag));
+        attributionTag = String16(nativeAttributionTag);
     }
 
     const char *nativeMessage;
-    String16 *message;
+    String16 message;
     if (jMessage != nullptr) {
         nativeMessage = env->GetStringUTFChars(jMessage, 0);
-        message = new String16(nativeMessage);
-    } else {
-        message = new String16();
+        message = String16(nativeMessage);
     }
 
-    appOpsManager.noteOp(op, uid, callingPackageName, attributionTag, *message);
+    appOpsManager.noteOp(op, uid, callingPackageName, attributionTag, message);
 
     env->ReleaseStringUTFChars(jCallingPackageName, nativeCallingPackageName);
 
@@ -62,5 +60,4 @@
     if (jMessage != nullptr) {
         env->ReleaseStringUTFChars(jMessage, nativeMessage);
     }
-    delete message;
 }
diff --git a/tests/tests/appop/src/android/app/appops/cts/AppOpEventCollectionTest.kt b/tests/tests/appop/src/android/app/appops/cts/AppOpEventCollectionTest.kt
index 133973a..efb863b 100644
--- a/tests/tests/appop/src/android/app/appops/cts/AppOpEventCollectionTest.kt
+++ b/tests/tests/appop/src/android/app/appops/cts/AppOpEventCollectionTest.kt
@@ -69,6 +69,13 @@
     }
 
     @Test
+    fun ensureCorrectOpStr() {
+        appOpsManager.noteOp(OPSTR_WIFI_SCAN, myUid, myPackage, null, null)
+        val opEntry = getOpEntry(myUid, myPackage, OPSTR_WIFI_SCAN)!!
+        assertThat(opEntry.opStr).isEqualTo(OPSTR_WIFI_SCAN)
+    }
+
+    @Test
     fun switchUidStateWhileOpsAreRunning() {
         val before = System.currentTimeMillis()
 
diff --git a/tests/tests/appop/src/android/app/appops/cts/AppOpsLoggingTest.kt b/tests/tests/appop/src/android/app/appops/cts/AppOpsLoggingTest.kt
index ea20c6d..c2cf39e 100644
--- a/tests/tests/appop/src/android/app/appops/cts/AppOpsLoggingTest.kt
+++ b/tests/tests/appop/src/android/app/appops/cts/AppOpsLoggingTest.kt
@@ -58,6 +58,7 @@
 import android.os.Handler
 import android.os.IBinder
 import android.os.Looper
+import android.os.Process
 import android.platform.test.annotations.AppModeFull
 import android.provider.ContactsContract
 import android.telephony.TelephonyManager
@@ -89,9 +90,12 @@
     private val context = InstrumentationRegistry.getInstrumentation().targetContext
     private val appOpsManager = context.getSystemService(AppOpsManager::class.java)
 
-    private val myUid = android.os.Process.myUid()
+    private val myUid = Process.myUid()
+    private val myUserHandle = Process.myUserHandle()
     private val myPackage = context.packageName
 
+    private var wasLocationEnabled = false
+
     private lateinit var testService: IAppOpsUserService
     private lateinit var serviceConnection: ServiceConnection
 
@@ -101,6 +105,23 @@
     private val asyncNoted = mutableListOf<AsyncNotedAppOp>()
 
     @Before
+    fun setLocationEnabled() {
+        val locationManager = context.getSystemService(LocationManager::class.java)
+        runWithShellPermissionIdentity {
+            wasLocationEnabled = locationManager.isLocationEnabled
+            locationManager.setLocationEnabledForUser(true, myUserHandle)
+        }
+    }
+
+    @After
+    fun restoreLocationEnabled() {
+        val locationManager = context.getSystemService(LocationManager::class.java)
+        runWithShellPermissionIdentity {
+            locationManager.setLocationEnabledForUser(wasLocationEnabled, myUserHandle)
+        }
+    }
+
+    @Before
     fun loadNativeCode() {
         System.loadLibrary("CtsAppOpsTestCases_jni")
     }
@@ -704,7 +725,7 @@
         private val handler = Handler(Looper.getMainLooper())
         private val appOpsManager = context.getSystemService(AppOpsManager::class.java)
 
-        private val myUid = android.os.Process.myUid()
+        private val myUid = Process.myUid()
         private val myPackage = context.packageName
 
         override fun noteSyncOp() {
diff --git a/tests/tests/appwidget/Android.bp b/tests/tests/appwidget/Android.bp
index 09b8e32..461b18d 100644
--- a/tests/tests/appwidget/Android.bp
+++ b/tests/tests/appwidget/Android.bp
@@ -34,11 +34,10 @@
         "junit",
         "compatibility-device-util-axt",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/appwidget/packages/launchermanifest/Android.bp b/tests/tests/appwidget/packages/launchermanifest/Android.bp
index 5631ea9..313667e 100644
--- a/tests/tests/appwidget/packages/launchermanifest/Android.bp
+++ b/tests/tests/appwidget/packages/launchermanifest/Android.bp
@@ -21,7 +21,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     aaptflags: [
@@ -38,7 +37,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     aaptflags: [
@@ -54,7 +52,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     aaptflags: [
diff --git a/tests/tests/appwidget/packages/widgetprovider/Android.bp b/tests/tests/appwidget/packages/widgetprovider/Android.bp
index e526a30..c4a64a8 100644
--- a/tests/tests/appwidget/packages/widgetprovider/Android.bp
+++ b/tests/tests/appwidget/packages/widgetprovider/Android.bp
@@ -21,7 +21,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -35,7 +34,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -49,7 +47,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/assist/Android.bp b/tests/tests/assist/Android.bp
index 85f4fd4..0f2e412 100644
--- a/tests/tests/assist/Android.bp
+++ b/tests/tests/assist/Android.bp
@@ -18,7 +18,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: [
diff --git a/tests/tests/assist/service/Android.bp b/tests/tests/assist/service/Android.bp
index 4b4c66c..20beec5 100644
--- a/tests/tests/assist/service/Android.bp
+++ b/tests/tests/assist/service/Android.bp
@@ -24,7 +24,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/assist/service/src/android/assist/service/MainInteractionSession.java b/tests/tests/assist/service/src/android/assist/service/MainInteractionSession.java
index 2c96f80..dde77a8 100644
--- a/tests/tests/assist/service/src/android/assist/service/MainInteractionSession.java
+++ b/tests/tests/assist/service/src/android/assist/service/MainInteractionSession.java
@@ -31,6 +31,7 @@
 import android.service.voice.VoiceInteractionSession;
 import android.util.Log;
 import android.view.Display;
+import android.view.DisplayCutout;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewTreeObserver;
@@ -121,6 +122,17 @@
                     Display d = mContentView.getDisplay();
                     Point displayPoint = new Point();
                     d.getRealSize(displayPoint);
+                    DisplayCutout dc = d.getCutout();
+                    if (dc != null) {
+                        // Means the device has a cutout area
+                        android.graphics.Insets wi = d.getCutout().getWaterfallInsets();
+
+                        if (wi != android.graphics.Insets.NONE) {
+                            // Waterfall cutout. Considers only the display
+                            // useful area discarding the cutout.
+                            displayPoint.x -= (wi.left + wi.right);
+                        }
+                    }
                     Bundle bundle = new Bundle();
                     bundle.putString(Utils.EXTRA_REMOTE_CALLBACK_ACTION, Utils.BROADCAST_CONTENT_VIEW_HEIGHT);
                     bundle.putInt(Utils.EXTRA_CONTENT_VIEW_HEIGHT, mContentView.getHeight());
diff --git a/tests/tests/assist/testapp/Android.bp b/tests/tests/assist/testapp/Android.bp
index 406fe7b..8ba03b7 100644
--- a/tests/tests/assist/testapp/Android.bp
+++ b/tests/tests/assist/testapp/Android.bp
@@ -20,7 +20,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/background/Android.bp b/tests/tests/background/Android.bp
index 312bc45..5dc54e5 100644
--- a/tests/tests/background/Android.bp
+++ b/tests/tests/background/Android.bp
@@ -23,11 +23,11 @@
         "ctstestrunner-axt",
         "ub-uiautomator",
     ],
-    libs: ["android.test.runner.stubs"],
+    libs: ["android.test.runner"],
     srcs: ["src/**/*.java"],
     test_suites: [
         "cts",
-        "vts10",
+        "general-tests",
     ],
     sdk_version: "test_current",
 }
diff --git a/tests/tests/batterysaving/Android.bp b/tests/tests/batterysaving/Android.bp
index 4966fbb..bbcd8d7 100644
--- a/tests/tests/batterysaving/Android.bp
+++ b/tests/tests/batterysaving/Android.bp
@@ -27,13 +27,12 @@
         "ub-uiautomator",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/batterysaving/apps/app_target_api_25/Android.bp b/tests/tests/batterysaving/apps/app_target_api_25/Android.bp
index bf00faf..b65c72d 100644
--- a/tests/tests/batterysaving/apps/app_target_api_25/Android.bp
+++ b/tests/tests/batterysaving/apps/app_target_api_25/Android.bp
@@ -21,7 +21,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/batterysaving/apps/app_target_api_current/Android.bp b/tests/tests/batterysaving/apps/app_target_api_current/Android.bp
index fa42b00..0fe80fd 100644
--- a/tests/tests/batterysaving/apps/app_target_api_current/Android.bp
+++ b/tests/tests/batterysaving/apps/app_target_api_current/Android.bp
@@ -20,7 +20,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/batterysaving/common/Android.bp b/tests/tests/batterysaving/common/Android.bp
index 6f99fda..40ff9bd 100644
--- a/tests/tests/batterysaving/common/Android.bp
+++ b/tests/tests/batterysaving/common/Android.bp
@@ -23,7 +23,7 @@
         "androidx.legacy_legacy-support-v4",
         "mockito-target",
         "compatibility-device-util-axt",
-        "android.test.runner.stubs",
+        "android.test.runner",
     ],
     sdk_version: "test_current",
     proto: {
diff --git a/tests/tests/binder_ndk/Android.bp b/tests/tests/binder_ndk/Android.bp
index 36150cd..6aef36d 100644
--- a/tests/tests/binder_ndk/Android.bp
+++ b/tests/tests/binder_ndk/Android.bp
@@ -18,22 +18,23 @@
     compile_multilib: "both",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: [
         "ctstestrunner-axt",
         "libbinder_ndk_test_interface-unstable-java",
+        "libbinder_ndk_compat_test_interface-unstable-java",
         "nativetesthelper",
     ],
     jni_libs: [
         "libbinder_ndk_test",
         "libbinder_ndk_test_utilities",
         "libbinder_ndk_test_interface-unstable-ndk",
+        "libbinder_ndk_compat_test_interface-unstable-ndk",
         "libbinder_ndk_test_interface_old",
         "libbinder_ndk_test_interface_new",
     ],
     stl: "c++_shared",
     srcs: ["src/**/*.java"],
-    sdk_version: "current",
+    sdk_version: "system_current",
 }
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/Android.bp b/tests/tests/binder_ndk/libbinder_ndk_test/Android.bp
index 036853e..936ae5d 100644
--- a/tests/tests/binder_ndk/libbinder_ndk_test/Android.bp
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/Android.bp
@@ -12,25 +12,59 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-aidl_interface {
-    name: "libbinder_ndk_test_interface",
+filegroup {
+    name: "libbinder_ndk_compat_test_interface_srcs",
+    srcs: [
+        "test_package/Baz.aidl",
+        "test_package/ICompatTest.aidl",
+    ],
+    visibility: ["//visibility:private"]
+}
+
+filegroup {
+    name: "libbinder_ndk_test_interface_srcs",
     srcs: [
         "test_package/Bar.aidl",
-        "test_package/ByteEnum.aidl",
         "test_package/Foo.aidl",
+        "test_package/ByteEnum.aidl",
+        "test_package/FixedSize.aidl",
         "test_package/IEmpty.aidl",
         "test_package/ITest.aidl",
         "test_package/IntEnum.aidl",
         "test_package/LongEnum.aidl",
         "test_package/RegularPolygon.aidl",
+        "test_package/GenericFoo.aidl",
+        "test_package/GenericBar.aidl",
+        "test_package/ExtendableParcelable.aidl",
+        "test_package/MyExt.aidl",
+        "test_package/SimpleUnion.aidl",
     ],
+    visibility: ["//visibility:private"]
+}
+
+aidl_interface {
+    name: "libbinder_ndk_test_interface",
+    srcs: [":libbinder_ndk_test_interface_srcs"],
+    backend: {
+        java: {
+            sdk_version: "system_current",
+        },
+        cpp: {
+            enabled: false,
+        }
+    },
+}
+
+aidl_interface {
+    name: "libbinder_ndk_compat_test_interface",
+    srcs: [":libbinder_ndk_compat_test_interface_srcs"],
     versions: [
         "1",
         "2",
     ],
     backend: {
         java: {
-            sdk_version: "28",
+            sdk_version: "system_current",
         },
         cpp: {
             enabled: false,
@@ -38,6 +72,29 @@
     },
 }
 
+aidl_interface {
+    name: "libbinder_ndk_compat_test_interface_dup",
+    srcs: [":libbinder_ndk_compat_test_interface_srcs"],
+    versions: [
+        "1",
+    ],
+    backend: {
+        java: {
+            enabled: false,
+        },
+        cpp: {
+            enabled: false,
+        },
+        ndk: {
+            enabled: true,
+        },
+    },
+    visibility: [
+        ":__subpackages__",
+        "//system/tools/aidl/build:__pkg__",
+    ]
+}
+
 cc_defaults {
     name: "libbinder_ndk_test_defaults",
     cflags: [
@@ -69,6 +126,7 @@
     // Using the up-to-date version of the interface
     shared_libs: [
         "libbinder_ndk_test_interface-unstable-ndk",
+        "libbinder_ndk_compat_test_interface-unstable-ndk",
         "libbinder_ndk_test_utilities",
     ],
 }
@@ -82,9 +140,11 @@
     cflags: ["-DUSING_VERSION_1"],
     // Using the frozen version 1 of the interface
     static_libs: [
-        "libbinder_ndk_test_interface-V1-ndk",
+        // this refers to the latest stable version which is 1
+        "libbinder_ndk_compat_test_interface_dup-ndk",
     ],
     shared_libs: [
+        "libbinder_ndk_test_interface-unstable-ndk",
         "libbinder_ndk_test_utilities",
     ],
 }
@@ -102,6 +162,7 @@
     ],
     shared_libs: [
         "libbinder_ndk_test_interface-unstable-ndk",
+        "libbinder_ndk_compat_test_interface-unstable-ndk",
         "libbinder_ndk_test_utilities",
     ],
 }
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/1/.hash b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/1/.hash
new file mode 100644
index 0000000..194c1b0
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/1/.hash
@@ -0,0 +1 @@
+b663b681b3e0d66f9b5428c2f23365031b7d4ba0
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/1/test_package/Baz.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/1/test_package/Baz.aidl
new file mode 100644
index 0000000..a26e8e4
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/1/test_package/Baz.aidl
@@ -0,0 +1,23 @@
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL interface (or parcelable). Do not try to
+// edit this file. It looks like you are doing that because you have modified
+// an AIDL interface in a backward-incompatible way, e.g., deleting a function
+// from an interface or a field from a parcelable and it broke the build. That
+// breakage is intended.
+//
+// You must not make a backward incompatible changes to the AIDL files built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package test_package;
+parcelable Baz {
+  String a = "FOO";
+  int b = 42;
+  float c = 3.140000f;
+}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/1/test_package/ICompatTest.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/1/test_package/ICompatTest.aidl
new file mode 100644
index 0000000..e92be81
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/1/test_package/ICompatTest.aidl
@@ -0,0 +1,22 @@
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL interface (or parcelable). Do not try to
+// edit this file. It looks like you are doing that because you have modified
+// an AIDL interface in a backward-incompatible way, e.g., deleting a function
+// from an interface or a field from a parcelable and it broke the build. That
+// breakage is intended.
+//
+// You must not make a backward incompatible changes to the AIDL files built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package test_package;
+interface ICompatTest {
+  test_package.Baz repeatBaz(in test_package.Baz inBaz);
+  String RepeatStringNullableLater(String repeated);
+}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/2/.hash b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/2/.hash
new file mode 100644
index 0000000..7b2b269
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/2/.hash
@@ -0,0 +1 @@
+2740afaf3b5a0e739c44165c49633a0af87369f2
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/2/test_package/Baz.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/2/test_package/Baz.aidl
new file mode 100644
index 0000000..c952240
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/2/test_package/Baz.aidl
@@ -0,0 +1,24 @@
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL interface (or parcelable). Do not try to
+// edit this file. It looks like you are doing that because you have modified
+// an AIDL interface in a backward-incompatible way, e.g., deleting a function
+// from an interface or a field from a parcelable and it broke the build. That
+// breakage is intended.
+//
+// You must not make a backward incompatible changes to the AIDL files built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package test_package;
+parcelable Baz {
+  String a = "FOO";
+  int b = 42;
+  float c = 3.140000f;
+  @nullable String[] d;
+}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/2/test_package/ICompatTest.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/2/test_package/ICompatTest.aidl
new file mode 100644
index 0000000..8135ec9
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/2/test_package/ICompatTest.aidl
@@ -0,0 +1,23 @@
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL interface (or parcelable). Do not try to
+// edit this file. It looks like you are doing that because you have modified
+// an AIDL interface in a backward-incompatible way, e.g., deleting a function
+// from an interface or a field from a parcelable and it broke the build. That
+// breakage is intended.
+//
+// You must not make a backward incompatible changes to the AIDL files built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package test_package;
+interface ICompatTest {
+  test_package.Baz repeatBaz(in test_package.Baz inBaz);
+  @nullable String RepeatStringNullableLater(@nullable String repeated);
+  int NewMethodThatReturns10();
+}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/current/test_package/Baz.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/current/test_package/Baz.aidl
new file mode 100644
index 0000000..c952240
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/current/test_package/Baz.aidl
@@ -0,0 +1,24 @@
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL interface (or parcelable). Do not try to
+// edit this file. It looks like you are doing that because you have modified
+// an AIDL interface in a backward-incompatible way, e.g., deleting a function
+// from an interface or a field from a parcelable and it broke the build. That
+// breakage is intended.
+//
+// You must not make a backward incompatible changes to the AIDL files built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package test_package;
+parcelable Baz {
+  String a = "FOO";
+  int b = 42;
+  float c = 3.140000f;
+  @nullable String[] d;
+}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/current/test_package/ICompatTest.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/current/test_package/ICompatTest.aidl
new file mode 100644
index 0000000..8135ec9
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface/current/test_package/ICompatTest.aidl
@@ -0,0 +1,23 @@
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL interface (or parcelable). Do not try to
+// edit this file. It looks like you are doing that because you have modified
+// an AIDL interface in a backward-incompatible way, e.g., deleting a function
+// from an interface or a field from a parcelable and it broke the build. That
+// breakage is intended.
+//
+// You must not make a backward incompatible changes to the AIDL files built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package test_package;
+interface ICompatTest {
+  test_package.Baz repeatBaz(in test_package.Baz inBaz);
+  @nullable String RepeatStringNullableLater(@nullable String repeated);
+  int NewMethodThatReturns10();
+}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface_dup/1/.hash b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface_dup/1/.hash
new file mode 100644
index 0000000..194c1b0
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface_dup/1/.hash
@@ -0,0 +1 @@
+b663b681b3e0d66f9b5428c2f23365031b7d4ba0
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface_dup/1/test_package/Baz.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface_dup/1/test_package/Baz.aidl
new file mode 100644
index 0000000..a26e8e4
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface_dup/1/test_package/Baz.aidl
@@ -0,0 +1,23 @@
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL interface (or parcelable). Do not try to
+// edit this file. It looks like you are doing that because you have modified
+// an AIDL interface in a backward-incompatible way, e.g., deleting a function
+// from an interface or a field from a parcelable and it broke the build. That
+// breakage is intended.
+//
+// You must not make a backward incompatible changes to the AIDL files built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package test_package;
+parcelable Baz {
+  String a = "FOO";
+  int b = 42;
+  float c = 3.140000f;
+}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface_dup/1/test_package/ICompatTest.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface_dup/1/test_package/ICompatTest.aidl
new file mode 100644
index 0000000..e92be81
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface_dup/1/test_package/ICompatTest.aidl
@@ -0,0 +1,22 @@
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL interface (or parcelable). Do not try to
+// edit this file. It looks like you are doing that because you have modified
+// an AIDL interface in a backward-incompatible way, e.g., deleting a function
+// from an interface or a field from a parcelable and it broke the build. That
+// breakage is intended.
+//
+// You must not make a backward incompatible changes to the AIDL files built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package test_package;
+interface ICompatTest {
+  test_package.Baz repeatBaz(in test_package.Baz inBaz);
+  String RepeatStringNullableLater(String repeated);
+}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface_dup/current/test_package/Baz.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface_dup/current/test_package/Baz.aidl
new file mode 100644
index 0000000..c952240
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface_dup/current/test_package/Baz.aidl
@@ -0,0 +1,24 @@
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL interface (or parcelable). Do not try to
+// edit this file. It looks like you are doing that because you have modified
+// an AIDL interface in a backward-incompatible way, e.g., deleting a function
+// from an interface or a field from a parcelable and it broke the build. That
+// breakage is intended.
+//
+// You must not make a backward incompatible changes to the AIDL files built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package test_package;
+parcelable Baz {
+  String a = "FOO";
+  int b = 42;
+  float c = 3.140000f;
+  @nullable String[] d;
+}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface_dup/current/test_package/ICompatTest.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface_dup/current/test_package/ICompatTest.aidl
new file mode 100644
index 0000000..8135ec9
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_compat_test_interface_dup/current/test_package/ICompatTest.aidl
@@ -0,0 +1,23 @@
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL interface (or parcelable). Do not try to
+// edit this file. It looks like you are doing that because you have modified
+// an AIDL interface in a backward-incompatible way, e.g., deleting a function
+// from an interface or a field from a parcelable and it broke the build. That
+// breakage is intended.
+//
+// You must not make a backward incompatible changes to the AIDL files built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package test_package;
+interface ICompatTest {
+  test_package.Baz repeatBaz(in test_package.Baz inBaz);
+  @nullable String RepeatStringNullableLater(@nullable String repeated);
+  int NewMethodThatReturns10();
+}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/.hash b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/.hash
deleted file mode 100644
index 44d6213..0000000
--- a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/.hash
+++ /dev/null
@@ -1 +0,0 @@
-8e163a1b4a6f366aa0c00b6da7fc13a970ee55d8
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/Bar.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/Bar.aidl
deleted file mode 100644
index 6a5d253..0000000
--- a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/Bar.aidl
+++ /dev/null
@@ -1,7 +0,0 @@
-package test_package;
-parcelable Bar {
-  String a = "BAR";
-  String b = "BAR2";
-  float c = 4.200000f;
-  int d = 100;
-}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/ByteEnum.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/ByteEnum.aidl
deleted file mode 100644
index 6884107..0000000
--- a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/ByteEnum.aidl
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2019 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 test_package;
-
-@Backing(type="byte")
-enum ByteEnum {
-    FOO = 1,
-    BAR = 2,
-}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/Foo.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/Foo.aidl
deleted file mode 100644
index 86af9b6..0000000
--- a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/Foo.aidl
+++ /dev/null
@@ -1,15 +0,0 @@
-package test_package;
-parcelable Foo {
-  String a = "FOO";
-  int b = 42;
-  float c = 3.140000f;
-  test_package.Bar d;
-  test_package.Bar e;
-  int f = 3;
-  test_package.ByteEnum shouldBeByteBar;
-  test_package.IntEnum shouldBeIntBar;
-  test_package.LongEnum shouldBeLongBar;
-  test_package.ByteEnum[] shouldContainTwoByteFoos;
-  test_package.IntEnum[] shouldContainTwoIntFoos;
-  test_package.LongEnum[] shouldContainTwoLongFoos;
-}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/IEmpty.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/IEmpty.aidl
deleted file mode 100644
index 2baa52c..0000000
--- a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/IEmpty.aidl
+++ /dev/null
@@ -1,3 +0,0 @@
-package test_package;
-interface IEmpty {
-}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/ITest.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/ITest.aidl
deleted file mode 100644
index 75e7a41..0000000
--- a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/ITest.aidl
+++ /dev/null
@@ -1,69 +0,0 @@
-package test_package;
-interface ITest {
-  String GetName();
-  void TestVoidReturn();
-  oneway void TestOneway();
-  int GiveMeMyCallingPid();
-  int GiveMeMyCallingUid();
-  oneway void CacheCallingInfoFromOneway();
-  int GiveMeMyCallingPidFromOneway();
-  int GiveMeMyCallingUidFromOneway();
-  int RepeatInt(int value);
-  long RepeatLong(long value);
-  float RepeatFloat(float value);
-  double RepeatDouble(double value);
-  boolean RepeatBoolean(boolean value);
-  char RepeatChar(char value);
-  byte RepeatByte(byte value);
-  test_package.ByteEnum RepeatByteEnum(test_package.ByteEnum value);
-  test_package.IntEnum RepeatIntEnum(test_package.IntEnum value);
-  test_package.LongEnum RepeatLongEnum(test_package.LongEnum value);
-  IBinder RepeatBinder(IBinder value);
-  @nullable IBinder RepeatNullableBinder(@nullable IBinder value);
-  test_package.IEmpty RepeatInterface(test_package.IEmpty value);
-  @nullable test_package.IEmpty RepeatNullableInterface(@nullable test_package.IEmpty value);
-  ParcelFileDescriptor RepeatFd(in ParcelFileDescriptor fd);
-  @nullable ParcelFileDescriptor RepeatNullableFd(in @nullable ParcelFileDescriptor fd);
-  String RepeatString(String value);
-  @nullable String RepeatNullableString(@nullable String value);
-  test_package.RegularPolygon RepeatPolygon(in test_package.RegularPolygon value);
-  @nullable test_package.RegularPolygon RepeatNullablePolygon(in @nullable test_package.RegularPolygon value);
-  void RenamePolygon(inout test_package.RegularPolygon value, String newName);
-  boolean[] RepeatBooleanArray(in boolean[] input, out boolean[] repeated);
-  byte[] RepeatByteArray(in byte[] input, out byte[] repeated);
-  char[] RepeatCharArray(in char[] input, out char[] repeated);
-  int[] RepeatIntArray(in int[] input, out int[] repeated);
-  long[] RepeatLongArray(in long[] input, out long[] repeated);
-  float[] RepeatFloatArray(in float[] input, out float[] repeated);
-  double[] RepeatDoubleArray(in double[] input, out double[] repeated);
-  test_package.ByteEnum[] RepeatByteEnumArray(in test_package.ByteEnum[] input, out test_package.ByteEnum[] repeated);
-  test_package.IntEnum[] RepeatIntEnumArray(in test_package.IntEnum[] input, out test_package.IntEnum[] repeated);
-  test_package.LongEnum[] RepeatLongEnumArray(in test_package.LongEnum[] input, out test_package.LongEnum[] repeated);
-  String[] RepeatStringArray(in String[] input, out String[] repeated);
-  test_package.RegularPolygon[] RepeatRegularPolygonArray(in test_package.RegularPolygon[] input, out test_package.RegularPolygon[] repeated);
-  ParcelFileDescriptor[] RepeatFdArray(in ParcelFileDescriptor[] input, out ParcelFileDescriptor[] repeated);
-  List<String> Repeat2StringList(in List<String> input, out List<String> repeated);
-  List<test_package.RegularPolygon> Repeat2RegularPolygonList(in List<test_package.RegularPolygon> input, out List<test_package.RegularPolygon> repeated);
-  @nullable boolean[] RepeatNullableBooleanArray(in @nullable boolean[] input);
-  @nullable byte[] RepeatNullableByteArray(in @nullable byte[] input);
-  @nullable char[] RepeatNullableCharArray(in @nullable char[] input);
-  @nullable int[] RepeatNullableIntArray(in @nullable int[] input);
-  @nullable long[] RepeatNullableLongArray(in @nullable long[] input);
-  @nullable float[] RepeatNullableFloatArray(in @nullable float[] input);
-  @nullable double[] RepeatNullableDoubleArray(in @nullable double[] input);
-  @nullable test_package.ByteEnum[] RepeatNullableByteEnumArray(in @nullable test_package.ByteEnum[] input);
-  @nullable test_package.IntEnum[] RepeatNullableIntEnumArray(in @nullable test_package.IntEnum[] input);
-  @nullable test_package.LongEnum[] RepeatNullableLongEnumArray(in @nullable test_package.LongEnum[] input);
-  @nullable String[] RepeatNullableStringArray(in @nullable String[] input);
-  @nullable String[] DoubleRepeatNullableStringArray(in @nullable String[] input, out @nullable String[] repeated);
-  test_package.Foo repeatFoo(in test_package.Foo inFoo);
-  void renameFoo(inout test_package.Foo foo, String name);
-  void renameBar(inout test_package.Foo foo, String name);
-  int getF(in test_package.Foo foo);
-  String RepeatStringNullableLater(String repeated);
-  const int kZero = 0;
-  const int kOne = 1;
-  const int kOnes = -1;
-  const String kEmpty = "";
-  const String kFoo = "foo";
-}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/IntEnum.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/IntEnum.aidl
deleted file mode 100644
index 15b9891..0000000
--- a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/IntEnum.aidl
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2019 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 test_package;
-
-@Backing(type="int")
-enum IntEnum {
-    FOO = 1000,
-    BAR = 2000,
-}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/LongEnum.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/LongEnum.aidl
deleted file mode 100644
index f21ea63..0000000
--- a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/LongEnum.aidl
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2019 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 test_package;
-
-@Backing(type="long")
-enum LongEnum {
-    FOO = 100000000000,
-    BAR = 200000000000,
-}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/RegularPolygon.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/RegularPolygon.aidl
deleted file mode 100644
index 14c6c2e..0000000
--- a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/1/test_package/RegularPolygon.aidl
+++ /dev/null
@@ -1,6 +0,0 @@
-package test_package;
-parcelable RegularPolygon {
-  String name = "square";
-  int numSides = 4;
-  float sideLength = 1.000000f;
-}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/.hash b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/.hash
deleted file mode 100644
index 42915a7..0000000
--- a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/.hash
+++ /dev/null
@@ -1 +0,0 @@
-dc04ee811daf7720da5a3bcf35847f7e0cea4521
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/Bar.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/Bar.aidl
deleted file mode 100644
index bf4c4fc..0000000
--- a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/Bar.aidl
+++ /dev/null
@@ -1,8 +0,0 @@
-package test_package;
-parcelable Bar {
-  String a = "BAR";
-  String b = "BAR2";
-  float c = 4.200000f;
-  int d = 100;
-  String e = "HELLO";
-}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/ByteEnum.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/ByteEnum.aidl
deleted file mode 100644
index 6884107..0000000
--- a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/ByteEnum.aidl
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2019 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 test_package;
-
-@Backing(type="byte")
-enum ByteEnum {
-    FOO = 1,
-    BAR = 2,
-}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/Foo.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/Foo.aidl
deleted file mode 100644
index d4afa64..0000000
--- a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/Foo.aidl
+++ /dev/null
@@ -1,16 +0,0 @@
-package test_package;
-parcelable Foo {
-  String a = "FOO";
-  int b = 42;
-  float c = 3.140000f;
-  test_package.Bar d;
-  test_package.Bar e;
-  int f = 3;
-  test_package.ByteEnum shouldBeByteBar;
-  test_package.IntEnum shouldBeIntBar;
-  test_package.LongEnum shouldBeLongBar;
-  test_package.ByteEnum[] shouldContainTwoByteFoos;
-  test_package.IntEnum[] shouldContainTwoIntFoos;
-  test_package.LongEnum[] shouldContainTwoLongFoos;
-  @nullable String[] g;
-}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/IEmpty.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/IEmpty.aidl
deleted file mode 100644
index 2baa52c..0000000
--- a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/IEmpty.aidl
+++ /dev/null
@@ -1,3 +0,0 @@
-package test_package;
-interface IEmpty {
-}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/ITest.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/ITest.aidl
deleted file mode 100644
index bcda3c7..0000000
--- a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/ITest.aidl
+++ /dev/null
@@ -1,70 +0,0 @@
-package test_package;
-interface ITest {
-  String GetName();
-  void TestVoidReturn();
-  oneway void TestOneway();
-  int GiveMeMyCallingPid();
-  int GiveMeMyCallingUid();
-  oneway void CacheCallingInfoFromOneway();
-  int GiveMeMyCallingPidFromOneway();
-  int GiveMeMyCallingUidFromOneway();
-  int RepeatInt(int value);
-  long RepeatLong(long value);
-  float RepeatFloat(float value);
-  double RepeatDouble(double value);
-  boolean RepeatBoolean(boolean value);
-  char RepeatChar(char value);
-  byte RepeatByte(byte value);
-  test_package.ByteEnum RepeatByteEnum(test_package.ByteEnum value);
-  test_package.IntEnum RepeatIntEnum(test_package.IntEnum value);
-  test_package.LongEnum RepeatLongEnum(test_package.LongEnum value);
-  IBinder RepeatBinder(IBinder value);
-  @nullable IBinder RepeatNullableBinder(@nullable IBinder value);
-  test_package.IEmpty RepeatInterface(test_package.IEmpty value);
-  @nullable test_package.IEmpty RepeatNullableInterface(@nullable test_package.IEmpty value);
-  ParcelFileDescriptor RepeatFd(in ParcelFileDescriptor fd);
-  @nullable ParcelFileDescriptor RepeatNullableFd(in @nullable ParcelFileDescriptor fd);
-  String RepeatString(String value);
-  @nullable String RepeatNullableString(@nullable String value);
-  test_package.RegularPolygon RepeatPolygon(in test_package.RegularPolygon value);
-  @nullable test_package.RegularPolygon RepeatNullablePolygon(in @nullable test_package.RegularPolygon value);
-  void RenamePolygon(inout test_package.RegularPolygon value, String newName);
-  boolean[] RepeatBooleanArray(in boolean[] input, out boolean[] repeated);
-  byte[] RepeatByteArray(in byte[] input, out byte[] repeated);
-  char[] RepeatCharArray(in char[] input, out char[] repeated);
-  int[] RepeatIntArray(in int[] input, out int[] repeated);
-  long[] RepeatLongArray(in long[] input, out long[] repeated);
-  float[] RepeatFloatArray(in float[] input, out float[] repeated);
-  double[] RepeatDoubleArray(in double[] input, out double[] repeated);
-  test_package.ByteEnum[] RepeatByteEnumArray(in test_package.ByteEnum[] input, out test_package.ByteEnum[] repeated);
-  test_package.IntEnum[] RepeatIntEnumArray(in test_package.IntEnum[] input, out test_package.IntEnum[] repeated);
-  test_package.LongEnum[] RepeatLongEnumArray(in test_package.LongEnum[] input, out test_package.LongEnum[] repeated);
-  String[] RepeatStringArray(in String[] input, out String[] repeated);
-  test_package.RegularPolygon[] RepeatRegularPolygonArray(in test_package.RegularPolygon[] input, out test_package.RegularPolygon[] repeated);
-  ParcelFileDescriptor[] RepeatFdArray(in ParcelFileDescriptor[] input, out ParcelFileDescriptor[] repeated);
-  List<String> Repeat2StringList(in List<String> input, out List<String> repeated);
-  List<test_package.RegularPolygon> Repeat2RegularPolygonList(in List<test_package.RegularPolygon> input, out List<test_package.RegularPolygon> repeated);
-  @nullable boolean[] RepeatNullableBooleanArray(in @nullable boolean[] input);
-  @nullable byte[] RepeatNullableByteArray(in @nullable byte[] input);
-  @nullable char[] RepeatNullableCharArray(in @nullable char[] input);
-  @nullable int[] RepeatNullableIntArray(in @nullable int[] input);
-  @nullable long[] RepeatNullableLongArray(in @nullable long[] input);
-  @nullable float[] RepeatNullableFloatArray(in @nullable float[] input);
-  @nullable double[] RepeatNullableDoubleArray(in @nullable double[] input);
-  @nullable test_package.ByteEnum[] RepeatNullableByteEnumArray(in @nullable test_package.ByteEnum[] input);
-  @nullable test_package.IntEnum[] RepeatNullableIntEnumArray(in @nullable test_package.IntEnum[] input);
-  @nullable test_package.LongEnum[] RepeatNullableLongEnumArray(in @nullable test_package.LongEnum[] input);
-  @nullable String[] RepeatNullableStringArray(in @nullable String[] input);
-  @nullable String[] DoubleRepeatNullableStringArray(in @nullable String[] input, out @nullable String[] repeated);
-  test_package.Foo repeatFoo(in test_package.Foo inFoo);
-  void renameFoo(inout test_package.Foo foo, String name);
-  void renameBar(inout test_package.Foo foo, String name);
-  int getF(in test_package.Foo foo);
-  @nullable String RepeatStringNullableLater(@nullable String repeated);
-  int NewMethodThatReturns10();
-  const int kZero = 0;
-  const int kOne = 1;
-  const int kOnes = -1;
-  const String kEmpty = "";
-  const String kFoo = "foo";
-}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/IntEnum.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/IntEnum.aidl
deleted file mode 100644
index 15b9891..0000000
--- a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/IntEnum.aidl
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2019 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 test_package;
-
-@Backing(type="int")
-enum IntEnum {
-    FOO = 1000,
-    BAR = 2000,
-}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/LongEnum.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/LongEnum.aidl
deleted file mode 100644
index f21ea63..0000000
--- a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/LongEnum.aidl
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (C) 2019 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 test_package;
-
-@Backing(type="long")
-enum LongEnum {
-    FOO = 100000000000,
-    BAR = 200000000000,
-}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/RegularPolygon.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/RegularPolygon.aidl
deleted file mode 100644
index 14c6c2e..0000000
--- a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/2/test_package/RegularPolygon.aidl
+++ /dev/null
@@ -1,6 +0,0 @@
-package test_package;
-parcelable RegularPolygon {
-  String name = "square";
-  int numSides = 4;
-  float sideLength = 1.000000f;
-}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/ExtendableParcelable.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/ExtendableParcelable.aidl
new file mode 100644
index 0000000..6646ba0
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/ExtendableParcelable.aidl
@@ -0,0 +1,25 @@
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL interface (or parcelable). Do not try to
+// edit this file. It looks like you are doing that because you have modified
+// an AIDL interface in a backward-incompatible way, e.g., deleting a function
+// from an interface or a field from a parcelable and it broke the build. That
+// breakage is intended.
+//
+// You must not make a backward incompatible changes to the AIDL files built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package test_package;
+parcelable ExtendableParcelable {
+  int a;
+  @nullable @utf8InCpp String b;
+  ParcelableHolder ext;
+  long c;
+  ParcelableHolder ext2;
+}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/FixedSize.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/FixedSize.aidl
new file mode 100644
index 0000000..e7a32f2
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/FixedSize.aidl
@@ -0,0 +1,23 @@
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL interface (or parcelable). Do not try to
+// edit this file. It looks like you are doing that because you have modified
+// an AIDL interface in a backward-incompatible way, e.g., deleting a function
+// from an interface or a field from a parcelable and it broke the build. That
+// breakage is intended.
+//
+// You must not make a backward incompatible changes to the AIDL files built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package test_package;
+@FixedSize
+parcelable FixedSize {
+  int a;
+  test_package.LongEnum b;
+}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/Foo.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/Foo.aidl
index 8b71fee..f2b551c 100644
--- a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/Foo.aidl
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/Foo.aidl
@@ -30,4 +30,5 @@
   test_package.IntEnum[] shouldContainTwoIntFoos;
   test_package.LongEnum[] shouldContainTwoLongFoos;
   @nullable String[] g;
+  @nullable test_package.SimpleUnion u;
 }
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/GenericBar.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/GenericBar.aidl
new file mode 100644
index 0000000..1d9103b
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/GenericBar.aidl
@@ -0,0 +1,22 @@
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL interface (or parcelable). Do not try to
+// edit this file. It looks like you are doing that because you have modified
+// an AIDL interface in a backward-incompatible way, e.g., deleting a function
+// from an interface or a field from a parcelable and it broke the build. That
+// breakage is intended.
+//
+// You must not make a backward incompatible changes to the AIDL files built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package test_package;
+parcelable GenericBar {
+  int a;
+  test_package.GenericFoo<int,test_package.Bar,test_package.IntEnum> shouldBeGenericFoo;
+}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/GenericFoo.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/GenericFoo.aidl
new file mode 100644
index 0000000..9bc86c1
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/GenericFoo.aidl
@@ -0,0 +1,22 @@
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL interface (or parcelable). Do not try to
+// edit this file. It looks like you are doing that because you have modified
+// an AIDL interface in a backward-incompatible way, e.g., deleting a function
+// from an interface or a field from a parcelable and it broke the build. That
+// breakage is intended.
+//
+// You must not make a backward incompatible changes to the AIDL files built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package test_package;
+parcelable GenericFoo {
+  int a;
+  int b;
+}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/ITest.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/ITest.aidl
index effb098..dad0716 100644
--- a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/ITest.aidl
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/ITest.aidl
@@ -77,11 +77,15 @@
   void renameFoo(inout test_package.Foo foo, String name);
   void renameBar(inout test_package.Foo foo, String name);
   int getF(in test_package.Foo foo);
-  @nullable String RepeatStringNullableLater(@nullable String repeated);
-  int NewMethodThatReturns10();
+  test_package.GenericBar<int> repeatGenericBar(in test_package.GenericBar<int> bar);
+  void RepeatExtendableParcelable(in test_package.ExtendableParcelable input, out test_package.ExtendableParcelable output);
+  test_package.SimpleUnion RepeatSimpleUnion(in test_package.SimpleUnion u);
+  IBinder getICompatTest();
   const int kZero = 0;
   const int kOne = 1;
   const int kOnes = -1;
+  const byte kByteOne = 1;
+  const long kLongOnes = -1;
   const String kEmpty = "";
   const String kFoo = "foo";
 }
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/MyExt.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/MyExt.aidl
new file mode 100644
index 0000000..3525284
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/MyExt.aidl
@@ -0,0 +1,22 @@
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL interface (or parcelable). Do not try to
+// edit this file. It looks like you are doing that because you have modified
+// an AIDL interface in a backward-incompatible way, e.g., deleting a function
+// from an interface or a field from a parcelable and it broke the build. That
+// breakage is intended.
+//
+// You must not make a backward incompatible changes to the AIDL files built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package test_package;
+parcelable MyExt {
+  int a;
+  @utf8InCpp String b;
+}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/SimpleUnion.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/SimpleUnion.aidl
new file mode 100644
index 0000000..7c1564a
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/SimpleUnion.aidl
@@ -0,0 +1,26 @@
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL interface (or parcelable). Do not try to
+// edit this file. It looks like you are doing that because you have modified
+// an AIDL interface in a backward-incompatible way, e.g., deleting a function
+// from an interface or a field from a parcelable and it broke the build. That
+// breakage is intended.
+//
+// You must not make a backward incompatible changes to the AIDL files built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package test_package;
+union SimpleUnion {
+  int a = 42;
+  int[] b;
+  String c;
+  test_package.ByteEnum d;
+  test_package.ByteEnum[] e;
+  @nullable test_package.Bar f;
+}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/itest_impl.h b/tests/tests/binder_ndk/libbinder_ndk_test/itest_impl.h
index 67d7930..8b1a1c3 100644
--- a/tests/tests/binder_ndk/libbinder_ndk_test/itest_impl.h
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/itest_impl.h
@@ -14,22 +14,29 @@
  * limitations under the License.
  */
 
+#include <aidl/test_package/BnCompatTest.h>
 #include <aidl/test_package/BnTest.h>
-
+#include <aidl/test_package/MyExt.h>
+#include <aidl/test_package/SimpleUnion.h>
 #include <stdio.h>
 #include <unistd.h>
+
 #include <condition_variable>
 #include <mutex>
 
 #include "utilities.h"
 
-using Bar = ::aidl::test_package::Bar;
-using ByteEnum = ::aidl::test_package::ByteEnum;
-using Foo = ::aidl::test_package::Foo;
-using IEmpty = ::aidl::test_package::IEmpty;
-using IntEnum = ::aidl::test_package::IntEnum;
-using LongEnum = ::aidl::test_package::LongEnum;
-using RegularPolygon = ::aidl::test_package::RegularPolygon;
+using ::aidl::test_package::Bar;
+using ::aidl::test_package::Baz;
+using ::aidl::test_package::ByteEnum;
+using ::aidl::test_package::ExtendableParcelable;
+using ::aidl::test_package::Foo;
+using ::aidl::test_package::IEmpty;
+using ::aidl::test_package::IntEnum;
+using ::aidl::test_package::LongEnum;
+using ::aidl::test_package::MyExt;
+using ::aidl::test_package::RegularPolygon;
+using ::aidl::test_package::SimpleUnion;
 
 class MyTest : public ::aidl::test_package::BnTest,
                public ThisShouldBeDestroyed {
@@ -224,9 +231,9 @@
     *_aidl_return = in_value;
     return ::ndk::ScopedAStatus(AStatus_newOk());
   }
-  ::ndk::ScopedAStatus RepeatByteArray(
-      const std::vector<int8_t>& in_value, std::vector<int8_t>* out_repeated,
-      std::vector<int8_t>* _aidl_return) override {
+  ::ndk::ScopedAStatus RepeatByteArray(const std::vector<uint8_t>& in_value,
+                                       std::vector<uint8_t>* out_repeated,
+                                       std::vector<uint8_t>* _aidl_return) override {
     *out_repeated = in_value;
     *_aidl_return = in_value;
     return ::ndk::ScopedAStatus(AStatus_newOk());
@@ -341,8 +348,8 @@
     return ::ndk::ScopedAStatus(AStatus_newOk());
   }
   ::ndk::ScopedAStatus RepeatNullableByteArray(
-      const std::optional<std::vector<int8_t>>& in_value,
-      std::optional<std::vector<int8_t>>* _aidl_return) override {
+      const std::optional<std::vector<uint8_t>>& in_value,
+      std::optional<std::vector<uint8_t>>* _aidl_return) override {
     *_aidl_return = in_value;
     return ::ndk::ScopedAStatus(AStatus_newOk());
   }
@@ -410,28 +417,57 @@
     return ::ndk::ScopedAStatus(AStatus_newOk());
   }
 
+  ::ndk::ScopedAStatus getICompatTest(::ndk::SpAIBinder* _aidl_return) {
+    class MyCompatTest : public ::aidl::test_package::BnCompatTest {
+     public:
+      ::ndk::ScopedAStatus repeatBaz(const ::aidl::test_package::Baz& in_inBaz,
+                                     ::aidl::test_package::Baz* _aidl_return) override {
+        *_aidl_return = in_inBaz;
+        return ::ndk::ScopedAStatus(AStatus_newOk());
+      }
+
 #ifdef USING_VERSION_1
-  ::ndk::ScopedAStatus RepeatStringNullableLater(const std::string& in_value,
-                                                 std::string* _aidl_return) override {
-    *_aidl_return = in_value;
-    return ::ndk::ScopedAStatus(AStatus_newOk());
-  }
+      ::ndk::ScopedAStatus RepeatStringNullableLater(const std::string& in_value,
+                                                     std::string* _aidl_return) override {
+        *_aidl_return = in_value;
+        return ::ndk::ScopedAStatus(AStatus_newOk());
+      }
 #else
-  ::ndk::ScopedAStatus RepeatStringNullableLater(
-      const std::optional<std::string>& in_value,
-      std::optional<std::string>* _aidl_return) override {
-    *_aidl_return = in_value;
-    return ::ndk::ScopedAStatus(AStatus_newOk());
-  }
+      ::ndk::ScopedAStatus RepeatStringNullableLater(
+          const std::optional<std::string>& in_value,
+          std::optional<std::string>* _aidl_return) override {
+        *_aidl_return = in_value;
+        return ::ndk::ScopedAStatus(AStatus_newOk());
+      }
 #endif
 
 #ifndef USING_VERSION_1
-  // All methods added from now on should be within this macro
-  ::ndk::ScopedAStatus NewMethodThatReturns10(int32_t* _aidl_return) override {
-    *_aidl_return = 10;
+      ::ndk::ScopedAStatus NewMethodThatReturns10(int32_t* _aidl_return) override {
+        *_aidl_return = 10;
+        return ::ndk::ScopedAStatus(AStatus_newOk());
+      }
+#endif
+    };
+    *_aidl_return = SharedRefBase::make<MyCompatTest>()->asBinder();
     return ::ndk::ScopedAStatus(AStatus_newOk());
   }
-#endif
+
+  ::ndk::ScopedAStatus RepeatExtendableParcelable(
+      const ::aidl::test_package::ExtendableParcelable& in_input,
+      ::aidl::test_package::ExtendableParcelable* out_output) {
+    std::unique_ptr<MyExt> ext = in_input.ext.getParcelable<MyExt>();
+    MyExt ext2;
+    ext2.a = ext->a;
+    ext2.b = ext->b;
+    out_output->ext.setParcelable(&ext2);
+    return ::ndk::ScopedAStatus(AStatus_newOk());
+  }
+
+  ::ndk::ScopedAStatus RepeatSimpleUnion(const SimpleUnion& in_u,
+                                         SimpleUnion* _aidl_return) override {
+    *_aidl_return = in_u;
+    return ::ndk::ScopedAStatus(AStatus_newOk());
+  }
 
   ::ndk::ScopedAStatus repeatFoo(const Foo& in_inFoo, Foo* _aidl_return) {
     *_aidl_return = in_inFoo;
@@ -452,4 +488,10 @@
     *_aidl_return = foo.f;
     return ::ndk::ScopedAStatus(AStatus_newOk());
   }
+
+  ::ndk::ScopedAStatus repeatGenericBar(const ::aidl::test_package::GenericBar<int32_t>& in_inFoo,
+                                        ::aidl::test_package::GenericBar<int32_t>* _aidl_return) {
+    *_aidl_return = in_inFoo;
+    return ::ndk::ScopedAStatus(AStatus_newOk());
+  }
 };
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/test_ibinder.cpp b/tests/tests/binder_ndk/libbinder_ndk_test/test_ibinder.cpp
index b05cba0..8103bf1 100644
--- a/tests/tests/binder_ndk/libbinder_ndk_test/test_ibinder.cpp
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/test_ibinder.cpp
@@ -242,6 +242,24 @@
   AIBinder_decStrong(binder);
 }
 
+TEST_F(NdkBinderTest_AIBinder, UnassociatedBinderRejected) {
+  AIBinder* binder1 = SampleData::newBinder(nullptr, ExpectLifetimeTransactions(0));
+
+  AParcel* in;
+  EXPECT_EQ(STATUS_OK, AIBinder_prepareTransaction(binder1, &in));
+
+  AIBinder* binder2 = SampleData::newBinder(nullptr, ExpectLifetimeTransactions(0));
+
+  AParcel* out;
+  // transaction on different binder object from prepare fails
+  EXPECT_EQ(STATUS_BAD_VALUE, AIBinder_transact(binder2, kCode, &in, &out, 0));
+
+  AParcel_delete(out);
+
+  AIBinder_decStrong(binder2);
+  AIBinder_decStrong(binder1);
+}
+
 void* EmptyOnCreate(void* args) { return args; }
 void EmptyOnDestroy(void* /*userData*/) {}
 binder_status_t EmptyOnTransact(AIBinder* /*binder*/,
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/test_native_aidl_client.cpp b/tests/tests/binder_ndk/libbinder_ndk_test/test_native_aidl_client.cpp
index f859df1..c81f1d4 100644
--- a/tests/tests/binder_ndk/libbinder_ndk_test/test_native_aidl_client.cpp
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/test_native_aidl_client.cpp
@@ -16,8 +16,11 @@
 #define LOG_TAG "Cts-NdkBinderTest"
 
 #include <aidl/test_package/BnEmpty.h>
+#include <aidl/test_package/BpCompatTest.h>
 #include <aidl/test_package/BpTest.h>
 #include <aidl/test_package/ByteEnum.h>
+#include <aidl/test_package/ExtendableParcelable.h>
+#include <aidl/test_package/FixedSize.h>
 #include <aidl/test_package/Foo.h>
 #include <aidl/test_package/IntEnum.h>
 #include <aidl/test_package/LongEnum.h>
@@ -32,20 +35,31 @@
 #include <stdio.h>
 #include <sys/socket.h>
 #include <sys/types.h>
+#include <type_traits>
 
 using ::aidl::test_package::Bar;
 using ::aidl::test_package::BpTest;
 using ::aidl::test_package::ByteEnum;
+using ::aidl::test_package::ExtendableParcelable;
+using ::aidl::test_package::FixedSize;
 using ::aidl::test_package::Foo;
+using ::aidl::test_package::GenericBar;
+using ::aidl::test_package::ICompatTest;
 using ::aidl::test_package::IntEnum;
 using ::aidl::test_package::ITest;
 using ::aidl::test_package::LongEnum;
+using ::aidl::test_package::MyExt;
 using ::aidl::test_package::RegularPolygon;
 using ::ndk::ScopedAStatus;
 using ::ndk::ScopedFileDescriptor;
 using ::ndk::SharedRefBase;
 using ::ndk::SpAIBinder;
 
+// This client is built for 32 and 64-bit targets. The size of FixedSize must remain the same.
+static_assert(sizeof(FixedSize) == 16);
+static_assert(offsetof(FixedSize, a) == 0);
+static_assert(offsetof(FixedSize, b) == 8);
+
 // AIDL tests which are independent of the service
 class NdkBinderTest_AidlLocal : public NdkBinderTest {};
 
@@ -57,6 +71,16 @@
   EXPECT_FALSE(test->isRemote());
 }
 
+TEST_F(NdkBinderTest_AidlLocal, ConfirmFixedSizeTrue) {
+  bool res = std::is_same<FixedSize::fixed_size, std::true_type>::value;
+  EXPECT_EQ(res, true);
+}
+
+TEST_F(NdkBinderTest_AidlLocal, ConfirmFixedSizeFalse) {
+  bool res = std::is_same<RegularPolygon::fixed_size, std::true_type>::value;
+  EXPECT_EQ(res, false);
+}
+
 struct Params {
   std::shared_ptr<ITest> iface;
   bool shouldBeRemote;
@@ -125,6 +149,12 @@
   return ret;
 }
 
+auto getCompatTest(std::shared_ptr<ITest> itest) {
+  SpAIBinder binder;
+  itest->getICompatTest(&binder);
+  return ICompatTest::fromBinder(binder);
+}
+
 TEST_P(NdkBinderTest_Aidl, UseDump) {
   std::string name;
   EXPECT_OK(iface->GetName(&name));
@@ -176,6 +206,8 @@
   ASSERT_EQ(0, ITest::kZero);
   ASSERT_EQ(1, ITest::kOne);
   ASSERT_EQ(0xffffffff, ITest::kOnes);
+  ASSERT_EQ(1, ITest::kByteOne);
+  ASSERT_EQ(0xffffffffffffffff, ITest::kLongOnes);
   ASSERT_EQ(std::string(""), ITest::kEmpty);
   ASSERT_EQ(std::string("foo"), ITest::kFoo);
 }
@@ -263,6 +295,14 @@
   ASSERT_OK(iface->RepeatBinder(binder, &ret));
   EXPECT_EQ(binder.get(), ret.get());
 
+  if (shouldBeWrapped) {
+    ndk::ScopedAStatus status = iface->RepeatBinder(nullptr, &ret);
+    ASSERT_EQ(STATUS_UNEXPECTED_NULL, AStatus_getStatus(status.get()));
+  } else {
+    ASSERT_OK(iface->RepeatBinder(nullptr, &ret));
+    EXPECT_EQ(nullptr, ret.get());
+  }
+
   ASSERT_OK(iface->RepeatNullableBinder(binder, &ret));
   EXPECT_EQ(binder.get(), ret.get());
 
@@ -279,6 +319,11 @@
   ASSERT_OK(iface->RepeatInterface(empty, &ret));
   EXPECT_EQ(empty.get(), ret.get());
 
+  // interfaces are always nullable in AIDL C++, and that behavior was carried
+  // over to the NDK backend for consistency
+  ASSERT_OK(iface->RepeatInterface(nullptr, &ret));
+  EXPECT_EQ(nullptr, ret.get());
+
   ASSERT_OK(iface->RepeatNullableInterface(empty, &ret));
   EXPECT_EQ(empty.get(), ret.get());
 
@@ -427,16 +472,17 @@
 }
 
 TEST_P(NdkBinderTest_Aidl, NewField) {
-  Foo foo;
-  foo.g = {"a", "b", "c"};
+  Baz baz;
+  baz.d = {"a", "b", "c"};
 
-  Foo outFoo;
-  ASSERT_OK(iface->repeatFoo(foo, &outFoo));
+  Baz outbaz;
+
+  ASSERT_OK(getCompatTest(iface)->repeatBaz(baz, &outbaz));
 
   if (GetParam().shouldBeOld) {
-    EXPECT_EQ(std::nullopt, outFoo.g);
+    EXPECT_EQ(std::nullopt, outbaz.d);
   } else {
-    EXPECT_EQ(foo.g, outFoo.g);
+    EXPECT_EQ(baz.d, outbaz.d);
   }
 }
 
@@ -464,6 +510,28 @@
   EXPECT_EQ(15, retF);
 }
 
+namespace aidl {
+namespace test_package {
+bool operator==(const SimpleUnion& lhs, const SimpleUnion& rhs) {
+  if (lhs.getTag() != rhs.getTag()) return false;
+  switch (lhs.getTag()) {
+    case SimpleUnion::a:
+      return lhs.get<SimpleUnion::a>() == rhs.get<SimpleUnion::a>();
+    case SimpleUnion::b:
+      return lhs.get<SimpleUnion::b>() == rhs.get<SimpleUnion::b>();
+    case SimpleUnion::c:
+      return lhs.get<SimpleUnion::c>() == rhs.get<SimpleUnion::c>();
+    case SimpleUnion::d:
+      return lhs.get<SimpleUnion::d>() == rhs.get<SimpleUnion::d>();
+    case SimpleUnion::e:
+      return lhs.get<SimpleUnion::e>() == rhs.get<SimpleUnion::e>();
+    case SimpleUnion::f:
+      return lhs.get<SimpleUnion::f>() == rhs.get<SimpleUnion::f>();
+  }
+}
+}  // namespace test_package
+}  // namespace aidl
+
 TEST_P(NdkBinderTest_Aidl, RepeatFoo) {
   Foo foo;
   foo.a = "NEW FOO";
@@ -476,6 +544,8 @@
   foo.shouldContainTwoByteFoos = {ByteEnum::FOO, ByteEnum::FOO};
   foo.shouldContainTwoIntFoos = {IntEnum::FOO, IntEnum::FOO};
   foo.shouldContainTwoLongFoos = {LongEnum::FOO, LongEnum::FOO};
+  foo.u = SimpleUnion::make<SimpleUnion::c>("hello");
+
   Foo retFoo;
 
   ASSERT_OK(iface->repeatFoo(foo, &retFoo));
@@ -490,6 +560,22 @@
   EXPECT_EQ(foo.shouldContainTwoByteFoos, retFoo.shouldContainTwoByteFoos);
   EXPECT_EQ(foo.shouldContainTwoIntFoos, retFoo.shouldContainTwoIntFoos);
   EXPECT_EQ(foo.shouldContainTwoLongFoos, retFoo.shouldContainTwoLongFoos);
+  EXPECT_EQ(foo.u, retFoo.u);
+}
+
+TEST_P(NdkBinderTest_Aidl, RepeatGenericBar) {
+  GenericBar<int32_t> bar;
+  bar.a = 40;
+  bar.shouldBeGenericFoo.a = 41;
+  bar.shouldBeGenericFoo.b = 42;
+
+  GenericBar<int32_t> retBar;
+
+  ASSERT_OK(iface->repeatGenericBar(bar, &retBar));
+
+  EXPECT_EQ(bar.a, retBar.a);
+  EXPECT_EQ(bar.shouldBeGenericFoo.a, retBar.shouldBeGenericFoo.a);
+  EXPECT_EQ(bar.shouldBeGenericFoo.b, retBar.shouldBeGenericFoo.b);
 }
 
 template <typename T>
@@ -550,12 +636,12 @@
                        {true},
                        {false, true, false},
                    });
-  testRepeat<int8_t>(iface, &ITest::RepeatByteArray,
-                     {
-                         {},
-                         {1},
-                         {1, 2, 3},
-                     });
+  testRepeat<uint8_t>(iface, &ITest::RepeatByteArray,
+                      {
+                          {},
+                          {1},
+                          {1, 2, 3},
+                      });
   testRepeat<char16_t>(iface, &ITest::RepeatCharArray,
                        {
                            {},
@@ -683,13 +769,13 @@
                        {{true}},
                        {{false, true, false}},
                    });
-  testRepeat<int8_t>(iface, &ITest::RepeatNullableByteArray,
-                     {
-                         std::nullopt,
-                         {{}},
-                         {{1}},
-                         {{1, 2, 3}},
-                     });
+  testRepeat<uint8_t>(iface, &ITest::RepeatNullableByteArray,
+                      {
+                          std::nullopt,
+                          {{}},
+                          {{1}},
+                          {{1, 2, 3}},
+                      });
   testRepeat<char16_t>(iface, &ITest::RepeatNullableCharArray,
                        {
                            std::nullopt,
@@ -766,7 +852,7 @@
                           });
 }
 
-class DefaultImpl : public ::aidl::test_package::ITestDefault {
+class DefaultImpl : public ::aidl::test_package::ICompatTestDefault {
  public:
   ::ndk::ScopedAStatus NewMethodThatReturns10(int32_t* _aidl_return) override {
     *_aidl_return = 100;  // default impl returns different value
@@ -775,11 +861,12 @@
 };
 
 TEST_P(NdkBinderTest_Aidl, NewMethod) {
-  std::shared_ptr<ITest> default_impl = SharedRefBase::make<DefaultImpl>();
-  ::aidl::test_package::ITest::setDefaultImpl(default_impl);
+  std::shared_ptr<ICompatTest> default_impl = SharedRefBase::make<DefaultImpl>();
+  ::aidl::test_package::ICompatTest::setDefaultImpl(default_impl);
 
+  auto compat_test = getCompatTest(iface);
   int32_t res;
-  EXPECT_OK(iface->NewMethodThatReturns10(&res));
+  EXPECT_OK(compat_test->NewMethodThatReturns10(&res));
   if (GetParam().shouldBeOld) {
     // Remote was built with version 1 interface which does not have
     // "NewMethodThatReturns10". In this case the default method
@@ -804,27 +891,29 @@
   // non-nullable type. Of course, this is not ideal, but the problem runs very
   // deep.
   const bool supports_nullable = !GetParam().shouldBeOld || name == "Java";
+  auto compat_test = getCompatTest(iface);
   if (supports_nullable) {
-    EXPECT_OK(iface->RepeatStringNullableLater(std::nullopt, &res));
+    EXPECT_OK(compat_test->RepeatStringNullableLater(std::nullopt, &res));
     EXPECT_EQ(std::nullopt, res);
   } else {
-    ndk::ScopedAStatus status = iface->RepeatStringNullableLater(std::nullopt, &res);
+    ndk::ScopedAStatus status = compat_test->RepeatStringNullableLater(std::nullopt, &res);
     ASSERT_EQ(STATUS_UNEXPECTED_NULL, AStatus_getStatus(status.get()));
   }
 
-  EXPECT_OK(iface->RepeatStringNullableLater("", &res));
+  EXPECT_OK(compat_test->RepeatStringNullableLater("", &res));
   EXPECT_EQ("", res);
 
-  EXPECT_OK(iface->RepeatStringNullableLater("a", &res));
+  EXPECT_OK(compat_test->RepeatStringNullableLater("a", &res));
   EXPECT_EQ("a", res);
 
-  EXPECT_OK(iface->RepeatStringNullableLater("say what?", &res));
+  EXPECT_OK(compat_test->RepeatStringNullableLater("say what?", &res));
   EXPECT_EQ("say what?", res);
 }
 
 TEST_P(NdkBinderTest_Aidl, GetInterfaceVersion) {
   int32_t res;
-  EXPECT_OK(iface->getInterfaceVersion(&res));
+  auto compat_test = getCompatTest(iface);
+  EXPECT_OK(compat_test->getInterfaceVersion(&res));
   if (GetParam().shouldBeOld) {
     EXPECT_EQ(1, res);
   } else {
@@ -835,15 +924,54 @@
 
 TEST_P(NdkBinderTest_Aidl, GetInterfaceHash) {
   std::string res;
-  EXPECT_OK(iface->getInterfaceHash(&res));
+  auto compat_test = getCompatTest(iface);
+  EXPECT_OK(compat_test->getInterfaceHash(&res));
   if (GetParam().shouldBeOld) {
     // aidl_api/libbinder_ndk_test_interface/1/.hash
-    EXPECT_EQ("8e163a1b4a6f366aa0c00b6da7fc13a970ee55d8", res);
+    EXPECT_EQ("b663b681b3e0d66f9b5428c2f23365031b7d4ba0", res);
   } else {
     EXPECT_EQ("notfrozen", res);
   }
 }
 
+TEST_P(NdkBinderTest_Aidl, ParcelableHolderTest) {
+  ExtendableParcelable ep;
+  MyExt myext1;
+  myext1.a = 42;
+  myext1.b = "mystr";
+  ep.ext.setParcelable(&myext1);
+  std::unique_ptr<MyExt> myext2 = ep.ext.getParcelable<MyExt>();
+  EXPECT_TRUE(myext2);
+  EXPECT_EQ(42, myext2->a);
+  EXPECT_EQ("mystr", myext2->b);
+
+  AParcel* parcel = AParcel_create();
+  ep.writeToParcel(parcel);
+  AParcel_setDataPosition(parcel, 0);
+  ExtendableParcelable ep2;
+  ep2.readFromParcel(parcel);
+  std::unique_ptr<MyExt> myext3 = ep2.ext.getParcelable<MyExt>();
+  EXPECT_TRUE(myext3);
+  EXPECT_EQ(42, myext3->a);
+  EXPECT_EQ("mystr", myext3->b);
+  AParcel_delete(parcel);
+}
+TEST_P(NdkBinderTest_Aidl, ParcelableHolderCommunicationTest) {
+  ExtendableParcelable ep;
+
+  MyExt myext1;
+  myext1.a = 42;
+  myext1.b = "mystr";
+  ep.ext.setParcelable(&myext1);
+
+  ExtendableParcelable ep2;
+  EXPECT_OK(iface->RepeatExtendableParcelable(ep, &ep2));
+  std::unique_ptr<MyExt> myext2 = ep2.ext.getParcelable<MyExt>();
+  EXPECT_TRUE(myext2);
+  EXPECT_EQ(42, myext2->a);
+  EXPECT_EQ("mystr", myext2->b);
+}
+
 std::shared_ptr<ITest> getProxyLocalService() {
   std::shared_ptr<MyTest> test = SharedRefBase::make<MyTest>();
   SpAIBinder binder = test->asBinder();
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/test_package/Baz.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/test_package/Baz.aidl
new file mode 100644
index 0000000..dc24369
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/test_package/Baz.aidl
@@ -0,0 +1,9 @@
+package test_package;
+
+parcelable Baz {
+    String a="FOO";
+    int b=42;
+    float c=3.14f;
+    // This field doesn't exist in version 1.
+    @nullable String[] d;
+}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/test_package/ExtendableParcelable.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/test_package/ExtendableParcelable.aidl
new file mode 100644
index 0000000..6155d4d
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/test_package/ExtendableParcelable.aidl
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2020 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 test_package;
+
+parcelable ExtendableParcelable {
+    int a;
+    @nullable @utf8InCpp String b;
+    ParcelableHolder ext;
+    long c;
+    ParcelableHolder ext2;
+}
\ No newline at end of file
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/test_package/FixedSize.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/test_package/FixedSize.aidl
new file mode 100644
index 0000000..b1665b5
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/test_package/FixedSize.aidl
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2020 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 test_package;
+
+import test_package.LongEnum;
+
+@FixedSize
+parcelable FixedSize {
+  int a;
+  LongEnum b;
+}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/test_package/Foo.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/test_package/Foo.aidl
index fc102d6..9ecb97e 100644
--- a/tests/tests/binder_ndk/libbinder_ndk_test/test_package/Foo.aidl
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/test_package/Foo.aidl
@@ -4,6 +4,7 @@
 import test_package.ByteEnum;
 import test_package.IntEnum;
 import test_package.LongEnum;
+import test_package.SimpleUnion;
 
 parcelable Foo {
     String a="FOO";
@@ -18,6 +19,6 @@
     ByteEnum[] shouldContainTwoByteFoos;
     IntEnum[] shouldContainTwoIntFoos;
     LongEnum[] shouldContainTwoLongFoos;
-    // This field doesn't exist in version 1.
     @nullable String[] g;
+    @nullable SimpleUnion u;
 }
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/test_package/GenericBar.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/test_package/GenericBar.aidl
new file mode 100644
index 0000000..9e18cb2
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/test_package/GenericBar.aidl
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2020 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 test_package;
+
+import test_package.GenericFoo;
+import test_package.IntEnum;
+import test_package.Bar;
+
+parcelable GenericBar<T> {
+  int a;
+  GenericFoo<int, Bar, IntEnum> shouldBeGenericFoo;
+}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/test_package/GenericFoo.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/test_package/GenericFoo.aidl
new file mode 100644
index 0000000..56db2e0
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/test_package/GenericFoo.aidl
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2020 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 test_package;
+
+parcelable GenericFoo<T, U, V> {
+  int a;
+  int b;
+}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/test_package/ICompatTest.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/test_package/ICompatTest.aidl
new file mode 100644
index 0000000..ad9e013
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/test_package/ICompatTest.aidl
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2020 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 test_package;
+
+import test_package.Baz;
+
+interface ICompatTest {
+    Baz repeatBaz(in Baz inBaz);
+    // Method which is not nullable in version 1, but is nullable in version 2
+    @nullable String RepeatStringNullableLater(@nullable String repeated);
+
+    // Methods that do not exist in version 1
+    int NewMethodThatReturns10();
+}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/test_package/ITest.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/test_package/ITest.aidl
index c8908ab..d5d112b 100644
--- a/tests/tests/binder_ndk/libbinder_ndk_test/test_package/ITest.aidl
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/test_package/ITest.aidl
@@ -22,6 +22,9 @@
 import test_package.IntEnum;
 import test_package.LongEnum;
 import test_package.RegularPolygon;
+import test_package.GenericBar;
+import test_package.ExtendableParcelable;
+import test_package.SimpleUnion;
 
 // This test interface is used in order to test the all of the things that AIDL can generate which
 // build on top of the NDK.
@@ -31,6 +34,8 @@
     const int kZero = 0;
     const int kOne = 1;
     const int kOnes = 0xffffffff;
+    const byte kByteOne = 1;
+    const long kLongOnes = 0xffffffffffffffff;
     const String kEmpty = "";
     const String kFoo = "foo";
 
@@ -118,9 +123,11 @@
     void renameBar(inout Foo foo, String name);
     int getF(in Foo foo);
 
-    // Method which is not nullable in version 1, but is nullable in version 2
-    @nullable String RepeatStringNullableLater(@nullable String repeated);
+    GenericBar<int> repeatGenericBar(in GenericBar<int> bar);
 
-    // Methods that do not exist in version 1
-    int NewMethodThatReturns10();
+    void RepeatExtendableParcelable(in ExtendableParcelable input, out ExtendableParcelable output);
+
+    SimpleUnion RepeatSimpleUnion(in SimpleUnion u);
+
+    IBinder getICompatTest();
 }
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/test_package/MyExt.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/test_package/MyExt.aidl
new file mode 100644
index 0000000..e14d73d
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/test_package/MyExt.aidl
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2020 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 test_package;
+
+parcelable MyExt {
+    int a;
+    @utf8InCpp String b;
+}
\ No newline at end of file
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/test_package/SimpleUnion.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/test_package/SimpleUnion.aidl
new file mode 100644
index 0000000..5fa906a
--- /dev/null
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/test_package/SimpleUnion.aidl
@@ -0,0 +1,13 @@
+package test_package;
+
+import test_package.Bar;
+import test_package.ByteEnum;
+
+union SimpleUnion {
+    int a = 42;
+    int[] b;
+    String c;
+    ByteEnum d;
+    ByteEnum[] e;
+    @nullable Bar f;
+}
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/test_parcel.cpp b/tests/tests/binder_ndk/libbinder_ndk_test/test_parcel.cpp
index 80c7313..baebb1c 100644
--- a/tests/tests/binder_ndk/libbinder_ndk_test/test_parcel.cpp
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/test_parcel.cpp
@@ -367,3 +367,58 @@
 
   AIBinder_decStrong(binder);
 }
+
+TEST_F(NdkBinderTest_AParcel, CreateParcelTest) {
+  AParcel* p = AParcel_create();
+  EXPECT_TRUE(p);
+  EXPECT_EQ(0, AParcel_getDataSize(p));
+  EXPECT_EQ(0, AParcel_getDataPosition(p));
+  AParcel_delete(p);
+}
+
+TEST_F(NdkBinderTest_AParcel, AppendFromTest) {
+  AParcel* p1 = AParcel_create();
+  AParcel* p2 = AParcel_create();
+
+  AParcel_writeInt32(p1, 42);
+
+  AParcel_appendFrom(p1, p2, 0, AParcel_getDataSize(p1));
+  EXPECT_EQ(AParcel_getDataSize(p1), AParcel_getDataSize(p1));
+
+  int32_t actual = 0;
+  AParcel_setDataPosition(p2, 0);
+  AParcel_readInt32(p2, &actual);
+
+  EXPECT_EQ(42, actual);
+
+  AParcel_delete(p1);
+  AParcel_delete(p2);
+}
+
+TEST_F(NdkBinderTest_AParcel, ResetTest) {
+  AParcel* p = AParcel_create();
+
+  AParcel_writeInt32(p, 42);
+  AParcel_reset(p);
+  EXPECT_EQ(0, AParcel_getDataSize(p));
+  EXPECT_EQ(0, AParcel_getDataPosition(p));
+
+  AParcel_writeInt32(p, 24);
+  AParcel_setDataPosition(p, 0);
+  int actual = 0;
+  AParcel_readInt32(p, &actual);
+
+  EXPECT_EQ(24, actual);
+  EXPECT_EQ(AParcel_getDataSize(p), AParcel_getDataPosition(p));
+
+  AParcel_delete(p);
+}
+
+TEST_F(NdkBinderTest_AParcel, GetDataSizeTest) {
+  AParcel* p = AParcel_create();
+
+  AParcel_writeInt32(p, 42);
+  EXPECT_EQ(AParcel_getDataSize(p), AParcel_getDataPosition(p));
+
+  AParcel_delete(p);
+}
\ No newline at end of file
diff --git a/tests/tests/binder_ndk/src/android/binder/cts/JavaClientTest.java b/tests/tests/binder_ndk/src/android/binder/cts/JavaClientTest.java
index b8b9364..e56c3c0 100644
--- a/tests/tests/binder_ndk/src/android/binder/cts/JavaClientTest.java
+++ b/tests/tests/binder_ndk/src/android/binder/cts/JavaClientTest.java
@@ -20,38 +20,42 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
 
 import android.os.IBinder;
 import android.os.ParcelFileDescriptor;
 import android.os.Process;
 import android.os.RemoteException;
 import android.util.Log;
-
 import androidx.test.InstrumentationRegistry;
-
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.function.BiPredicate;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
-
 import test_package.Bar;
+import test_package.Baz;
 import test_package.ByteEnum;
+import test_package.ExtendableParcelable;
 import test_package.Foo;
+import test_package.GenericBar;
+import test_package.GenericFoo;
+import test_package.ICompatTest;
 import test_package.IEmpty;
 import test_package.ITest;
 import test_package.IntEnum;
 import test_package.LongEnum;
+import test_package.MyExt;
 import test_package.RegularPolygon;
-
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.function.BiPredicate;
+import test_package.SimpleUnion;
 
 @RunWith(Parameterized.class)
 public class JavaClientTest {
@@ -175,11 +179,6 @@
     }
 
     private static class Empty extends IEmpty.Stub {
-        @Override
-        public int getInterfaceVersion() { return Empty.VERSION; }
-
-        @Override
-        public String getInterfaceHash() { return Empty.HASH; }
     }
 
     @Test
@@ -606,6 +605,8 @@
         foo.shouldContainTwoIntFoos = new int[]{IntEnum.FOO, IntEnum.FOO};
         foo.shouldContainTwoLongFoos = new long[]{LongEnum.FOO, LongEnum.FOO};
 
+        foo.u = SimpleUnion.e(new byte[]{ByteEnum.FOO, ByteEnum.FOO});
+
         Foo repeatedFoo = mInterface.repeatFoo(foo);
 
         assertEquals(foo.a, repeatedFoo.a);
@@ -618,22 +619,33 @@
         Assert.assertArrayEquals(foo.shouldContainTwoByteFoos, repeatedFoo.shouldContainTwoByteFoos);
         Assert.assertArrayEquals(foo.shouldContainTwoIntFoos, repeatedFoo.shouldContainTwoIntFoos);
         Assert.assertArrayEquals(foo.shouldContainTwoLongFoos, repeatedFoo.shouldContainTwoLongFoos);
+        Assert.assertArrayEquals(foo.u.getE(), repeatedFoo.u.getE());
+    }
+
+    @Test
+    public void testRepeatGenericBar() throws RemoteException {
+      GenericBar<Integer> bar = new GenericBar<Integer>();
+      bar.shouldBeGenericFoo = new GenericFoo<Integer, Bar, Integer>();
+      bar.shouldBeGenericFoo.a = 41;
+      bar.shouldBeGenericFoo.b = 42;
+      GenericBar<Integer> repeatedBar = new GenericBar<Integer>();
+      repeatedBar = mInterface.repeatGenericBar(bar);
+
+      assertEquals(bar.a, repeatedBar.a);
+      assertEquals(bar.shouldBeGenericFoo.a, repeatedBar.shouldBeGenericFoo.a);
+      assertEquals(bar.shouldBeGenericFoo.b, repeatedBar.shouldBeGenericFoo.b);
     }
 
     @Test
     public void testNewField() throws RemoteException {
-        Foo foo = new Foo();
-        foo.d = new Bar();
-        foo.e = new Bar();
-        foo.shouldContainTwoByteFoos = new byte[]{};
-        foo.shouldContainTwoIntFoos = new int[]{};
-        foo.shouldContainTwoLongFoos = new long[]{};
-        foo.g = new String[]{"a", "b", "c"};
-        Foo newFoo = mInterface.repeatFoo(foo);
+        Baz baz = new Baz();
+        baz.d = new String[]{"a", "b", "c"};
+        ICompatTest compatTest = ICompatTest.Stub.asInterface(mInterface.getICompatTest());
+        Baz newBaz = compatTest.repeatBaz(baz);
         if (mShouldBeOld) {
-            assertEquals(null, newFoo.g);
+            assertEquals(null, newBaz.d);
         } else {
-            Assert.assertArrayEquals(foo.g, newFoo.g);
+            Assert.assertArrayEquals(baz.d, newBaz.d);
         }
     }
     @Test
@@ -663,14 +675,42 @@
     public void testRepeatStringNullableLater() throws RemoteException {
         // see notes in native NdkBinderTest_Aidl RepeatStringNullableLater
         boolean handlesNull = !mShouldBeOld || mExpectedName == "JAVA";
+        ICompatTest compatTest = ICompatTest.Stub.asInterface(mInterface.getICompatTest());
+
         try {
-            assertEquals(null, mInterface.RepeatStringNullableLater(null));
+            assertEquals(null, compatTest.RepeatStringNullableLater(null));
             assertTrue("should reach here if null is handled", handlesNull);
         } catch (NullPointerException e) {
             assertFalse("should reach here if null isn't handled", handlesNull);
         }
-        assertEquals("", mInterface.RepeatStringNullableLater(""));
-        assertEquals("a", mInterface.RepeatStringNullableLater("a"));
-        assertEquals("foo", mInterface.RepeatStringNullableLater("foo"));
+        assertEquals("", compatTest.RepeatStringNullableLater(""));
+        assertEquals("a", compatTest.RepeatStringNullableLater("a"));
+        assertEquals("foo", compatTest.RepeatStringNullableLater("foo"));
+    }
+
+    @Test
+    public void testParcelableHolder() throws RemoteException {
+        ExtendableParcelable ep = new ExtendableParcelable();
+
+        MyExt myext1 = new MyExt();
+        myext1.a = 42;
+        myext1.b = "mystr";
+        ep.ext.setParcelable(myext1);
+
+        ExtendableParcelable ep2 = new ExtendableParcelable();
+        mInterface.RepeatExtendableParcelable(ep, ep2);
+        MyExt myext2 = ep2.ext.getParcelable(MyExt.class);
+        assertNotEquals(null, myext2);
+        assertEquals(42, myext2.a);
+        assertEquals("mystr", myext2.b);
+    }
+
+    @Test
+    public void testRepeatSimpleUnion() throws RemoteException {
+        final int[] intArray = { 1, 2, 3 };
+        SimpleUnion origin = SimpleUnion.b(intArray);
+        SimpleUnion ret = mInterface.RepeatSimpleUnion(origin);
+        assertEquals(SimpleUnion.b, ret.getTag());
+        Assert.assertArrayEquals(intArray, ret.getB());
     }
 }
diff --git a/tests/tests/binder_ndk/src/android/binder/cts/TestImpl.java b/tests/tests/binder_ndk/src/android/binder/cts/TestImpl.java
index b0ab502..c65a99a 100644
--- a/tests/tests/binder_ndk/src/android/binder/cts/TestImpl.java
+++ b/tests/tests/binder_ndk/src/android/binder/cts/TestImpl.java
@@ -20,26 +20,24 @@
 import android.os.IBinder;
 import android.os.ParcelFileDescriptor;
 import android.os.RemoteException;
+import java.io.FileDescriptor;
 import java.io.IOException;
-
+import java.io.PrintWriter;
+import java.util.concurrent.CountDownLatch;
+import test_package.Bar;
+import test_package.Baz;
+import test_package.Foo;
+import test_package.GenericBar;
+import test_package.ICompatTest;
 import test_package.IEmpty;
 import test_package.ITest;
 import test_package.RegularPolygon;
-import test_package.Foo;
-import test_package.Bar;
-
-import java.util.concurrent.CountDownLatch;
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
+import test_package.ExtendableParcelable;
+import test_package.MyExt;
+import test_package.SimpleUnion;
 
 public class TestImpl extends ITest.Stub {
   @Override
-  public int getInterfaceVersion() { return TestImpl.VERSION; }
-
-  @Override
-  public String getInterfaceHash() { return TestImpl.HASH; }
-
-  @Override
   protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
     for (String arg : args) {
       pw.print(arg);
@@ -394,12 +392,49 @@
   }
 
   @Override
-  public String RepeatStringNullableLater(String in_value) {
-    return in_value;
+  public GenericBar<Integer> repeatGenericBar(GenericBar<Integer> bar) {
+    return bar;
   }
 
   @Override
-  public int NewMethodThatReturns10() {
-    return 10;
+  public void RepeatExtendableParcelable(ExtendableParcelable in, ExtendableParcelable out) {
+    MyExt ext = in.ext.getParcelable(MyExt.class);
+    MyExt ext2 = new MyExt();
+    ext2.a = ext.a;
+    ext2.b = ext.b;
+    out.ext.setParcelable(ext2);
+  }
+
+  public SimpleUnion RepeatSimpleUnion(SimpleUnion in_u) {
+    return in_u;
+  }
+
+  private static class CompatTest extends ICompatTest.Stub {
+    @Override
+    public int getInterfaceVersion() { return CompatTest.VERSION; }
+
+    @Override
+    public String getInterfaceHash() { return CompatTest.HASH; }
+
+    @Override
+    public Baz repeatBaz(Baz inBaz) {
+      return inBaz;
+    }
+
+    @Override
+    public String RepeatStringNullableLater(String in_value) {
+      return in_value;
+    }
+
+    @Override
+    public int NewMethodThatReturns10() {
+      return 10;
+    }
+  }
+
+  @Override
+  public IBinder getICompatTest() {
+    return new CompatTest();
+
   }
 }
diff --git a/tests/tests/bionic/Android.mk b/tests/tests/bionic/Android.mk
index 9c198d2..0bb59ff 100644
--- a/tests/tests/bionic/Android.mk
+++ b/tests/tests/bionic/Android.mk
@@ -48,7 +48,7 @@
 LOCAL_CXX_STL := libc++_static
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests mts
+LOCAL_COMPATIBILITY_SUITE := cts general-tests mts
 
 LOCAL_CTS_TEST_PACKAGE := android.bionic
 
diff --git a/tests/tests/bionic_app/Android.bp b/tests/tests/bionic_app/Android.bp
index 3735430..03fca22 100644
--- a/tests/tests/bionic_app/Android.bp
+++ b/tests/tests/bionic_app/Android.bp
@@ -24,7 +24,7 @@
     sdk_version: "current",
     test_suites: [
         "cts",
-        "vts10",
+        "general-tests",
     ],
     use_embedded_native_libs: true,
 }
diff --git a/tests/tests/bluetooth/Android.bp b/tests/tests/bluetooth/Android.bp
index 13ee58e..a99a09e 100644
--- a/tests/tests/bluetooth/Android.bp
+++ b/tests/tests/bluetooth/Android.bp
@@ -20,15 +20,14 @@
         "bluetooth-test-util-lib",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     sdk_version: "current",
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/calendarcommon/Android.bp b/tests/tests/calendarcommon/Android.bp
index 7168435..55b5180 100644
--- a/tests/tests/calendarcommon/Android.bp
+++ b/tests/tests/calendarcommon/Android.bp
@@ -16,14 +16,13 @@
     name: "CtsCalendarcommon2TestCases",
     defaults: ["cts_defaults"],
     static_libs: ["ctstestrunner-axt"],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: ["src/**/*.java"],
     sdk_version: "current",
     min_sdk_version: "15",
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/calendarprovider/Android.bp b/tests/tests/calendarprovider/Android.bp
index f1fc458..39327ba 100644
--- a/tests/tests/calendarprovider/Android.bp
+++ b/tests/tests/calendarprovider/Android.bp
@@ -4,14 +4,13 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
     libs: [
         "android.test.mock",
-        "android.test.base.stubs",
-        "android.test.runner.stubs",
+        "android.test.base",
+        "android.test.runner",
     ],
 
     static_libs: [
diff --git a/tests/tests/car/Android.bp b/tests/tests/car/Android.bp
index 675009b..683ee41 100644
--- a/tests/tests/car/Android.bp
+++ b/tests/tests/car/Android.bp
@@ -20,19 +20,18 @@
         "compatibility-device-util-axt",
         "truth-prebuilt",
         "ctstestrunner-axt",
-        "android.test.base.stubs",
         // TODO: remove once Android migrates to JUnit 4.12,
         // which provides assertThrows
         "testng",
     ],
     libs: [
+        "android.test.base",
         "android.car-test-stubs",
     ],
     srcs: ["src/**/*.java"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/car/src/android/car/cts/CarApiTestBase.java b/tests/tests/car/src/android/car/cts/CarApiTestBase.java
index 23851e0..e5c343a 100644
--- a/tests/tests/car/src/android/car/cts/CarApiTestBase.java
+++ b/tests/tests/car/src/android/car/cts/CarApiTestBase.java
@@ -71,9 +71,7 @@
     }
 
     protected void setUp() throws Exception {
-        mCar = Car.createCar(sContext, mConnectionListener, null);
-        mCar.connect();
-        mConnectionListener.waitForConnection(DEFAULT_WAIT_TIMEOUT_MS);
+        mCar = Car.createCar(sContext);
     }
 
     @After
diff --git a/tests/tests/car/src/android/car/cts/CarAppFocusManagerTest.java b/tests/tests/car/src/android/car/cts/CarAppFocusManagerTest.java
index 9383460..e254bbc 100644
--- a/tests/tests/car/src/android/car/cts/CarAppFocusManagerTest.java
+++ b/tests/tests/car/src/android/car/cts/CarAppFocusManagerTest.java
@@ -28,6 +28,7 @@
 import android.car.Car;
 import android.car.CarAppFocusManager;
 import android.content.Context;
+import android.platform.test.annotations.AppModeFull;
 import android.platform.test.annotations.RequiresDevice;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.util.Log;
@@ -45,6 +46,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
+@AppModeFull(reason = "Test relies on other server to connect to.")
 public class CarAppFocusManagerTest extends CarApiTestBase {
     private static final String TAG = CarAppFocusManagerTest.class.getSimpleName();
 
diff --git a/tests/tests/car/src/android/car/cts/CarInfoManagerTest.java b/tests/tests/car/src/android/car/cts/CarInfoManagerTest.java
index d7135da..e8f46ed 100644
--- a/tests/tests/car/src/android/car/cts/CarInfoManagerTest.java
+++ b/tests/tests/car/src/android/car/cts/CarInfoManagerTest.java
@@ -23,6 +23,7 @@
 import android.car.FuelType;
 import android.car.PortLocationType;
 import android.car.VehicleAreaSeat;
+import android.platform.test.annotations.AppModeFull;
 import android.platform.test.annotations.RequiresDevice;
 import android.test.suitebuilder.annotation.SmallTest;
 
@@ -38,6 +39,7 @@
 @SmallTest
 @RequiresDevice
 @RunWith(AndroidJUnit4.class)
+@AppModeFull(reason = "Instant apps cannot get car related permissions.")
 public class CarInfoManagerTest extends CarApiTestBase {
 
     private CarInfoManager mCarInfoManager;
diff --git a/tests/tests/car/src/android/car/cts/CarOccupantZoneManagerTest.java b/tests/tests/car/src/android/car/cts/CarOccupantZoneManagerTest.java
index f6436e8..7dafee2 100644
--- a/tests/tests/car/src/android/car/cts/CarOccupantZoneManagerTest.java
+++ b/tests/tests/car/src/android/car/cts/CarOccupantZoneManagerTest.java
@@ -25,6 +25,7 @@
 import android.car.CarOccupantZoneManager.OccupantZoneInfo;
 import android.os.Process;
 import android.os.UserHandle;
+import android.platform.test.annotations.AppModeFull;
 import android.platform.test.annotations.RequiresDevice;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.view.Display;
@@ -39,6 +40,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
+@AppModeFull(reason = "Instant apps cannot get car related permissions.")
 public class CarOccupantZoneManagerTest extends CarApiTestBase {
 
     private OccupantZoneInfo mDriverZoneInfo;
diff --git a/tests/tests/car/src/android/car/cts/CarPackageManagerTest.java b/tests/tests/car/src/android/car/cts/CarPackageManagerTest.java
index 0bffd49..6304ebe 100644
--- a/tests/tests/car/src/android/car/cts/CarPackageManagerTest.java
+++ b/tests/tests/car/src/android/car/cts/CarPackageManagerTest.java
@@ -24,6 +24,7 @@
 import android.car.content.pm.CarPackageManager;
 import android.content.Intent;
 import android.os.Build;
+import android.platform.test.annotations.AppModeFull;
 import android.platform.test.annotations.RequiresDevice;
 import android.test.suitebuilder.annotation.SmallTest;
 
@@ -35,6 +36,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
+@AppModeFull(reason = "Instant apps cannot see other packages")
 public class CarPackageManagerTest extends CarApiTestBase {
 
     private CarPackageManager mCarPm;
diff --git a/tests/tests/car/src/android/car/cts/CarPropertyConfigTest.java b/tests/tests/car/src/android/car/cts/CarPropertyConfigTest.java
index 1b78318..06e1212 100644
--- a/tests/tests/car/src/android/car/cts/CarPropertyConfigTest.java
+++ b/tests/tests/car/src/android/car/cts/CarPropertyConfigTest.java
@@ -21,6 +21,7 @@
 import android.car.hardware.CarPropertyConfig;
 import android.car.hardware.property.CarPropertyManager;
 
+import android.platform.test.annotations.AppModeFull;
 import android.platform.test.annotations.RequiresDevice;
 import android.test.suitebuilder.annotation.SmallTest;
 import androidx.test.runner.AndroidJUnit4;
@@ -38,6 +39,7 @@
 @SmallTest
 @RequiresDevice
 @RunWith(AndroidJUnit4.class)
+@AppModeFull(reason = "Instant apps cannot get car related permissions.")
 public class CarPropertyConfigTest extends CarApiTestBase {
     private CarPropertyManager mCarPropertyManager;
     private List<CarPropertyConfig> mConfigs = new ArrayList<>();
diff --git a/tests/tests/car/src/android/car/cts/CarPropertyManagerTest.java b/tests/tests/car/src/android/car/cts/CarPropertyManagerTest.java
index 3482327..a36af18 100644
--- a/tests/tests/car/src/android/car/cts/CarPropertyManagerTest.java
+++ b/tests/tests/car/src/android/car/cts/CarPropertyManagerTest.java
@@ -28,6 +28,7 @@
 import android.car.hardware.CarPropertyValue;
 import android.car.hardware.property.CarPropertyManager;
 import android.car.hardware.property.CarPropertyManager.CarPropertyEventCallback;
+import android.platform.test.annotations.AppModeFull;
 import android.platform.test.annotations.RequiresDevice;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.util.ArraySet;
@@ -51,6 +52,7 @@
 @SmallTest
 @RequiresDevice
 @RunWith(AndroidJUnit4.class)
+@AppModeFull(reason = "Instant apps cannot get car related permissions.")
 public class CarPropertyManagerTest extends CarApiTestBase {
 
     private static final String TAG = CarPropertyManagerTest.class.getSimpleName();
diff --git a/tests/tests/car/src/android/car/cts/CarPropertyValueTest.java b/tests/tests/car/src/android/car/cts/CarPropertyValueTest.java
index c658939..6cdb951 100644
--- a/tests/tests/car/src/android/car/cts/CarPropertyValueTest.java
+++ b/tests/tests/car/src/android/car/cts/CarPropertyValueTest.java
@@ -21,6 +21,7 @@
 import android.car.hardware.CarPropertyValue;
 import android.car.hardware.property.CarPropertyManager;
 
+import android.platform.test.annotations.AppModeFull;
 import android.util.SparseArray;
 import androidx.test.runner.AndroidJUnit4;
 import static com.google.common.truth.Truth.assertThat;
@@ -39,6 +40,7 @@
 @SmallTest
 @RequiresDevice
 @RunWith(AndroidJUnit4.class)
+@AppModeFull(reason = "Instant apps cannot get car related permissions.")
 public class CarPropertyValueTest extends CarApiTestBase {
     private CarPropertyManager mCarPropertyManager;
     private List<CarPropertyValue> mCarPropertyValues = new ArrayList<>();
diff --git a/tests/tests/car/src/android/car/cts/CarSensorManagerTest.java b/tests/tests/car/src/android/car/cts/CarSensorManagerTest.java
index 5325768..f7eccdf 100644
--- a/tests/tests/car/src/android/car/cts/CarSensorManagerTest.java
+++ b/tests/tests/car/src/android/car/cts/CarSensorManagerTest.java
@@ -21,6 +21,7 @@
 
 import android.car.Car;
 import android.car.hardware.CarSensorManager;
+import android.platform.test.annotations.AppModeFull;
 import android.platform.test.annotations.RequiresDevice;
 import android.test.suitebuilder.annotation.SmallTest;
 
@@ -37,6 +38,7 @@
 @SmallTest
 @RequiresDevice
 @RunWith(AndroidJUnit4.class)
+@AppModeFull(reason = "Instant apps cannot get car related permissions.")
 public class CarSensorManagerTest extends CarApiTestBase {
 
     private int[] mSupportedSensors;
diff --git a/tests/tests/car/src/android/car/cts/CarTest.java b/tests/tests/car/src/android/car/cts/CarTest.java
index 30db102..fc18eb5 100644
--- a/tests/tests/car/src/android/car/cts/CarTest.java
+++ b/tests/tests/car/src/android/car/cts/CarTest.java
@@ -23,6 +23,7 @@
 import android.content.ServiceConnection;
 import android.content.pm.PackageManager;
 import android.os.IBinder;
+import android.platform.test.annotations.AppModeFull;
 import android.test.suitebuilder.annotation.SmallTest;
 
 import androidx.annotation.NonNull;
@@ -43,6 +44,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
+@AppModeFull(reason = "Test relies on other server to connect to.")
 public class CarTest {
     @ClassRule
     public static final RequiredFeatureRule sRequiredFeatureRule = new RequiredFeatureRule(
diff --git a/tests/tests/car/src/android/car/cts/CarUxRestrictionsManagerTest.java b/tests/tests/car/src/android/car/cts/CarUxRestrictionsManagerTest.java
index 6e50c9b..dcd572d 100644
--- a/tests/tests/car/src/android/car/cts/CarUxRestrictionsManagerTest.java
+++ b/tests/tests/car/src/android/car/cts/CarUxRestrictionsManagerTest.java
@@ -23,6 +23,7 @@
 import android.car.Car;
 import android.car.drivingstate.CarUxRestrictions;
 import android.car.drivingstate.CarUxRestrictionsManager;
+import android.platform.test.annotations.AppModeFull;
 import android.platform.test.annotations.RequiresDevice;
 import android.test.suitebuilder.annotation.SmallTest;
 
@@ -35,6 +36,7 @@
 @SmallTest
 @RequiresDevice
 @RunWith(AndroidJUnit4.class)
+@AppModeFull(reason = "Test relies on other server to connect to.")
 public class CarUxRestrictionsManagerTest extends CarApiTestBase {
     private CarUxRestrictionsManager mManager;
 
diff --git a/tests/tests/carrierapi/Android.bp b/tests/tests/carrierapi/Android.bp
index 111392b..0eac60e 100644
--- a/tests/tests/carrierapi/Android.bp
+++ b/tests/tests/carrierapi/Android.bp
@@ -25,12 +25,11 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     // This  APK must be signed to match the test SIM's cert whitelist.
     // While "testkey" is the default, there are different per-device testkeys, so
diff --git a/tests/tests/carrierapi/AndroidTest.xml b/tests/tests/carrierapi/AndroidTest.xml
index adafe53..e5e885d 100644
--- a/tests/tests/carrierapi/AndroidTest.xml
+++ b/tests/tests/carrierapi/AndroidTest.xml
@@ -20,9 +20,6 @@
     <option name="config-descriptor:metadata" key="component" value="telecom" />
     <option name="config-descriptor:metadata" key="token" value="UICC_SIM_CARD" />
     <option name="not-shardable" value="true" />
-    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.TokenRequirement">
-        <option name="token" value="sim-card-with-certs" />
-    </target_preparer>
     <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
         <option name="cleanup-apks" value="true" />
         <option name="test-file-name" value="CtsCarrierApiTestCases.apk" />
diff --git a/tests/tests/carrierapi/src/android/carrierapi/cts/CarrierApiTest.java b/tests/tests/carrierapi/src/android/carrierapi/cts/CarrierApiTest.java
index b98e6a9..8f2d6fc 100644
--- a/tests/tests/carrierapi/src/android/carrierapi/cts/CarrierApiTest.java
+++ b/tests/tests/carrierapi/src/android/carrierapi/cts/CarrierApiTest.java
@@ -1055,6 +1055,7 @@
 
         // Set subscription group with current sub Id.
         int subId = SubscriptionManager.getDefaultDataSubscriptionId();
+        if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) return;
         ParcelUuid uuid = mSubscriptionManager.createSubscriptionGroup(Arrays.asList(subId));
 
         try {
@@ -1092,6 +1093,7 @@
 
         // Set subscription group with current sub Id.
         int subId = SubscriptionManager.getDefaultDataSubscriptionId();
+        if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) return;
         ParcelUuid uuid = mSubscriptionManager.createSubscriptionGroup(Arrays.asList(subId));
 
         try {
@@ -1123,6 +1125,7 @@
         if (!hasCellular) return;
 
         int subId = SubscriptionManager.getDefaultDataSubscriptionId();
+        if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) return;
         SubscriptionInfo info = mSubscriptionManager.getActiveSubscriptionInfo(subId);
         boolean oldOpportunistic = info.isOpportunistic();
         boolean newOpportunistic = !oldOpportunistic;
diff --git a/tests/tests/classloaderfactory/test-memcl/Android.bp b/tests/tests/classloaderfactory/test-memcl/Android.bp
index a54ecb2..e4dafb8 100644
--- a/tests/tests/classloaderfactory/test-memcl/Android.bp
+++ b/tests/tests/classloaderfactory/test-memcl/Android.bp
@@ -18,7 +18,6 @@
     srcs: [ ":cts-classloaderfactorytest-srcs" ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/classloaderfactory/test-pathcl/Android.bp b/tests/tests/classloaderfactory/test-pathcl/Android.bp
index 08bbd85..3622519 100644
--- a/tests/tests/classloaderfactory/test-pathcl/Android.bp
+++ b/tests/tests/classloaderfactory/test-pathcl/Android.bp
@@ -18,7 +18,6 @@
     srcs: [ ":cts-classloaderfactorytest-srcs" ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/colormode/Android.bp b/tests/tests/colormode/Android.bp
index a3fff06..3560a61 100644
--- a/tests/tests/colormode/Android.bp
+++ b/tests/tests/colormode/Android.bp
@@ -26,7 +26,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/tests/tests/contactsprovider/Android.bp b/tests/tests/contactsprovider/Android.bp
index 67f5687..975e5bf 100644
--- a/tests/tests/contactsprovider/Android.bp
+++ b/tests/tests/contactsprovider/Android.bp
@@ -6,14 +6,13 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
     libs: [
         "android.test.mock",
-        "android.test.base.stubs",
-        "android.test.runner.stubs",
+        "android.test.base",
+        "android.test.runner",
     ],
 
     static_libs: [
diff --git a/tests/tests/contactsprovider/gal/Android.bp b/tests/tests/contactsprovider/gal/Android.bp
index 4804a85..5b2f639 100644
--- a/tests/tests/contactsprovider/gal/Android.bp
+++ b/tests/tests/contactsprovider/gal/Android.bp
@@ -4,7 +4,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/tests/tests/contactsproviderwipe/Android.bp b/tests/tests/contactsproviderwipe/Android.bp
index 82eecbd..c3ce587 100644
--- a/tests/tests/contactsproviderwipe/Android.bp
+++ b/tests/tests/contactsproviderwipe/Android.bp
@@ -24,13 +24,12 @@
         "ub-uiautomator",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/content/Android.bp b/tests/tests/content/Android.bp
index eba49d3..4df740d 100644
--- a/tests/tests/content/Android.bp
+++ b/tests/tests/content/Android.bp
@@ -26,8 +26,8 @@
         "libnativehelper_compat_libc++",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
         "android.test.mock",
     ],
     static_libs: [
@@ -69,7 +69,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     min_sdk_version: "29",
diff --git a/tests/tests/content/BinderPermissionTestService/Android.bp b/tests/tests/content/BinderPermissionTestService/Android.bp
index 8408547..798f084 100644
--- a/tests/tests/content/BinderPermissionTestService/Android.bp
+++ b/tests/tests/content/BinderPermissionTestService/Android.bp
@@ -24,7 +24,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     optimize: {
diff --git a/tests/tests/content/CtsSyncAccountAccessOtherCertTests/Android.bp b/tests/tests/content/CtsSyncAccountAccessOtherCertTests/Android.bp
index b05bc27..b15e59a 100644
--- a/tests/tests/content/CtsSyncAccountAccessOtherCertTests/Android.bp
+++ b/tests/tests/content/CtsSyncAccountAccessOtherCertTests/Android.bp
@@ -27,7 +27,6 @@
     certificate: ":cts-testkey2",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     optimize: {
diff --git a/tests/tests/content/DirectBootUnawareTestApp/Android.bp b/tests/tests/content/DirectBootUnawareTestApp/Android.bp
index 1206cb3..c03d9fc 100644
--- a/tests/tests/content/DirectBootUnawareTestApp/Android.bp
+++ b/tests/tests/content/DirectBootUnawareTestApp/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     min_sdk_version: "29",
diff --git a/tests/tests/content/HelloWorldApp/Android.bp b/tests/tests/content/HelloWorldApp/Android.bp
index 36bce17..b303c78 100644
--- a/tests/tests/content/HelloWorldApp/Android.bp
+++ b/tests/tests/content/HelloWorldApp/Android.bp
@@ -39,7 +39,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     v4_signature: true,
@@ -53,7 +52,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     v4_signature: true,
diff --git a/tests/tests/content/PartiallyDirectBootAwareTestApp/Android.bp b/tests/tests/content/PartiallyDirectBootAwareTestApp/Android.bp
index c08aa30..a618068 100644
--- a/tests/tests/content/PartiallyDirectBootAwareTestApp/Android.bp
+++ b/tests/tests/content/PartiallyDirectBootAwareTestApp/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     min_sdk_version : "29"
diff --git a/tests/tests/content/SyncAccountAccessStubs/Android.bp b/tests/tests/content/SyncAccountAccessStubs/Android.bp
index 6358d12..1713171 100644
--- a/tests/tests/content/SyncAccountAccessStubs/Android.bp
+++ b/tests/tests/content/SyncAccountAccessStubs/Android.bp
@@ -22,7 +22,6 @@
     sdk_version: "current",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     optimize: {
diff --git a/tests/tests/content/emptytestapp/Android.bp b/tests/tests/content/emptytestapp/Android.bp
index 71baac9..763cf4e 100644
--- a/tests/tests/content/emptytestapp/Android.bp
+++ b/tests/tests/content/emptytestapp/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     min_sdk_version : "29"
diff --git a/tests/tests/content/pm/SecureFrp/Android.bp b/tests/tests/content/pm/SecureFrp/Android.bp
index fd921b2..09872e7 100644
--- a/tests/tests/content/pm/SecureFrp/Android.bp
+++ b/tests/tests/content/pm/SecureFrp/Android.bp
@@ -28,7 +28,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "mts",
     ],
diff --git a/tests/tests/content/pm/SecureFrp/AndroidManifest.xml b/tests/tests/content/pm/SecureFrp/AndroidManifest.xml
index f1b5184..9e45d4a 100644
--- a/tests/tests/content/pm/SecureFrp/AndroidManifest.xml
+++ b/tests/tests/content/pm/SecureFrp/AndroidManifest.xml
@@ -18,6 +18,7 @@
           package="com.android.tests.securefrpinstall" >
 
     <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
+    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
 
     <application>
         <receiver android:name="com.android.cts.install.lib.LocalIntentSender"
diff --git a/tests/tests/content/src/android/content/cts/ApexEnvironmentTest.java b/tests/tests/content/src/android/content/cts/ApexEnvironmentTest.java
new file mode 100644
index 0000000..eb97850
--- /dev/null
+++ b/tests/tests/content/src/android/content/cts/ApexEnvironmentTest.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2020 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.content.cts;
+
+import static org.junit.Assert.assertEquals;
+
+import android.content.ApexEnvironment;
+import android.os.UserHandle;
+import android.platform.test.annotations.AppModeFull;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Copied from frameworks/base/core/tests/coretests/src/android/content/ApexEnvironmentTest.java
+ */
+@AppModeFull(reason = "Doesn't interact with system server")
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class ApexEnvironmentTest {
+
+    @Test
+    public void dataDirectoryPathsAreAsExpected() {
+        ApexEnvironment apexEnvironment = ApexEnvironment.getApexEnvironment("my.apex");
+
+        assertEquals("/data/misc/apexdata/my.apex",
+                apexEnvironment.getDeviceProtectedDataDir().getAbsolutePath());
+
+        assertEquals("/data/misc_de/5/apexdata/my.apex",
+                apexEnvironment
+                        .getDeviceProtectedDataDirForUser(UserHandle.of(5)).getAbsolutePath());
+
+        assertEquals("/data/misc_ce/16/apexdata/my.apex",
+                apexEnvironment.getCredentialProtectedDataDirForUser(
+                        UserHandle.of(16)).getAbsolutePath());
+    }
+}
diff --git a/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java b/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
index 47ccab4..8ae80df 100644
--- a/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
+++ b/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
@@ -24,6 +24,7 @@
 import android.content.ContentUris;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
@@ -31,6 +32,7 @@
 import android.media.RingtoneManager;
 import android.net.Uri;
 import android.net.wifi.WifiManager;
+import android.os.BatteryManager;
 import android.os.storage.StorageManager;
 import android.platform.test.annotations.AppModeFull;
 import android.provider.AlarmClock;
@@ -492,7 +494,7 @@
     }
 
     public void testPowerUsageSummarySettings() {
-        if (isHandheld()) {
+        if (isBatteryPresent()) {
             assertCanBeHandled(new Intent(Intent.ACTION_POWER_USAGE_SUMMARY));
         }
     }
@@ -560,4 +562,10 @@
                 && !pm.hasSystemFeature(pm.FEATURE_TELEVISION)
                 && !pm.hasSystemFeature(pm.FEATURE_AUTOMOTIVE);
     }
+
+    private boolean isBatteryPresent() {
+        final Intent batteryInfo = mContext.registerReceiver(null,
+                                    new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
+        return batteryInfo.getBooleanExtra(BatteryManager.EXTRA_PRESENT, true);
+    }
 }
diff --git a/tests/tests/content/src/android/content/cts/ContentProviderClientTest.java b/tests/tests/content/src/android/content/cts/ContentProviderClientTest.java
index 9119ea1..cdd6dc1 100644
--- a/tests/tests/content/src/android/content/cts/ContentProviderClientTest.java
+++ b/tests/tests/content/src/android/content/cts/ContentProviderClientTest.java
@@ -17,11 +17,13 @@
 package android.content.cts;
 
 import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.RETURNS_DEFAULTS;
 
 import android.content.ContentProvider;
 import android.content.ContentProviderClient;
@@ -38,7 +40,6 @@
 import android.os.RemoteException;
 import android.test.AndroidTestCase;
 import android.test.mock.MockContentResolver;
-import android.test.mock.MockIContentProvider;
 
 import org.mockito.stubbing.Answer;
 
@@ -84,10 +85,10 @@
     public void setUp() throws Exception {
         super.setUp();
 
-        mIContentProvider = mock(MockIContentProvider.class);
+        mIContentProvider = mock(IContentProvider.class, RETURNS_DEFAULTS);
         mICancellationSignal = mock(ICancellationSignal.class);
 
-        when(mIContentProvider.createCancellationSignal()).thenReturn(mICancellationSignal);
+        doReturn(mICancellationSignal).when(mIContentProvider).createCancellationSignal();
 
         mContentResolver = spy(
                 new MockContentResolver(getContext().createFeatureContext(FEATURE_ID)));
@@ -114,8 +115,8 @@
     }
 
     public void testQueryTimeout() throws RemoteException, InterruptedException {
-        when(mIContentProvider.query(PACKAGE_NAME, FEATURE_ID, URI, null, ARGS,
-                mICancellationSignal)).thenAnswer(ANSWER_SLEEP);
+        doAnswer(ANSWER_SLEEP).when(mIContentProvider).query(PACKAGE_NAME, FEATURE_ID, URI, null,
+                ARGS, mICancellationSignal);
 
         testTimeout(() -> mContentProviderClient.query(URI, null, ARGS, mCancellationSignal));
 
@@ -136,8 +137,7 @@
     }
 
     public void testGetTypeTimeout() throws RemoteException, InterruptedException {
-        when(mIContentProvider.getType(URI))
-                .thenAnswer(ANSWER_SLEEP);
+        doAnswer(ANSWER_SLEEP).when(mIContentProvider).getType(URI);
 
         testTimeout(() -> mContentProviderClient.getType(URI));
 
@@ -150,8 +150,7 @@
     }
 
     public void testGetStreamTypesTimeout() throws RemoteException, InterruptedException {
-        when(mIContentProvider.getStreamTypes(URI, ""))
-                .thenAnswer(ANSWER_SLEEP);
+        doAnswer(ANSWER_SLEEP).when(mIContentProvider).getStreamTypes(URI, "");
 
         testTimeout(() -> mContentProviderClient.getStreamTypes(URI, ""));
 
@@ -164,8 +163,7 @@
     }
 
     public void testCanonicalizeTimeout() throws RemoteException, InterruptedException {
-        when(mIContentProvider.canonicalize(PACKAGE_NAME, FEATURE_ID, URI))
-                .thenAnswer(ANSWER_SLEEP);
+        doAnswer(ANSWER_SLEEP).when(mIContentProvider).canonicalize(PACKAGE_NAME, FEATURE_ID, URI);
 
         testTimeout(() -> mContentProviderClient.canonicalize(URI));
 
@@ -178,8 +176,7 @@
     }
 
     public void testUncanonicalizeTimeout() throws RemoteException, InterruptedException {
-        when(mIContentProvider.uncanonicalize(PACKAGE_NAME, FEATURE_ID, URI))
-                .thenAnswer(ANSWER_SLEEP);
+        doAnswer(ANSWER_SLEEP).when(mIContentProvider).uncanonicalize(PACKAGE_NAME, FEATURE_ID, URI);
 
         testTimeout(() -> mContentProviderClient.uncanonicalize(URI));
 
@@ -193,8 +190,8 @@
     }
 
     public void testRefreshTimeout() throws RemoteException, InterruptedException {
-        when(mIContentProvider.refresh(PACKAGE_NAME, FEATURE_ID, URI, ARGS, mICancellationSignal))
-                .thenAnswer(ANSWER_SLEEP);
+        doAnswer(ANSWER_SLEEP).when(mIContentProvider).refresh(PACKAGE_NAME, FEATURE_ID, URI, ARGS,
+                mICancellationSignal);
 
         testTimeout(() -> mContentProviderClient.refresh(URI, ARGS, mCancellationSignal));
 
@@ -214,8 +211,8 @@
     }
 
     public void testInsertTimeout() throws RemoteException, InterruptedException {
-        when(mIContentProvider.insert(PACKAGE_NAME, FEATURE_ID, URI, VALUES, EXTRAS))
-                .thenAnswer(ANSWER_SLEEP);
+        doAnswer(ANSWER_SLEEP).when(mIContentProvider).insert(PACKAGE_NAME, FEATURE_ID, URI,
+                VALUES, EXTRAS);
 
         testTimeout(() -> mContentProviderClient.insert(URI, VALUES, EXTRAS));
 
@@ -228,8 +225,8 @@
     }
 
     public void testBulkInsertTimeout() throws RemoteException, InterruptedException {
-        when(mIContentProvider.bulkInsert(PACKAGE_NAME, FEATURE_ID, URI, VALUES_ARRAY))
-                .thenAnswer(ANSWER_SLEEP);
+        doAnswer(ANSWER_SLEEP).when(mIContentProvider).bulkInsert(PACKAGE_NAME, FEATURE_ID, URI,
+                VALUES_ARRAY);
 
         testTimeout(() -> mContentProviderClient.bulkInsert(URI, VALUES_ARRAY));
 
@@ -242,8 +239,8 @@
     }
 
     public void testDeleteTimeout() throws RemoteException, InterruptedException {
-        when(mIContentProvider.delete(PACKAGE_NAME, FEATURE_ID, URI, EXTRAS))
-                .thenAnswer(ANSWER_SLEEP);
+        doAnswer(ANSWER_SLEEP).when(mIContentProvider).delete(PACKAGE_NAME, FEATURE_ID, URI,
+                EXTRAS);
 
         testTimeout(() -> mContentProviderClient.delete(URI, EXTRAS));
 
@@ -256,8 +253,8 @@
     }
 
     public void testUpdateTimeout() throws RemoteException, InterruptedException {
-        when(mIContentProvider.update(PACKAGE_NAME, FEATURE_ID, URI, VALUES, EXTRAS))
-                .thenAnswer(ANSWER_SLEEP);
+        doAnswer(ANSWER_SLEEP).when(mIContentProvider).update(PACKAGE_NAME, FEATURE_ID, URI,
+                VALUES, EXTRAS);
 
         testTimeout(() -> mContentProviderClient.update(URI, VALUES, EXTRAS));
 
@@ -273,8 +270,8 @@
 
     public void testOpenFileTimeout()
             throws RemoteException, InterruptedException, FileNotFoundException {
-        when(mIContentProvider.openFile(PACKAGE_NAME, FEATURE_ID, URI, MODE, mICancellationSignal,
-                null)).thenAnswer(ANSWER_SLEEP);
+        doAnswer(ANSWER_SLEEP).when(mIContentProvider).openFile(PACKAGE_NAME, FEATURE_ID, URI, MODE,
+                mICancellationSignal, null);
 
         testTimeout(() -> mContentProviderClient.openFile(URI, MODE, mCancellationSignal));
 
@@ -298,8 +295,8 @@
 
     public void testOpenAssetFileTimeout()
             throws RemoteException, InterruptedException, FileNotFoundException {
-        when(mIContentProvider.openAssetFile(PACKAGE_NAME, FEATURE_ID, URI, MODE,
-                mICancellationSignal)).thenAnswer(ANSWER_SLEEP);
+        doAnswer(ANSWER_SLEEP).when(mIContentProvider).openAssetFile(PACKAGE_NAME, FEATURE_ID, URI,
+                MODE, mICancellationSignal);
 
         testTimeout(() -> mContentProviderClient.openAssetFile(URI, MODE, mCancellationSignal));
 
@@ -331,9 +328,8 @@
 
     public void testOpenTypedAssetFileTimeout()
             throws RemoteException, InterruptedException, FileNotFoundException {
-        when(mIContentProvider.openTypedAssetFile(PACKAGE_NAME, FEATURE_ID, URI, MODE, ARGS,
-                mICancellationSignal))
-                .thenAnswer(ANSWER_SLEEP);
+        doAnswer(ANSWER_SLEEP).when(mIContentProvider).openTypedAssetFile(PACKAGE_NAME, FEATURE_ID,
+                URI, MODE, ARGS, mICancellationSignal);
 
         testTimeout(() -> mContentProviderClient.openTypedAssetFile(URI, MODE, ARGS,
                 mCancellationSignal));
@@ -359,8 +355,8 @@
 
     public void testApplyBatchTimeout()
             throws RemoteException, InterruptedException, OperationApplicationException {
-        when(mIContentProvider.applyBatch(PACKAGE_NAME, FEATURE_ID, AUTHORITY, OPS))
-                .thenAnswer(ANSWER_SLEEP);
+        doAnswer(ANSWER_SLEEP).when(mIContentProvider).applyBatch(PACKAGE_NAME, FEATURE_ID,
+                AUTHORITY, OPS);
 
         testTimeout(() -> mContentProviderClient.applyBatch(AUTHORITY, OPS));
 
@@ -374,8 +370,8 @@
     }
 
     public void testCallTimeout() throws RemoteException, InterruptedException {
-        when(mIContentProvider.call(PACKAGE_NAME, FEATURE_ID, AUTHORITY, METHOD, ARG, ARGS))
-                .thenAnswer(ANSWER_SLEEP);
+        doAnswer(ANSWER_SLEEP).when(mIContentProvider).call(PACKAGE_NAME, FEATURE_ID, AUTHORITY,
+                METHOD, ARG, ARGS);
 
         testTimeout(() -> mContentProviderClient.call(AUTHORITY, METHOD, ARG, ARGS));
 
diff --git a/tests/tests/content/src/android/content/pm/cts/InstallSessionParamsUnitTest.java b/tests/tests/content/src/android/content/pm/cts/InstallSessionParamsUnitTest.java
index b4176f9..b867f00e 100644
--- a/tests/tests/content/src/android/content/pm/cts/InstallSessionParamsUnitTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/InstallSessionParamsUnitTest.java
@@ -32,7 +32,6 @@
 
 import static org.junit.Assert.fail;
 
-import android.content.Context;
 import android.content.pm.PackageInstaller;
 import android.content.pm.PackageInstaller.SessionInfo;
 import android.content.pm.PackageInstaller.SessionParams;
@@ -43,6 +42,8 @@
 
 import androidx.test.InstrumentationRegistry;
 
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -81,6 +82,13 @@
     @Parameterized.Parameter(10)
     public boolean expectFailure;
 
+    private PackageInstaller mInstaller = InstrumentationRegistry.getInstrumentation()
+            .getTargetContext()
+            .getPackageManager()
+            .getPackageInstaller();
+
+    private int mSessionId = -1;
+
     /**
      * Generate test-parameters where all params are the same, but one param cycles through all
      * values.
@@ -181,9 +189,7 @@
      * owned by the this package.
      */
     private SessionInfo getSessionInfo(int sessionId) {
-        Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
-        PackageInstaller installer = context.getPackageManager().getPackageInstaller();
-        List<SessionInfo> mySessionInfos = installer.getMySessions();
+        List<SessionInfo> mySessionInfos = mInstaller.getMySessions();
 
         for (SessionInfo sessionInfo : mySessionInfos) {
             if (sessionInfo.getSessionId() == sessionId) {
@@ -194,16 +200,19 @@
         return null;
     }
 
-    /**
-     * Create a new installer session.
-     *
-     * @return The new session
-     */
-    private int createSession(SessionParams params) throws Exception {
-        Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
-        PackageInstaller installer = context.getPackageManager().getPackageInstaller();
+    @Before
+    public void resetSessionId() {
+        mSessionId = 1;
+    }
 
-        return installer.createSession(params);
+    @After
+    public void abandonSession() {
+        if (mSessionId != -1) {
+            try {
+                mInstaller.abandonSession(mSessionId);
+            } catch (SecurityException ignored) {
+            }
+        }
     }
 
     @Test
@@ -225,9 +234,8 @@
         referredUri.ifPresent(params::setReferrerUri);
         installReason.ifPresent(params::setInstallReason);
 
-        int sessionId;
         try {
-            sessionId = createSession(params);
+            mSessionId = mInstaller.createSession(params);
 
             if (expectFailure) {
                 fail("Creating session did not fail");
@@ -240,7 +248,7 @@
             throw e;
         }
 
-        SessionInfo info = getSessionInfo(sessionId);
+        SessionInfo info = getSessionInfo(mSessionId);
 
         assertThat(info.getMode()).isEqualTo(mode.get());
         installLocation.ifPresent(i -> assertThat(info.getInstallLocation()).isEqualTo(i));
diff --git a/tests/tests/content/src/android/content/pm/cts/InstallSessionTransferTest.java b/tests/tests/content/src/android/content/pm/cts/InstallSessionTransferTest.java
index 8db0b66..51752bc 100644
--- a/tests/tests/content/src/android/content/pm/cts/InstallSessionTransferTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/InstallSessionTransferTest.java
@@ -38,6 +38,8 @@
 import androidx.test.InstrumentationRegistry;
 import androidx.test.runner.AndroidJUnit4;
 
+import com.android.internal.util.FunctionalUtils;
+
 import libcore.io.Streams;
 
 import org.junit.Test;
@@ -109,21 +111,6 @@
         }
     }
 
-    /**
-     * Create a new installer session.
-     *
-     * @return The new session
-     */
-    private Session createSession() throws Exception {
-        Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
-
-        PackageInstaller installer = context.getPackageManager().getPackageInstaller();
-
-        SessionParams params = new SessionParams(MODE_FULL_INSTALL);
-        int sessionId = installer.createSession(params);
-        return installer.openSession(sessionId);
-    }
-
     @Test
     public void transferSession() throws Exception {
         Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
@@ -133,140 +120,152 @@
 
         PackageInstaller installer = context.getPackageManager().getPackageInstaller();
 
-        SessionParams params = new SessionParams(MODE_FULL_INSTALL);
-        int sessionId = installer.createSession(params);
-        Session session = installer.openSession(sessionId);
+        openAndCloseSession((sessionId, session) -> {
+            writeApk(session, "CtsContentTestCases");
 
-        writeApk(session, "CtsContentTestCases");
+            InputStream danglingReadStream = session.openRead("CtsContentTestCases");
 
-        InputStream danglingReadStream = session.openRead("CtsContentTestCases");
+            SessionInfo info = getSessionInfo(installer, sessionId);
+            assertThat(info.getInstallerPackageName()).isEqualTo(context.getPackageName());
+            assertThat(info.isSealed()).isFalse();
 
-        SessionInfo info = getSessionInfo(installer, sessionId);
-        assertThat(info.getInstallerPackageName()).isEqualTo(context.getPackageName());
-        assertThat(info.isSealed()).isFalse();
+            // This transfers the session to the new owner
+            session.transfer(packageInstallerPackage);
+            assertThat(getSessionInfo(installer, sessionId)).isNull();
 
-        // This transfers the session to the new owner
-        session.transfer(packageInstallerPackage);
-        assertThat(getSessionInfo(installer, sessionId)).isNull();
+            try {
+                // Session is transferred, all operations on the session are invalid
+                session.getNames();
+                fail();
+            } catch (SecurityException e) {
+                // expected
+            }
 
-        try {
-            // Session is transferred, all operations on the session are invalid
-            session.getNames();
-            fail();
-        } catch (SecurityException e) {
-            // expected
-        }
+            // Even when the session is transferred read streams still work and contain the same
+            // content that we initially wrote into it.
+            try (InputStream originalContent = new FileInputStream(
+                    "/data/local/tmp/cts/content/CtsContentTestCases.apk")) {
+                try (InputStream sessionContent = danglingReadStream) {
+                    byte[] buffer = new byte[4096];
+                    while (true) {
+                        int numReadOriginal = originalContent.read(buffer);
+                        int numReadSession = sessionContent.read(buffer);
 
-        // Even when the session is transferred read streams still work and contain the same content
-        // that we initially wrote into it.
-        try (InputStream originalContent = new FileInputStream(
-                "/data/local/tmp/cts/content/CtsContentTestCases.apk")) {
-            try (InputStream sessionContent = danglingReadStream) {
-                byte[] buffer = new byte[4096];
-                while (true) {
-                    int numReadOriginal = originalContent.read(buffer);
-                    int numReadSession = sessionContent.read(buffer);
-
-                    assertThat(numReadOriginal).isEqualTo(numReadSession);
-                    if (numReadOriginal == -1) {
-                        break;
+                        assertThat(numReadOriginal).isEqualTo(numReadSession);
+                        if (numReadOriginal == -1) {
+                            break;
+                        }
                     }
                 }
             }
-        }
 
-        danglingReadStream.close();
+            danglingReadStream.close();
+        });
     }
 
     @Test
     public void transferToInvalidNewOwner() throws Exception {
-        Session session = createSession();
-        writeApk(session, "CtsContentTestCases");
+        openAndCloseSession((sessionId, session) -> {
+            writeApk(session, "CtsContentTestCases");
 
-        try {
-            // This will fail as the name of the new owner is invalid
-            session.transfer("android.content.cts.invalid.package");
-            fail();
-        } catch (PackageManager.NameNotFoundException e) {
-            // Expected
-        }
-
-        session.abandon();
+            try {
+                // This will fail as the name of the new owner is invalid
+                session.transfer("android.content.cts.invalid.package");
+                fail();
+            } catch (PackageManager.NameNotFoundException e) {
+                // Expected
+            }
+        });
     }
 
     @Test
     public void transferToOwnerWithoutInstallPermission() throws Exception {
-        Session session = createSession();
-        writeApk(session, "CtsContentTestCases");
+        openAndCloseSession((sessionId, session) -> {
+            writeApk(session, "CtsContentTestCases");
 
-        try {
-            // This will fail as the current package does not own the install-packages permission
-            session.transfer(InstrumentationRegistry.getInstrumentation().getTargetContext()
-                    .getPackageName());
-            fail();
-        } catch (SecurityException e) {
-            // Expected
-        }
-
-        session.abandon();
+            try {
+                // This will fail as the current package does not own the install-packages
+                // permission
+                session.transfer(InstrumentationRegistry.getInstrumentation().getTargetContext()
+                        .getPackageName());
+                fail();
+            } catch (SecurityException e) {
+                // Expected
+            }
+        });
     }
 
     @Test
     public void transferWithOpenWrite() throws Exception {
-        Session session = createSession();
-        String packageInstallerPackage = getPackageInstallerPackageName();
-        assumeNotNull(packageInstallerPackage);
+        openAndCloseSession((sessionId, session) -> {
+            String packageInstallerPackage = getPackageInstallerPackageName();
+            assumeNotNull(packageInstallerPackage);
 
-        session.openWrite("danglingWriteStream", 0, 1);
-        try {
-            // This will fail as the danglingWriteStream is still open
-            session.transfer(packageInstallerPackage);
-            fail();
-        } catch (SecurityException e) {
-            // Expected
-        }
-
-        session.abandon();
+            session.openWrite("danglingWriteStream", 0, 1);
+            try {
+                // This will fail as the danglingWriteStream is still open
+                session.transfer(packageInstallerPackage);
+                fail();
+            } catch (SecurityException e) {
+                // Expected
+            }
+        });
     }
 
     @Test
     public void transferSessionWithInvalidApk() throws Exception {
-        Session session = createSession();
-        String packageInstallerPackage = getPackageInstallerPackageName();
-        assumeNotNull(packageInstallerPackage);
+        openAndCloseSession((sessionId, session) -> {
+            String packageInstallerPackage = getPackageInstallerPackageName();
+            assumeNotNull(packageInstallerPackage);
 
-        try (OutputStream out = session.openWrite("invalid", 0, 2)) {
-            out.write(new byte[]{23, 42});
-            out.flush();
-        }
+            try (OutputStream out = session.openWrite("invalid", 0, 2)) {
+                out.write(new byte[]{23, 42});
+                out.flush();
+            }
 
-        try {
-            // This will fail as the content of 'invalid' is not a valid APK
-            session.transfer(packageInstallerPackage);
-            fail();
-        } catch (IllegalArgumentException e) {
-            // expected
-        }
-
-        session.abandon();
+            try {
+                // This will fail as the content of 'invalid' is not a valid APK
+                session.transfer(packageInstallerPackage);
+                fail();
+            } catch (IllegalArgumentException e) {
+                // expected
+            }
+        });
     }
 
     @Test
     public void transferWithApkFromWrongPackage() throws Exception {
-        Session session = createSession();
-        String packageInstallerPackage = getPackageInstallerPackageName();
-        assumeNotNull(packageInstallerPackage);
+        openAndCloseSession((sessionId, session) -> {
+            String packageInstallerPackage = getPackageInstallerPackageName();
+            assumeNotNull(packageInstallerPackage);
 
-        writeApk(session, "CtsContentEmptyTestApp");
+            writeApk(session, "CtsContentEmptyTestApp");
 
+            try {
+                // This will fail as the session contains the a apk from the wrong package
+                session.transfer(packageInstallerPackage);
+                fail();
+            } catch (SecurityException e) {
+                // expected
+            }
+        });
+    }
+
+    private void openAndCloseSession(FunctionalUtils.ThrowingBiConsumer<Integer, Session> block)
+            throws IOException {
+        Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+
+        PackageInstaller installer = context.getPackageManager().getPackageInstaller();
+
+        SessionParams params = new SessionParams(MODE_FULL_INSTALL);
+        int sessionId = installer.createSession(params);
         try {
-            // This will fail as the session contains the a apk from the wrong package
-            session.transfer(packageInstallerPackage);
-            fail();
-        } catch (SecurityException e) {
-            // expected
+            block.accept(sessionId, installer.openSession(sessionId));
+        } finally {
+            try {
+                installer.abandonSession(sessionId);
+            } catch (SecurityException ignored) {
+            }
         }
-
-        session.abandon();
     }
 }
diff --git a/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandTest.java b/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandTest.java
index 382099c..d401e62 100644
--- a/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandTest.java
@@ -51,7 +51,9 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 import java.util.Optional;
 import java.util.Random;
 import java.util.stream.Collectors;
@@ -87,6 +89,7 @@
     private boolean mStreaming = false;
     private boolean mIncremental = false;
     private String mInstall = "";
+    private List<Integer> mSessionIds = new ArrayList<>();
 
     private static PackageInstaller getPackageInstaller() {
         return InstrumentationRegistry.getContext().getPackageManager().getPackageInstaller();
@@ -162,6 +165,8 @@
 
         uninstallPackageSilently(TEST_APP_PACKAGE);
         assertFalse(isAppInstalled(TEST_APP_PACKAGE));
+
+        mSessionIds.clear();
     }
 
     @After
@@ -169,6 +174,13 @@
         uninstallPackageSilently(TEST_APP_PACKAGE);
         assertFalse(isAppInstalled(TEST_APP_PACKAGE));
         assertEquals(null, getSplits(TEST_APP_PACKAGE));
+
+        for (int sessionId : mSessionIds) {
+            try {
+                getPackageInstaller().abandonSession(sessionId);
+            } catch (SecurityException ignored) {
+            }
+        }
     }
 
     @Test
@@ -411,7 +423,7 @@
 
             final SessionParams params = new SessionParams(SessionParams.MODE_FULL_INSTALL);
 
-            final int sessionId = installer.createSession(params);
+            final int sessionId = createSession(params);
             PackageInstaller.Session session = installer.openSession(sessionId);
 
             assertEquals(null, session.getDataLoaderParams());
@@ -439,7 +451,7 @@
                     mIncremental ? DataLoaderParams.forIncremental(componentName, args)
                             : DataLoaderParams.forStreaming(componentName, args));
 
-            final int sessionId = installer.createSession(params);
+            final int sessionId = createSession(params);
             PackageInstaller.Session session = installer.openSession(sessionId);
 
             DataLoaderParams dataLoaderParams = session.getDataLoaderParams();
@@ -473,7 +485,7 @@
                     mIncremental ? DataLoaderParams.forIncremental(componentName, args)
                             : DataLoaderParams.forStreaming(componentName, args));
 
-            final int sessionId = installer.createSession(params);
+            final int sessionId = createSession(params);
             PackageInstaller.Session session = installer.openSession(sessionId);
 
             session.addFile(LOCATION_DATA_APP, "base.apk", 123, "123".getBytes(), null);
@@ -493,6 +505,12 @@
         }
     }
 
+    private int createSession(SessionParams params) throws IOException {
+        int sessionId = getPackageInstaller().createSession(params);
+        mSessionIds.add(sessionId);
+        return sessionId;
+    }
+
     private String createUpdateSession(String packageName) throws IOException {
         return createSession("-p " + packageName);
     }
@@ -503,7 +521,10 @@
         final String commandResult = executeShellCommand("pm install-create " + arg);
         assertTrue(commandResult, commandResult.startsWith(prefix));
         assertTrue(commandResult, commandResult.endsWith(suffix));
-        return commandResult.substring(prefix.length(), commandResult.length() - suffix.length());
+        String sessionId = commandResult.substring(prefix.length(),
+                commandResult.length() - suffix.length());
+        mSessionIds.add(Integer.parseInt(sessionId));
+        return sessionId;
     }
 
     private void addSplits(String sessionId, String[] splitNames) throws IOException {
diff --git a/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java b/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java
index b3785d8..3a035f6 100644
--- a/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java
+++ b/tests/tests/content/src/android/content/pm/cts/PackageManagerTest.java
@@ -669,7 +669,7 @@
 
         // Check required permissions
         List<String> requestedPermissions = Arrays.asList(pkgInfo.requestedPermissions);
-        assertThat(requestedPermissions).containsAllOf(
+        assertThat(requestedPermissions).containsAtLeast(
                 "android.permission.MANAGE_ACCOUNTS",
                 "android.permission.ACCESS_NETWORK_STATE",
                 "android.content.cts.permission.TEST_GRANTED");
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 6998103..e4ec383 100644
--- a/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java
+++ b/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java
@@ -102,7 +102,7 @@
 
         // We don't do an exact match because the framework can add asset files and this test
         // would be too brittle.
-        assertThat(files).asList().containsAllOf(fileName, "subdir");
+        assertThat(files).asList().containsAtLeast(fileName, "subdir");
 
         files = mAssets.list("subdir");
         assertThat(files).isNotNull();
diff --git a/tests/tests/cronet/Android.bp b/tests/tests/cronet/Android.bp
new file mode 100644
index 0000000..179e6b3
--- /dev/null
+++ b/tests/tests/cronet/Android.bp
@@ -0,0 +1,36 @@
+// Copyright (C) 2019 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.
+
+
+// TODO: Move this target to cts/tests/tests/net/cronet
+android_test {
+    name: "CtsCronetTestCases",
+    defaults: ["cts_defaults"],
+
+    // Include both the 32 and 64 bit versions
+    compile_multilib: "both",
+
+    static_libs: [
+        "CronetApiCommonTests",
+        "ctstestrunner-axt",
+    ],
+
+    // Tag this module as a cts test artifact
+    test_suites: [
+        "cts",
+        "general-tests",
+        "mts",
+    ],
+
+}
diff --git a/tests/tests/cronet/AndroidManifest.xml b/tests/tests/cronet/AndroidManifest.xml
new file mode 100644
index 0000000..b7ae844
--- /dev/null
+++ b/tests/tests/cronet/AndroidManifest.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2007 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.cronet.cts" >
+
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.INTERNET" />
+
+    <application android:usesCleartextTraffic="true">
+        <uses-library android:name="android.test.runner" />
+        <uses-library android:name="org.chromium.net.cronet" />
+    </application>
+
+    <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
+                     android:targetPackage="android.cronet.cts"
+                     android:label="CTS tests of android.cronet">
+        <meta-data android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener" />
+    </instrumentation>
+
+</manifest>
diff --git a/tests/tests/cronet/AndroidTest.xml b/tests/tests/cronet/AndroidTest.xml
new file mode 100644
index 0000000..79c37f7
--- /dev/null
+++ b/tests/tests/cronet/AndroidTest.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 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.
+-->
+<configuration description="Config for CTS Cronet test cases">
+    <option name="test-suite-tag" value="cts" />
+    <option name="config-descriptor:metadata" key="component" value="networking" />
+    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
+    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
+    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
+    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+        <option name="cleanup-apks" value="true" />
+        <option name="test-file-name" value="CtsCronetTestCases.apk" />
+    </target_preparer>
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+        <option name="package" value="android.cronet.cts" />
+        <option name="runtime-hint" value="10s" />
+    </test>
+</configuration>
\ No newline at end of file
diff --git a/tests/tests/cronet/OWNERS b/tests/tests/cronet/OWNERS
new file mode 100644
index 0000000..f4525df
--- /dev/null
+++ b/tests/tests/cronet/OWNERS
@@ -0,0 +1,2 @@
+# Bug component: 31808
+include ../net/OWNERS
\ No newline at end of file
diff --git a/tests/tests/database/Android.bp b/tests/tests/database/Android.bp
index 36da2df..e2e1f2c 100644
--- a/tests/tests/database/Android.bp
+++ b/tests/tests/database/Android.bp
@@ -24,14 +24,13 @@
         "junit",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     // Enforce public / test api only
diff --git a/tests/tests/database/OWNERS b/tests/tests/database/OWNERS
index 169c781..ff8b569 100644
--- a/tests/tests/database/OWNERS
+++ b/tests/tests/database/OWNERS
@@ -1,5 +1,6 @@
 # Bug component: 21000
+zezeozue@google.com
+nandana@google.com
+narayan@google.com
 omakoto@google.com
 yamasani@google.com
-narayan@google.com
-nandana@google.com
diff --git a/tests/tests/database/apps/Android.bp b/tests/tests/database/apps/Android.bp
index 63feb8f..0f18003 100644
--- a/tests/tests/database/apps/Android.bp
+++ b/tests/tests/database/apps/Android.bp
@@ -22,7 +22,6 @@
 
   test_suites: [
     "cts",
-        "vts10",
     "general-tests",
   ]
 }
\ No newline at end of file
diff --git a/tests/tests/database/src/android/database/sqlite/cts/SQLiteDatabaseTest.java b/tests/tests/database/src/android/database/sqlite/cts/SQLiteDatabaseTest.java
index 3856d1d..81d3657 100644
--- a/tests/tests/database/src/android/database/sqlite/cts/SQLiteDatabaseTest.java
+++ b/tests/tests/database/src/android/database/sqlite/cts/SQLiteDatabaseTest.java
@@ -55,8 +55,8 @@
 public class SQLiteDatabaseTest extends AndroidTestCase {
 
     private static final String TAG = "SQLiteDatabaseTest";
-    private static final String EXPECTED_MAJOR_MINOR_VERSION = "3.28";
-    private static final int EXPECTED_MIN_PATCH_LEVEL = 0;
+    private static final String EXPECTED_MAJOR_MINOR_VERSION = "3.32";
+    private static final int EXPECTED_MIN_PATCH_LEVEL = 2;
 
     private SQLiteDatabase mDatabase;
     private File mDatabaseFile;
diff --git a/tests/tests/deviceconfig/Android.bp b/tests/tests/deviceconfig/Android.bp
index 6666025..ade7f7c 100644
--- a/tests/tests/deviceconfig/Android.bp
+++ b/tests/tests/deviceconfig/Android.bp
@@ -20,10 +20,9 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     static_libs: [
         "compatibility-device-util-axt",
         "ctstestrunner-axt",
diff --git a/tests/tests/deviceconfig/OWNERS b/tests/tests/deviceconfig/OWNERS
index cf9ff13..ac6ec2d 100644
--- a/tests/tests/deviceconfig/OWNERS
+++ b/tests/tests/deviceconfig/OWNERS
@@ -1,6 +1,4 @@
 # Bug component: 326016
-zholnin@google.com
-lus@google.com
-mpape@google.com
+hongyiz@google.com
+shuc@google.com
 svetoslavganov@google.com
-
diff --git a/tests/tests/display/Android.bp b/tests/tests/display/Android.bp
index 729d653..a6df5fc 100644
--- a/tests/tests/display/Android.bp
+++ b/tests/tests/display/Android.bp
@@ -23,11 +23,10 @@
     },
     srcs: ["src/**/*.java"],
     static_libs: ["androidx.test.rules"],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "sts",
     ],
diff --git a/tests/tests/display/src/android/display/cts/DisplayTest.java b/tests/tests/display/src/android/display/cts/DisplayTest.java
index 94295e2..639ecc8 100644
--- a/tests/tests/display/src/android/display/cts/DisplayTest.java
+++ b/tests/tests/display/src/android/display/cts/DisplayTest.java
@@ -470,6 +470,16 @@
             params.setTitle("CtsTestPresentation");
             getWindow().setAttributes(params);
         }
+
+        @Override
+        public void cancel() {
+            // Ignore attempts to force cancel the presentation. This is going to happen when we
+            // change the mode of the display since doing so will change the display metrics, which
+            // Presentations don't yet support. Ignoring it means the Presentation will stay up and
+            // the mode will stay changed until dismiss is called, preventing a race condition
+            // between the test checking the mode of the display and the mode changing back to the
+            // default because the requesting Presentation is no longer showing.
+        }
     }
 
     private Activity launchScreenOnActivity() {
diff --git a/tests/tests/dpi/Android.bp b/tests/tests/dpi/Android.bp
index 862bcda..e3fa2ea 100644
--- a/tests/tests/dpi/Android.bp
+++ b/tests/tests/dpi/Android.bp
@@ -23,15 +23,14 @@
         "compatibility-device-util-axt",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     sdk_version: "test_current",
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -42,7 +41,7 @@
 // CTS tests, so drop it into a library that other tests can use.
 java_library {
     name: "android.cts.dpi",
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: ["src/android/dpi/cts/DefaultManifestAttributesTest.java"],
     sdk_version: "test_current",
 }
diff --git a/tests/tests/dpi2/Android.bp b/tests/tests/dpi2/Android.bp
index 635023a..e38a6fc 100644
--- a/tests/tests/dpi2/Android.bp
+++ b/tests/tests/dpi2/Android.bp
@@ -23,14 +23,13 @@
         "ctstestrunner-axt",
         "junit",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: ["src/**/*.java"],
     sdk_version: "test_current",
     min_sdk_version: "3",
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/dreams/Android.bp b/tests/tests/dreams/Android.bp
index 64e0548..13c05b8 100644
--- a/tests/tests/dreams/Android.bp
+++ b/tests/tests/dreams/Android.bp
@@ -18,8 +18,10 @@
     static_libs: [
         "ctstestrunner-axt",
         "junit",
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+    ],
+    libs: [
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     // Need access to ServiceManager - see b/13307221
@@ -28,7 +30,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/drm/Android.bp b/tests/tests/drm/Android.bp
index a787221..59c23d2 100644
--- a/tests/tests/drm/Android.bp
+++ b/tests/tests/drm/Android.bp
@@ -21,12 +21,11 @@
         "ctstestrunner-axt",
         "compatibility-device-util-axt",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: ["src/**/*.java"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     jni_libs: [
diff --git a/tests/tests/drm/jni/Android.bp b/tests/tests/drm/jni/Android.bp
index ce14d1e..aa6a94b 100644
--- a/tests/tests/drm/jni/Android.bp
+++ b/tests/tests/drm/jni/Android.bp
@@ -19,6 +19,7 @@
         "android_drm_cts_NativeCodeTest.cpp",
     ],
     gtest: false,
+    header_libs: ["jni_headers"],
     shared_libs: [
         "liblog",
         "libdl",
diff --git a/tests/tests/dynamic_linker/Android.bp b/tests/tests/dynamic_linker/Android.bp
index b9da8a2..38a7d25 100644
--- a/tests/tests/dynamic_linker/Android.bp
+++ b/tests/tests/dynamic_linker/Android.bp
@@ -20,6 +20,7 @@
         "-Wall",
         "-Werror",
     ],
+    header_libs: ["jni_headers"],
     strip: {
         none: true,
     },
@@ -34,6 +35,7 @@
         "-Wall",
         "-Werror",
     ],
+    header_libs: ["jni_headers"],
     strip: {
         none: true,
     },
@@ -54,7 +56,7 @@
     sdk_version: "current",
     test_suites: [
         "cts",
-        "vts10",
+        "general-tests",
     ],
     use_embedded_native_libs: true,
 }
diff --git a/tests/tests/effect/Android.bp b/tests/tests/effect/Android.bp
index fb788fc..5ee5b74 100644
--- a/tests/tests/effect/Android.bp
+++ b/tests/tests/effect/Android.bp
@@ -20,7 +20,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/tests/tests/externalservice/Android.bp b/tests/tests/externalservice/Android.bp
index d4d1271..c70d41b 100644
--- a/tests/tests/externalservice/Android.bp
+++ b/tests/tests/externalservice/Android.bp
@@ -26,12 +26,11 @@
         "compatibility-device-util-axt",
         "ctstestrunner-axt",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: ["src/**/*.java"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/externalservice/service/Android.bp b/tests/tests/externalservice/service/Android.bp
index 3511bb6..781d272 100644
--- a/tests/tests/externalservice/service/Android.bp
+++ b/tests/tests/externalservice/service/Android.bp
@@ -24,7 +24,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/gesture/Android.bp b/tests/tests/gesture/Android.bp
index 0ba1997..0d0f52d 100644
--- a/tests/tests/gesture/Android.bp
+++ b/tests/tests/gesture/Android.bp
@@ -20,7 +20,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/tests/tests/graphics/Android.bp b/tests/tests/graphics/Android.bp
index 9d8a1b8..3f821b0 100644
--- a/tests/tests/graphics/Android.bp
+++ b/tests/tests/graphics/Android.bp
@@ -17,8 +17,8 @@
     defaults: ["cts_defaults"],
     compile_multilib: "both",
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     static_libs: [
         "androidx.test.rules",
@@ -37,7 +37,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     // Enforce public / test api only
diff --git a/tests/tests/graphics/src/android/graphics/cts/PaintTest.java b/tests/tests/graphics/src/android/graphics/cts/PaintTest.java
index 4fbecde..b1d99f8 100644
--- a/tests/tests/graphics/src/android/graphics/cts/PaintTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/PaintTest.java
@@ -1358,7 +1358,7 @@
     public void testHasGlyph() {
         Paint p = new Paint();
 
-        // This method tests both the logic of hasGlyph and the sanity of fonts present
+        // This method tests both the logic of hasGlyph and the validity of fonts present
         // on the device.
         assertTrue(p.hasGlyph("A"));
         assertFalse(p.hasGlyph("\uFFFE"));  // U+FFFE is guaranteed to be a noncharacter
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/AnimatedVectorDrawableParameterizedTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/AnimatedVectorDrawableParameterizedTest.java
index bfc3be2..ec44400 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/AnimatedVectorDrawableParameterizedTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/AnimatedVectorDrawableParameterizedTest.java
@@ -247,7 +247,7 @@
         AnimatedVectorDrawableTest.waitForAVDStop(callback, MAX_TIMEOUT_MS);
         // Check that the AVD with empty AnimatorSet has finished
         callback.assertEnded(true);
-        callback.assertAVDRuntime(0, TimeUnit.MILLISECONDS.toNanos(300));
+        callback.assertAVDRuntime(0, TimeUnit.MILLISECONDS.toNanos(900));
     }
 
     // Does a fuzzy comparison between two images.
diff --git a/tests/tests/graphics/src/android/graphics/fonts/FontTest.java b/tests/tests/graphics/src/android/graphics/fonts/FontTest.java
index 47e4c2b..951cea6 100644
--- a/tests/tests/graphics/src/android/graphics/fonts/FontTest.java
+++ b/tests/tests/graphics/src/android/graphics/fonts/FontTest.java
@@ -526,7 +526,7 @@
 
     @Test
     public void testBuilder_fd_subdata() throws IOException {
-        byte[] dummy = { (byte) 0xde, (byte) 0xad, (byte) 0xbe, (byte) 0xef };
+        byte[] placeHolderData = { (byte) 0xde, (byte) 0xad, (byte) 0xbe, (byte) 0xef };
         AssetManager am = InstrumentationRegistry.getTargetContext().getAssets();
         for (Pair<Integer, Boolean> style : FontTestUtil.getAllStyles()) {
             int weight = style.first.intValue();
@@ -536,12 +536,12 @@
 
             File file = getTempFile();
             try (InputStream is = am.open(path)) {
-                assertTrue(copyToFile(file, is, dummy, dummy));
+                assertTrue(copyToFile(file, is, placeHolderData, placeHolderData));
 
                 try (ParcelFileDescriptor fd = ParcelFileDescriptor.open(file,
                         ParcelFileDescriptor.MODE_READ_ONLY)) {
-                    Font font = new Font.Builder(
-                            fd, dummy.length, file.length() - dummy.length * 2).build();
+                    Font font = new Font.Builder(fd, placeHolderData.length,
+                            file.length() - placeHolderData.length * 2).build();
                     assertEquals(path, weight, font.getStyle().getWeight());
                     assertEquals(path, slant, font.getStyle().getSlant());
                     assertEquals(path, 0, font.getTtcIndex());
@@ -557,7 +557,7 @@
 
     @Test
     public void testBuilder_fd_subdata_ttc() throws IOException {
-        byte[] dummy = { (byte) 0xde, (byte) 0xad, (byte) 0xbe, (byte) 0xef };
+        byte[] placeHolderData = { (byte) 0xde, (byte) 0xad, (byte) 0xbe, (byte) 0xef };
         AssetManager am = InstrumentationRegistry.getTargetContext().getAssets();
         for (Pair<Integer, Boolean> style : FontTestUtil.getAllStyles()) {
             int weight = style.first.intValue();
@@ -568,12 +568,12 @@
 
             File file = getTempFile();
             try (InputStream is = am.open(path)) {
-                assertTrue(copyToFile(file, is, dummy, dummy));
+                assertTrue(copyToFile(file, is, placeHolderData, placeHolderData));
 
                 try (ParcelFileDescriptor fd = ParcelFileDescriptor.open(file,
                         ParcelFileDescriptor.MODE_READ_ONLY)) {
                     Font font = new Font.Builder(
-                            fd, dummy.length, file.length() - dummy.length * 2)
+                            fd, placeHolderData.length, file.length() - placeHolderData.length * 2)
                             .setTtcIndex(ttcIndex).build();
                     assertEquals(path, weight, font.getStyle().getWeight());
                     assertEquals(path, slant, font.getStyle().getSlant());
@@ -590,7 +590,7 @@
 
     @Test
     public void testBuilder_fd_subdata_vf() throws IOException {
-        byte[] dummy = { (byte) 0xde, (byte) 0xad, (byte) 0xbe, (byte) 0xef };
+        byte[] placeHolderData = { (byte) 0xde, (byte) 0xad, (byte) 0xbe, (byte) 0xef };
         AssetManager am = InstrumentationRegistry.getTargetContext().getAssets();
         for (Pair<Integer, Boolean> style : FontTestUtil.getAllStyles()) {
             int weight = style.first.intValue();
@@ -602,12 +602,12 @@
 
             File file = getTempFile();
             try (InputStream is = am.open(path)) {
-                assertTrue(copyToFile(file, is, dummy, dummy));
+                assertTrue(copyToFile(file, is, placeHolderData, placeHolderData));
 
                 try (ParcelFileDescriptor fd = ParcelFileDescriptor.open(file,
                         ParcelFileDescriptor.MODE_READ_ONLY)) {
                     Font font = new Font.Builder(
-                            fd, dummy.length, file.length() - dummy.length * 2)
+                            fd, placeHolderData.length, file.length() - placeHolderData.length * 2)
                             .setFontVariationSettings(axes).build();
                     assertEquals(path, weight, font.getStyle().getWeight());
                     assertEquals(path, slant, font.getStyle().getSlant());
@@ -625,7 +625,7 @@
     @Test
     public void testBuilder_fd_subdata_override() throws IOException {
         int customWeight = 350;
-        byte[] dummy = { (byte) 0xde, (byte) 0xad, (byte) 0xbe, (byte) 0xef };
+        byte[] placeHolderData = { (byte) 0xde, (byte) 0xad, (byte) 0xbe, (byte) 0xef };
         AssetManager am = InstrumentationRegistry.getTargetContext().getAssets();
         for (Pair<Integer, Boolean> style : FontTestUtil.getAllStyles()) {
             int weight = style.first.intValue();
@@ -635,12 +635,12 @@
 
             File file = getTempFile();
             try (InputStream is = am.open(path)) {
-                assertTrue(copyToFile(file, is, dummy, dummy));
+                assertTrue(copyToFile(file, is, placeHolderData, placeHolderData));
 
                 try (ParcelFileDescriptor fd = ParcelFileDescriptor.open(file,
                         ParcelFileDescriptor.MODE_READ_ONLY)) {
                     Font font = new Font.Builder(
-                            fd, dummy.length, file.length() - dummy.length * 2)
+                            fd, placeHolderData.length, file.length() - placeHolderData.length * 2)
                             .setWeight(customWeight).build();
                     assertEquals(path, customWeight, font.getStyle().getWeight());
                     assertEquals(path, slant, font.getStyle().getSlant());
@@ -661,12 +661,12 @@
 
             File file = getTempFile();
             try (InputStream is = am.open(path)) {
-                assertTrue(copyToFile(file, is, dummy, dummy));
+                assertTrue(copyToFile(file, is, placeHolderData, placeHolderData));
 
                 try (ParcelFileDescriptor fd = ParcelFileDescriptor.open(file,
                         ParcelFileDescriptor.MODE_READ_ONLY)) {
                     Font font = new Font.Builder(
-                            fd, dummy.length, file.length() - dummy.length * 2)
+                            fd, placeHolderData.length, file.length() - placeHolderData.length * 2)
                             .setSlant(FontStyle.FONT_SLANT_ITALIC).build();
                     assertEquals(path, weight, font.getStyle().getWeight());
                     assertEquals(path, FontStyle.FONT_SLANT_ITALIC, font.getStyle().getSlant());
diff --git a/tests/tests/gwp-asan/enabled/Android.bp b/tests/tests/gwp-asan/enabled/Android.bp
index 68b1078..aadbdde 100644
--- a/tests/tests/gwp-asan/enabled/Android.bp
+++ b/tests/tests/gwp-asan/enabled/Android.bp
@@ -20,12 +20,11 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     static_libs: [
         "ctstestrunner-axt",
diff --git a/tests/tests/hardware/Android.bp b/tests/tests/hardware/Android.bp
index 9be4739..ea60dda 100644
--- a/tests/tests/hardware/Android.bp
+++ b/tests/tests/hardware/Android.bp
@@ -18,13 +18,12 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     compile_multilib: "both",
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     static_libs: [
         "androidx.annotation_annotation",
diff --git a/tests/tests/hardware/src/android/hardware/cts/GeomagneticFieldTest.java b/tests/tests/hardware/src/android/hardware/cts/GeomagneticFieldTest.java
index 8968442..12f7d45 100644
--- a/tests/tests/hardware/src/android/hardware/cts/GeomagneticFieldTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/GeomagneticFieldTest.java
@@ -20,82 +20,61 @@
 import android.platform.test.annotations.Presubmit;
 import android.test.AndroidTestCase;
 
-import java.util.GregorianCalendar;
+import java.util.Calendar;
+import java.util.TimeZone;
 
 public class GeomagneticFieldTest extends AndroidTestCase {
-    private static final float DECLINATION_THRESHOLD = 0.1f;
-    private static final float INCLINATION_THRESHOLD = 0.1f;
-    private static final float FIELD_STRENGTH_THRESHOLD = 100;
+    private static final float DECLINATION_THRESHOLD = 0.01f;
+    private static final float INCLINATION_THRESHOLD = 0.01f;
+    private static final float FIELD_STRENGTH_THRESHOLD = 1;
 
     @Presubmit
     public void testGeomagneticField() {
-        // Reference values calculated from NOAA online calculator for WMM 2015
+        // Reference values calculated from NOAA online calculator for WMM 2020
         // https://www.ngdc.noaa.gov/geomag-web/#igrfwmm
-        TestDataPoint testPoints[] = new TestDataPoint[] {
-            // Mountain View, CA, USA on 2017/1/1
-            new TestDataPoint(37.386f, -122.083f, 32, 2017, 1, 1,
-                    13.4589f, 60.9542f, 48168.0f),
-            // Chengdu, China on 2017/8/8
-            new TestDataPoint(30.658f, 103.935f, 500f, 2017, 8, 8,
-                    -1.9784f, 47.9723f, 50717.3f),
-            // Sao Paulo, Brazil on 2018/12/25
-            new TestDataPoint(-23.682f, -46.875f, 760f, 2018, 12, 25,
-                    -21.3130f, -37.9940f, 22832.3f),
-            // Boston, MA, USA on 2019/2/10
-            new TestDataPoint(42.313f, -71.127f, 43f, 2019, 2, 10,
-                    -14.5391f, 66.9693f, 51815.1f),
-            // Cape Town, South Africa on 2019/5/1
-            new TestDataPoint(-33.913f, 18.095f, 100f, 2019, 5, 1,
-                    -25.2454f, -65.8887f, 25369.2f),
-            // Sydney, Australia on 2020/1/1
-            new TestDataPoint(-33.847f, 150.791f, 19f, 2020, 1, 1,
-                    12.4469f, -64.3443f, 57087.9f)
-        };
-
-        for (TestDataPoint t : testPoints) {
-            GeomagneticField field =
-                    new GeomagneticField(t.latitude, t.longitude, t.altitude, t.epochTimeMillis);
-            assertEquals(t.declinationDegree,  field.getDeclination(), DECLINATION_THRESHOLD);
-            assertEquals(t.inclinationDegree,  field.getInclination(), INCLINATION_THRESHOLD);
-            assertEquals(t.fieldStrengthNanoTesla, field.getFieldStrength(),
-                    FIELD_STRENGTH_THRESHOLD);
-
-            float horizontalFieldStrengthNanoTesla = (float)(
-                    Math.cos(Math.toRadians(t.inclinationDegree)) * t.fieldStrengthNanoTesla);
-            assertEquals(horizontalFieldStrengthNanoTesla, field.getHorizontalStrength(),
-                    FIELD_STRENGTH_THRESHOLD);
-
-            float verticalFieldStrengthNanoTesla = (float)(
-                    Math.sin(Math.toRadians(t.inclinationDegree)) * t.fieldStrengthNanoTesla);
-            assertEquals(verticalFieldStrengthNanoTesla, field.getZ(), FIELD_STRENGTH_THRESHOLD);
-
-            float declinationDegree = (float)(
-                    Math.toDegrees(Math.atan2(field.getY(), field.getX())));
-            assertEquals(t.declinationDegree, declinationDegree, DECLINATION_THRESHOLD);
-            assertEquals(horizontalFieldStrengthNanoTesla,
-                    Math.sqrt(field.getX() * field.getX() + field.getY() * field.getY()),
-                    FIELD_STRENGTH_THRESHOLD);
-        }
+        // Mountain View, CA, USA on 2022/1/1
+        assertMagneticField(37.386f, -122.083f, 32f, 2022, Calendar.JANUARY, 1,
+                13.0859f, 60.9203f, 47672.9f);
+        // Chengdu, China on 2022/8/8
+        assertMagneticField(30.658f, 103.935f, 500f, 2022, Calendar.AUGUST, 8,
+                -2.4528f, 48.3264f, 51119.6f);
+        // Sao Paulo, Brazil on 2023/12/25
+        assertMagneticField(-23.682f, -46.875f, 760f, 2023, Calendar.DECEMBER, 25,
+                -21.7186f, -40.0321f, 22830.8f);
+        // Boston, MA, USA on 2024/2/10
+        assertMagneticField(42.313f, -71.127f, 43f, 2024, Calendar.FEBRUARY, 10,
+                -14.0899f, 66.3987f, 51413.4f);
+        // Cape Town, South Africa on 2024/5/1
+        assertMagneticField(-33.913f, 18.095f, 100f, 2024, Calendar.MAY, 1,
+                -25.7008f, -65.1060f, 25053.5f);
+        // Sydney, Australia on 2024/12/31
+        assertMagneticField(-33.847f, 150.791f, 19f, 2024, Calendar.DECEMBER, 31,
+                12.6845f, -64.4769f, 57114.9f);
     }
 
-    private class TestDataPoint {
-        public final float latitude;
-        public final float longitude;
-        public final float altitude;
-        public final long epochTimeMillis;
-        public final float declinationDegree;
-        public final float inclinationDegree;
-        public final float fieldStrengthNanoTesla;
+    private void assertMagneticField(float lat, float lon, float altitude, int year, int month,
+                                     int day, float dec, float inc, float strength) {
+        long time = new Calendar.Builder()
+                .setDate(year, month, day)
+                .setTimeZone(TimeZone.getTimeZone("UTC"))
+                .build()
+                .getTimeInMillis();
 
-        TestDataPoint(float lat, float lng, float alt, int year, int month, int day,
-                float dec, float inc, float strength) {
-            latitude = lat;
-            longitude = lng;
-            altitude = alt;
-            epochTimeMillis = new GregorianCalendar(year, month, day).getTimeInMillis();
-            declinationDegree = dec;
-            inclinationDegree = inc;
-            fieldStrengthNanoTesla = strength;
-        }
+        GeomagneticField field = new GeomagneticField(lat, lon, altitude, time);
+        assertEquals(dec, field.getDeclination(), DECLINATION_THRESHOLD);
+        assertEquals(inc, field.getInclination(), INCLINATION_THRESHOLD);
+        assertEquals(strength, field.getFieldStrength(), FIELD_STRENGTH_THRESHOLD);
+        float horizontalFieldStrengthNanoTesla = (float) (
+                Math.cos(Math.toRadians(inc)) * strength);
+        assertEquals(horizontalFieldStrengthNanoTesla, field.getHorizontalStrength(),
+                FIELD_STRENGTH_THRESHOLD);
+        float verticalFieldStrengthNanoTesla = (float) (Math.sin(Math.toRadians(inc)) * strength);
+        assertEquals(verticalFieldStrengthNanoTesla, field.getZ(), FIELD_STRENGTH_THRESHOLD);
+        float declinationDegree = (float) (
+                Math.toDegrees(Math.atan2(field.getY(), field.getX())));
+        assertEquals(dec, declinationDegree, DECLINATION_THRESHOLD);
+        assertEquals(horizontalFieldStrengthNanoTesla,
+                Math.sqrt(field.getX() * field.getX() + field.getY() * field.getY()),
+                FIELD_STRENGTH_THRESHOLD);
     }
 }
diff --git a/tests/tests/icu/Android.bp b/tests/tests/icu/Android.bp
index e654a0c..df1f6d0 100644
--- a/tests/tests/icu/Android.bp
+++ b/tests/tests/icu/Android.bp
@@ -15,6 +15,8 @@
 android_test {
     name: "CtsIcuTestCases",
     defaults: ["cts_support_defaults"],
+    test_config: "CtsIcuTestCases.xml",
+    manifest: "AndroidManifest.xml",
     java_resource_dirs: ["resources"],
     static_libs: [
         "cts-core-test-runner-axt",
@@ -23,9 +25,24 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
-	"mts",
+        "mts",
     ],
     platform_apis: true,
 }
+
+java_test_host {
+    name: "CtsIcu4cTestCases",
+    defaults: ["cts_support_defaults"],
+    test_config: "CtsIcu4cTestCases.xml",
+    data: [
+        ":cintltst",
+        ":intltest",
+        ":icu4c_test_data",
+        ":ICU4CTestRunner",
+    ],
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+}
diff --git a/tests/tests/icu/CtsIcu4cTestCases.xml b/tests/tests/icu/CtsIcu4cTestCases.xml
new file mode 100644
index 0000000..acef467
--- /dev/null
+++ b/tests/tests/icu/CtsIcu4cTestCases.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 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.
+-->
+<configuration description="Config for CTS ICU4C test cases">
+    <option name="test-suite-tag" value="cts" />
+    <option name="config-descriptor:metadata" key="component" value="libcore" />
+    <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
+    <!-- Test single abi only due to a limitation in Soong http://b/141637587#comment28. -->
+    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
+    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.FilePusher">
+        <option name="cleanup" value="true" />
+        <option name="push" value="icu.cintltst->/data/local/tmp/cintltst" />
+        <option name="post-push" value="chmod a+x /data/local/tmp/cintltst" />
+    </target_preparer>
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.FilePusher">
+        <option name="cleanup" value="true" />
+        <option name="push" value="icu.intltest->/data/local/tmp/intltest" />
+        <option name="post-push" value="chmod a+x /data/local/tmp/intltest" />
+    </target_preparer>
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.FilePusher">
+        <option name="cleanup" value="true" />
+        <option name="push" value="icu4c_test_data.zip->/data/local/tmp/icu4c_test_data.zip" />
+    </target_preparer>
+    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
+        <option name="run-command" value="mkdir -p /data/local/tmp/test/testdata &amp;&amp; unzip -o -d /data/local/tmp/test/testdata /data/local/tmp/icu4c_test_data.zip" />
+        <option name="teardown-command" value="rm -r /data/local/tmp/test/testdata" />
+    </target_preparer>
+
+    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+        <option name="cleanup-apks" value="true" />
+        <option name="test-file-name" value="CtsIcu4cTestApp.apk" />
+    </target_preparer>
+
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+        <option name="package" value="android.icu4c.cts" />
+        <option name="runtime-hint" value="5s" />
+    </test>
+    <test class="com.android.tradefed.testtype.HostTest" >
+        <option name="jar" value="ICU4CTestRunner.jar" />
+        <option name="set-option" value="module-name:cintltst" />
+        <option name="set-option" value="runtime-hint:20s" />
+        <option name="set-option" value="no-fail-data-errors:true" />
+        <option name="set-option" value="native-test-timeout:300000" />
+        <option name="set-option" value="command-filter-prefix:/" />
+        <!-- Sample include-filter to run a subset of tests in putiltst-->
+        <!-- <option name="set-option" value="include-filter:cintltst.putiltst" /> -->
+    </test>
+
+    <test class="com.android.tradefed.testtype.HostTest" >
+        <option name="jar" value="ICU4CTestRunner.jar" />
+        <option name="set-option" value="module-name:intltest" />
+        <option name="set-option" value="runtime-hint:1m30s" />
+        <option name="set-option" value="no-fail-data-errors:true" />
+        <!-- test-timeout unit is ms, value = 10 minutes -->
+        <option name="set-option" value="native-test-timeout:600000" />
+        <!-- Sample include-filter to run a subset of tests in utility-->
+        <!-- <option name="set-option" value="include-filter:intltest.utility" /> -->
+    </test>
+</configuration>
+
diff --git a/tests/tests/icu/AndroidTest.xml b/tests/tests/icu/CtsIcuTestCases.xml
similarity index 100%
rename from tests/tests/icu/AndroidTest.xml
rename to tests/tests/icu/CtsIcuTestCases.xml
diff --git a/tests/tests/icu/icu4c_testapp/Android.bp b/tests/tests/icu/icu4c_testapp/Android.bp
new file mode 100644
index 0000000..e0a8825
--- /dev/null
+++ b/tests/tests/icu/icu4c_testapp/Android.bp
@@ -0,0 +1,52 @@
+// Copyright (C) 2020 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.
+
+android_test_helper_app {
+    name: "CtsIcu4cTestApp",
+    defaults: ["cts_defaults"],
+    jni_libs: ["libicutest"],
+    sdk_version: "test_current",
+    compile_multilib: "both",
+    srcs: ["src/**/*.java"],
+    static_libs: [
+        "compatibility-device-util-axt",
+        "ctstestrunner-axt",
+        "nativetesthelper",
+    ],
+    libs: [
+        "android.test.runner.stubs",
+        "android.test.base.stubs",
+    ],
+    // Tag this module as a cts test artifact
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+}
+
+// intermediate library to avoid dependency on libnativetesthelper_jni from libicutest_static.
+cc_library_shared {
+    name: "libicutest",
+    sdk_version: "current",
+    stl: "c++_static",
+    whole_static_libs: [
+        "libicutest_static",
+        "libnativetesthelper_jni"
+    ],
+    shared_libs: [
+        "libicu",
+        "liblog",
+    ],
+    installable: false,
+}
diff --git a/tests/tests/icu/icu4c_testapp/AndroidManifest.xml b/tests/tests/icu/icu4c_testapp/AndroidManifest.xml
new file mode 100644
index 0000000..8195600
--- /dev/null
+++ b/tests/tests/icu/icu4c_testapp/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.icu4c.cts">
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
+                     android:targetPackage="android.icu4c.cts"
+                     android:label="CTS tests for ICU4C">
+        <meta-data android:name="listener"
+                   android:value="com.android.cts.runner.CtsTestRunListener" />
+    </instrumentation>
+</manifest>
\ No newline at end of file
diff --git a/tests/tests/icu/icu4c_testapp/src/android/icu4c/cts/Icu4cGTests.java b/tests/tests/icu/icu4c_testapp/src/android/icu4c/cts/Icu4cGTests.java
new file mode 100644
index 0000000..e55fe00
--- /dev/null
+++ b/tests/tests/icu/icu4c_testapp/src/android/icu4c/cts/Icu4cGTests.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2020 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.icu4c.cts;
+
+import com.android.gtestrunner.GtestRunner;
+import com.android.gtestrunner.TargetLibrary;
+
+import org.junit.runner.RunWith;
+
+@RunWith(GtestRunner.class)
+@TargetLibrary("icutest")
+public class Icu4cGTests {}
diff --git a/tests/tests/identity/Android.bp b/tests/tests/identity/Android.bp
index 2f5eb91..203f578 100644
--- a/tests/tests/identity/Android.bp
+++ b/tests/tests/identity/Android.bp
@@ -18,12 +18,11 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     static_libs: [
         "androidx.test.rules",
diff --git a/tests/tests/identity/OWNERS b/tests/tests/identity/OWNERS
index f076300..71af31d 100644
--- a/tests/tests/identity/OWNERS
+++ b/tests/tests/identity/OWNERS
@@ -1,3 +1,3 @@
-# Bug component: 111446262
+# Bug component: 609621
 swillden@google.com
 zeuthen@google.com
diff --git a/tests/tests/instantapp/Android.bp b/tests/tests/instantapp/Android.bp
index 9109578..62bc24f 100644
--- a/tests/tests/instantapp/Android.bp
+++ b/tests/tests/instantapp/Android.bp
@@ -30,8 +30,8 @@
     ],
     test_suites: [
         "cts",
+        "general-tests",
         "vts",
-        "vts10",
         "device-tests",
     ],
 }
diff --git a/tests/tests/jni/Android.bp b/tests/tests/jni/Android.bp
index 74e5426..5895cf3 100644
--- a/tests/tests/jni/Android.bp
+++ b/tests/tests/jni/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: [
@@ -50,6 +49,7 @@
         "-Wall",
         "-Werror",
     ],
+    header_libs: ["jni_headers"],
     local_include_dirs: ["libjnicommon"],
     host_ldlibs: ["-llog"],
     shared_libs: [
@@ -67,6 +67,7 @@
         "-Wall",
         "-Werror",
     ],
+    header_libs: ["jni_headers"],
     local_include_dirs: ["libjnicommon"],
     host_ldlibs: ["-llog"],
     shared_libs: [
@@ -84,6 +85,7 @@
         "-Wall",
         "-Werror",
     ],
+    header_libs: ["jni_headers"],
     local_include_dirs: ["libjnicommon"],
     host_ldlibs: ["-llog"],
     shared_libs: [
diff --git a/tests/tests/jni/libjnitest/android_jni_cts_LinkerNamespacesTest.cpp b/tests/tests/jni/libjnitest/android_jni_cts_LinkerNamespacesTest.cpp
index 208b43b..2bd24b4 100644
--- a/tests/tests/jni/libjnitest/android_jni_cts_LinkerNamespacesTest.cpp
+++ b/tests/tests/jni/libjnitest/android_jni_cts_LinkerNamespacesTest.cpp
@@ -55,7 +55,7 @@
 static const std::vector<std::regex> kSystemPathRegexes = {
     std::regex("/system/lib(64)?"),
     std::regex("/apex/com\\.android\\.[^/]*/lib(64)?"),
-    std::regex("/system/lib/arm(64)?"), // when CTS runs in ARM ABI on non-ARM CPU. http://b/149852946
+    std::regex("/system/(lib/arm|lib64/arm64)"), // when CTS runs in ARM ABI on non-ARM CPU. http://b/149852946
 };
 
 static const std::string kWebViewPlatSupportLib = "libwebviewchromium_plat_support.so";
@@ -406,8 +406,6 @@
   // Check the runtime libraries.
   if (!check_path(env, clazz, kArtApexLibraryPath, {kArtApexLibraryPath},
                   runtime_public_libraries,
-                  // System.loadLibrary("icuuc") would fail since a copy exists in /system.
-                  // TODO(b/124218500): Change to true when the bug is resolved.
                   /*test_system_load_library=*/true,
                   check_absence, &errors)) {
     success = false;
diff --git a/tests/tests/jni/src/android/jni/cts/LinkerNamespacesHelper.java b/tests/tests/jni/src/android/jni/cts/LinkerNamespacesHelper.java
index 14fc592..6cd2441 100644
--- a/tests/tests/jni/src/android/jni/cts/LinkerNamespacesHelper.java
+++ b/tests/tests/jni/src/android/jni/cts/LinkerNamespacesHelper.java
@@ -82,6 +82,7 @@
     private final static String[] PUBLIC_ART_LIBRARIES = {
         "libicui18n.so",
         "libicuuc.so",
+        "libnativehelper.so"
     };
 
     // The grey-list.
@@ -93,7 +94,6 @@
         "libexpat.so",
         "libgui.so",
         "libmedia.so",
-        "libnativehelper.so",
         "libskia.so",
         "libssl.so",
         "libstagefright.so",
@@ -188,7 +188,7 @@
 
         Collections.addAll(systemLibs, PUBLIC_SYSTEM_LIBRARIES);
         Collections.addAll(systemLibs, OPTIONAL_SYSTEM_LIBRARIES);
-	// System path could contain public ART libraries on foreign arch. http://b/149852946
+        // System path could contain public ART libraries on foreign arch. http://b/149852946
         if (isForeignArchitecture()) {
             Collections.addAll(systemLibs, PUBLIC_ART_LIBRARIES);
         }
diff --git a/tests/tests/jvmti/attaching/Android.bp b/tests/tests/jvmti/attaching/Android.bp
index 54761ad..eb7f31f 100644
--- a/tests/tests/jvmti/attaching/Android.bp
+++ b/tests/tests/jvmti/attaching/Android.bp
@@ -17,7 +17,6 @@
     defaults: ["cts_defaults"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: [
diff --git a/tests/tests/jvmti/attaching/jni/Android.bp b/tests/tests/jvmti/attaching/jni/Android.bp
index 8e26f86..5e84b2c 100644
--- a/tests/tests/jvmti/attaching/jni/Android.bp
+++ b/tests/tests/jvmti/attaching/jni/Android.bp
@@ -27,6 +27,7 @@
         "-Wno-unused-parameter",
         "-DAGENT_NR=1",
     ],
+    header_libs: ["jni_headers"],
 }
 
 cc_test_library {
@@ -40,6 +41,7 @@
         "-Wno-unused-parameter",
         "-DAGENT_NR=2",
     ],
+    header_libs: ["jni_headers"],
 }
 
 cc_test_library {
@@ -53,6 +55,7 @@
         "-Wno-unused-parameter",
         "-DAGENT_NR=3",
     ],
+    header_libs: ["jni_headers"],
 }
 
 cc_test_library {
@@ -66,4 +69,5 @@
         "-Wno-unused-parameter",
         "-DAGENT_NR=4",
     ],
+    header_libs: ["jni_headers"],
 }
diff --git a/tests/tests/keystore/Android.bp b/tests/tests/keystore/Android.bp
index a8d2587..0fa7cf7 100644
--- a/tests/tests/keystore/Android.bp
+++ b/tests/tests/keystore/Android.bp
@@ -35,13 +35,12 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
         "bouncycastle-unbundled",
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     static_libs: [
         "androidx.test.rules",
diff --git a/tests/tests/keystore/TEST_MAPPING b/tests/tests/keystore/TEST_MAPPING
new file mode 100644
index 0000000..0511967
--- /dev/null
+++ b/tests/tests/keystore/TEST_MAPPING
@@ -0,0 +1,74 @@
+{
+  "presubmit": [
+    {
+      "name": "CtsKeystoreTestCases",
+      "options": [
+        {
+          "include-annotation": "android.platform.test.annotations.RequiresDevice"
+        },
+        {
+          "exclude-filter": "android.keystore.cts.SignatureTest"
+        },
+        {
+          "exclude-filter": "android.keystore.cts.RsaSignaturePerformanceTest"
+        },
+        {
+          "exclude-filter": "android.keystore.cts.RsaKeyGenPerformanceTest"
+        },
+        {
+          "exclude-filter": "android.keystore.cts.RsaCipherPerformanceTest"
+        },
+        {
+          "exclude-filter": "android.keystore.cts.MacTest#testLargeMsgKat"
+        },
+        {
+          "exclude-filter": "android.keystore.cts.KeyPairGeneratorTest"
+        },
+        {
+          "exclude-filter": "android.keystore.cts.KeyGeneratorTest#testHmacKeySupportedSizes"
+        },
+        {
+          "exclude-filter": "android.keystore.cts.HmacMacPerformanceTest"
+        },
+        {
+          "exclude-filter": "android.keystore.cts.EcdsaSignaturePerformanceTest"
+        },
+        {
+          "exclude-filter": "android.keystore.cts.EcKeyGenPerformanceTest"
+        },
+        {
+          "exclude-filter": "android.keystore.cts.DesCipherPerformanceTest"
+        },
+        {
+          "exclude-filter": "android.keystore.cts.CipherTest"
+        },
+        {
+          "exclude-filter": "android.keystore.cts.AttestationPerformanceTest"
+        },
+        {
+          "exclude-filter": "android.keystore.cts.AndroidKeyStoreTest"
+        },
+        {
+          "exclude-filter": "android.keystore.cts.AesCipherPerformanceTest"
+        },
+        {
+          "exclude-filter": "android.keystore.cts.AESCipherNistCavpKatTest"
+        },
+        {
+          "exclude-filter": "android.keystore.cts.DESedeECBPKCS7PaddingCipherTest"
+        },
+        {
+          "exclude-filter": "android.keystore.cts.DESedeECBNoPaddingCipherTest"
+        },
+        {
+          "exclude-filter": "android.keystore.cts.DESedeECBPKCS7PaddingCipherTest"
+        }
+      ]
+    }
+  ],
+  "postsubmit": [
+    {
+      "name": "CtsKeystoreTestCases"
+    }
+  ]
+}
diff --git a/tests/tests/keystore/src/android/keystore/cts/KeyAttestationTest.java b/tests/tests/keystore/src/android/keystore/cts/KeyAttestationTest.java
index 4c330e0..194b6f6 100644
--- a/tests/tests/keystore/src/android/keystore/cts/KeyAttestationTest.java
+++ b/tests/tests/keystore/src/android/keystore/cts/KeyAttestationTest.java
@@ -51,6 +51,7 @@
 import static org.hamcrest.Matchers.either;
 import static org.hamcrest.Matchers.empty;
 import static org.hamcrest.Matchers.greaterThanOrEqualTo;
+import static org.hamcrest.Matchers.lessThanOrEqualTo;
 import static org.hamcrest.Matchers.hasItems;
 
 import android.content.pm.PackageManager.NameNotFoundException;
@@ -73,6 +74,7 @@
 import org.bouncycastle.asn1.x500.X500Name;
 import org.bouncycastle.cert.jcajce.JcaX509CertificateHolder;
 
+import java.io.File;
 import java.lang.Math;
 import java.security.GeneralSecurityException;
 import java.security.InvalidAlgorithmParameterException;
@@ -165,21 +167,26 @@
         int[] purposes = {
                 KM_PURPOSE_SIGN, KM_PURPOSE_VERIFY, KM_PURPOSE_SIGN | KM_PURPOSE_VERIFY
         };
+        boolean[] devicePropertiesAttestationValues = {true, false};
+        boolean[] includeValidityDatesValues = {true, false};
 
         for (int curveIndex = 0; curveIndex < curves.length; ++curveIndex) {
             for (int challengeIndex = 0; challengeIndex < challenges.length; ++challengeIndex) {
                 for (int purposeIndex = 0; purposeIndex < purposes.length; ++purposeIndex) {
-                    try {
-                        testEcAttestation(challenges[challengeIndex],
-                                true /* includeValidityDates */,
-                                curves[curveIndex], keySizes[curveIndex], purposes[purposeIndex]);
-                        testEcAttestation(challenges[challengeIndex],
-                                false /* includeValidityDates */,
-                                curves[curveIndex], keySizes[curveIndex], purposes[purposeIndex]);
-                    } catch (Throwable e) {
-                        throw new Exception(
-                                "Failed on curve " + curveIndex + " and challege " + challengeIndex,
-                                e);
+                    for (boolean includeValidityDates : includeValidityDatesValues) {
+                        for (boolean devicePropertiesAttestation : devicePropertiesAttestationValues) {
+                            try {
+                                testEcAttestation(challenges[challengeIndex], includeValidityDates,
+                                        curves[curveIndex], keySizes[curveIndex],
+                                        purposes[purposeIndex], devicePropertiesAttestation);
+                            } catch (Throwable e) {
+                                throw new Exception("Failed on curve " + curveIndex +
+                                        " challenge " + challengeIndex + " purpose " +
+                                        purposeIndex + " includeValidityDates " +
+                                        includeValidityDates + " and devicePropertiesAttestation " +
+                                        devicePropertiesAttestation, e);
+                            }
+                        }
                     }
                 }
             }
@@ -187,43 +194,50 @@
     }
 
     public void testEcAttestation_TooLargeChallenge() throws Exception {
-        try {
-            testEcAttestation(new byte[129], true /* includeValidityDates */, "secp256r1", 256,
-                    KM_PURPOSE_SIGN);
-            fail("Attestation challenges larger than 128 bytes should be rejected");
-        } catch (ProviderException e) {
-            KeyStoreException cause = (KeyStoreException) e.getCause();
-            assertEquals(KM_ERROR_INVALID_INPUT_LENGTH, cause.getErrorCode());
+        boolean[] devicePropertiesAttestationValues = {true, false};
+        for (boolean devicePropertiesAttestation : devicePropertiesAttestationValues) {
+            try {
+                testEcAttestation(new byte[129], true /* includeValidityDates */, "secp256r1", 256,
+                        KM_PURPOSE_SIGN, devicePropertiesAttestation);
+                fail("Attestation challenges larger than 128 bytes should be rejected");
+            } catch (ProviderException e) {
+                KeyStoreException cause = (KeyStoreException) e.getCause();
+                assertEquals(KM_ERROR_INVALID_INPUT_LENGTH, cause.getErrorCode());
+            }
         }
     }
 
     public void testEcAttestation_NoChallenge() throws Exception {
-        String keystoreAlias = "test_key";
-        Date now = new Date();
-        Date originationEnd = new Date(now.getTime() + ORIGINATION_TIME_OFFSET);
-        Date consumptionEnd = new Date(now.getTime() + CONSUMPTION_TIME_OFFSET);
-        KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(keystoreAlias, PURPOSE_SIGN)
-                .setAlgorithmParameterSpec(new ECGenParameterSpec("secp256r1"))
-                .setDigests(DIGEST_NONE, DIGEST_SHA256, DIGEST_SHA512)
-                .setAttestationChallenge(null)
-                .setKeyValidityStart(now)
-                .setKeyValidityForOriginationEnd(originationEnd)
-                .setKeyValidityForConsumptionEnd(consumptionEnd)
-                .build();
+        boolean[] devicePropertiesAttestationValues = {true, false};
+        for (boolean devicePropertiesAttestation : devicePropertiesAttestationValues) {
+            String keystoreAlias = "test_key";
+            Date now = new Date();
+            Date originationEnd = new Date(now.getTime() + ORIGINATION_TIME_OFFSET);
+            Date consumptionEnd = new Date(now.getTime() + CONSUMPTION_TIME_OFFSET);
+            KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(keystoreAlias, PURPOSE_SIGN)
+                    .setAlgorithmParameterSpec(new ECGenParameterSpec("secp256r1"))
+                    .setDigests(DIGEST_NONE, DIGEST_SHA256, DIGEST_SHA512)
+                    .setAttestationChallenge(null)
+                    .setKeyValidityStart(now)
+                    .setKeyValidityForOriginationEnd(originationEnd)
+                    .setKeyValidityForConsumptionEnd(consumptionEnd)
+                    .setDevicePropertiesAttestationIncluded(devicePropertiesAttestation)
+                    .build();
 
-        generateKeyPair(KEY_ALGORITHM_EC, spec);
+            generateKeyPair(KEY_ALGORITHM_EC, spec);
 
-        KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
-        keyStore.load(null);
+            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
+            keyStore.load(null);
 
-        try {
-            Certificate certificates[] = keyStore.getCertificateChain(keystoreAlias);
-            assertEquals(1, certificates.length);
+            try {
+                Certificate certificates[] = keyStore.getCertificateChain(keystoreAlias);
+                assertEquals(1, certificates.length);
 
-            X509Certificate attestationCert = (X509Certificate) certificates[0];
-            assertNull(attestationCert.getExtensionValue(Attestation.KEY_DESCRIPTION_OID));
-        } finally {
-            keyStore.deleteEntry(keystoreAlias);
+                X509Certificate attestationCert = (X509Certificate) certificates[0];
+                assertNull(attestationCert.getExtensionValue(Attestation.KEY_DESCRIPTION_OID));
+            } finally {
+                keyStore.deleteEntry(keystoreAlias);
+            }
         }
     }
 
@@ -328,14 +342,19 @@
                         SIGNATURE_PADDING_RSA_PSS,
                 },
         };
+        boolean[] devicePropertiesAttestationValues = {true, false};
 
-        for (int keySize : keySizes) {
-            for (byte[] challenge : challenges) {
-                for (int purpose : purposes) {
-                    if (isEncryptionPurpose(purpose)) {
-                        testRsaAttestations(keySize, challenge, purpose, encryptionPaddingModes);
-                    } else {
-                        testRsaAttestations(keySize, challenge, purpose, signaturePaddingModes);
+        for (boolean devicePropertiesAttestation : devicePropertiesAttestationValues) {
+            for (int keySize : keySizes) {
+                for (byte[] challenge : challenges) {
+                    for (int purpose : purposes) {
+                        if (isEncryptionPurpose(purpose)) {
+                            testRsaAttestations(keySize, challenge, purpose, encryptionPaddingModes,
+                                    devicePropertiesAttestation);
+                        } else {
+                            testRsaAttestations(keySize, challenge, purpose, signaturePaddingModes,
+                                    devicePropertiesAttestation);
+                        }
                     }
                 }
             }
@@ -343,42 +362,51 @@
     }
 
     public void testRsaAttestation_TooLargeChallenge() throws Exception {
-        try {
-            testRsaAttestation(new byte[129], true /* includeValidityDates */, 512, PURPOSE_SIGN,
-                    null /* paddingModes; may be empty because we'll never test them */);
-            fail("Attestation challenges larger than 128 bytes should be rejected");
-        } catch (ProviderException e) {
-            KeyStoreException cause = (KeyStoreException) e.getCause();
-            assertEquals(KM_ERROR_INVALID_INPUT_LENGTH, cause.getErrorCode());
+        boolean[] devicePropertiesAttestationValues = {true, false};
+        for (boolean devicePropertiesAttestation : devicePropertiesAttestationValues) {
+            try {
+                testRsaAttestation(new byte[129], true /* includeValidityDates */, 512,
+                        PURPOSE_SIGN,
+                        null /* paddingModes; may be empty because we'll never test them */,
+                        devicePropertiesAttestation);
+                fail("Attestation challenges larger than 128 bytes should be rejected");
+            } catch(ProviderException e){
+                KeyStoreException cause = (KeyStoreException) e.getCause();
+                assertEquals(KM_ERROR_INVALID_INPUT_LENGTH, cause.getErrorCode());
+            }
         }
     }
 
     public void testRsaAttestation_NoChallenge() throws Exception {
-        String keystoreAlias = "test_key";
-        Date now = new Date();
-        Date originationEnd = new Date(now.getTime() + ORIGINATION_TIME_OFFSET);
-        Date consumptionEnd = new Date(now.getTime() + CONSUMPTION_TIME_OFFSET);
-        KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(keystoreAlias, PURPOSE_SIGN)
-                .setDigests(DIGEST_NONE, DIGEST_SHA256, DIGEST_SHA512)
-                .setAttestationChallenge(null)
-                .setKeyValidityStart(now)
-                .setKeyValidityForOriginationEnd(originationEnd)
-                .setKeyValidityForConsumptionEnd(consumptionEnd)
-                .build();
+        boolean[] devicePropertiesAttestationValues = {true, false};
+        for (boolean devicePropertiesAttestation : devicePropertiesAttestationValues) {
+            String keystoreAlias = "test_key";
+            Date now = new Date();
+            Date originationEnd = new Date(now.getTime() + ORIGINATION_TIME_OFFSET);
+            Date consumptionEnd = new Date(now.getTime() + CONSUMPTION_TIME_OFFSET);
+            KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(keystoreAlias, PURPOSE_SIGN)
+                    .setDigests(DIGEST_NONE, DIGEST_SHA256, DIGEST_SHA512)
+                    .setAttestationChallenge(null)
+                    .setKeyValidityStart(now)
+                    .setKeyValidityForOriginationEnd(originationEnd)
+                    .setKeyValidityForConsumptionEnd(consumptionEnd)
+                    .setDevicePropertiesAttestationIncluded(devicePropertiesAttestation)
+                    .build();
 
-        generateKeyPair(KEY_ALGORITHM_RSA, spec);
+            generateKeyPair(KEY_ALGORITHM_RSA, spec);
 
-        KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
-        keyStore.load(null);
+            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
+            keyStore.load(null);
 
-        try {
-            Certificate certificates[] = keyStore.getCertificateChain(keystoreAlias);
-            assertEquals(1, certificates.length);
+            try {
+                Certificate certificates[] = keyStore.getCertificateChain(keystoreAlias);
+                assertEquals(1, certificates.length);
 
-            X509Certificate attestationCert = (X509Certificate) certificates[0];
-            assertNull(attestationCert.getExtensionValue(Attestation.KEY_DESCRIPTION_OID));
-        } finally {
-            keyStore.deleteEntry(keystoreAlias);
+                X509Certificate attestationCert = (X509Certificate) certificates[0];
+                assertNull(attestationCert.getExtensionValue(Attestation.KEY_DESCRIPTION_OID));
+            } finally {
+                keyStore.deleteEntry(keystoreAlias);
+            }
         }
     }
 
@@ -421,52 +449,62 @@
     }
 
     public void testAesAttestation() throws Exception {
-        String keystoreAlias = "test_key";
-        KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(keystoreAlias, PURPOSE_ENCRYPT)
-                .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
-                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
-                .setAttestationChallenge(new byte[0])
-                .build();
-        generateKey(spec, KeyProperties.KEY_ALGORITHM_AES);
+        boolean[] devicePropertiesAttestationValues = {true, false};
+        for (boolean devicePropertiesAttestation : devicePropertiesAttestationValues) {
+            String keystoreAlias = "test_key";
+            KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(keystoreAlias,
+                    PURPOSE_ENCRYPT)
+                    .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
+                    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
+                    .setAttestationChallenge(new byte[0])
+                    .setDevicePropertiesAttestationIncluded(devicePropertiesAttestation)
+                    .build();
+            generateKey(spec, KeyProperties.KEY_ALGORITHM_AES);
 
-        KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
-        keyStore.load(null);
-        try {
-            assertNull(keyStore.getCertificateChain(keystoreAlias));
-        } finally {
-            keyStore.deleteEntry(keystoreAlias);
+            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
+            keyStore.load(null);
+            try {
+                assertNull(keyStore.getCertificateChain(keystoreAlias));
+            } finally {
+                keyStore.deleteEntry(keystoreAlias);
+            }
         }
     }
 
     public void testHmacAttestation() throws Exception {
-        String keystoreAlias = "test_key";
-        KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(keystoreAlias, PURPOSE_SIGN)
-                .build();
+        boolean[] devicePropertiesAttestationValues = {true, false};
+        for (boolean devicePropertiesAttestation : devicePropertiesAttestationValues) {
+            String keystoreAlias = "test_key";
+            KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(keystoreAlias, PURPOSE_SIGN)
+                    .setDevicePropertiesAttestationIncluded(devicePropertiesAttestation)
+                    .build();
 
-        generateKey(spec, KeyProperties.KEY_ALGORITHM_HMAC_SHA256);
+            generateKey(spec, KeyProperties.KEY_ALGORITHM_HMAC_SHA256);
 
-        KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
-        keyStore.load(null);
-        try {
-            assertNull(keyStore.getCertificateChain(keystoreAlias));
-        } finally {
-            keyStore.deleteEntry(keystoreAlias);
+            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
+            keyStore.load(null);
+            try {
+                assertNull(keyStore.getCertificateChain(keystoreAlias));
+            } finally {
+                keyStore.deleteEntry(keystoreAlias);
+            }
         }
     }
 
     private void testRsaAttestations(int keySize, byte[] challenge, int purpose,
-            String[][] paddingModes) throws Exception {
+            String[][] paddingModes, boolean devicePropertiesAttestation) throws Exception {
         for (String[] paddings : paddingModes) {
             try {
                 testRsaAttestation(challenge, true /* includeValidityDates */, keySize, purpose,
-                        paddings);
+                        paddings, devicePropertiesAttestation);
                 testRsaAttestation(challenge, false /* includeValidityDates */, keySize, purpose,
-                        paddings);
+                        paddings, devicePropertiesAttestation);
             } catch (Throwable e) {
                 throw new Exception("Failed on key size " + keySize + " challenge [" +
                         new String(challenge) + "], purposes " +
-                        buildPurposeSet(purpose) + " and paddings " +
-                        ImmutableSet.copyOf(paddings),
+                        buildPurposeSet(purpose) + " paddings " +
+                        ImmutableSet.copyOf(paddings) + " and devicePropertiesAttestation "
+                        + devicePropertiesAttestation,
                         e);
             }
         }
@@ -480,9 +518,14 @@
 
     @SuppressWarnings("deprecation")
     private void testRsaAttestation(byte[] challenge, boolean includeValidityDates, int keySize,
-            int purposes, String[] paddingModes) throws Exception {
-        String keystoreAlias = "test_key";
+            int purposes, String[] paddingModes, boolean devicePropertiesAttestation)
+            throws Exception {
+        Log.i(TAG, "RSA key attestation with: challenge " + Arrays.toString(challenge) +
+                " / includeValidityDates " + includeValidityDates + " / keySize " + keySize +
+                " / purposes " + purposes + " / paddingModes " + Arrays.toString(paddingModes) +
+                " / devicePropertiesAttestation " + devicePropertiesAttestation);
 
+        String keystoreAlias = "test_key";
         Date startTime = new Date();
         Date originationEnd = new Date(startTime.getTime() + ORIGINATION_TIME_OFFSET);
         Date consumptionEnd = new Date(startTime.getTime() + CONSUMPTION_TIME_OFFSET);
@@ -490,7 +533,8 @@
             new KeyGenParameterSpec.Builder(keystoreAlias, purposes)
                         .setKeySize(keySize)
                         .setDigests(DIGEST_NONE, DIGEST_SHA256, DIGEST_SHA512)
-                        .setAttestationChallenge(challenge);
+                        .setAttestationChallenge(challenge)
+                        .setDevicePropertiesAttestationIncluded(devicePropertiesAttestation);
 
         if (includeValidityDates) {
             builder.setKeyValidityStart(startTime)
@@ -521,7 +565,7 @@
             checkRsaKeyDetails(attestation, keySize, purposes, ImmutableSet.copyOf(paddingModes));
             checkKeyUsage(attestationCert, purposes);
             checkKeyIndependentAttestationInfo(challenge, purposes, startTime, includeValidityDates,
-                    attestation);
+                    devicePropertiesAttestation, attestation);
         } finally {
             keyStore.deleteEntry(keystoreAlias);
         }
@@ -542,9 +586,13 @@
 
     @SuppressWarnings("deprecation")
     private void testEcAttestation(byte[] challenge, boolean includeValidityDates, String ecCurve,
-            int keySize, int purposes) throws Exception {
-        String keystoreAlias = "test_key";
+            int keySize, int purposes, boolean devicePropertiesAttestation) throws Exception {
+        Log.i(TAG, "EC key attestation with: challenge " + Arrays.toString(challenge) +
+                " / includeValidityDates " + includeValidityDates + " / ecCurve " + ecCurve +
+                " / keySize " + keySize + " / purposes " + purposes +
+                " / devicePropertiesAttestation " + devicePropertiesAttestation);
 
+        String keystoreAlias = "test_key";
         Date startTime = new Date();
         Date originationEnd = new Date(startTime.getTime() + ORIGINATION_TIME_OFFSET);
         Date consumptionEnd = new Date(startTime.getTime() + CONSUMPTION_TIME_OFFSET);
@@ -552,7 +600,8 @@
                 purposes)
                         .setAlgorithmParameterSpec(new ECGenParameterSpec(ecCurve))
                         .setDigests(DIGEST_NONE, DIGEST_SHA256, DIGEST_SHA512)
-                        .setAttestationChallenge(challenge);
+                        .setAttestationChallenge(challenge)
+                        .setDevicePropertiesAttestationIncluded(devicePropertiesAttestation);
 
         if (includeValidityDates) {
             builder.setKeyValidityStart(startTime)
@@ -575,7 +624,7 @@
             checkEcKeyDetails(attestation, ecCurve, keySize);
             checkKeyUsage(attestationCert, purposes);
             checkKeyIndependentAttestationInfo(challenge, purposes, startTime, includeValidityDates,
-                    attestation);
+                    devicePropertiesAttestation, attestation);
         } finally {
             keyStore.deleteEntry(keystoreAlias);
         }
@@ -600,9 +649,50 @@
         }
     }
 
+    private void checkAttestationDeviceProperties(boolean devicePropertiesAttestation,
+            Attestation attestation) {
+        final AuthorizationList keyDetailsList;
+        final AuthorizationList nonKeyDetailsList;
+        if (attestation.getKeymasterSecurityLevel() == KM_SECURITY_LEVEL_TRUSTED_ENVIRONMENT) {
+            keyDetailsList = attestation.getTeeEnforced();
+            nonKeyDetailsList = attestation.getSoftwareEnforced();
+        } else {
+            keyDetailsList = attestation.getSoftwareEnforced();
+            nonKeyDetailsList = attestation.getTeeEnforced();
+        }
+
+        if (devicePropertiesAttestation) {
+            assertEquals(Build.BRAND, keyDetailsList.getBrand());
+            assertEquals(Build.DEVICE, keyDetailsList.getDevice());
+            assertEquals(Build.PRODUCT, keyDetailsList.getProduct());
+            assertEquals(Build.MANUFACTURER, keyDetailsList.getManufacturer());
+            assertEquals(Build.MODEL, keyDetailsList.getModel());
+        } else {
+            assertNull(keyDetailsList.getBrand());
+            assertNull(keyDetailsList.getDevice());
+            assertNull(keyDetailsList.getProduct());
+            assertNull(keyDetailsList.getManufacturer());
+            assertNull(keyDetailsList.getModel());
+        }
+        assertNull(nonKeyDetailsList.getBrand());
+        assertNull(nonKeyDetailsList.getDevice());
+        assertNull(nonKeyDetailsList.getProduct());
+        assertNull(nonKeyDetailsList.getManufacturer());
+        assertNull(nonKeyDetailsList.getModel());
+    }
+
+    private void checkAttestationNoUniqueIds(Attestation attestation) {
+        assertNull(attestation.getTeeEnforced().getImei());
+        assertNull(attestation.getTeeEnforced().getMeid());
+        assertNull(attestation.getTeeEnforced().getSerialNumber());
+        assertNull(attestation.getSoftwareEnforced().getImei());
+        assertNull(attestation.getSoftwareEnforced().getMeid());
+        assertNull(attestation.getSoftwareEnforced().getSerialNumber());
+    }
+
     private void checkKeyIndependentAttestationInfo(byte[] challenge, int purposes, Date startTime,
-            boolean includesValidityDates, Attestation attestation)
-            throws NoSuchAlgorithmException, NameNotFoundException {
+            boolean includesValidityDates, boolean devicePropertiesAttestation,
+            Attestation attestation) throws NoSuchAlgorithmException, NameNotFoundException {
         checkUnexpectedOids(attestation);
         checkAttestationSecurityLevelDependentParams(attestation);
         assertNotNull(attestation.getAttestationChallenge());
@@ -616,6 +706,8 @@
         checkFlags(attestation);
         checkOrigin(attestation);
         checkAttestationApplicationId(attestation);
+        checkAttestationDeviceProperties(devicePropertiesAttestation, attestation);
+        checkAttestationNoUniqueIds(attestation);
     }
 
     private void checkUnexpectedOids(Attestation attestation) {
@@ -811,6 +903,21 @@
         return expectedPurposes;
     }
 
+    private boolean isGsiImage() {
+        final File initGsiRc= new File("/system/system_ext/etc/init/init.gsi.rc");
+        return initGsiRc.exists();
+    }
+
+    private void checkSystemPatchLevel(int teeOsPatchLevel, int systemPatchLevel) {
+        if (isGsiImage()) {
+            // b/168663786: When using a GSI image, the system patch level might be
+            // greater than or equal to the OS patch level reported from TEE.
+            assertThat(teeOsPatchLevel, lessThanOrEqualTo(systemPatchLevel));
+        } else {
+            assertThat(teeOsPatchLevel, is(systemPatchLevel));
+        }
+    }
+
     @SuppressWarnings("unchecked")
     private void checkAttestationSecurityLevelDependentParams(Attestation attestation) {
         assertThat("Attestation version must be 1, 2, 3, or 4", attestation.getAttestationVersion(),
@@ -832,7 +939,7 @@
 
                 checkRootOfTrust(attestation, false /* requireLocked */);
                 assertThat(teeEnforced.getOsVersion(), is(systemOsVersion));
-                assertThat(teeEnforced.getOsPatchLevel(), is(systemPatchLevel));
+                checkSystemPatchLevel(teeEnforced.getOsPatchLevel(), systemPatchLevel);
                 break;
 
             case KM_SECURITY_LEVEL_SOFTWARE:
@@ -844,7 +951,7 @@
                     assertThat("Software KM is version 3", attestation.getKeymasterVersion(),
                             is(3));
                     assertThat(softwareEnforced.getOsVersion(), is(systemOsVersion));
-                    assertThat(softwareEnforced.getOsPatchLevel(), is(systemPatchLevel));
+                    checkSystemPatchLevel(teeEnforced.getOsPatchLevel(), systemPatchLevel);
                 }
 
                 assertNull("Software attestation cannot provide root of trust",
diff --git a/tests/tests/keystore/src/android/keystore/cts/KeyPairGeneratorTest.java b/tests/tests/keystore/src/android/keystore/cts/KeyPairGeneratorTest.java
index c6b559a..5eea70e 100644
--- a/tests/tests/keystore/src/android/keystore/cts/KeyPairGeneratorTest.java
+++ b/tests/tests/keystore/src/android/keystore/cts/KeyPairGeneratorTest.java
@@ -1815,7 +1815,7 @@
         @Override
         public String chooseEngineClientAlias(String[] keyType, Principal[] issuers,
             SSLEngine engine) {
-            return "fake";
+            throw new IllegalStateException();
         }
 
         @Override
@@ -1826,7 +1826,7 @@
         @Override
         public String chooseEngineServerAlias(String keyType, Principal[] issuers,
             SSLEngine engine) {
-            return "fake";
+            throw new IllegalStateException();
         }
 
         @Override
diff --git a/tests/tests/libcoreapievolution/Android.bp b/tests/tests/libcoreapievolution/Android.bp
index 1ce9133..8cecd94 100644
--- a/tests/tests/libcoreapievolution/Android.bp
+++ b/tests/tests/libcoreapievolution/Android.bp
@@ -19,13 +19,12 @@
         "ctstestrunner-axt",
         "junit",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: ["src/**/*.java"],
     sdk_version: "current",
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/libcorefileio/Android.bp b/tests/tests/libcorefileio/Android.bp
index ed8183d..e910c2f 100644
--- a/tests/tests/libcorefileio/Android.bp
+++ b/tests/tests/libcorefileio/Android.bp
@@ -19,13 +19,12 @@
         "ctstestrunner-axt",
         "junit",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: ["src/**/*.java"],
     sdk_version: "current",
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/libcorelegacy22/Android.bp b/tests/tests/libcorelegacy22/Android.bp
index f199af9..eb64d08 100644
--- a/tests/tests/libcorelegacy22/Android.bp
+++ b/tests/tests/libcorelegacy22/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/libnativehelper/Android.bp b/tests/tests/libnativehelper/Android.bp
new file mode 100644
index 0000000..ba75d50
--- /dev/null
+++ b/tests/tests/libnativehelper/Android.bp
@@ -0,0 +1,36 @@
+// Copyright (C) 2020 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.
+
+android_test {
+    name: "CtsLibnativehelperTestCases",
+    defaults: ["cts_defaults"],
+    compile_multilib: "both",
+    libs: [
+        "android.test.runner.stubs",
+        "android.test.base.stubs",
+    ],
+    static_libs: [
+        "compatibility-device-util-axt",
+        "ctstestrunner-axt",
+        "nativetesthelper",
+    ],
+    jni_libs: ["libnativehelper_test_jni"],
+    sdk_version: "test_current",
+    srcs: ["src/**/*.java"],
+    // Tag this module as a cts test artifact
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+}
diff --git a/tests/tests/libnativehelper/AndroidManifest.xml b/tests/tests/libnativehelper/AndroidManifest.xml
new file mode 100644
index 0000000..01f1c5e
--- /dev/null
+++ b/tests/tests/libnativehelper/AndroidManifest.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.libnativehelper.cts"
+    android:targetSandboxVersion="2">
+    <application android:usesCleartextTraffic="true">
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
+                     android:targetPackage="android.libnativehelper.cts"
+                     android:label="CTS tests of android.libnativehelper">
+        <meta-data android:name="listener"
+            android:value="com.android.cts.runner.CtsTestRunListener" />
+    </instrumentation>
+</manifest>
diff --git a/tests/tests/libnativehelper/AndroidTest.xml b/tests/tests/libnativehelper/AndroidTest.xml
new file mode 100644
index 0000000..796ff08
--- /dev/null
+++ b/tests/tests/libnativehelper/AndroidTest.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+<configuration description="Configuration for Libnativehelper Tests">
+    <option name="test-suite-tag" value="cts" />
+    <option name="config-descriptor:metadata" key="component" value="art" />
+    <option name="config-descriptor:metadata" key="parameter" value="multi_abi" />
+    <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
+    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
+    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+        <option name="cleanup-apks" value="true" />
+        <option name="test-file-name" value="CtsLibnativehelperTestCases.apk" />
+    </target_preparer>
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+        <option name="package" value="android.libnativehelper.cts" />
+        <option name="runtime-hint" value="5s" />
+    </test>
+</configuration>
diff --git a/tests/tests/libnativehelper/OWNERS b/tests/tests/libnativehelper/OWNERS
new file mode 100644
index 0000000..da3f4a8
--- /dev/null
+++ b/tests/tests/libnativehelper/OWNERS
@@ -0,0 +1,5 @@
+# Bug component: 86431
+enh@google.com
+mast@google.com
+ngeoffray@google.com
+oth@google.com
diff --git a/tests/tests/libnativehelper/README.md b/tests/tests/libnativehelper/README.md
new file mode 100644
index 0000000..bb0c5ed
--- /dev/null
+++ b/tests/tests/libnativehelper/README.md
@@ -0,0 +1,3 @@
+# libnativehelper NDK CTS tests
+
+These tests cover all of the FileDescriptor NDK API exported by libnativehelper.so.
diff --git a/tests/tests/libnativehelper/TEST_MAPPING b/tests/tests/libnativehelper/TEST_MAPPING
new file mode 100644
index 0000000..f7789dc
--- /dev/null
+++ b/tests/tests/libnativehelper/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+  "presubmit": [
+    {
+      "name": "CtsLibnativehelperTestCases"
+    }
+  ]
+}
diff --git a/tests/tests/libnativehelper/jni/Android.bp b/tests/tests/libnativehelper/jni/Android.bp
new file mode 100644
index 0000000..441a8d1
--- /dev/null
+++ b/tests/tests/libnativehelper/jni/Android.bp
@@ -0,0 +1,36 @@
+// Copyright (C) 2020 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.
+
+cc_library_shared {
+    name: "libnativehelper_test_jni",
+    cflags: [
+        "-Wall",
+        "-Werror",
+        "-Wno-unused-parameter",
+    ],
+    srcs: [
+        "file_descriptor_ndk_test.cpp",
+        "jni_invocation_api_ndk_test.cpp",
+        "libnativehelper_test.cpp",
+    ],
+    shared_libs: [
+        "libnativehelper",
+        "liblog",
+    ],
+    sdk_version: "current",
+    stl: "c++_static",
+    static_libs: ["libgmock_ndk"],
+    whole_static_libs: ["libnativetesthelper_jni"],
+    tidy: true,
+}
\ No newline at end of file
diff --git a/tests/tests/libnativehelper/jni/file_descriptor_ndk_test.cpp b/tests/tests/libnativehelper/jni/file_descriptor_ndk_test.cpp
new file mode 100644
index 0000000..6df63cf
--- /dev/null
+++ b/tests/tests/libnativehelper/jni/file_descriptor_ndk_test.cpp
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <android/file_descriptor_jni.h>
+
+#include "libnativehelper_test.h"
+
+TEST_F(LibnativehelperTest, FileDescriptorNdkApiUses) {
+    static constexpr int kInvalidFd = -1;
+    jobject jifd = AFileDescriptor_create(mEnv);
+    ASSERT_NE(nullptr, jifd);
+    ASSERT_EQ(JNI_FALSE, mEnv->ExceptionCheck());
+    ASSERT_EQ(kInvalidFd, AFileDescriptor_getFD(mEnv, jifd));
+
+    static const int kSubsequentUnixFds[] = { 0, -1, -999, -1, 0, 1812, -1, 1066 };
+    for (int unixFd : kSubsequentUnixFds) {
+        AFileDescriptor_setFD(mEnv, jifd, unixFd);
+        ASSERT_EQ(JNI_FALSE, mEnv->ExceptionCheck());
+        ASSERT_EQ(unixFd, AFileDescriptor_getFD(mEnv, jifd));
+        ASSERT_EQ(JNI_FALSE, mEnv->ExceptionCheck());
+    }
+}
diff --git a/tests/tests/libnativehelper/jni/jni_invocation_api_ndk_test.cpp b/tests/tests/libnativehelper/jni/jni_invocation_api_ndk_test.cpp
new file mode 100644
index 0000000..f77f08a
--- /dev/null
+++ b/tests/tests/libnativehelper/jni/jni_invocation_api_ndk_test.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <jni.h>
+
+#include "libnativehelper_test.h"
+
+TEST_F(LibnativehelperTest, JNI_CreateJavaVM) {
+    // Android only supports a single runtime, this is already running so no more can be created.
+    JavaVMInitArgs vm_args;
+    JavaVMOption options[] = {
+        { .optionString = "-verbose:jni", .extraInfo = nullptr }
+    };
+    vm_args.version = JNI_VERSION_1_6;
+    vm_args.nOptions = std::size(options);
+    vm_args.options = options;
+    vm_args.ignoreUnrecognized = JNI_TRUE;
+
+    JavaVM* vm = nullptr;
+    JNIEnv* env = nullptr;
+    EXPECT_EQ(JNI_ERR, JNI_CreateJavaVM(&vm, &env, &vm_args));
+    EXPECT_EQ(nullptr, vm);
+    EXPECT_EQ(nullptr, env);
+}
+
+TEST_F(LibnativehelperTest, JNI_GetDefaultJavaVMInitArgs) {
+    // JNI_GetDefaultJavaVMInitArgs is historically not supported by ART or Dalvik (at least as
+    // far back as android-r2.2.3_r2).
+    JavaVMInitArgs vm_args;
+    vm_args.version = JNI_VERSION_1_6;
+    vm_args.nOptions = 0;
+    EXPECT_EQ(JNI_ERR, JNI_GetDefaultJavaVMInitArgs(&vm_args));
+}
+
+TEST_F(LibnativehelperTest, JNI_GetCreatedJavaVMs) {
+    JavaVM* vmBuf[3];
+    jsize nVMs;
+    ASSERT_EQ(JNI_OK, JNI_GetCreatedJavaVMs(vmBuf, std::size(vmBuf), &nVMs));
+    ASSERT_EQ(1, nVMs);
+    ASSERT_NE(nullptr, vmBuf[0]);
+
+    // Check caller can get the JNIEnv.
+    jint versions[] = { JNI_VERSION_1_1, JNI_VERSION_1_2, JNI_VERSION_1_4, JNI_VERSION_1_6 };
+    JNIEnv* env = nullptr;
+    for (jint version : versions) {
+        EXPECT_EQ(JNI_OK, vmBuf[0]->GetEnv(reinterpret_cast<void**>(&env), version))
+            << " for JNI version " << std::hex << version;
+        EXPECT_EQ(mEnv, env);
+    }
+}
diff --git a/tests/tests/libnativehelper/jni/libnativehelper_test.cpp b/tests/tests/libnativehelper/jni/libnativehelper_test.cpp
new file mode 100644
index 0000000..5371004
--- /dev/null
+++ b/tests/tests/libnativehelper/jni/libnativehelper_test.cpp
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <libnativehelper_test.h>
+
+#include <nativetesthelper_jni/utils.h>
+
+void LibnativehelperTest::SetUp() {
+    int result = GetJavaVM()->GetEnv(reinterpret_cast<void**>(&mEnv), JNI_VERSION_1_6);
+    EXPECT_EQ(JNI_OK, result);
+    EXPECT_NE(nullptr, mEnv);
+}
+
+void LibnativehelperTest::TearDown() {
+    mEnv = nullptr;
+}
diff --git a/tests/tests/libnativehelper/jni/libnativehelper_test.h b/tests/tests/libnativehelper/jni/libnativehelper_test.h
new file mode 100644
index 0000000..0d3ed20
--- /dev/null
+++ b/tests/tests/libnativehelper/jni/libnativehelper_test.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2020 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.
+ */
+
+#pragma once
+
+#include <gtest/gtest.h>
+
+#include <jni.h>
+
+class LibnativehelperTest : public ::testing::Test {
+  protected:
+    virtual void SetUp() override;
+    virtual void TearDown() override;
+
+    JNIEnv* mEnv;
+};
diff --git a/tests/tests/libnativehelper/src/android/libnativehelper/cts/LibnativehelperGTests.java b/tests/tests/libnativehelper/src/android/libnativehelper/cts/LibnativehelperGTests.java
new file mode 100644
index 0000000..0084ef2
--- /dev/null
+++ b/tests/tests/libnativehelper/src/android/libnativehelper/cts/LibnativehelperGTests.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2020 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.libnativehelper.cts;
+
+import com.android.gtestrunner.GtestRunner;
+import com.android.gtestrunner.TargetLibrary;
+
+import org.junit.runner.RunWith;
+
+@RunWith(GtestRunner.class)
+@TargetLibrary("nativehelper_test_jni")
+public class LibnativehelperGTests {}
diff --git a/tests/tests/libthermalndk/Android.bp b/tests/tests/libthermalndk/Android.bp
index 1ffd27c..ba58f2d 100644
--- a/tests/tests/libthermalndk/Android.bp
+++ b/tests/tests/libthermalndk/Android.bp
@@ -21,8 +21,8 @@
         "ctstestrunner-axt",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     jni_uses_platform_apis: true,
     jni_libs: [
@@ -32,7 +32,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/libthermalndk/jni/Android.bp b/tests/tests/libthermalndk/jni/Android.bp
index 9f95e7f..0990304 100644
--- a/tests/tests/libthermalndk/jni/Android.bp
+++ b/tests/tests/libthermalndk/jni/Android.bp
@@ -17,6 +17,7 @@
     srcs: [
         "NativeThermalTest.cpp",
     ],
+    header_libs: ["jni_headers"],
     shared_libs: [
         "libandroid",
         "liblog",
diff --git a/tests/tests/match_flags/Android.bp b/tests/tests/match_flags/Android.bp
index b29d3e0..4a40784 100644
--- a/tests/tests/match_flags/Android.bp
+++ b/tests/tests/match_flags/Android.bp
@@ -18,7 +18,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: [
diff --git a/tests/tests/match_flags/app/a/Android.bp b/tests/tests/match_flags/app/a/Android.bp
index a843990..8513fad 100644
--- a/tests/tests/match_flags/app/a/Android.bp
+++ b/tests/tests/match_flags/app/a/Android.bp
@@ -20,7 +20,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/match_flags/app/b/Android.bp b/tests/tests/match_flags/app/b/Android.bp
index 87c417c..868fa34 100644
--- a/tests/tests/match_flags/app/b/Android.bp
+++ b/tests/tests/match_flags/app/b/Android.bp
@@ -20,7 +20,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/media/Android.bp b/tests/tests/media/Android.bp
index 848f004..2c150b9 100644
--- a/tests/tests/media/Android.bp
+++ b/tests/tests/media/Android.bp
@@ -43,6 +43,7 @@
         "truth-prebuilt",
         "mockito-target-minus-junit4",
         "androidx.heifwriter_heifwriter",
+        "CtsCameraUtils",
     ],
     jni_libs: [
         "libaudio_jni",
@@ -69,13 +70,12 @@
     jni_uses_sdk_apis: true,
     libs: [
         "org.apache.http.legacy",
-        "android.test.base.stubs",
-        "android.test.runner.stubs",
+        "android.test.base",
+        "android.test.runner",
     ],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "mts",
     ],
diff --git a/tests/tests/media/AndroidTest.xml b/tests/tests/media/AndroidTest.xml
index a04bcfc..c54ecd0 100644
--- a/tests/tests/media/AndroidTest.xml
+++ b/tests/tests/media/AndroidTest.xml
@@ -20,12 +20,14 @@
     <option name="config-descriptor:metadata" key="parameter" value="multi_abi" />
     <target_preparer class="com.android.compatibility.common.tradefed.targetprep.DynamicConfigPusher">
         <option name="target" value="host" />
-        <option name="config-filename" value="cts" />
-        <option name="dynamic-config-name" value="cts-dynamic-config" />
+        <option name="config-filename" value="CtsMediaTestCases" />
+        <option name="dynamic-config-name" value="CtsMediaTestCases" />
         <option name="version" value="9.0_r1"/>
     </target_preparer>
     <target_preparer class="com.android.compatibility.common.tradefed.targetprep.MediaPreparer">
-        <option name="images-only" value="true" />
+        <option name="push-all" value="true" />
+        <option name="media-folder-name" value="CtsMediaTestCases-1.3" />
+        <option name="dynamic-config-module" value="CtsMediaTestCases" />
     </target_preparer>
     <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
         <option name="cleanup-apks" value="true" />
diff --git a/tests/tests/media/DynamicConfig.xml b/tests/tests/media/DynamicConfig.xml
index b39e3fb..0fd0a0b 100644
--- a/tests/tests/media/DynamicConfig.xml
+++ b/tests/tests/media/DynamicConfig.xml
@@ -50,4 +50,7 @@
     <entry key="streaming_media_player_test_http_mpeg4_sp_aac_video2">
         <value>http://redirector.gvt1.com/videoplayback?id=c80658495af60617&amp;itag=17&amp;source=youtube&amp;ip=0.0.0.0&amp;ipbits=0&amp;expire=19000000000&amp;sparams=ip,ipbits,expire,id,itag,source&amp;signature=70E979A621001201BC18622BDBF914FA870BDA40.6E78890B80F4A33A18835F775B1FF64F0A4D0003&amp;key=ik0&amp;user=android-device-test</value>
     </entry>
+    <entry key="media_files_url">
+    <value>https://storage.googleapis.com/android_media/cts/tests/tests/media/CtsMediaTestCases-1.3.zip</value>
+    </entry>
 </dynamicConfig>
diff --git a/tests/tests/media/OWNERS b/tests/tests/media/OWNERS
index ecf36fa..e3d8ccc 100644
--- a/tests/tests/media/OWNERS
+++ b/tests/tests/media/OWNERS
@@ -8,6 +8,7 @@
 hunga@google.com
 insun@google.com
 jaewan@google.com
+jinpark@google.com
 jmtrivi@google.com
 jsharkey@android.com
 sungsoo@google.com
diff --git a/tests/tests/media/libaudiojni/Android.bp b/tests/tests/media/libaudiojni/Android.bp
index ff95160..f77d529 100644
--- a/tests/tests/media/libaudiojni/Android.bp
+++ b/tests/tests/media/libaudiojni/Android.bp
@@ -32,6 +32,7 @@
     ],
     header_libs: [
         "libaudioutils_headers",
+        "liblog_headers",
     ],
     stl: "libc++_static",
     cflags: [
diff --git a/tests/tests/media/libmediandkjni/Android.bp b/tests/tests/media/libmediandkjni/Android.bp
index becae52..847a21c 100644
--- a/tests/tests/media/libmediandkjni/Android.bp
+++ b/tests/tests/media/libmediandkjni/Android.bp
@@ -22,11 +22,11 @@
         "codec-utils-jni.cpp",
         "md5_utils.cpp",
     ],
-    include_dirs: ["system/core/include"],
     shared_libs: [
         "libnativehelper_compat_libc++",
         "liblog",
     ],
+    header_libs: ["liblog_headers"],
     sdk_version: "29",
     cflags: [
         "-Werror",
@@ -47,7 +47,6 @@
         "native_media_utils.cpp",
         "native_media_decoder_source.cpp",
     ],
-    include_dirs: ["system/core/include"],
     shared_libs: [
         "libandroid",
         "libnativehelper_compat_libc++",
@@ -55,6 +54,7 @@
         "libmediandk",
         "libEGL",
     ],
+    header_libs: ["liblog_headers"],
     stl: "libc++_static",
     cflags: [
         "-Werror",
@@ -85,6 +85,7 @@
         "libdl",
         "libEGL",
     ],
+    header_libs: ["liblog_headers"],
     cflags: [
         "-Werror",
         "-Wall",
diff --git a/tests/tests/media/libmediandkjni/native-mediadrm-jni.cpp b/tests/tests/media/libmediandkjni/native-mediadrm-jni.cpp
index 11b0c62..f0fb434 100644
--- a/tests/tests/media/libmediandkjni/native-mediadrm-jni.cpp
+++ b/tests/tests/media/libmediandkjni/native-mediadrm-jni.cpp
@@ -26,6 +26,7 @@
 #include <assert.h>
 #include <jni.h>
 #include <nativehelper/JNIHelp.h>
+#include <sys/stat.h>
 
 #include <android/native_window_jni.h>
 
@@ -59,8 +60,10 @@
 static bool gListenerGotValidExpiryTime = false;
 static bool gOnKeyChangeListenerOK = false;
 
-static const size_t kPlayTimeSeconds = 30;
-static const size_t kUuidSize = 16;
+static const char kFileScheme[] = "file://";
+static constexpr size_t kFileSchemeStrLen = sizeof(kFileScheme) - 1;
+static constexpr size_t kPlayTimeSeconds = 30;
+static constexpr size_t kUuidSize = 16;
 
 static const uint8_t kClearKeyUuid[kUuidSize] = {
     0x10, 0x77, 0xef, 0xec, 0xc0, 0xb2, 0x4d, 0x02,
@@ -131,6 +134,40 @@
     return juuid;
 }
 
+static media_status_t setDataSourceFdFromUrl(
+    AMediaExtractor* extractor, const char* url) {
+
+    const char *path = url + kFileSchemeStrLen;
+    FILE* fp = fopen(path, "r");
+    struct stat buf {};
+    media_status_t status = AMEDIA_ERROR_BASE;
+    if (fp && !fstat(fileno(fp), &buf)) {
+      status = AMediaExtractor_setDataSourceFd(
+          extractor,
+          fileno(fp), 0, buf.st_size);
+    } else {
+        status = AMEDIA_ERROR_IO;
+        ALOGE("Failed to convert URL to Fd");
+    }
+    if (fp && fclose(fp) == EOF) {
+        // 0 indicate success, EOF for error
+        ALOGE("Failed to close file pointer");
+    }
+    return status;
+}
+
+static media_status_t setDataSourceFdOrUrl(
+    AMediaExtractor* extractor, const char* url) {
+
+    media_status_t status = AMEDIA_ERROR_BASE;
+    if (strlen(url) > kFileSchemeStrLen && strncmp(url, kFileScheme, kFileSchemeStrLen) == 0) {
+        status = setDataSourceFdFromUrl(extractor, url);
+    } else {
+       status = AMediaExtractor_setDataSource(extractor, url);
+    }
+    return status;
+}
+
 extern "C" jboolean Java_android_media_cts_NativeMediaDrmClearkeyTest_isCryptoSchemeSupportedNative(
     JNIEnv* env, jclass /*clazz*/, jbyteArray uuid) {
 
@@ -279,7 +316,7 @@
     aMediaObjects.setVideoExtractor(AMediaExtractor_new());
     const char* url = env->GetStringUTFChars(videoUrl, 0);
     if (url) {
-        media_status_t status = AMediaExtractor_setDataSource(
+        media_status_t status = setDataSourceFdOrUrl(
             aMediaObjects.getVideoExtractor(), url);
         env->ReleaseStringUTFChars(videoUrl, url);
 
@@ -696,7 +733,7 @@
     aMediaObjects.setAudioExtractor(AMediaExtractor_new());
     const char* url = env->GetStringUTFChars(params.audioUrl, 0);
     if (url) {
-        status = AMediaExtractor_setDataSource(
+        status = setDataSourceFdOrUrl(
             aMediaObjects.getAudioExtractor(), url);
         env->ReleaseStringUTFChars(params.audioUrl, url);
 
@@ -710,7 +747,7 @@
     aMediaObjects.setVideoExtractor(AMediaExtractor_new());
     url = env->GetStringUTFChars(params.videoUrl, 0);
     if (url) {
-        status = AMediaExtractor_setDataSource(
+        status = setDataSourceFdOrUrl(
             aMediaObjects.getVideoExtractor(), url);
         env->ReleaseStringUTFChars(params.videoUrl, url);
 
diff --git a/tests/tests/media/res/raw/MultiLangPerso_1PID_PC0_Select_AC4_H265_DVB_50fps_Audio_Only.ts b/tests/tests/media/res/raw/MultiLangPerso_1PID_PC0_Select_AC4_H265_DVB_50fps_Audio_Only.ts
deleted file mode 100644
index 4b4da9f..0000000
--- a/tests/tests/media/res/raw/MultiLangPerso_1PID_PC0_Select_AC4_H265_DVB_50fps_Audio_Only.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/audio_aac_mono_70kbs_44100hz_aac_mono_70kbs_44100hz.mp4 b/tests/tests/media/res/raw/audio_aac_mono_70kbs_44100hz_aac_mono_70kbs_44100hz.mp4
deleted file mode 100644
index 157c222..0000000
--- a/tests/tests/media/res/raw/audio_aac_mono_70kbs_44100hz_aac_mono_70kbs_44100hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s1_320x180_webm_vp8_800kbps_30fps_opus_5ch_320kbps_48000hz.webm b/tests/tests/media/res/raw/bbb_s1_320x180_webm_vp8_800kbps_30fps_opus_5ch_320kbps_48000hz.webm
deleted file mode 100644
index b4a86b5..0000000
--- a/tests/tests/media/res/raw/bbb_s1_320x180_webm_vp8_800kbps_30fps_opus_5ch_320kbps_48000hz.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s1_320x180_webm_vp9_0p11_600kbps_30fps_vorbis_mono_64kbps_48000hz.webm b/tests/tests/media/res/raw/bbb_s1_320x180_webm_vp9_0p11_600kbps_30fps_vorbis_mono_64kbps_48000hz.webm
deleted file mode 100644
index e056966..0000000
--- a/tests/tests/media/res/raw/bbb_s1_320x180_webm_vp9_0p11_600kbps_30fps_vorbis_mono_64kbps_48000hz.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s1_320x240_mp4_h264_mp2_800kbps_30fps_aac_lc_5ch_240kbps_44100hz.mp4 b/tests/tests/media/res/raw/bbb_s1_320x240_mp4_h264_mp2_800kbps_30fps_aac_lc_5ch_240kbps_44100hz.mp4
deleted file mode 100644
index a0c38ff..0000000
--- a/tests/tests/media/res/raw/bbb_s1_320x240_mp4_h264_mp2_800kbps_30fps_aac_lc_5ch_240kbps_44100hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s1_352x288_mp4_hevc_mp2_600kbps_30fps_aac_he_stereo_96kbps_48000hz.mp4 b/tests/tests/media/res/raw/bbb_s1_352x288_mp4_hevc_mp2_600kbps_30fps_aac_he_stereo_96kbps_48000hz.mp4
deleted file mode 100644
index 9cda631..0000000
--- a/tests/tests/media/res/raw/bbb_s1_352x288_mp4_hevc_mp2_600kbps_30fps_aac_he_stereo_96kbps_48000hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s1_640x360_mp4_hevc_mp21_1600kbps_30fps_aac_he_6ch_288kbps_44100hz.mp4 b/tests/tests/media/res/raw/bbb_s1_640x360_mp4_hevc_mp21_1600kbps_30fps_aac_he_6ch_288kbps_44100hz.mp4
deleted file mode 100644
index 721cd50..0000000
--- a/tests/tests/media/res/raw/bbb_s1_640x360_mp4_hevc_mp21_1600kbps_30fps_aac_he_6ch_288kbps_44100hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s1_640x360_webm_vp8_2mbps_30fps_vorbis_5ch_320kbps_48000hz.webm b/tests/tests/media/res/raw/bbb_s1_640x360_webm_vp8_2mbps_30fps_vorbis_5ch_320kbps_48000hz.webm
deleted file mode 100644
index 2bbd2a6..0000000
--- a/tests/tests/media/res/raw/bbb_s1_640x360_webm_vp8_2mbps_30fps_vorbis_5ch_320kbps_48000hz.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s1_640x360_webm_vp9_0p21_1600kbps_30fps_vorbis_stereo_128kbps_48000hz.webm b/tests/tests/media/res/raw/bbb_s1_640x360_webm_vp9_0p21_1600kbps_30fps_vorbis_stereo_128kbps_48000hz.webm
deleted file mode 100644
index 9efa191..0000000
--- a/tests/tests/media/res/raw/bbb_s1_640x360_webm_vp9_0p21_1600kbps_30fps_vorbis_stereo_128kbps_48000hz.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s1_720x480_mp4_h264_mp3_2mbps_30fps_aac_lc_5ch_320kbps_48000hz.mp4 b/tests/tests/media/res/raw/bbb_s1_720x480_mp4_h264_mp3_2mbps_30fps_aac_lc_5ch_320kbps_48000hz.mp4
deleted file mode 100644
index 5c51cb5..0000000
--- a/tests/tests/media/res/raw/bbb_s1_720x480_mp4_h264_mp3_2mbps_30fps_aac_lc_5ch_320kbps_48000hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s1_720x480_mp4_hevc_mp3_1600kbps_30fps_aac_he_6ch_240kbps_48000hz.mp4 b/tests/tests/media/res/raw/bbb_s1_720x480_mp4_hevc_mp3_1600kbps_30fps_aac_he_6ch_240kbps_48000hz.mp4
deleted file mode 100644
index d9adec4..0000000
--- a/tests/tests/media/res/raw/bbb_s1_720x480_mp4_hevc_mp3_1600kbps_30fps_aac_he_6ch_240kbps_48000hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s2_1920x1080_mkv_h264_mp42_20mbps_60fps_aac_he_v2_5ch_160kbps_48000hz.mkv b/tests/tests/media/res/raw/bbb_s2_1920x1080_mkv_h264_mp42_20mbps_60fps_aac_he_v2_5ch_160kbps_48000hz.mkv
deleted file mode 100644
index 8963f2c..0000000
--- a/tests/tests/media/res/raw/bbb_s2_1920x1080_mkv_h264_mp42_20mbps_60fps_aac_he_v2_5ch_160kbps_48000hz.mkv
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s2_1920x1080_mp4_h264_hp42_20mbps_60fps_aac_lc_6ch_384kbps_48000hz.mp4 b/tests/tests/media/res/raw/bbb_s2_1920x1080_mp4_h264_hp42_20mbps_60fps_aac_lc_6ch_384kbps_48000hz.mp4
deleted file mode 100644
index f089306..0000000
--- a/tests/tests/media/res/raw/bbb_s2_1920x1080_mp4_h264_hp42_20mbps_60fps_aac_lc_6ch_384kbps_48000hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s2_1920x1080_mp4_h264_mp42_20mbps_60fps_aac_he_v2_5ch_160kbps_48000hz.mp4 b/tests/tests/media/res/raw/bbb_s2_1920x1080_mp4_h264_mp42_20mbps_60fps_aac_he_v2_5ch_160kbps_48000hz.mp4
deleted file mode 100644
index 023072a..0000000
--- a/tests/tests/media/res/raw/bbb_s2_1920x1080_mp4_h264_mp42_20mbps_60fps_aac_he_v2_5ch_160kbps_48000hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s2_1920x1080_mp4_hevc_mp41_10mbps_60fps_aac_lc_6ch_384kbps_22050hz.mp4 b/tests/tests/media/res/raw/bbb_s2_1920x1080_mp4_hevc_mp41_10mbps_60fps_aac_lc_6ch_384kbps_22050hz.mp4
deleted file mode 100644
index 64a146b..0000000
--- a/tests/tests/media/res/raw/bbb_s2_1920x1080_mp4_hevc_mp41_10mbps_60fps_aac_lc_6ch_384kbps_22050hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s2_1920x1080_webm_vp8_20mbps_60fps_vorbis_6ch_384kbps_48000hz.webm b/tests/tests/media/res/raw/bbb_s2_1920x1080_webm_vp8_20mbps_60fps_vorbis_6ch_384kbps_48000hz.webm
deleted file mode 100644
index 369e496..0000000
--- a/tests/tests/media/res/raw/bbb_s2_1920x1080_webm_vp8_20mbps_60fps_vorbis_6ch_384kbps_48000hz.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s2_1920x1080_webm_vp9_0p41_10mbps_60fps_vorbis_6ch_384kbps_22050hz.webm b/tests/tests/media/res/raw/bbb_s2_1920x1080_webm_vp9_0p41_10mbps_60fps_vorbis_6ch_384kbps_22050hz.webm
deleted file mode 100644
index 270307d..0000000
--- a/tests/tests/media/res/raw/bbb_s2_1920x1080_webm_vp9_0p41_10mbps_60fps_vorbis_6ch_384kbps_22050hz.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s2_3840x2160_mp4_hevc_mp51_20mbps_60fps_aac_lc_6ch_384kbps_32000hz.mp4 b/tests/tests/media/res/raw/bbb_s2_3840x2160_mp4_hevc_mp51_20mbps_60fps_aac_lc_6ch_384kbps_32000hz.mp4
deleted file mode 100644
index 23438aa..0000000
--- a/tests/tests/media/res/raw/bbb_s2_3840x2160_mp4_hevc_mp51_20mbps_60fps_aac_lc_6ch_384kbps_32000hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s2_3840x2160_webm_vp9_0p51_20mbps_60fps_vorbis_6ch_384kbps_32000hz.webm b/tests/tests/media/res/raw/bbb_s2_3840x2160_webm_vp9_0p51_20mbps_60fps_vorbis_6ch_384kbps_32000hz.webm
deleted file mode 100644
index 23171d6..0000000
--- a/tests/tests/media/res/raw/bbb_s2_3840x2160_webm_vp9_0p51_20mbps_60fps_vorbis_6ch_384kbps_32000hz.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s3_1280x720_mp4_h264_hp32_8mbps_60fps_aac_he_v2_stereo_48kbps_48000hz.mp4 b/tests/tests/media/res/raw/bbb_s3_1280x720_mp4_h264_hp32_8mbps_60fps_aac_he_v2_stereo_48kbps_48000hz.mp4
deleted file mode 100644
index 3cd151e..0000000
--- a/tests/tests/media/res/raw/bbb_s3_1280x720_mp4_h264_hp32_8mbps_60fps_aac_he_v2_stereo_48kbps_48000hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s3_1280x720_mp4_h264_mp32_8mbps_60fps_aac_he_v2_6ch_144kbps_44100hz.mp4 b/tests/tests/media/res/raw/bbb_s3_1280x720_mp4_h264_mp32_8mbps_60fps_aac_he_v2_6ch_144kbps_44100hz.mp4
deleted file mode 100644
index 23adcae..0000000
--- a/tests/tests/media/res/raw/bbb_s3_1280x720_mp4_h264_mp32_8mbps_60fps_aac_he_v2_6ch_144kbps_44100hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s3_1280x720_webm_vp8_8mbps_60fps_opus_6ch_384kbps_48000hz.webm b/tests/tests/media/res/raw/bbb_s3_1280x720_webm_vp8_8mbps_60fps_opus_6ch_384kbps_48000hz.webm
deleted file mode 100644
index 84fb99f..0000000
--- a/tests/tests/media/res/raw/bbb_s3_1280x720_webm_vp8_8mbps_60fps_opus_6ch_384kbps_48000hz.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s4_1280x720_mp4_h264_mp31_8mbps_30fps_aac_he_mono_40kbps_44100hz.mp4 b/tests/tests/media/res/raw/bbb_s4_1280x720_mp4_h264_mp31_8mbps_30fps_aac_he_mono_40kbps_44100hz.mp4
deleted file mode 100644
index 6908e1d..0000000
--- a/tests/tests/media/res/raw/bbb_s4_1280x720_mp4_h264_mp31_8mbps_30fps_aac_he_mono_40kbps_44100hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s4_1280x720_mp4_hevc_mp31_4mbps_30fps_aac_he_stereo_80kbps_32000hz.mp4 b/tests/tests/media/res/raw/bbb_s4_1280x720_mp4_hevc_mp31_4mbps_30fps_aac_he_stereo_80kbps_32000hz.mp4
deleted file mode 100644
index ecc4663..0000000
--- a/tests/tests/media/res/raw/bbb_s4_1280x720_mp4_hevc_mp31_4mbps_30fps_aac_he_stereo_80kbps_32000hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s4_1280x720_webm_vp8_8mbps_30fps_opus_mono_64kbps_48000hz.webm b/tests/tests/media/res/raw/bbb_s4_1280x720_webm_vp8_8mbps_30fps_opus_mono_64kbps_48000hz.webm
deleted file mode 100644
index 8216c37..0000000
--- a/tests/tests/media/res/raw/bbb_s4_1280x720_webm_vp8_8mbps_30fps_opus_mono_64kbps_48000hz.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s4_1280x720_webm_vp9_0p31_4mbps_30fps_opus_stereo_128kbps_48000hz.webm b/tests/tests/media/res/raw/bbb_s4_1280x720_webm_vp9_0p31_4mbps_30fps_opus_stereo_128kbps_48000hz.webm
deleted file mode 100644
index 67d2aaa..0000000
--- a/tests/tests/media/res/raw/bbb_s4_1280x720_webm_vp9_0p31_4mbps_30fps_opus_stereo_128kbps_48000hz.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s4_1920x1080_wide_mp4_h264_hp4_20mbps_30fps_aac_lc_6ch_384kbps_44100hz.mp4 b/tests/tests/media/res/raw/bbb_s4_1920x1080_wide_mp4_h264_hp4_20mbps_30fps_aac_lc_6ch_384kbps_44100hz.mp4
deleted file mode 100644
index 0170144..0000000
--- a/tests/tests/media/res/raw/bbb_s4_1920x1080_wide_mp4_h264_hp4_20mbps_30fps_aac_lc_6ch_384kbps_44100hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s4_1920x1080_wide_mp4_h264_mp4_20mbps_30fps_aac_he_5ch_200kbps_44100hz.mp4 b/tests/tests/media/res/raw/bbb_s4_1920x1080_wide_mp4_h264_mp4_20mbps_30fps_aac_he_5ch_200kbps_44100hz.mp4
deleted file mode 100644
index 00ccb2a..0000000
--- a/tests/tests/media/res/raw/bbb_s4_1920x1080_wide_mp4_h264_mp4_20mbps_30fps_aac_he_5ch_200kbps_44100hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s4_1920x1080_wide_webm_vp8_20mbps_30fps_vorbis_6ch_384kbps_44100hz.webm b/tests/tests/media/res/raw/bbb_s4_1920x1080_wide_webm_vp8_20mbps_30fps_vorbis_6ch_384kbps_44100hz.webm
deleted file mode 100644
index e5bd51a..0000000
--- a/tests/tests/media/res/raw/bbb_s4_1920x1080_wide_webm_vp8_20mbps_30fps_vorbis_6ch_384kbps_44100hz.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s4_3840x2160_mp4_hevc_mp5_20mbps_30fps_aac_lc_6ch_384kbps_24000hz.mp4 b/tests/tests/media/res/raw/bbb_s4_3840x2160_mp4_hevc_mp5_20mbps_30fps_aac_lc_6ch_384kbps_24000hz.mp4
deleted file mode 100644
index e15f7c3..0000000
--- a/tests/tests/media/res/raw/bbb_s4_3840x2160_mp4_hevc_mp5_20mbps_30fps_aac_lc_6ch_384kbps_24000hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bbb_s4_3840x2160_webm_vp9_0p5_20mbps_30fps_vorbis_6ch_384kbps_24000hz.webm b/tests/tests/media/res/raw/bbb_s4_3840x2160_webm_vp9_0p5_20mbps_30fps_vorbis_6ch_384kbps_24000hz.webm
deleted file mode 100644
index d0fee89..0000000
--- a/tests/tests/media/res/raw/bbb_s4_3840x2160_webm_vp9_0p5_20mbps_30fps_vorbis_6ch_384kbps_24000hz.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/big5_1.mp3 b/tests/tests/media/res/raw/big5_1.mp3
deleted file mode 100644
index faa3eb4..0000000
--- a/tests/tests/media/res/raw/big5_1.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/big5_2.mp3 b/tests/tests/media/res/raw/big5_2.mp3
deleted file mode 100644
index a69da4f..0000000
--- a/tests/tests/media/res/raw/big5_2.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/binary_counter_320x240_30fps_600frames.mp4 b/tests/tests/media/res/raw/binary_counter_320x240_30fps_600frames.mp4
deleted file mode 100644
index 8c0d787..0000000
--- a/tests/tests/media/res/raw/binary_counter_320x240_30fps_600frames.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/binary_counter_320x240_30fps_600frames_editlist.mp4 b/tests/tests/media/res/raw/binary_counter_320x240_30fps_600frames_editlist.mp4
deleted file mode 100644
index 6609614..0000000
--- a/tests/tests/media/res/raw/binary_counter_320x240_30fps_600frames_editlist.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/binary_counter_320x240_30fps_600frames_empty_normal_editlist_entries.mp4 b/tests/tests/media/res/raw/binary_counter_320x240_30fps_600frames_empty_normal_editlist_entries.mp4
deleted file mode 100644
index 5b175ee..0000000
--- a/tests/tests/media/res/raw/binary_counter_320x240_30fps_600frames_empty_normal_editlist_entries.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/binary_counter_320x240_720x240_30fps_600frames.mp4 b/tests/tests/media/res/raw/binary_counter_320x240_720x240_30fps_600frames.mp4
deleted file mode 100644
index 2822d20..0000000
--- a/tests/tests/media/res/raw/binary_counter_320x240_720x240_30fps_600frames.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/bug13652927.ogg b/tests/tests/media/res/raw/bug13652927.ogg
deleted file mode 100644
index 065d9e5..0000000
--- a/tests/tests/media/res/raw/bug13652927.ogg
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/camera_click.ogg b/tests/tests/media/res/raw/camera_click.ogg
deleted file mode 100644
index b836e10..0000000
--- a/tests/tests/media/res/raw/camera_click.ogg
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/color_176x144_bt2020_lr_hlg_h265.mp4 b/tests/tests/media/res/raw/color_176x144_bt2020_lr_hlg_h265.mp4
deleted file mode 100644
index 748151c..0000000
--- a/tests/tests/media/res/raw/color_176x144_bt2020_lr_hlg_h265.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/color_176x144_bt2020_lr_smpte2084_h265.mp4 b/tests/tests/media/res/raw/color_176x144_bt2020_lr_smpte2084_h265.mp4
deleted file mode 100644
index f21237f..0000000
--- a/tests/tests/media/res/raw/color_176x144_bt2020_lr_smpte2084_h265.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/color_176x144_bt601_525_lr_sdr_h264.mp4 b/tests/tests/media/res/raw/color_176x144_bt601_525_lr_sdr_h264.mp4
deleted file mode 100644
index 84701c3..0000000
--- a/tests/tests/media/res/raw/color_176x144_bt601_525_lr_sdr_h264.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/color_176x144_bt601_525_lr_sdr_h265.mp4 b/tests/tests/media/res/raw/color_176x144_bt601_525_lr_sdr_h265.mp4
deleted file mode 100644
index 7d948d4..0000000
--- a/tests/tests/media/res/raw/color_176x144_bt601_525_lr_sdr_h265.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/color_176x144_bt601_525_lr_sdr_mpeg2.mp4 b/tests/tests/media/res/raw/color_176x144_bt601_525_lr_sdr_mpeg2.mp4
deleted file mode 100644
index 0edf5c4..0000000
--- a/tests/tests/media/res/raw/color_176x144_bt601_525_lr_sdr_mpeg2.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/color_176x144_bt601_625_fr_sdr_h264.mp4 b/tests/tests/media/res/raw/color_176x144_bt601_625_fr_sdr_h264.mp4
deleted file mode 100644
index ed3b47d..0000000
--- a/tests/tests/media/res/raw/color_176x144_bt601_625_fr_sdr_h264.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/color_176x144_bt601_625_fr_sdr_h265.mp4 b/tests/tests/media/res/raw/color_176x144_bt601_625_fr_sdr_h265.mp4
deleted file mode 100644
index 11025be..0000000
--- a/tests/tests/media/res/raw/color_176x144_bt601_625_fr_sdr_h265.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/color_176x144_bt601_625_lr_sdr_mpeg2.mp4 b/tests/tests/media/res/raw/color_176x144_bt601_625_lr_sdr_mpeg2.mp4
deleted file mode 100644
index a16fc6f..0000000
--- a/tests/tests/media/res/raw/color_176x144_bt601_625_lr_sdr_mpeg2.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/color_176x144_bt709_lr_sdr_h264.mp4 b/tests/tests/media/res/raw/color_176x144_bt709_lr_sdr_h264.mp4
deleted file mode 100644
index d95d5c7..0000000
--- a/tests/tests/media/res/raw/color_176x144_bt709_lr_sdr_h264.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/color_176x144_bt709_lr_sdr_h265.mp4 b/tests/tests/media/res/raw/color_176x144_bt709_lr_sdr_h265.mp4
deleted file mode 100644
index dfd97fe..0000000
--- a/tests/tests/media/res/raw/color_176x144_bt709_lr_sdr_h265.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/color_176x144_bt709_lr_sdr_mpeg2.mp4 b/tests/tests/media/res/raw/color_176x144_bt709_lr_sdr_mpeg2.mp4
deleted file mode 100644
index 3385ed1..0000000
--- a/tests/tests/media/res/raw/color_176x144_bt709_lr_sdr_mpeg2.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/color_176x144_srgb_lr_sdr_h264.mp4 b/tests/tests/media/res/raw/color_176x144_srgb_lr_sdr_h264.mp4
deleted file mode 100644
index 2360277..0000000
--- a/tests/tests/media/res/raw/color_176x144_srgb_lr_sdr_h264.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/color_176x144_srgb_lr_sdr_h265.mp4 b/tests/tests/media/res/raw/color_176x144_srgb_lr_sdr_h265.mp4
deleted file mode 100644
index fe34c5b..0000000
--- a/tests/tests/media/res/raw/color_176x144_srgb_lr_sdr_h265.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/color_176x144_srgb_lr_sdr_mpeg2.mp4 b/tests/tests/media/res/raw/color_176x144_srgb_lr_sdr_mpeg2.mp4
deleted file mode 100644
index 9de85c7..0000000
--- a/tests/tests/media/res/raw/color_176x144_srgb_lr_sdr_mpeg2.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/cp1251_3.mp3 b/tests/tests/media/res/raw/cp1251_3.mp3
deleted file mode 100644
index 179a1a5..0000000
--- a/tests/tests/media/res/raw/cp1251_3.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/cp1251_3_a_ms_acm_mp3.mkv b/tests/tests/media/res/raw/cp1251_3_a_ms_acm_mp3.mkv
deleted file mode 100644
index c06a542..0000000
--- a/tests/tests/media/res/raw/cp1251_3_a_ms_acm_mp3.mkv
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/cp1251_4.mp3 b/tests/tests/media/res/raw/cp1251_4.mp3
deleted file mode 100644
index 3df1d32..0000000
--- a/tests/tests/media/res/raw/cp1251_4.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/cp1251_5.mp3 b/tests/tests/media/res/raw/cp1251_5.mp3
deleted file mode 100644
index 46df442..0000000
--- a/tests/tests/media/res/raw/cp1251_5.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/cp1251_6.mp3 b/tests/tests/media/res/raw/cp1251_6.mp3
deleted file mode 100644
index 545834d..0000000
--- a/tests/tests/media/res/raw/cp1251_6.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/cp1251_7.mp3 b/tests/tests/media/res/raw/cp1251_7.mp3
deleted file mode 100644
index d1c492b..0000000
--- a/tests/tests/media/res/raw/cp1251_7.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/cp1251_8.mp3 b/tests/tests/media/res/raw/cp1251_8.mp3
deleted file mode 100644
index 17f7e31..0000000
--- a/tests/tests/media/res/raw/cp1251_8.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/cp1251_v1.mp3 b/tests/tests/media/res/raw/cp1251_v1.mp3
deleted file mode 100644
index 173d970..0000000
--- a/tests/tests/media/res/raw/cp1251_v1.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/cp1251_v1v2.mp3 b/tests/tests/media/res/raw/cp1251_v1v2.mp3
deleted file mode 100644
index abffa92..0000000
--- a/tests/tests/media/res/raw/cp1251_v1v2.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/football_qvga.yuv b/tests/tests/media/res/raw/football_qvga.yuv
deleted file mode 100644
index f18f676..0000000
--- a/tests/tests/media/res/raw/football_qvga.yuv
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/football_qvga_desc.txt b/tests/tests/media/res/raw/football_qvga_desc.txt
deleted file mode 100644
index f6b44b2..0000000
--- a/tests/tests/media/res/raw/football_qvga_desc.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Football_qvga.yuv contains 3 seconds of raw 320x240 yuv420 video @ 30 fps.
-Extracted from http://media.xiph.org/video/derf/y4m/football_cif.y4m.
\ No newline at end of file
diff --git a/tests/tests/media/res/raw/gb18030_1.mp3 b/tests/tests/media/res/raw/gb18030_1.mp3
deleted file mode 100644
index dc63de5..0000000
--- a/tests/tests/media/res/raw/gb18030_1.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/gb18030_2.mp3 b/tests/tests/media/res/raw/gb18030_2.mp3
deleted file mode 100644
index 6109c97..0000000
--- a/tests/tests/media/res/raw/gb18030_2.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/gb18030_3.mp3 b/tests/tests/media/res/raw/gb18030_3.mp3
deleted file mode 100644
index 4fcb22f..0000000
--- a/tests/tests/media/res/raw/gb18030_3.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/gb18030_4.mp3 b/tests/tests/media/res/raw/gb18030_4.mp3
deleted file mode 100644
index fedffd7..0000000
--- a/tests/tests/media/res/raw/gb18030_4.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/gb18030_6.mp3 b/tests/tests/media/res/raw/gb18030_6.mp3
deleted file mode 100644
index b4817b2..0000000
--- a/tests/tests/media/res/raw/gb18030_6.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/gb18030_7.mp3 b/tests/tests/media/res/raw/gb18030_7.mp3
deleted file mode 100644
index 7932596..0000000
--- a/tests/tests/media/res/raw/gb18030_7.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/gb18030_8.mp3 b/tests/tests/media/res/raw/gb18030_8.mp3
deleted file mode 100644
index f5f54de..0000000
--- a/tests/tests/media/res/raw/gb18030_8.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/gb18030_utf8_mixed_1.mp3 b/tests/tests/media/res/raw/gb18030_utf8_mixed_1.mp3
deleted file mode 100644
index af2c7ac..0000000
--- a/tests/tests/media/res/raw/gb18030_utf8_mixed_1.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/gb18030_utf8_mixed_2.mp3 b/tests/tests/media/res/raw/gb18030_utf8_mixed_2.mp3
deleted file mode 100644
index d1c88fe..0000000
--- a/tests/tests/media/res/raw/gb18030_utf8_mixed_2.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/gb18030_utf8_mixed_3.mp3 b/tests/tests/media/res/raw/gb18030_utf8_mixed_3.mp3
deleted file mode 100644
index ddae12f..0000000
--- a/tests/tests/media/res/raw/gb18030_utf8_mixed_3.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/heap_oob_flac.mp3 b/tests/tests/media/res/raw/heap_oob_flac.mp3
deleted file mode 100644
index ae542d0..0000000
--- a/tests/tests/media/res/raw/heap_oob_flac.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/hebrew.mp3 b/tests/tests/media/res/raw/hebrew.mp3
deleted file mode 100644
index 59d76d8..0000000
--- a/tests/tests/media/res/raw/hebrew.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/hebrew2.mp3 b/tests/tests/media/res/raw/hebrew2.mp3
deleted file mode 100644
index d48cad2..0000000
--- a/tests/tests/media/res/raw/hebrew2.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/id3test0.mp3 b/tests/tests/media/res/raw/id3test0.mp3
deleted file mode 100644
index 5730b6b..0000000
--- a/tests/tests/media/res/raw/id3test0.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/id3test1.mp3 b/tests/tests/media/res/raw/id3test1.mp3
deleted file mode 100644
index af52e0f..0000000
--- a/tests/tests/media/res/raw/id3test1.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/id3test10.mp3 b/tests/tests/media/res/raw/id3test10.mp3
deleted file mode 100644
index ac01a00..0000000
--- a/tests/tests/media/res/raw/id3test10.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/id3test11.mp3 b/tests/tests/media/res/raw/id3test11.mp3
deleted file mode 100644
index 5786b80..0000000
--- a/tests/tests/media/res/raw/id3test11.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/id3test2.mp3 b/tests/tests/media/res/raw/id3test2.mp3
deleted file mode 100644
index 7fdb737..0000000
--- a/tests/tests/media/res/raw/id3test2.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/id3test3.mp3 b/tests/tests/media/res/raw/id3test3.mp3
deleted file mode 100644
index a9ce936..0000000
--- a/tests/tests/media/res/raw/id3test3.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/id3test4.mp3 b/tests/tests/media/res/raw/id3test4.mp3
deleted file mode 100644
index f2d2df9..0000000
--- a/tests/tests/media/res/raw/id3test4.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/id3test5.mp3 b/tests/tests/media/res/raw/id3test5.mp3
deleted file mode 100644
index 4ee1200..0000000
--- a/tests/tests/media/res/raw/id3test5.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/id3test6.mp3 b/tests/tests/media/res/raw/id3test6.mp3
deleted file mode 100644
index 017e0c0..0000000
--- a/tests/tests/media/res/raw/id3test6.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/id3test7.mp3 b/tests/tests/media/res/raw/id3test7.mp3
deleted file mode 100644
index d106a46..0000000
--- a/tests/tests/media/res/raw/id3test7.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/id3test8.mp3 b/tests/tests/media/res/raw/id3test8.mp3
deleted file mode 100644
index ab83c86..0000000
--- a/tests/tests/media/res/raw/id3test8.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/id3test9.mp3 b/tests/tests/media/res/raw/id3test9.mp3
deleted file mode 100644
index 84d2c49..0000000
--- a/tests/tests/media/res/raw/id3test9.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/iso88591_1.ogg b/tests/tests/media/res/raw/iso88591_1.ogg
deleted file mode 100644
index c20bf34..0000000
--- a/tests/tests/media/res/raw/iso88591_1.ogg
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/iso88591_10.mp3 b/tests/tests/media/res/raw/iso88591_10.mp3
deleted file mode 100644
index 4d43200..0000000
--- a/tests/tests/media/res/raw/iso88591_10.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/iso88591_11.mp3 b/tests/tests/media/res/raw/iso88591_11.mp3
deleted file mode 100644
index 3760238..0000000
--- a/tests/tests/media/res/raw/iso88591_11.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/iso88591_12.mp3 b/tests/tests/media/res/raw/iso88591_12.mp3
deleted file mode 100644
index 1ffcc0c..0000000
--- a/tests/tests/media/res/raw/iso88591_12.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/iso88591_13.mp3 b/tests/tests/media/res/raw/iso88591_13.mp3
deleted file mode 100644
index 91987c1..0000000
--- a/tests/tests/media/res/raw/iso88591_13.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/iso88591_2.mp3 b/tests/tests/media/res/raw/iso88591_2.mp3
deleted file mode 100644
index bcfdaad..0000000
--- a/tests/tests/media/res/raw/iso88591_2.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/iso88591_3.mp3 b/tests/tests/media/res/raw/iso88591_3.mp3
deleted file mode 100644
index 2b6a03f..0000000
--- a/tests/tests/media/res/raw/iso88591_3.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/iso88591_4.mp3 b/tests/tests/media/res/raw/iso88591_4.mp3
deleted file mode 100644
index 0623fff..0000000
--- a/tests/tests/media/res/raw/iso88591_4.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/iso88591_5.mp3 b/tests/tests/media/res/raw/iso88591_5.mp3
deleted file mode 100644
index 8051af5..0000000
--- a/tests/tests/media/res/raw/iso88591_5.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/iso88591_6.mp3 b/tests/tests/media/res/raw/iso88591_6.mp3
deleted file mode 100644
index 4dc2b49..0000000
--- a/tests/tests/media/res/raw/iso88591_6.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/iso88591_7.mp3 b/tests/tests/media/res/raw/iso88591_7.mp3
deleted file mode 100644
index 72f5c5b..0000000
--- a/tests/tests/media/res/raw/iso88591_7.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/iso88591_8.mp3 b/tests/tests/media/res/raw/iso88591_8.mp3
deleted file mode 100644
index f841d59..0000000
--- a/tests/tests/media/res/raw/iso88591_8.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/iso88591_9.mp3 b/tests/tests/media/res/raw/iso88591_9.mp3
deleted file mode 100644
index 8f93d48..0000000
--- a/tests/tests/media/res/raw/iso88591_9.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/iso88591_utf8_mixed_1.mp3 b/tests/tests/media/res/raw/iso88591_utf8_mixed_1.mp3
deleted file mode 100644
index 78bad13..0000000
--- a/tests/tests/media/res/raw/iso88591_utf8_mixed_1.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/iso88591_utf8_mixed_2.mp3 b/tests/tests/media/res/raw/iso88591_utf8_mixed_2.mp3
deleted file mode 100644
index c7d8429..0000000
--- a/tests/tests/media/res/raw/iso88591_utf8_mixed_2.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/iso88591_utf8_mixed_3.mp3 b/tests/tests/media/res/raw/iso88591_utf8_mixed_3.mp3
deleted file mode 100644
index c8d4afa..0000000
--- a/tests/tests/media/res/raw/iso88591_utf8_mixed_3.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/john_cage.ogg b/tests/tests/media/res/raw/john_cage.ogg
deleted file mode 100644
index 62d2335..0000000
--- a/tests/tests/media/res/raw/john_cage.ogg
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/largealbumart.mp3 b/tests/tests/media/res/raw/largealbumart.mp3
deleted file mode 100644
index e630f0d..0000000
--- a/tests/tests/media/res/raw/largealbumart.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/lg_g4_iso_800.jpg b/tests/tests/media/res/raw/lg_g4_iso_800.jpg
deleted file mode 100644
index d264196..0000000
--- a/tests/tests/media/res/raw/lg_g4_iso_800.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/loudsoftaac.aac b/tests/tests/media/res/raw/loudsoftaac.aac
deleted file mode 100644
index 1534ef2..0000000
--- a/tests/tests/media/res/raw/loudsoftaac.aac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/loudsoftfaac.m4a b/tests/tests/media/res/raw/loudsoftfaac.m4a
deleted file mode 100644
index b4895b5..0000000
--- a/tests/tests/media/res/raw/loudsoftfaac.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/loudsoftitunes.m4a b/tests/tests/media/res/raw/loudsoftitunes.m4a
deleted file mode 100644
index b01b36b..0000000
--- a/tests/tests/media/res/raw/loudsoftitunes.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/loudsoftmp3.mp3 b/tests/tests/media/res/raw/loudsoftmp3.mp3
deleted file mode 100644
index b32c8bd..0000000
--- a/tests/tests/media/res/raw/loudsoftmp3.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/loudsoftogg.ogg b/tests/tests/media/res/raw/loudsoftogg.ogg
deleted file mode 100644
index dc122d9..0000000
--- a/tests/tests/media/res/raw/loudsoftogg.ogg
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/loudsoftoggmkv.mkv b/tests/tests/media/res/raw/loudsoftoggmkv.mkv
deleted file mode 100644
index d4d62dc..0000000
--- a/tests/tests/media/res/raw/loudsoftoggmkv.mkv
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/loudsoftoggmp4.mp4 b/tests/tests/media/res/raw/loudsoftoggmp4.mp4
deleted file mode 100644
index 8e1154e..0000000
--- a/tests/tests/media/res/raw/loudsoftoggmp4.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/loudsoftwav.wav b/tests/tests/media/res/raw/loudsoftwav.wav
deleted file mode 100644
index 9930dcb..0000000
--- a/tests/tests/media/res/raw/loudsoftwav.wav
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/midi8sec.mid b/tests/tests/media/res/raw/midi8sec.mid
deleted file mode 100644
index 746aca1..0000000
--- a/tests/tests/media/res/raw/midi8sec.mid
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/mkv_audio_pcms16be.mkv b/tests/tests/media/res/raw/mkv_audio_pcms16be.mkv
deleted file mode 100755
index 6735941..0000000
--- a/tests/tests/media/res/raw/mkv_audio_pcms16be.mkv
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/mkv_audio_pcms16le.mkv b/tests/tests/media/res/raw/mkv_audio_pcms16le.mkv
deleted file mode 100755
index e55f946..0000000
--- a/tests/tests/media/res/raw/mkv_audio_pcms16le.mkv
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/mkv_avc_adpcm_ima.mkv b/tests/tests/media/res/raw/mkv_avc_adpcm_ima.mkv
deleted file mode 100755
index 1cba11a..0000000
--- a/tests/tests/media/res/raw/mkv_avc_adpcm_ima.mkv
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/mkv_avc_adpcm_ms.mkv b/tests/tests/media/res/raw/mkv_avc_adpcm_ms.mkv
deleted file mode 100755
index 33d272c..0000000
--- a/tests/tests/media/res/raw/mkv_avc_adpcm_ms.mkv
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/mkv_avc_mp2.mkv b/tests/tests/media/res/raw/mkv_avc_mp2.mkv
deleted file mode 100755
index f4d475d..0000000
--- a/tests/tests/media/res/raw/mkv_avc_mp2.mkv
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/mkv_avc_wma.mkv b/tests/tests/media/res/raw/mkv_avc_wma.mkv
deleted file mode 100755
index 8438e66..0000000
--- a/tests/tests/media/res/raw/mkv_avc_wma.mkv
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/monodcneg.mp3 b/tests/tests/media/res/raw/monodcneg.mp3
deleted file mode 100644
index 7d262de..0000000
--- a/tests/tests/media/res/raw/monodcneg.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/monodcpos.mp3 b/tests/tests/media/res/raw/monodcpos.mp3
deleted file mode 100644
index 81a7943..0000000
--- a/tests/tests/media/res/raw/monodcpos.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/mononoisedcpos.m4a b/tests/tests/media/res/raw/mononoisedcpos.m4a
deleted file mode 100644
index d0ae090..0000000
--- a/tests/tests/media/res/raw/mononoisedcpos.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/monotestgsm.wav b/tests/tests/media/res/raw/monotestgsm.wav
deleted file mode 100644
index 6062f36..0000000
--- a/tests/tests/media/res/raw/monotestgsm.wav
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/monotestm4a.m4a b/tests/tests/media/res/raw/monotestm4a.m4a
deleted file mode 100644
index 9ef6651..0000000
--- a/tests/tests/media/res/raw/monotestm4a.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/monotestmp3.mp3 b/tests/tests/media/res/raw/monotestmp3.mp3
deleted file mode 100644
index 43a8ac3..0000000
--- a/tests/tests/media/res/raw/monotestmp3.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/monotestogg.ogg b/tests/tests/media/res/raw/monotestogg.ogg
deleted file mode 100644
index 3dc5644..0000000
--- a/tests/tests/media/res/raw/monotestogg.ogg
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/monotestoggmkv.mkv b/tests/tests/media/res/raw/monotestoggmkv.mkv
deleted file mode 100644
index 7d0fada..0000000
--- a/tests/tests/media/res/raw/monotestoggmkv.mkv
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/monotestoggmp4.mp4 b/tests/tests/media/res/raw/monotestoggmp4.mp4
deleted file mode 100644
index eca0440..0000000
--- a/tests/tests/media/res/raw/monotestoggmp4.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/multi0.mp4 b/tests/tests/media/res/raw/multi0.mp4
deleted file mode 100644
index c1e68a6..0000000
--- a/tests/tests/media/res/raw/multi0.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/noise_5ch_44khz_aot2_mp4.m4a b/tests/tests/media/res/raw/noise_5ch_44khz_aot2_mp4.m4a
deleted file mode 100755
index cc9ad73..0000000
--- a/tests/tests/media/res/raw/noise_5ch_44khz_aot2_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/noise_5ch_48khz_aot5_dr_sbr_sig1_mp4.m4a b/tests/tests/media/res/raw/noise_5ch_48khz_aot5_dr_sbr_sig1_mp4.m4a
deleted file mode 100755
index a1266bf..0000000
--- a/tests/tests/media/res/raw/noise_5ch_48khz_aot5_dr_sbr_sig1_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/noise_6ch_44khz_aot5_dr_sbr_sig2_mp4.m4a b/tests/tests/media/res/raw/noise_6ch_44khz_aot5_dr_sbr_sig2_mp4.m4a
deleted file mode 100755
index ef1332c..0000000
--- a/tests/tests/media/res/raw/noise_6ch_44khz_aot5_dr_sbr_sig2_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/noise_6ch_48khz_aot2_mp4.m4a b/tests/tests/media/res/raw/noise_6ch_48khz_aot2_mp4.m4a
deleted file mode 100755
index 7eeb5e8..0000000
--- a/tests/tests/media/res/raw/noise_6ch_48khz_aot2_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/okgoogle123_good.wav b/tests/tests/media/res/raw/okgoogle123_good.wav
deleted file mode 100644
index ffd5a7f..0000000
--- a/tests/tests/media/res/raw/okgoogle123_good.wav
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/orientation_0.jpg b/tests/tests/media/res/raw/orientation_0.jpg
deleted file mode 100644
index 9b4d44a..0000000
--- a/tests/tests/media/res/raw/orientation_0.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/orientation_180.jpg b/tests/tests/media/res/raw/orientation_180.jpg
deleted file mode 100644
index 005fee2..0000000
--- a/tests/tests/media/res/raw/orientation_180.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/orientation_270.jpg b/tests/tests/media/res/raw/orientation_270.jpg
deleted file mode 100644
index b2c269f..0000000
--- a/tests/tests/media/res/raw/orientation_270.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/orientation_90.jpg b/tests/tests/media/res/raw/orientation_90.jpg
deleted file mode 100644
index aefca34..0000000
--- a/tests/tests/media/res/raw/orientation_90.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/orientation_heic_0.HEIC b/tests/tests/media/res/raw/orientation_heic_0.HEIC
deleted file mode 100644
index 44493a2..0000000
--- a/tests/tests/media/res/raw/orientation_heic_0.HEIC
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/orientation_heic_180.HEIC b/tests/tests/media/res/raw/orientation_heic_180.HEIC
deleted file mode 100644
index c1113ce..0000000
--- a/tests/tests/media/res/raw/orientation_heic_180.HEIC
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/orientation_heic_270.HEIC b/tests/tests/media/res/raw/orientation_heic_270.HEIC
deleted file mode 100644
index 542618c..0000000
--- a/tests/tests/media/res/raw/orientation_heic_270.HEIC
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/orientation_heic_90.HEIC b/tests/tests/media/res/raw/orientation_heic_90.HEIC
deleted file mode 100644
index 0ec74c1..0000000
--- a/tests/tests/media/res/raw/orientation_heic_90.HEIC
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/orientation_stripped_0.jpg b/tests/tests/media/res/raw/orientation_stripped_0.jpg
deleted file mode 100644
index 4656475..0000000
--- a/tests/tests/media/res/raw/orientation_stripped_0.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/orientation_stripped_180.jpg b/tests/tests/media/res/raw/orientation_stripped_180.jpg
deleted file mode 100644
index eb77283..0000000
--- a/tests/tests/media/res/raw/orientation_stripped_180.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/orientation_stripped_270.jpg b/tests/tests/media/res/raw/orientation_stripped_270.jpg
deleted file mode 100644
index 606520d..0000000
--- a/tests/tests/media/res/raw/orientation_stripped_270.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/orientation_stripped_90.jpg b/tests/tests/media/res/raw/orientation_stripped_90.jpg
deleted file mode 100644
index 43cc074..0000000
--- a/tests/tests/media/res/raw/orientation_stripped_90.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/playlist1.pls b/tests/tests/media/res/raw/playlist1.pls
deleted file mode 100644
index 27ad178f92..0000000
--- a/tests/tests/media/res/raw/playlist1.pls
+++ /dev/null
@@ -1,3 +0,0 @@
-[playlist]
-File1=testmp3.mp3
-File2=testmp3_2.mp3
diff --git a/tests/tests/media/res/raw/playlist2.m3u b/tests/tests/media/res/raw/playlist2.m3u
deleted file mode 100644
index b307703..0000000
--- a/tests/tests/media/res/raw/playlist2.m3u
+++ /dev/null
@@ -1,7 +0,0 @@
-# comments should be ignored
-
-# first track
-testmp3_2.mp3
-
-# second track
-testmp3.mp3
diff --git a/tests/tests/media/res/raw/png_with_exif_byte_order_ii.png b/tests/tests/media/res/raw/png_with_exif_byte_order_ii.png
deleted file mode 100644
index 082de21..0000000
--- a/tests/tests/media/res/raw/png_with_exif_byte_order_ii.png
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/png_without_exif.png b/tests/tests/media/res/raw/png_without_exif.png
deleted file mode 100644
index f3defab..0000000
--- a/tests/tests/media/res/raw/png_without_exif.png
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/programstream.mpeg b/tests/tests/media/res/raw/programstream.mpeg
deleted file mode 100644
index 6f8a480..0000000
--- a/tests/tests/media/res/raw/programstream.mpeg
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/psshtest.mp4 b/tests/tests/media/res/raw/psshtest.mp4
deleted file mode 100644
index 98ffeb0..0000000
--- a/tests/tests/media/res/raw/psshtest.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/segment000001_m2ts.mp4 b/tests/tests/media/res/raw/segment000001_m2ts.mp4
deleted file mode 100644
index fc8daba..0000000
--- a/tests/tests/media/res/raw/segment000001_m2ts.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/shiftjis1.mp3 b/tests/tests/media/res/raw/shiftjis1.mp3
deleted file mode 100644
index 1c50c76..0000000
--- a/tests/tests/media/res/raw/shiftjis1.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/shiftjis2.mp3 b/tests/tests/media/res/raw/shiftjis2.mp3
deleted file mode 100644
index 808c597..0000000
--- a/tests/tests/media/res/raw/shiftjis2.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/shiftjis3.mp3 b/tests/tests/media/res/raw/shiftjis3.mp3
deleted file mode 100644
index 820631b..0000000
--- a/tests/tests/media/res/raw/shiftjis3.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/shiftjis4.mp3 b/tests/tests/media/res/raw/shiftjis4.mp3
deleted file mode 100644
index 3fbc25e..0000000
--- a/tests/tests/media/res/raw/shiftjis4.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/shiftjis5.mp3 b/tests/tests/media/res/raw/shiftjis5.mp3
deleted file mode 100644
index 90520f8..0000000
--- a/tests/tests/media/res/raw/shiftjis5.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/shiftjis6.mp3 b/tests/tests/media/res/raw/shiftjis6.mp3
deleted file mode 100644
index 5310936..0000000
--- a/tests/tests/media/res/raw/shiftjis6.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/shiftjis7.mp3 b/tests/tests/media/res/raw/shiftjis7.mp3
deleted file mode 100644
index 6143126..0000000
--- a/tests/tests/media/res/raw/shiftjis7.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/shiftjis8.mp3 b/tests/tests/media/res/raw/shiftjis8.mp3
deleted file mode 100644
index c45c130..0000000
--- a/tests/tests/media/res/raw/shiftjis8.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sine1320hz5sec.wav b/tests/tests/media/res/raw/sine1320hz5sec.wav
deleted file mode 100644
index 22fde48..0000000
--- a/tests/tests/media/res/raw/sine1320hz5sec.wav
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep1_1ch_11khz_aot2_mp4.m4a b/tests/tests/media/res/raw/sinesweep1_1ch_11khz_aot2_mp4.m4a
deleted file mode 100755
index 019dbae..0000000
--- a/tests/tests/media/res/raw/sinesweep1_1ch_11khz_aot2_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep1_1ch_12khz_aot2_mp4.m4a b/tests/tests/media/res/raw/sinesweep1_1ch_12khz_aot2_mp4.m4a
deleted file mode 100755
index 0aae458..0000000
--- a/tests/tests/media/res/raw/sinesweep1_1ch_12khz_aot2_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep1_1ch_16khz_aot2_mp4.m4a b/tests/tests/media/res/raw/sinesweep1_1ch_16khz_aot2_mp4.m4a
deleted file mode 100755
index b8e767b..0000000
--- a/tests/tests/media/res/raw/sinesweep1_1ch_16khz_aot2_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep1_1ch_16khz_aot39_fl480_mp4.m4a b/tests/tests/media/res/raw/sinesweep1_1ch_16khz_aot39_fl480_mp4.m4a
deleted file mode 100755
index 86ff942..0000000
--- a/tests/tests/media/res/raw/sinesweep1_1ch_16khz_aot39_fl480_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep1_1ch_22khz_aot2_mp4.m4a b/tests/tests/media/res/raw/sinesweep1_1ch_22khz_aot2_mp4.m4a
deleted file mode 100755
index ce240bb..0000000
--- a/tests/tests/media/res/raw/sinesweep1_1ch_22khz_aot2_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep1_1ch_22khz_aot39_fl512_mp4.m4a b/tests/tests/media/res/raw/sinesweep1_1ch_22khz_aot39_fl512_mp4.m4a
deleted file mode 100755
index b07b036..0000000
--- a/tests/tests/media/res/raw/sinesweep1_1ch_22khz_aot39_fl512_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep1_1ch_24khz_aot2_mp4.m4a b/tests/tests/media/res/raw/sinesweep1_1ch_24khz_aot2_mp4.m4a
deleted file mode 100755
index 7245bbb..0000000
--- a/tests/tests/media/res/raw/sinesweep1_1ch_24khz_aot2_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep1_1ch_24khz_aot39_fl480_mp4.m4a b/tests/tests/media/res/raw/sinesweep1_1ch_24khz_aot39_fl480_mp4.m4a
deleted file mode 100755
index 252366b..0000000
--- a/tests/tests/media/res/raw/sinesweep1_1ch_24khz_aot39_fl480_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep1_1ch_32khz_aot2_mp4.m4a b/tests/tests/media/res/raw/sinesweep1_1ch_32khz_aot2_mp4.m4a
deleted file mode 100755
index e4216da..0000000
--- a/tests/tests/media/res/raw/sinesweep1_1ch_32khz_aot2_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep1_1ch_32khz_aot39_fl512_mp4.m4a b/tests/tests/media/res/raw/sinesweep1_1ch_32khz_aot39_fl512_mp4.m4a
deleted file mode 100755
index a0c6a46..0000000
--- a/tests/tests/media/res/raw/sinesweep1_1ch_32khz_aot39_fl512_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep1_1ch_44khz_aot2_mp4.m4a b/tests/tests/media/res/raw/sinesweep1_1ch_44khz_aot2_mp4.m4a
deleted file mode 100755
index d44a956..0000000
--- a/tests/tests/media/res/raw/sinesweep1_1ch_44khz_aot2_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep1_1ch_44khz_aot39_fl480_mp4.m4a b/tests/tests/media/res/raw/sinesweep1_1ch_44khz_aot39_fl480_mp4.m4a
deleted file mode 100755
index 4b3a860..0000000
--- a/tests/tests/media/res/raw/sinesweep1_1ch_44khz_aot39_fl480_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep1_1ch_48khz_aot2_mp4.m4a b/tests/tests/media/res/raw/sinesweep1_1ch_48khz_aot2_mp4.m4a
deleted file mode 100755
index 438b066..0000000
--- a/tests/tests/media/res/raw/sinesweep1_1ch_48khz_aot2_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep1_1ch_48khz_aot39_fl512_mp4.m4a b/tests/tests/media/res/raw/sinesweep1_1ch_48khz_aot39_fl512_mp4.m4a
deleted file mode 100755
index b6a2e69..0000000
--- a/tests/tests/media/res/raw/sinesweep1_1ch_48khz_aot39_fl512_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep1_1ch_8khz_aot2_mp4.m4a b/tests/tests/media/res/raw/sinesweep1_1ch_8khz_aot2_mp4.m4a
deleted file mode 100755
index 4b690e2..0000000
--- a/tests/tests/media/res/raw/sinesweep1_1ch_8khz_aot2_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep51m4a.m4a b/tests/tests/media/res/raw/sinesweep51m4a.m4a
deleted file mode 100644
index 1e35934..0000000
--- a/tests/tests/media/res/raw/sinesweep51m4a.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep_2ch_11khz_aot2_mp4.m4a b/tests/tests/media/res/raw/sinesweep_2ch_11khz_aot2_mp4.m4a
deleted file mode 100755
index bd83ec8..0000000
--- a/tests/tests/media/res/raw/sinesweep_2ch_11khz_aot2_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep_2ch_12khz_aot2_mp4.m4a b/tests/tests/media/res/raw/sinesweep_2ch_12khz_aot2_mp4.m4a
deleted file mode 100755
index 054d6d8..0000000
--- a/tests/tests/media/res/raw/sinesweep_2ch_12khz_aot2_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep_2ch_16khz_aot2_mp4.m4a b/tests/tests/media/res/raw/sinesweep_2ch_16khz_aot2_mp4.m4a
deleted file mode 100755
index 321a3b5..0000000
--- a/tests/tests/media/res/raw/sinesweep_2ch_16khz_aot2_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep_2ch_16khz_aot39_fl512_mp4.m4a b/tests/tests/media/res/raw/sinesweep_2ch_16khz_aot39_fl512_mp4.m4a
deleted file mode 100755
index f04f29f..0000000
--- a/tests/tests/media/res/raw/sinesweep_2ch_16khz_aot39_fl512_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep_2ch_22khz_aot2_mp4.m4a b/tests/tests/media/res/raw/sinesweep_2ch_22khz_aot2_mp4.m4a
deleted file mode 100755
index 432b379..0000000
--- a/tests/tests/media/res/raw/sinesweep_2ch_22khz_aot2_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep_2ch_22khz_aot39_fl480_mp4.m4a b/tests/tests/media/res/raw/sinesweep_2ch_22khz_aot39_fl480_mp4.m4a
deleted file mode 100755
index 0a300f8..0000000
--- a/tests/tests/media/res/raw/sinesweep_2ch_22khz_aot39_fl480_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep_2ch_24khz_aot2_mp4.m4a b/tests/tests/media/res/raw/sinesweep_2ch_24khz_aot2_mp4.m4a
deleted file mode 100755
index c859c9a..0000000
--- a/tests/tests/media/res/raw/sinesweep_2ch_24khz_aot2_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep_2ch_24khz_aot39_fl512_mp4.m4a b/tests/tests/media/res/raw/sinesweep_2ch_24khz_aot39_fl512_mp4.m4a
deleted file mode 100755
index cdc8928..0000000
--- a/tests/tests/media/res/raw/sinesweep_2ch_24khz_aot39_fl512_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep_2ch_32khz_aot2_mp4.m4a b/tests/tests/media/res/raw/sinesweep_2ch_32khz_aot2_mp4.m4a
deleted file mode 100755
index 48c7b02..0000000
--- a/tests/tests/media/res/raw/sinesweep_2ch_32khz_aot2_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep_2ch_32khz_aot39_fl480_mp4.m4a b/tests/tests/media/res/raw/sinesweep_2ch_32khz_aot39_fl480_mp4.m4a
deleted file mode 100755
index 76c9d47..0000000
--- a/tests/tests/media/res/raw/sinesweep_2ch_32khz_aot39_fl480_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep_2ch_44khz_aot2_mp4.m4a b/tests/tests/media/res/raw/sinesweep_2ch_44khz_aot2_mp4.m4a
deleted file mode 100755
index dd752b0..0000000
--- a/tests/tests/media/res/raw/sinesweep_2ch_44khz_aot2_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep_2ch_44khz_aot39_fl512_mp4.m4a b/tests/tests/media/res/raw/sinesweep_2ch_44khz_aot39_fl512_mp4.m4a
deleted file mode 100755
index 76fba31..0000000
--- a/tests/tests/media/res/raw/sinesweep_2ch_44khz_aot39_fl512_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep_2ch_48khz_aot2_mp4.m4a b/tests/tests/media/res/raw/sinesweep_2ch_48khz_aot2_mp4.m4a
deleted file mode 100755
index 2960b54..0000000
--- a/tests/tests/media/res/raw/sinesweep_2ch_48khz_aot2_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep_2ch_48khz_aot39_fl480_mp4.m4a b/tests/tests/media/res/raw/sinesweep_2ch_48khz_aot39_fl480_mp4.m4a
deleted file mode 100755
index baea42e..0000000
--- a/tests/tests/media/res/raw/sinesweep_2ch_48khz_aot39_fl480_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweep_2ch_8khz_aot2_mp4.m4a b/tests/tests/media/res/raw/sinesweep_2ch_8khz_aot2_mp4.m4a
deleted file mode 100755
index 0863187..0000000
--- a/tests/tests/media/res/raw/sinesweep_2ch_8khz_aot2_mp4.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweepalac.mov b/tests/tests/media/res/raw/sinesweepalac.mov
deleted file mode 100644
index f0e76e4..0000000
--- a/tests/tests/media/res/raw/sinesweepalac.mov
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweepflac.flac b/tests/tests/media/res/raw/sinesweepflac.flac
deleted file mode 100644
index c51b3c5..0000000
--- a/tests/tests/media/res/raw/sinesweepflac.flac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweepflac24.flac b/tests/tests/media/res/raw/sinesweepflac24.flac
deleted file mode 100644
index ac40ea9..0000000
--- a/tests/tests/media/res/raw/sinesweepflac24.flac
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweepflacmkv.mkv b/tests/tests/media/res/raw/sinesweepflacmkv.mkv
deleted file mode 100644
index 2f622cd..0000000
--- a/tests/tests/media/res/raw/sinesweepflacmkv.mkv
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweepflacmp4.mp4 b/tests/tests/media/res/raw/sinesweepflacmp4.mp4
deleted file mode 100644
index f397afa..0000000
--- a/tests/tests/media/res/raw/sinesweepflacmp4.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweepid3v23ext.mp3 b/tests/tests/media/res/raw/sinesweepid3v23ext.mp3
deleted file mode 100644
index 8249f4a..0000000
--- a/tests/tests/media/res/raw/sinesweepid3v23ext.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweepid3v23extbe.mp3 b/tests/tests/media/res/raw/sinesweepid3v23extbe.mp3
deleted file mode 100644
index 8d04b44..0000000
--- a/tests/tests/media/res/raw/sinesweepid3v23extbe.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweepid3v24ext.mp3 b/tests/tests/media/res/raw/sinesweepid3v24ext.mp3
deleted file mode 100644
index 40b392f..0000000
--- a/tests/tests/media/res/raw/sinesweepid3v24ext.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweepm4a.m4a b/tests/tests/media/res/raw/sinesweepm4a.m4a
deleted file mode 100644
index 533a515..0000000
--- a/tests/tests/media/res/raw/sinesweepm4a.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweepmp3lame.mp3 b/tests/tests/media/res/raw/sinesweepmp3lame.mp3
deleted file mode 100644
index 4d8ae70..0000000
--- a/tests/tests/media/res/raw/sinesweepmp3lame.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweepmp3smpb.mp3 b/tests/tests/media/res/raw/sinesweepmp3smpb.mp3
deleted file mode 100644
index 47a1e9d..0000000
--- a/tests/tests/media/res/raw/sinesweepmp3smpb.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweepogg.ogg b/tests/tests/media/res/raw/sinesweepogg.ogg
deleted file mode 100644
index e4fd4aa..0000000
--- a/tests/tests/media/res/raw/sinesweepogg.ogg
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweepoggalbumart.ogg b/tests/tests/media/res/raw/sinesweepoggalbumart.ogg
deleted file mode 100644
index 00ad4ad..0000000
--- a/tests/tests/media/res/raw/sinesweepoggalbumart.ogg
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweepoggmkv.mkv b/tests/tests/media/res/raw/sinesweepoggmkv.mkv
deleted file mode 100644
index 35bc5ca..0000000
--- a/tests/tests/media/res/raw/sinesweepoggmkv.mkv
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweepoggmp4.mp4 b/tests/tests/media/res/raw/sinesweepoggmp4.mp4
deleted file mode 100644
index d53fad4..0000000
--- a/tests/tests/media/res/raw/sinesweepoggmp4.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweepopus.mkv b/tests/tests/media/res/raw/sinesweepopus.mkv
deleted file mode 100644
index 230dd36..0000000
--- a/tests/tests/media/res/raw/sinesweepopus.mkv
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweepopusmp4.mp4 b/tests/tests/media/res/raw/sinesweepopusmp4.mp4
deleted file mode 100644
index 6894908..0000000
--- a/tests/tests/media/res/raw/sinesweepopusmp4.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweeppcmbemov.mov b/tests/tests/media/res/raw/sinesweeppcmbemov.mov
deleted file mode 100644
index 212c9ff..0000000
--- a/tests/tests/media/res/raw/sinesweeppcmbemov.mov
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweeppcmlemov.mov b/tests/tests/media/res/raw/sinesweeppcmlemov.mov
deleted file mode 100644
index 9f091d2..0000000
--- a/tests/tests/media/res/raw/sinesweeppcmlemov.mov
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweepraw.raw b/tests/tests/media/res/raw/sinesweepraw.raw
deleted file mode 100644
index c0d48ce..0000000
--- a/tests/tests/media/res/raw/sinesweepraw.raw
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweeptsaac.m4a b/tests/tests/media/res/raw/sinesweeptsaac.m4a
deleted file mode 100644
index f583012..0000000
--- a/tests/tests/media/res/raw/sinesweeptsaac.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweepvorbis.mkv b/tests/tests/media/res/raw/sinesweepvorbis.mkv
deleted file mode 100644
index 613ab71..0000000
--- a/tests/tests/media/res/raw/sinesweepvorbis.mkv
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweepvorbismp4.mp4 b/tests/tests/media/res/raw/sinesweepvorbismp4.mp4
deleted file mode 100644
index 660ca02..0000000
--- a/tests/tests/media/res/raw/sinesweepvorbismp4.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweepwav.wav b/tests/tests/media/res/raw/sinesweepwav.wav
deleted file mode 100644
index e1cd020..0000000
--- a/tests/tests/media/res/raw/sinesweepwav.wav
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/sinesweepwav24.wav b/tests/tests/media/res/raw/sinesweepwav24.wav
deleted file mode 100644
index 2657b5c..0000000
--- a/tests/tests/media/res/raw/sinesweepwav24.wav
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/stereonoisedcpos.m4a b/tests/tests/media/res/raw/stereonoisedcpos.m4a
deleted file mode 100644
index 77362df..0000000
--- a/tests/tests/media/res/raw/stereonoisedcpos.m4a
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_128x128_h264.mp4 b/tests/tests/media/res/raw/swirl_128x128_h264.mp4
deleted file mode 100644
index 3ff485a..0000000
--- a/tests/tests/media/res/raw/swirl_128x128_h264.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_128x128_h264_albumart.mp4 b/tests/tests/media/res/raw/swirl_128x128_h264_albumart.mp4
deleted file mode 100644
index f493f25..0000000
--- a/tests/tests/media/res/raw/swirl_128x128_h264_albumart.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_128x128_h265.mp4 b/tests/tests/media/res/raw/swirl_128x128_h265.mp4
deleted file mode 100644
index a0b112b..0000000
--- a/tests/tests/media/res/raw/swirl_128x128_h265.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_128x128_mpeg4.mp4 b/tests/tests/media/res/raw/swirl_128x128_mpeg4.mp4
deleted file mode 100644
index 694ce95..0000000
--- a/tests/tests/media/res/raw/swirl_128x128_mpeg4.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_128x128_vp8.webm b/tests/tests/media/res/raw/swirl_128x128_vp8.webm
deleted file mode 100644
index 7b606a2..0000000
--- a/tests/tests/media/res/raw/swirl_128x128_vp8.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_128x128_vp9.webm b/tests/tests/media/res/raw/swirl_128x128_vp9.webm
deleted file mode 100644
index 7acff11..0000000
--- a/tests/tests/media/res/raw/swirl_128x128_vp9.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_128x96_h263.3gp b/tests/tests/media/res/raw/swirl_128x96_h263.3gp
deleted file mode 100644
index f0ef242..0000000
--- a/tests/tests/media/res/raw/swirl_128x96_h263.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_130x132_h264.mp4 b/tests/tests/media/res/raw/swirl_130x132_h264.mp4
deleted file mode 100644
index 60027fd..0000000
--- a/tests/tests/media/res/raw/swirl_130x132_h264.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_130x132_h265.mp4 b/tests/tests/media/res/raw/swirl_130x132_h265.mp4
deleted file mode 100644
index 46fab26..0000000
--- a/tests/tests/media/res/raw/swirl_130x132_h265.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_130x132_mpeg4.mp4 b/tests/tests/media/res/raw/swirl_130x132_mpeg4.mp4
deleted file mode 100644
index ed6b529..0000000
--- a/tests/tests/media/res/raw/swirl_130x132_mpeg4.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_130x132_vp8.webm b/tests/tests/media/res/raw/swirl_130x132_vp8.webm
deleted file mode 100644
index a3f2d21..0000000
--- a/tests/tests/media/res/raw/swirl_130x132_vp8.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_130x132_vp9.webm b/tests/tests/media/res/raw/swirl_130x132_vp9.webm
deleted file mode 100644
index 840dc59..0000000
--- a/tests/tests/media/res/raw/swirl_130x132_vp9.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_132x130_h264.mp4 b/tests/tests/media/res/raw/swirl_132x130_h264.mp4
deleted file mode 100644
index dc17f8f..0000000
--- a/tests/tests/media/res/raw/swirl_132x130_h264.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_132x130_h265.mp4 b/tests/tests/media/res/raw/swirl_132x130_h265.mp4
deleted file mode 100644
index f9a59f5..0000000
--- a/tests/tests/media/res/raw/swirl_132x130_h265.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_132x130_mpeg4.mp4 b/tests/tests/media/res/raw/swirl_132x130_mpeg4.mp4
deleted file mode 100644
index ed975db..0000000
--- a/tests/tests/media/res/raw/swirl_132x130_mpeg4.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_132x130_vp8.webm b/tests/tests/media/res/raw/swirl_132x130_vp8.webm
deleted file mode 100644
index 8cd8d4e..0000000
--- a/tests/tests/media/res/raw/swirl_132x130_vp8.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_132x130_vp9.webm b/tests/tests/media/res/raw/swirl_132x130_vp9.webm
deleted file mode 100644
index 4a8d79f..0000000
--- a/tests/tests/media/res/raw/swirl_132x130_vp9.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_136x144_h264.mp4 b/tests/tests/media/res/raw/swirl_136x144_h264.mp4
deleted file mode 100644
index bc5fadf..0000000
--- a/tests/tests/media/res/raw/swirl_136x144_h264.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_136x144_h265.mp4 b/tests/tests/media/res/raw/swirl_136x144_h265.mp4
deleted file mode 100644
index 38f1fc8..0000000
--- a/tests/tests/media/res/raw/swirl_136x144_h265.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_136x144_mpeg4.mp4 b/tests/tests/media/res/raw/swirl_136x144_mpeg4.mp4
deleted file mode 100644
index c74bd96..0000000
--- a/tests/tests/media/res/raw/swirl_136x144_mpeg4.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_136x144_vp8.webm b/tests/tests/media/res/raw/swirl_136x144_vp8.webm
deleted file mode 100644
index 960d02f..0000000
--- a/tests/tests/media/res/raw/swirl_136x144_vp8.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_136x144_vp9.webm b/tests/tests/media/res/raw/swirl_136x144_vp9.webm
deleted file mode 100644
index 5898f07..0000000
--- a/tests/tests/media/res/raw/swirl_136x144_vp9.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_144x136_h264.mp4 b/tests/tests/media/res/raw/swirl_144x136_h264.mp4
deleted file mode 100644
index 962a218..0000000
--- a/tests/tests/media/res/raw/swirl_144x136_h264.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_144x136_h265.mp4 b/tests/tests/media/res/raw/swirl_144x136_h265.mp4
deleted file mode 100644
index 8098621..0000000
--- a/tests/tests/media/res/raw/swirl_144x136_h265.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_144x136_mpeg4.mp4 b/tests/tests/media/res/raw/swirl_144x136_mpeg4.mp4
deleted file mode 100644
index 81c1db3..0000000
--- a/tests/tests/media/res/raw/swirl_144x136_mpeg4.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_144x136_vp8.webm b/tests/tests/media/res/raw/swirl_144x136_vp8.webm
deleted file mode 100644
index b050ade..0000000
--- a/tests/tests/media/res/raw/swirl_144x136_vp8.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_144x136_vp9.webm b/tests/tests/media/res/raw/swirl_144x136_vp9.webm
deleted file mode 100644
index 9c0539a..0000000
--- a/tests/tests/media/res/raw/swirl_144x136_vp9.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_176x144_h263.3gp b/tests/tests/media/res/raw/swirl_176x144_h263.3gp
deleted file mode 100644
index ee51660..0000000
--- a/tests/tests/media/res/raw/swirl_176x144_h263.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/swirl_352x288_h263.3gp b/tests/tests/media/res/raw/swirl_352x288_h263.3gp
deleted file mode 100644
index 53830a9..0000000
--- a/tests/tests/media/res/raw/swirl_352x288_h263.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/test1m1shighstereo.mp3 b/tests/tests/media/res/raw/test1m1shighstereo.mp3
deleted file mode 100644
index 2a97077..0000000
--- a/tests/tests/media/res/raw/test1m1shighstereo.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/test_subtitle1_srt.3gp b/tests/tests/media/res/raw/test_subtitle1_srt.3gp
deleted file mode 100644
index 8dbc240..0000000
--- a/tests/tests/media/res/raw/test_subtitle1_srt.3gp
+++ /dev/null
@@ -1,39 +0,0 @@
-1
-00:00:0,000 --> 00:00:0,500
-2:0000
-
-2
-00:00:1,000 --> 00:00:1,500
-2:1000
-
-3
-00:00:2,000 --> 00:00:2,500
-2:2000
-
-4
-00:00:3,000 --> 00:00:3,500
-2:3000
-
-5
-00:00:4,000 --> 00:00:4,500
-2:4000
-
-6
-00:00:5,000 --> 00:00:5,500
-2:5000
-
-7
-00:00:6,000 --> 00:00:6,500
-2:6000
-
-8
-00:00:7,000 --> 00:00:7,500
-2:7000
-
-9
-00:00:8,000 --> 00:00:8,500
-2:8000
-
-10
-00:00:9,000 --> 00:00:9,500
-2:9000
diff --git a/tests/tests/media/res/raw/test_subtitle2_srt.3gp b/tests/tests/media/res/raw/test_subtitle2_srt.3gp
deleted file mode 100644
index 7ac2e72..0000000
--- a/tests/tests/media/res/raw/test_subtitle2_srt.3gp
+++ /dev/null
@@ -1,39 +0,0 @@
-1
-00:00:0,500 --> 00:00:1,000
-3:500
-
-2
-00:00:1,500 --> 00:00:2,000
-3:1500
-
-3
-00:00:2,500 --> 00:00:3,000
-3:2500
-
-4
-00:00:3,500 --> 00:00:4,000
-3:3500
-
-5
-00:00:4,500 --> 00:00:5,000
-3:4500
-
-6
-00:00:5,500 --> 00:00:6,000
-3:5500
-
-7
-00:00:6,500 --> 00:00:7,000
-3:6500
-
-8
-00:00:7,500 --> 00:00:8,000
-3:7500
-
-9
-00:00:8,500 --> 00:00:9,000
-3:8500
-
-10
-00:00:9,500 --> 00:00:10,000
-3:9500
diff --git a/tests/tests/media/res/raw/testac3mp4.mp4 b/tests/tests/media/res/raw/testac3mp4.mp4
deleted file mode 100644
index af527b1..0000000
--- a/tests/tests/media/res/raw/testac3mp4.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/testac3ts.ts b/tests/tests/media/res/raw/testac3ts.ts
deleted file mode 100644
index a67b8b8..0000000
--- a/tests/tests/media/res/raw/testac3ts.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/testamr.amr b/tests/tests/media/res/raw/testamr.amr
deleted file mode 100644
index 36c259c..0000000
--- a/tests/tests/media/res/raw/testamr.amr
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/testcanonicalize_localizable_mp3.mp3 b/tests/tests/media/res/raw/testcanonicalize_localizable_mp3.mp3
new file mode 100644
index 0000000..6878526
--- /dev/null
+++ b/tests/tests/media/res/raw/testcanonicalize_localizable_mp3.mp3
Binary files differ
diff --git a/tests/tests/media/res/raw/testcanonicalize_mp3.mp3 b/tests/tests/media/res/raw/testcanonicalize_mp3.mp3
new file mode 100644
index 0000000..610fdc65
--- /dev/null
+++ b/tests/tests/media/res/raw/testcanonicalize_mp3.mp3
Binary files differ
diff --git a/tests/tests/media/res/raw/testeac3mp4.mp4 b/tests/tests/media/res/raw/testeac3mp4.mp4
deleted file mode 100644
index ac9cad2..0000000
--- a/tests/tests/media/res/raw/testeac3mp4.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/testeac3ts.ts b/tests/tests/media/res/raw/testeac3ts.ts
deleted file mode 100644
index 1e7bc14..0000000
--- a/tests/tests/media/res/raw/testeac3ts.ts
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/testimy.imy b/tests/tests/media/res/raw/testimy.imy
deleted file mode 100644
index b66f02b..0000000
--- a/tests/tests/media/res/raw/testimy.imy
+++ /dev/null
@@ -1,10 +0,0 @@
-BEGIN:IMELODY

-VERSION:1.2

-FORMAT:CLASS1.0

-NAME:Test

-COMPOSER:Android

-BEAT:120

-STYLE:S1

-VOLUME:V7

-MELODY:a1b2c3vibeoffledoffbackoffa3.vibeonledonbackon*4d3a3vibeoffbackoffbackoffg3.backon(*5c4c1..)@9*5#f2*5#f2

-END:IMELODY

diff --git a/tests/tests/media/res/raw/testmp3_2.mp3 b/tests/tests/media/res/raw/testmp3_2.mp3
deleted file mode 100644
index 6a70c69..0000000
--- a/tests/tests/media/res/raw/testmp3_2.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/testmp3_3.raw b/tests/tests/media/res/raw/testmp3_3.raw
deleted file mode 100644
index 1d5ee19..0000000
--- a/tests/tests/media/res/raw/testmp3_3.raw
+++ /dev/null
@@ -1 +0,0 @@
-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
diff --git a/tests/tests/media/res/raw/testmp3_4.mp3 b/tests/tests/media/res/raw/testmp3_4.mp3
deleted file mode 100755
index 2098ebd..0000000
--- a/tests/tests/media/res/raw/testmp3_4.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/testmxmf.mxmf b/tests/tests/media/res/raw/testmxmf.mxmf
deleted file mode 100644
index 239f500..0000000
--- a/tests/tests/media/res/raw/testmxmf.mxmf
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/testota.ota b/tests/tests/media/res/raw/testota.ota
deleted file mode 100644
index 7aa5f99..0000000
--- a/tests/tests/media/res/raw/testota.ota
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/testrtttl.rtttl b/tests/tests/media/res/raw/testrtttl.rtttl
deleted file mode 100644
index 1f7e270..0000000
--- a/tests/tests/media/res/raw/testrtttl.rtttl
+++ /dev/null
@@ -1 +0,0 @@
-Test:d=2,o=6,b=120,l=2,s=n:a,b,c,d,e,4a,4b#,4c,4d,a4,b4,c4,d4
diff --git a/tests/tests/media/res/raw/testvideo.3gp b/tests/tests/media/res/raw/testvideo.3gp
deleted file mode 100644
index 8329311..0000000
--- a/tests/tests/media/res/raw/testvideo.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/testvideo_with_2_subtitle_tracks.mp4 b/tests/tests/media/res/raw/testvideo_with_2_subtitle_tracks.mp4
deleted file mode 100755
index ac70dd3..0000000
--- a/tests/tests/media/res/raw/testvideo_with_2_subtitle_tracks.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/testvideo_with_2_timedtext_tracks.3gp b/tests/tests/media/res/raw/testvideo_with_2_timedtext_tracks.3gp
deleted file mode 100644
index 1de14a5..0000000
--- a/tests/tests/media/res/raw/testvideo_with_2_timedtext_tracks.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/timestamps_binary_counter_320x240_30fps_600frames.txt b/tests/tests/media/res/raw/timestamps_binary_counter_320x240_30fps_600frames.txt
deleted file mode 100644
index 388bacc..0000000
--- a/tests/tests/media/res/raw/timestamps_binary_counter_320x240_30fps_600frames.txt
+++ /dev/null
@@ -1,600 +0,0 @@
-66666
-166666
-100000
-133333
-300000
-233333
-200000
-266666
-433333
-366666
-333333
-400000
-566666
-500000
-466666
-533333
-666666
-600000
-633333
-800000
-733333
-700000
-766666
-900000
-833333
-866666
-1033333
-966666
-933333
-1000000
-1066666
-1166666
-1100000
-1133333
-1300000
-1233333
-1200000
-1266666
-1433333
-1366666
-1333333
-1400000
-1566666
-1500000
-1466666
-1533333
-1666666
-1600000
-1633333
-1800000
-1733333
-1700000
-1766666
-1900000
-1833333
-1866666
-2000000
-1933333
-1966666
-2033333
-2066666
-2166666
-2100000
-2133333
-2300000
-2233333
-2200000
-2266666
-2433333
-2366666
-2333333
-2400000
-2566666
-2500000
-2466666
-2533333
-2700000
-2633333
-2600000
-2666666
-2833333
-2766666
-2733333
-2800000
-2966666
-2900000
-2866666
-2933333
-3033333
-3000000
-3066666
-3166666
-3100000
-3133333
-3300000
-3233333
-3200000
-3266666
-3433333
-3366666
-3333333
-3400000
-3566666
-3500000
-3466666
-3533333
-3666666
-3600000
-3633333
-3800000
-3733333
-3700000
-3766666
-3900000
-3833333
-3866666
-4000000
-3933333
-3966666
-4033333
-4066666
-4166666
-4100000
-4133333
-4300000
-4233333
-4200000
-4266666
-4433333
-4366666
-4333333
-4400000
-4566666
-4500000
-4466666
-4533333
-4666666
-4600000
-4633333
-4733333
-4700000
-4833333
-4766666
-4800000
-4966666
-4900000
-4866666
-4933333
-5033333
-5000000
-5066666
-5166666
-5100000
-5133333
-5300000
-5233333
-5200000
-5266666
-5433333
-5366666
-5333333
-5400000
-5566666
-5500000
-5466666
-5533333
-5666666
-5600000
-5633333
-5800000
-5733333
-5700000
-5766666
-5900000
-5833333
-5866666
-6033333
-5966666
-5933333
-6000000
-6066666
-6166666
-6100000
-6133333
-6300000
-6233333
-6200000
-6266666
-6433333
-6366666
-6333333
-6400000
-6566666
-6500000
-6466666
-6533333
-6666666
-6600000
-6633333
-6800000
-6733333
-6700000
-6766666
-6900000
-6833333
-6866666
-7000000
-6933333
-6966666
-7033333
-7066666
-7166666
-7100000
-7133333
-7300000
-7233333
-7200000
-7266666
-7433333
-7366666
-7333333
-7400000
-7566666
-7500000
-7466666
-7533333
-7700000
-7633333
-7600000
-7666666
-7833333
-7766666
-7733333
-7800000
-7966666
-7900000
-7866666
-7933333
-8033333
-8000000
-8066666
-8166666
-8100000
-8133333
-8300000
-8233333
-8200000
-8266666
-8433333
-8366666
-8333333
-8400000
-8566666
-8500000
-8466666
-8533333
-8666666
-8600000
-8633333
-8800000
-8733333
-8700000
-8766666
-8900000
-8833333
-8866666
-9000000
-8933333
-8966666
-9033333
-9066666
-9166666
-9100000
-9133333
-9300000
-9233333
-9200000
-9266666
-9366666
-9333333
-9500000
-9433333
-9400000
-9466666
-9633333
-9566666
-9533333
-9600000
-9766666
-9700000
-9666666
-9733333
-9900000
-9833333
-9800000
-9866666
-10000000
-9933333
-9966666
-10033333
-10066666
-10166666
-10100000
-10133333
-10300000
-10233333
-10200000
-10266666
-10433333
-10366666
-10333333
-10400000
-10566666
-10500000
-10466666
-10533333
-10666666
-10600000
-10633333
-10800000
-10733333
-10700000
-10766666
-10900000
-10833333
-10866666
-11033333
-10966666
-10933333
-11000000
-11066666
-11166666
-11100000
-11133333
-11300000
-11233333
-11200000
-11266666
-11433333
-11366666
-11333333
-11400000
-11566666
-11500000
-11466666
-11533333
-11666666
-11600000
-11633333
-11800000
-11733333
-11700000
-11766666
-11900000
-11833333
-11866666
-12000000
-11933333
-11966666
-12033333
-12066666
-12166666
-12100000
-12133333
-12300000
-12233333
-12200000
-12266666
-12433333
-12366666
-12333333
-12400000
-12566666
-12500000
-12466666
-12533333
-12700000
-12633333
-12600000
-12666666
-12833333
-12766666
-12733333
-12800000
-12966666
-12900000
-12866666
-12933333
-13033333
-13000000
-13066666
-13166666
-13100000
-13133333
-13300000
-13233333
-13200000
-13266666
-13433333
-13366666
-13333333
-13400000
-13566666
-13500000
-13466666
-13533333
-13666666
-13600000
-13633333
-13800000
-13733333
-13700000
-13766666
-13900000
-13833333
-13866666
-14000000
-13933333
-13966666
-14033333
-14066666
-14166666
-14100000
-14133333
-14300000
-14233333
-14200000
-14266666
-14433333
-14366666
-14333333
-14400000
-14566666
-14500000
-14466666
-14533333
-14666666
-14600000
-14633333
-14733333
-14700000
-14833333
-14766666
-14800000
-14966666
-14900000
-14866666
-14933333
-15033333
-15000000
-15066666
-15166666
-15100000
-15133333
-15300000
-15233333
-15200000
-15266666
-15433333
-15366666
-15333333
-15400000
-15566666
-15500000
-15466666
-15533333
-15666666
-15600000
-15633333
-15800000
-15733333
-15700000
-15766666
-15900000
-15833333
-15866666
-16033333
-15966666
-15933333
-16000000
-16066666
-16166666
-16100000
-16133333
-16300000
-16233333
-16200000
-16266666
-16433333
-16366666
-16333333
-16400000
-16566666
-16500000
-16466666
-16533333
-16666666
-16600000
-16633333
-16800000
-16733333
-16700000
-16766666
-16900000
-16833333
-16866666
-17000000
-16933333
-16966666
-17033333
-17066666
-17166666
-17100000
-17133333
-17300000
-17233333
-17200000
-17266666
-17433333
-17366666
-17333333
-17400000
-17566666
-17500000
-17466666
-17533333
-17700000
-17633333
-17600000
-17666666
-17833333
-17766666
-17733333
-17800000
-17966666
-17900000
-17866666
-17933333
-18033333
-18000000
-18066666
-18166666
-18100000
-18133333
-18300000
-18233333
-18200000
-18266666
-18433333
-18366666
-18333333
-18400000
-18566666
-18500000
-18466666
-18533333
-18666666
-18600000
-18633333
-18800000
-18733333
-18700000
-18766666
-18900000
-18833333
-18866666
-19000000
-18933333
-18966666
-19033333
-19066666
-19166666
-19100000
-19133333
-19300000
-19233333
-19200000
-19266666
-19366666
-19333333
-19500000
-19433333
-19400000
-19466666
-19633333
-19566666
-19533333
-19600000
-19766666
-19700000
-19666666
-19733333
-19900000
-19833333
-19800000
-19866666
-20000000
-19933333
-19966666
-20033333
diff --git a/tests/tests/media/res/raw/tones.wav b/tests/tests/media/res/raw/tones.wav
deleted file mode 100644
index ec54c96..0000000
--- a/tests/tests/media/res/raw/tones.wav
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/utf16_1.mp3 b/tests/tests/media/res/raw/utf16_1.mp3
deleted file mode 100644
index 829d311..0000000
--- a/tests/tests/media/res/raw/utf16_1.mp3
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_1280x720_av1_hdr_static_3mbps.webm b/tests/tests/media/res/raw/video_1280x720_av1_hdr_static_3mbps.webm
deleted file mode 100644
index 0e332c2..0000000
--- a/tests/tests/media/res/raw/video_1280x720_av1_hdr_static_3mbps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_1280x720_hevc_hdr10_static_3mbps.mp4 b/tests/tests/media/res/raw/video_1280x720_hevc_hdr10_static_3mbps.mp4
deleted file mode 100644
index 17150d4..0000000
--- a/tests/tests/media/res/raw/video_1280x720_hevc_hdr10_static_3mbps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_1280x720_mkv_h265_500kbps_25fps_aac_stereo_128kbps_44100hz.mkv b/tests/tests/media/res/raw/video_1280x720_mkv_h265_500kbps_25fps_aac_stereo_128kbps_44100hz.mkv
deleted file mode 100644
index dd6d3ab..0000000
--- a/tests/tests/media/res/raw/video_1280x720_mkv_h265_500kbps_25fps_aac_stereo_128kbps_44100hz.mkv
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_1280x720_mkv_h265_500kbps_25fps_aac_stereo_128kbps_44100hz_withoutcues.mkv b/tests/tests/media/res/raw/video_1280x720_mkv_h265_500kbps_25fps_aac_stereo_128kbps_44100hz_withoutcues.mkv
deleted file mode 100644
index 3b01295..0000000
--- a/tests/tests/media/res/raw/video_1280x720_mkv_h265_500kbps_25fps_aac_stereo_128kbps_44100hz_withoutcues.mkv
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_1280x720_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4 b/tests/tests/media/res/raw/video_1280x720_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4
deleted file mode 100644
index add873d..0000000
--- a/tests/tests/media/res/raw/video_1280x720_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_1280x720_mp4_mpeg2_3000kbps_30fps_aac_stereo_128kbps_48000hz.mp4 b/tests/tests/media/res/raw/video_1280x720_mp4_mpeg2_3000kbps_30fps_aac_stereo_128kbps_48000hz.mp4
deleted file mode 100644
index 0490c74..0000000
--- a/tests/tests/media/res/raw/video_1280x720_mp4_mpeg2_3000kbps_30fps_aac_stereo_128kbps_48000hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_1280x720_mp4_mpeg2_6000kbps_30fps_aac_stereo_128kbps_48000hz.mp4 b/tests/tests/media/res/raw/video_1280x720_mp4_mpeg2_6000kbps_30fps_aac_stereo_128kbps_48000hz.mp4
deleted file mode 100644
index 55cc26c..0000000
--- a/tests/tests/media/res/raw/video_1280x720_mp4_mpeg2_6000kbps_30fps_aac_stereo_128kbps_48000hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_1280x720_mp4_mpeg4_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4 b/tests/tests/media/res/raw/video_1280x720_mp4_mpeg4_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4
deleted file mode 100644
index d8aa8a4..0000000
--- a/tests/tests/media/res/raw/video_1280x720_mp4_mpeg4_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_1280x720_vp9_hdr_static_3mbps.mkv b/tests/tests/media/res/raw/video_1280x720_vp9_hdr_static_3mbps.mkv
deleted file mode 100644
index 40677fd..0000000
--- a/tests/tests/media/res/raw/video_1280x720_vp9_hdr_static_3mbps.mkv
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_1280x720_webm_av1_2000kbps_30fps_vorbis_stereo_128kbps_48000hz.webm b/tests/tests/media/res/raw/video_1280x720_webm_av1_2000kbps_30fps_vorbis_stereo_128kbps_48000hz.webm
deleted file mode 100644
index abaea3f..0000000
--- a/tests/tests/media/res/raw/video_1280x720_webm_av1_2000kbps_30fps_vorbis_stereo_128kbps_48000hz.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_1280x720_webm_vp9_csd_309kbps_25fps_vorbis_stereo_128kbps_48000hz.webm b/tests/tests/media/res/raw/video_1280x720_webm_vp9_csd_309kbps_25fps_vorbis_stereo_128kbps_48000hz.webm
deleted file mode 100644
index 8f00ded..0000000
--- a/tests/tests/media/res/raw/video_1280x720_webm_vp9_csd_309kbps_25fps_vorbis_stereo_128kbps_48000hz.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_12fps_aac_mono_24kbps_11025hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_12fps_aac_mono_24kbps_11025hz.3gp
deleted file mode 100644
index e6dfdcd..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_12fps_aac_mono_24kbps_11025hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_12fps_aac_mono_24kbps_22050hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_12fps_aac_mono_24kbps_22050hz.3gp
deleted file mode 100644
index 0d73ba2..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_12fps_aac_mono_24kbps_22050hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_11025hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_11025hz.3gp
deleted file mode 100644
index 4d63192..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_11025hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz.3gp
deleted file mode 100644
index fc007d9..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_12fps_aac_stereo_24kbps_11025hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_12fps_aac_stereo_24kbps_11025hz.3gp
deleted file mode 100644
index c7a04f0..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_12fps_aac_stereo_24kbps_11025hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_12fps_aac_stereo_24kbps_22050hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_12fps_aac_stereo_24kbps_22050hz.3gp
deleted file mode 100644
index ad7eca1..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_12fps_aac_stereo_24kbps_22050hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_mono_24kbps_11025hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_mono_24kbps_11025hz.3gp
deleted file mode 100644
index 63add5e..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_mono_24kbps_11025hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_mono_24kbps_22050hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_mono_24kbps_22050hz.3gp
deleted file mode 100644
index 25103ee..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_mono_24kbps_22050hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_11025hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_11025hz.3gp
deleted file mode 100644
index d38a8b6..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_11025hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_11025hz_metadata_gyro_compliant.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_11025hz_metadata_gyro_compliant.3gp
deleted file mode 100644
index 6ce3a29..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_11025hz_metadata_gyro_compliant.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_11025hz_metadata_gyro_non_compliant.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_11025hz_metadata_gyro_non_compliant.3gp
deleted file mode 100644
index 1fa3474..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_11025hz_metadata_gyro_non_compliant.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_22050hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_22050hz.3gp
deleted file mode 100644
index c0bef56..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_22050hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_stereo_24kbps_11025hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_stereo_24kbps_11025hz.3gp
deleted file mode 100644
index aee6c61..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_stereo_24kbps_11025hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_stereo_24kbps_22050hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_stereo_24kbps_22050hz.3gp
deleted file mode 100644
index 95a6e25..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_300kbps_25fps_aac_stereo_24kbps_22050hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_12fps_aac_mono_24kbps_11025hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_12fps_aac_mono_24kbps_11025hz.3gp
deleted file mode 100644
index d2a6ddf..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_12fps_aac_mono_24kbps_11025hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_12fps_aac_mono_24kbps_22050hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_12fps_aac_mono_24kbps_22050hz.3gp
deleted file mode 100644
index b7c2bed..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_12fps_aac_mono_24kbps_22050hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_12fps_aac_stereo_128kbps_11025hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_12fps_aac_stereo_128kbps_11025hz.3gp
deleted file mode 100644
index 4b10c21..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_12fps_aac_stereo_128kbps_11025hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_12fps_aac_stereo_128kbps_22050hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_12fps_aac_stereo_128kbps_22050hz.3gp
deleted file mode 100644
index 61e90a6..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_12fps_aac_stereo_128kbps_22050hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_12fps_aac_stereo_24kbps_11025hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_12fps_aac_stereo_24kbps_11025hz.3gp
deleted file mode 100644
index 9ce8a32..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_12fps_aac_stereo_24kbps_11025hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_12fps_aac_stereo_24kbps_22050hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_12fps_aac_stereo_24kbps_22050hz.3gp
deleted file mode 100644
index eec1e10..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_12fps_aac_stereo_24kbps_22050hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_25fps_aac_mono_24kbps_11025hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_25fps_aac_mono_24kbps_11025hz.3gp
deleted file mode 100644
index b39c665..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_25fps_aac_mono_24kbps_11025hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_25fps_aac_mono_24kbps_22050hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_25fps_aac_mono_24kbps_22050hz.3gp
deleted file mode 100644
index e50f329..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_25fps_aac_mono_24kbps_22050hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_25fps_aac_stereo_128kbps_11025hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_25fps_aac_stereo_128kbps_11025hz.3gp
deleted file mode 100644
index cc50019..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_25fps_aac_stereo_128kbps_11025hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_25fps_aac_stereo_128kbps_22050hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_25fps_aac_stereo_128kbps_22050hz.3gp
deleted file mode 100644
index 64be17e..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_25fps_aac_stereo_128kbps_22050hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_25fps_aac_stereo_24kbps_11025hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_25fps_aac_stereo_24kbps_11025hz.3gp
deleted file mode 100644
index 22a7b8b..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_25fps_aac_stereo_24kbps_11025hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_25fps_aac_stereo_24kbps_22050hz.3gp b/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_25fps_aac_stereo_24kbps_22050hz.3gp
deleted file mode 100644
index 55a73ec..0000000
--- a/tests/tests/media/res/raw/video_176x144_3gp_h263_56kbps_25fps_aac_stereo_24kbps_22050hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_h264_408kbps_30fps_352x288_h264_122kbps_30fps.mp4 b/tests/tests/media/res/raw/video_176x144_h264_408kbps_30fps_352x288_h264_122kbps_30fps.mp4
deleted file mode 100644
index 42ce9a0..0000000
--- a/tests/tests/media/res/raw/video_176x144_h264_408kbps_30fps_352x288_h264_122kbps_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_mp4_mpeg2_105kbps_25fps_aac_stereo_128kbps_44100hz.mp4 b/tests/tests/media/res/raw/video_176x144_mp4_mpeg2_105kbps_25fps_aac_stereo_128kbps_44100hz.mp4
deleted file mode 100644
index 7875ff9..0000000
--- a/tests/tests/media/res/raw/video_176x144_mp4_mpeg2_105kbps_25fps_aac_stereo_128kbps_44100hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_mp4_mpeg4_300kbps_25fps_aac_stereo_128kbps_44100hz.mp4 b/tests/tests/media/res/raw/video_176x144_mp4_mpeg4_300kbps_25fps_aac_stereo_128kbps_44100hz.mp4
deleted file mode 100644
index 044d5f8..0000000
--- a/tests/tests/media/res/raw/video_176x144_mp4_mpeg4_300kbps_25fps_aac_stereo_128kbps_44100hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_176x144_yv12.raw b/tests/tests/media/res/raw/video_176x144_yv12.raw
deleted file mode 100644
index 23af164..0000000
--- a/tests/tests/media/res/raw/video_176x144_yv12.raw
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_1920x1080_mp4_mpeg2_12000kbps_30fps_aac_stereo_128kbps_48000hz.mp4 b/tests/tests/media/res/raw/video_1920x1080_mp4_mpeg2_12000kbps_30fps_aac_stereo_128kbps_48000hz.mp4
deleted file mode 100644
index d0704c4..0000000
--- a/tests/tests/media/res/raw/video_1920x1080_mp4_mpeg2_12000kbps_30fps_aac_stereo_128kbps_48000hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_1920x1080_webm_av1_7000kbps_60fps_vorbis_stereo_128kbps_48000hz.webm b/tests/tests/media/res/raw/video_1920x1080_webm_av1_7000kbps_60fps_vorbis_stereo_128kbps_48000hz.webm
deleted file mode 100644
index e2277e1..0000000
--- a/tests/tests/media/res/raw/video_1920x1080_webm_av1_7000kbps_60fps_vorbis_stereo_128kbps_48000hz.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_256x144_webm_vp9_hdr_83kbps_24fps.webm b/tests/tests/media/res/raw/video_256x144_webm_vp9_hdr_83kbps_24fps.webm
deleted file mode 100644
index bc4ef33..0000000
--- a/tests/tests/media/res/raw/video_256x144_webm_vp9_hdr_83kbps_24fps.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_320x180_webm_av1_200kbps_30fps_vorbis_stereo_128kbps_48000hz.webm b/tests/tests/media/res/raw/video_320x180_webm_av1_200kbps_30fps_vorbis_stereo_128kbps_48000hz.webm
deleted file mode 100644
index 7cf844e..0000000
--- a/tests/tests/media/res/raw/video_320x180_webm_av1_200kbps_30fps_vorbis_stereo_128kbps_48000hz.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_352x288_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz.3gp b/tests/tests/media/res/raw/video_352x288_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz.3gp
deleted file mode 100644
index 5ad946d..0000000
--- a/tests/tests/media/res/raw/video_352x288_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz.3gp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_352x288_mp4_mpeg2_1000kbps_30fps_aac_stereo_128kbps_48000hz.mp4 b/tests/tests/media/res/raw/video_352x288_mp4_mpeg2_1000kbps_30fps_aac_stereo_128kbps_48000hz.mp4
deleted file mode 100644
index 25814db..0000000
--- a/tests/tests/media/res/raw/video_352x288_mp4_mpeg2_1000kbps_30fps_aac_stereo_128kbps_48000hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_3840x2160_mp4_mpeg2_20000kbps_30fps_aac_stereo_128kbps_48000hz.mp4 b/tests/tests/media/res/raw/video_3840x2160_mp4_mpeg2_20000kbps_30fps_aac_stereo_128kbps_48000hz.mp4
deleted file mode 100644
index c8c63a5..0000000
--- a/tests/tests/media/res/raw/video_3840x2160_mp4_mpeg2_20000kbps_30fps_aac_stereo_128kbps_48000hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_3840x2160_webm_av1_11000kbps_30fps_vorbis_stereo_128kbps_48000hz.webm b/tests/tests/media/res/raw/video_3840x2160_webm_av1_11000kbps_30fps_vorbis_stereo_128kbps_48000hz.webm
deleted file mode 100644
index a61e8f9..0000000
--- a/tests/tests/media/res/raw/video_3840x2160_webm_av1_11000kbps_30fps_vorbis_stereo_128kbps_48000hz.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_3840x2160_webm_av1_18000kbps_60fps_vorbis_stereo_128kbps_48000hz.webm b/tests/tests/media/res/raw/video_3840x2160_webm_av1_18000kbps_60fps_vorbis_stereo_128kbps_48000hz.webm
deleted file mode 100644
index 51e4d27..0000000
--- a/tests/tests/media/res/raw/video_3840x2160_webm_av1_18000kbps_60fps_vorbis_stereo_128kbps_48000hz.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4 b/tests/tests/media/res/raw/video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4
deleted file mode 100644
index 601dda1..0000000
--- a/tests/tests/media/res/raw/video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_480x360_mp4_h264_1000kbps_30fps_aac_stereo_128kbps_44100hz.mp4 b/tests/tests/media/res/raw/video_480x360_mp4_h264_1000kbps_30fps_aac_stereo_128kbps_44100hz.mp4
deleted file mode 100644
index 571ff44..0000000
--- a/tests/tests/media/res/raw/video_480x360_mp4_h264_1000kbps_30fps_aac_stereo_128kbps_44100hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_480x360_mp4_h264_1350kbps_25fps_aac_stereo_128kbps_44100hz.mp4 b/tests/tests/media/res/raw/video_480x360_mp4_h264_1350kbps_25fps_aac_stereo_128kbps_44100hz.mp4
deleted file mode 100644
index 5772810..0000000
--- a/tests/tests/media/res/raw/video_480x360_mp4_h264_1350kbps_25fps_aac_stereo_128kbps_44100hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz.mp4 b/tests/tests/media/res/raw/video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz.mp4
deleted file mode 100644
index 36cd1b1..0000000
--- a/tests/tests/media/res/raw/video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz_dash.mp4 b/tests/tests/media/res/raw/video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz_dash.mp4
deleted file mode 100644
index 19c4e06..0000000
--- a/tests/tests/media/res/raw/video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz_dash.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz_fragmented.mp4 b/tests/tests/media/res/raw/video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz_fragmented.mp4
deleted file mode 100644
index c321586..0000000
--- a/tests/tests/media/res/raw/video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz_fragmented.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz.mp4 b/tests/tests/media/res/raw/video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz.mp4
deleted file mode 100644
index 63e25b8..0000000
--- a/tests/tests/media/res/raw/video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_480x360_mp4_h264_500kbps_25fps_aac_stereo_128kbps_44100hz.mp4 b/tests/tests/media/res/raw/video_480x360_mp4_h264_500kbps_25fps_aac_stereo_128kbps_44100hz.mp4
deleted file mode 100644
index c5bae27..0000000
--- a/tests/tests/media/res/raw/video_480x360_mp4_h264_500kbps_25fps_aac_stereo_128kbps_44100hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_480x360_mp4_h264_500kbps_25fps_aac_stereo_128kbps_44100hz_id3v2.mp4 b/tests/tests/media/res/raw/video_480x360_mp4_h264_500kbps_25fps_aac_stereo_128kbps_44100hz_id3v2.mp4
deleted file mode 100644
index 0902533..0000000
--- a/tests/tests/media/res/raw/video_480x360_mp4_h264_500kbps_25fps_aac_stereo_128kbps_44100hz_id3v2.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz.mp4 b/tests/tests/media/res/raw/video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz.mp4
deleted file mode 100644
index 5f7c928..0000000
--- a/tests/tests/media/res/raw/video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_480x360_mp4_h264_871kbps_30fps.mp4 b/tests/tests/media/res/raw/video_480x360_mp4_h264_871kbps_30fps.mp4
deleted file mode 100644
index 55a83e7..0000000
--- a/tests/tests/media/res/raw/video_480x360_mp4_h264_871kbps_30fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_480x360_mp4_h264_bframes_495kbps_30fps_editlist.mp4 b/tests/tests/media/res/raw/video_480x360_mp4_h264_bframes_495kbps_30fps_editlist.mp4
deleted file mode 100644
index f91b80d..0000000
--- a/tests/tests/media/res/raw/video_480x360_mp4_h264_bframes_495kbps_30fps_editlist.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_480x360_mp4_hevc_650kbps_30fps_aac_stereo_128kbps_48000hz.mp4 b/tests/tests/media/res/raw/video_480x360_mp4_hevc_650kbps_30fps_aac_stereo_128kbps_48000hz.mp4
deleted file mode 100644
index 8d69e41..0000000
--- a/tests/tests/media/res/raw/video_480x360_mp4_hevc_650kbps_30fps_aac_stereo_128kbps_48000hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_480x360_mp4_mpeg2_1500kbps_30fps_aac_stereo_128kbps_48000hz.mp4 b/tests/tests/media/res/raw/video_480x360_mp4_mpeg2_1500kbps_30fps_aac_stereo_128kbps_48000hz.mp4
deleted file mode 100644
index 33f66a0..0000000
--- a/tests/tests/media/res/raw/video_480x360_mp4_mpeg2_1500kbps_30fps_aac_stereo_128kbps_48000hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz.mp4 b/tests/tests/media/res/raw/video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz.mp4
deleted file mode 100644
index 5dbb6db..0000000
--- a/tests/tests/media/res/raw/video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_480x360_webm_av1_400kbps_30fps_vorbis_stereo_128kbps_48000hz.webm b/tests/tests/media/res/raw/video_480x360_webm_av1_400kbps_30fps_vorbis_stereo_128kbps_48000hz.webm
deleted file mode 100644
index 5671197..0000000
--- a/tests/tests/media/res/raw/video_480x360_webm_av1_400kbps_30fps_vorbis_stereo_128kbps_48000hz.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_48000hz.webm b/tests/tests/media/res/raw/video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_48000hz.webm
deleted file mode 100644
index c101291..0000000
--- a/tests/tests/media/res/raw/video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_48000hz.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_48000hz.webm b/tests/tests/media/res/raw/video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_48000hz.webm
deleted file mode 100644
index 0a33e54..0000000
--- a/tests/tests/media/res/raw/video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_48000hz.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_640x360_mp4_hevc_450kbps_no_b.mp4 b/tests/tests/media/res/raw/video_640x360_mp4_hevc_450kbps_no_b.mp4
deleted file mode 100644
index e19fc72..0000000
--- a/tests/tests/media/res/raw/video_640x360_mp4_hevc_450kbps_no_b.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_640x360_mp4_mpeg2_2000kbps_30fps_aac_stereo_128kbps_48000hz.mp4 b/tests/tests/media/res/raw/video_640x360_mp4_mpeg2_2000kbps_30fps_aac_stereo_128kbps_48000hz.mp4
deleted file mode 100644
index cc502a4..0000000
--- a/tests/tests/media/res/raw/video_640x360_mp4_mpeg2_2000kbps_30fps_aac_stereo_128kbps_48000hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_640x360_webm_av1_470kbps_30fps_vorbis_stereo_128kbps_48000hz.webm b/tests/tests/media/res/raw/video_640x360_webm_av1_470kbps_30fps_vorbis_stereo_128kbps_48000hz.webm
deleted file mode 100644
index 1d99b2c..0000000
--- a/tests/tests/media/res/raw/video_640x360_webm_av1_470kbps_30fps_vorbis_stereo_128kbps_48000hz.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_720x480_mp4_mpeg2_2000kbps_30fps_aac_stereo_128kbps_48000hz.mp4 b/tests/tests/media/res/raw/video_720x480_mp4_mpeg2_2000kbps_30fps_aac_stereo_128kbps_48000hz.mp4
deleted file mode 100644
index c6187fa..0000000
--- a/tests/tests/media/res/raw/video_720x480_mp4_mpeg2_2000kbps_30fps_aac_stereo_128kbps_48000hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_bikes_hdr10plus.webm b/tests/tests/media/res/raw/video_bikes_hdr10plus.webm
deleted file mode 100644
index be1977b..0000000
--- a/tests/tests/media/res/raw/video_bikes_hdr10plus.webm
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_dovi_1920x1080_30fps_dvhe_04.mp4 b/tests/tests/media/res/raw/video_dovi_1920x1080_30fps_dvhe_04.mp4
deleted file mode 100644
index 58f0f5b..0000000
--- a/tests/tests/media/res/raw/video_dovi_1920x1080_30fps_dvhe_04.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_dovi_1920x1080_60fps_dvav_09.mp4 b/tests/tests/media/res/raw/video_dovi_1920x1080_60fps_dvav_09.mp4
deleted file mode 100755
index 0c754d6..0000000
--- a/tests/tests/media/res/raw/video_dovi_1920x1080_60fps_dvav_09.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_dovi_1920x1080_60fps_dvhe_05.mp4 b/tests/tests/media/res/raw/video_dovi_1920x1080_60fps_dvhe_05.mp4
deleted file mode 100644
index 894f308..0000000
--- a/tests/tests/media/res/raw/video_dovi_1920x1080_60fps_dvhe_05.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_dovi_1920x1080_60fps_dvhe_08.mp4 b/tests/tests/media/res/raw/video_dovi_1920x1080_60fps_dvhe_08.mp4
deleted file mode 100755
index 9cc7925..0000000
--- a/tests/tests/media/res/raw/video_dovi_1920x1080_60fps_dvhe_08.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_dovi_3840x2160_30fps_dav1_10.mp4 b/tests/tests/media/res/raw/video_dovi_3840x2160_30fps_dav1_10.mp4
deleted file mode 100644
index aa0f7b2..0000000
--- a/tests/tests/media/res/raw/video_dovi_3840x2160_30fps_dav1_10.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_dovi_3840x2160_30fps_dav1_10_2.mp4 b/tests/tests/media/res/raw/video_dovi_3840x2160_30fps_dav1_10_2.mp4
deleted file mode 100644
index 38e791f..0000000
--- a/tests/tests/media/res/raw/video_dovi_3840x2160_30fps_dav1_10_2.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_h264_30fps_video_h264_30fps_aac_44100hz_aac_44100hz.mp4 b/tests/tests/media/res/raw/video_h264_30fps_video_h264_30fps_aac_44100hz_aac_44100hz.mp4
deleted file mode 100644
index 365f282..0000000
--- a/tests/tests/media/res/raw/video_h264_30fps_video_h264_30fps_aac_44100hz_aac_44100hz.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_h264_main_b_frames.mp4 b/tests/tests/media/res/raw/video_h264_main_b_frames.mp4
deleted file mode 100644
index 448ad3c..0000000
--- a/tests/tests/media/res/raw/video_h264_main_b_frames.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_h264_main_b_frames_frag.mp4 b/tests/tests/media/res/raw/video_h264_main_b_frames_frag.mp4
deleted file mode 100644
index b54a4d6..0000000
--- a/tests/tests/media/res/raw/video_h264_main_b_frames_frag.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_h264_mpeg4_rotate_0.mp4 b/tests/tests/media/res/raw/video_h264_mpeg4_rotate_0.mp4
deleted file mode 100644
index 73a7309..0000000
--- a/tests/tests/media/res/raw/video_h264_mpeg4_rotate_0.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_h264_mpeg4_rotate_180.mp4 b/tests/tests/media/res/raw/video_h264_mpeg4_rotate_180.mp4
deleted file mode 100644
index 7c6a927..0000000
--- a/tests/tests/media/res/raw/video_h264_mpeg4_rotate_180.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_h264_mpeg4_rotate_270.mp4 b/tests/tests/media/res/raw/video_h264_mpeg4_rotate_270.mp4
deleted file mode 100644
index 684ba40..0000000
--- a/tests/tests/media/res/raw/video_h264_mpeg4_rotate_270.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_h264_mpeg4_rotate_90.mp4 b/tests/tests/media/res/raw/video_h264_mpeg4_rotate_90.mp4
deleted file mode 100644
index 921a58f..0000000
--- a/tests/tests/media/res/raw/video_h264_mpeg4_rotate_90.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_h265_hdr10plus.mp4 b/tests/tests/media/res/raw/video_h265_hdr10plus.mp4
deleted file mode 100644
index e641b2c..0000000
--- a/tests/tests/media/res/raw/video_h265_hdr10plus.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/video_only_176x144_3gp_h263_25fps.mp4 b/tests/tests/media/res/raw/video_only_176x144_3gp_h263_25fps.mp4
deleted file mode 100644
index 944a56d..0000000
--- a/tests/tests/media/res/raw/video_only_176x144_3gp_h263_25fps.mp4
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/voice12_32k_128kbps_15s_ac3_spdif.raw b/tests/tests/media/res/raw/voice12_32k_128kbps_15s_ac3_spdif.raw
deleted file mode 100644
index a2610bd..0000000
--- a/tests/tests/media/res/raw/voice12_32k_128kbps_15s_ac3_spdif.raw
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/voice12_44k_128kbps_15s_ac3_spdif.raw b/tests/tests/media/res/raw/voice12_44k_128kbps_15s_ac3_spdif.raw
deleted file mode 100644
index 4023a5c..0000000
--- a/tests/tests/media/res/raw/voice12_44k_128kbps_15s_ac3_spdif.raw
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/voice12_48k_128kbps_15s_ac3.raw b/tests/tests/media/res/raw/voice12_48k_128kbps_15s_ac3.raw
deleted file mode 100644
index e8b46af..0000000
--- a/tests/tests/media/res/raw/voice12_48k_128kbps_15s_ac3.raw
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/voice12_48k_128kbps_15s_ac3_readme.txt b/tests/tests/media/res/raw/voice12_48k_128kbps_15s_ac3_readme.txt
deleted file mode 100644
index 3073d48..0000000
--- a/tests/tests/media/res/raw/voice12_48k_128kbps_15s_ac3_readme.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-file=voice12_48k_128kbps_15s.raw
-author=Phil Burk
-copyright=2016 Google Inc
-license=Apache Open Source V2
-channels=2
-encoding=AC3
-rate=48000
diff --git a/tests/tests/media/res/raw/voice12_48k_128kbps_15s_ac3_spdif.raw b/tests/tests/media/res/raw/voice12_48k_128kbps_15s_ac3_spdif.raw
deleted file mode 100644
index 3215769..0000000
--- a/tests/tests/media/res/raw/voice12_48k_128kbps_15s_ac3_spdif.raw
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/volantis.jpg b/tests/tests/media/res/raw/volantis.jpg
deleted file mode 100644
index cfe300f..0000000
--- a/tests/tests/media/res/raw/volantis.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_00.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_00.vp9
deleted file mode 100644
index 1d65e32..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_00.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_00_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_00_vp9_md5
deleted file mode 100644
index aa90d5a..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_00_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-c3fbb7abbdb5bd4ed4a7e34768c17df1  vp90-2-00-quantizer-00-352x288-0001.i420
-08203c2595bdb2d58ead6f921345d699  vp90-2-00-quantizer-00-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_01.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_01.vp9
deleted file mode 100644
index c2aebcf..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_01.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_01_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_01_vp9_md5
deleted file mode 100644
index 85e12ba..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_01_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-f041b870cf9236d5f22e2b08a77d5958  vp90-2-00-quantizer-01-352x288-0001.i420
-cbdb7526986ae15592891488c9afc84c  vp90-2-00-quantizer-01-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_02.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_02.vp9
deleted file mode 100644
index 6baa992..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_02.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_02_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_02_vp9_md5
deleted file mode 100644
index e1bbcaa..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_02_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-98048cfdb4af5059f4085c5acc94ef8f  vp90-2-00-quantizer-02-352x288-0001.i420
-8160183e1eed1d0af4427be216b8b9f7  vp90-2-00-quantizer-02-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_03.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_03.vp9
deleted file mode 100644
index 7b7ead0..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_03.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_03_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_03_vp9_md5
deleted file mode 100644
index fb6f597..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_03_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-15c548208f5eda243a151a42f4d64855  vp90-2-00-quantizer-03-352x288-0001.i420
-e96d463dc8e9b27b1c2ec40f77eee6ef  vp90-2-00-quantizer-03-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_04.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_04.vp9
deleted file mode 100644
index 4eb17d0..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_04.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_04_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_04_vp9_md5
deleted file mode 100644
index fbe7558..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_04_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-928c64a0747ac57ab50c1520d694fea7  vp90-2-00-quantizer-04-352x288-0001.i420
-a6f6daa293231e95ef30ed168f582c84  vp90-2-00-quantizer-04-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_05.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_05.vp9
deleted file mode 100644
index b11f071..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_05.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_05_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_05_vp9_md5
deleted file mode 100644
index 4977060..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_05_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-082460718b7d7046c8fb23184b7f71ca  vp90-2-00-quantizer-05-352x288-0001.i420
-4a41aad51c40a92df72333e13f47d3fe  vp90-2-00-quantizer-05-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_06.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_06.vp9
deleted file mode 100644
index 11e2814..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_06.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_06_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_06_vp9_md5
deleted file mode 100644
index 2a90a40..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_06_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-cfca1bed96ff62a69b2d841fda01c6b9  vp90-2-00-quantizer-06-352x288-0001.i420
-9b4d61f1b998745c108f8eb67925e03d  vp90-2-00-quantizer-06-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_07.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_07.vp9
deleted file mode 100644
index 38f752c..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_07.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_07_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_07_vp9_md5
deleted file mode 100644
index 6b77e7f..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_07_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-6f5122064bead9d9882bec2698a6ed9c  vp90-2-00-quantizer-07-352x288-0001.i420
-50dae67d2f57a76eece210dee8b6df9e  vp90-2-00-quantizer-07-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_08.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_08.vp9
deleted file mode 100644
index a666e85..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_08.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_08_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_08_vp9_md5
deleted file mode 100644
index d0dba67..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_08_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-eb3d6985fcda5d93dd62d53354e8a093  vp90-2-00-quantizer-08-352x288-0001.i420
-5b1f5b7780b4cafe1f75e56a0b526643  vp90-2-00-quantizer-08-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_09.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_09.vp9
deleted file mode 100644
index d5e9268..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_09.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_09_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_09_vp9_md5
deleted file mode 100644
index a1d78c2..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_09_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-d7ccaf28c59875fe91983def5490d2b1  vp90-2-00-quantizer-09-352x288-0001.i420
-bd98fe9492054826748de840b4495309  vp90-2-00-quantizer-09-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_10.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_10.vp9
deleted file mode 100644
index ad74ec5..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_10.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_10_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_10_vp9_md5
deleted file mode 100644
index cc8a716..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_10_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-20dda6231f9801c9c237c6d09d9939b6  vp90-2-00-quantizer-10-352x288-0001.i420
-23c91e93807fb9a4ed5bd5bdd449d99f  vp90-2-00-quantizer-10-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_11.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_11.vp9
deleted file mode 100644
index 144a555..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_11.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_11_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_11_vp9_md5
deleted file mode 100644
index 39464f2..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_11_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-960833315ebcdee97f46c4d98d0f3fef  vp90-2-00-quantizer-11-352x288-0001.i420
-eec40507d17b64b7895a61cb87b2096a  vp90-2-00-quantizer-11-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_12.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_12.vp9
deleted file mode 100644
index c831b57..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_12.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_12_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_12_vp9_md5
deleted file mode 100644
index 57e7dbe..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_12_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-6533224d3b6ba1ec0dd973bbe56c6349  vp90-2-00-quantizer-12-352x288-0001.i420
-12ceadc6d28327a24a75f8c40b6084d1  vp90-2-00-quantizer-12-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_13.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_13.vp9
deleted file mode 100644
index 168bca9..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_13.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_13_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_13_vp9_md5
deleted file mode 100644
index 03acb52..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_13_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-7268de6756014f79a56dcf010c52a97f  vp90-2-00-quantizer-13-352x288-0001.i420
-9e39e9b0e2295b8460dfa05f44762771  vp90-2-00-quantizer-13-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_14.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_14.vp9
deleted file mode 100644
index 0113e12..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_14.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_14_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_14_vp9_md5
deleted file mode 100644
index 2525db5..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_14_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-57e9e333c641fa952f7485b788df225a  vp90-2-00-quantizer-14-352x288-0001.i420
-551f0cea83dcdf4540c3983736757874  vp90-2-00-quantizer-14-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_15.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_15.vp9
deleted file mode 100644
index fe7add2..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_15.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_15_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_15_vp9_md5
deleted file mode 100644
index c6e5377..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_15_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-17a0a2842856b9e89aede237648d5dda  vp90-2-00-quantizer-15-352x288-0001.i420
-c9fcade888a38621bebe3d4b41664245  vp90-2-00-quantizer-15-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_16.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_16.vp9
deleted file mode 100644
index c9c35b4..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_16.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_16_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_16_vp9_md5
deleted file mode 100644
index c1abf24..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_16_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-6cc2089e9a3d352fe10b59ccd935c677  vp90-2-00-quantizer-16-352x288-0001.i420
-d165bf7b9cb901e121a65038758d8613  vp90-2-00-quantizer-16-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_17.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_17.vp9
deleted file mode 100644
index cd8dd67..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_17.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_17_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_17_vp9_md5
deleted file mode 100644
index 40d8f03..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_17_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-bc80511c83162c09661f155cd29f6dd8  vp90-2-00-quantizer-17-352x288-0001.i420
-a62f1cbdb3f86d2fb4c880cfd917def5  vp90-2-00-quantizer-17-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_18.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_18.vp9
deleted file mode 100644
index 4b0fe9f..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_18.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_18_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_18_vp9_md5
deleted file mode 100644
index 3cb5fbe..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_18_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-b2d350f6faa41cb50c2e8a9907d0f4a5  vp90-2-00-quantizer-18-352x288-0001.i420
-39b4380d16bc8e093dd4dba475175fb3  vp90-2-00-quantizer-18-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_19.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_19.vp9
deleted file mode 100644
index f14d8d6..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_19.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_19_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_19_vp9_md5
deleted file mode 100644
index 36dbdac..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_19_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-441e09be3c15fcb240afd74bb7a10a72  vp90-2-00-quantizer-19-352x288-0001.i420
-32ae5dac876ca5d5ae6ab7c74f4dc25d  vp90-2-00-quantizer-19-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_20.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_20.vp9
deleted file mode 100644
index 062fd61..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_20.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_20_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_20_vp9_md5
deleted file mode 100644
index ca80f66..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_20_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-7786eb9944dba0553e129133523a98c1  vp90-2-00-quantizer-20-352x288-0001.i420
-206d888f8453427f10a40aa8bf5f6df0  vp90-2-00-quantizer-20-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_21.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_21.vp9
deleted file mode 100644
index 500950c..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_21.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_21_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_21_vp9_md5
deleted file mode 100644
index b31ac9e..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_21_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-aab95e195be71feca050a839d7b3154d  vp90-2-00-quantizer-21-352x288-0001.i420
-02a05d699bbbdc477e34bb0dad9f0391  vp90-2-00-quantizer-21-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_22.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_22.vp9
deleted file mode 100644
index 88dad68..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_22.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_22_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_22_vp9_md5
deleted file mode 100644
index 8f50f51..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_22_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-41f853c3ee2d4611b645cc643d82e287  vp90-2-00-quantizer-22-352x288-0001.i420
-1c240c653110ff8609ca0f0287a6496d  vp90-2-00-quantizer-22-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_23.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_23.vp9
deleted file mode 100644
index 1834017..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_23.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_23_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_23_vp9_md5
deleted file mode 100644
index ea0aaaa..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_23_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-bc5b07369df50c8f97ce1a377fe513cf  vp90-2-00-quantizer-23-352x288-0001.i420
-ce62ddb4f3e305d0f8587ae8bb44cc79  vp90-2-00-quantizer-23-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_24.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_24.vp9
deleted file mode 100644
index d9dac53..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_24.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_24_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_24_vp9_md5
deleted file mode 100644
index 49f378f..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_24_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-982d54041221c977b6f0e37a9236cc76  vp90-2-00-quantizer-24-352x288-0001.i420
-57631e7f13f645c834e2944ebfd6d40e  vp90-2-00-quantizer-24-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_25.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_25.vp9
deleted file mode 100644
index e04f1b6..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_25.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_25_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_25_vp9_md5
deleted file mode 100644
index 90ed556..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_25_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-b0fb55f3f2f56b3d27038e83c10123ce  vp90-2-00-quantizer-25-352x288-0001.i420
-9fcac3becdcc2d30d778a55eca4c2018  vp90-2-00-quantizer-25-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_26.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_26.vp9
deleted file mode 100644
index 3b5abd3..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_26.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_26_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_26_vp9_md5
deleted file mode 100644
index dbec99c..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_26_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-4f645e0f354da77b9e2f2a6753c361da  vp90-2-00-quantizer-26-352x288-0001.i420
-b7542998ec298273ca662bc9b658d10e  vp90-2-00-quantizer-26-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_27.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_27.vp9
deleted file mode 100644
index 6dbea83..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_27.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_27_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_27_vp9_md5
deleted file mode 100644
index 14ec691..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_27_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-6edc96a3747cad43828397045764206e  vp90-2-00-quantizer-27-352x288-0001.i420
-5fbc65d20fdca1abd69079851ce676d3  vp90-2-00-quantizer-27-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_28.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_28.vp9
deleted file mode 100644
index 8f928cc..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_28.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_28_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_28_vp9_md5
deleted file mode 100644
index 0e2d177..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_28_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-5db3e910e70da38bb91d01d73acc33dd  vp90-2-00-quantizer-28-352x288-0001.i420
-b920ee7f7e61b7fdf9f44b1f738d0292  vp90-2-00-quantizer-28-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_29.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_29.vp9
deleted file mode 100644
index f343340..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_29.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_29_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_29_vp9_md5
deleted file mode 100644
index 1187388..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_29_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-3cb3e310be5305077efa6216f6f10654  vp90-2-00-quantizer-29-352x288-0001.i420
-692d3e098af5978fe1a898ebc1a66a7a  vp90-2-00-quantizer-29-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_30.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_30.vp9
deleted file mode 100644
index f6ce3c8..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_30.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_30_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_30_vp9_md5
deleted file mode 100644
index 39a6f82..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_30_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-e3b3cea66ea38c5dfba1aa73bb4c611d  vp90-2-00-quantizer-30-352x288-0001.i420
-42bb3e54b19c3f4c4f7ee3a6ba012e19  vp90-2-00-quantizer-30-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_31.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_31.vp9
deleted file mode 100644
index e83141f..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_31.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_31_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_31_vp9_md5
deleted file mode 100644
index 9d84937..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_31_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-2523e9ecfd3781eafcd7da192dc105e9  vp90-2-00-quantizer-31-352x288-0001.i420
-6d5feea012b9a1f51fc643633e728764  vp90-2-00-quantizer-31-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_32.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_32.vp9
deleted file mode 100644
index 5987ec8..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_32.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_32_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_32_vp9_md5
deleted file mode 100644
index 5e6cdde..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_32_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-0a0305eba36500ebf6cc6cc0f01f5a3b  vp90-2-00-quantizer-32-352x288-0001.i420
-2c76bcd6763467f9057a726fbcf50ab1  vp90-2-00-quantizer-32-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_33.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_33.vp9
deleted file mode 100644
index c053597..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_33.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_33_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_33_vp9_md5
deleted file mode 100644
index 4604865..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_33_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-c68433e0e94047c220be9b629334f744  vp90-2-00-quantizer-33-352x288-0001.i420
-fcfa4dff7a39bc9c5e315849ecbb46ea  vp90-2-00-quantizer-33-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_34.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_34.vp9
deleted file mode 100644
index 3b13d0c..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_34.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_34_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_34_vp9_md5
deleted file mode 100644
index 42ec3bd..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_34_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-ad9dc2f912c137b014a33e2792c88a25  vp90-2-00-quantizer-34-352x288-0001.i420
-11221ee4ea5c776f43af68756682cd5a  vp90-2-00-quantizer-34-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_35.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_35.vp9
deleted file mode 100644
index 9e88eaf..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_35.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_35_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_35_vp9_md5
deleted file mode 100644
index 7467703..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_35_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-75031f898cccf303a64ab46b1f815389  vp90-2-00-quantizer-35-352x288-0001.i420
-a4fc864e7fbc470dfcab6207e0eea152  vp90-2-00-quantizer-35-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_36.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_36.vp9
deleted file mode 100644
index 89095d8..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_36.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_36_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_36_vp9_md5
deleted file mode 100644
index f83c5fd..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_36_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-c7824af009fde6cafdd8d39fae6bb6cf  vp90-2-00-quantizer-36-352x288-0001.i420
-516a82d5fc4dfa3daf713ed2ec36041b  vp90-2-00-quantizer-36-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_37.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_37.vp9
deleted file mode 100644
index 51ea020..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_37.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_37_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_37_vp9_md5
deleted file mode 100644
index 56ae9cf..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_37_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-a2e5c820fd9733e18f9349fb658ca281  vp90-2-00-quantizer-37-352x288-0001.i420
-fb23e0bc64728a492a33d985032f21b8  vp90-2-00-quantizer-37-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_38.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_38.vp9
deleted file mode 100644
index b502d01..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_38.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_38_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_38_vp9_md5
deleted file mode 100644
index 5c70650..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_38_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-8347bfb891317e89ef66781d6c28e24f  vp90-2-00-quantizer-38-352x288-0001.i420
-a5722f824d32deac042513a1a7dcdcd0  vp90-2-00-quantizer-38-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_39.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_39.vp9
deleted file mode 100644
index 559a435..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_39.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_39_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_39_vp9_md5
deleted file mode 100644
index 7c9fece..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_39_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-018968f97fac3bdff146cf22c1da5ef0  vp90-2-00-quantizer-39-352x288-0001.i420
-ca8b09b01e5132183395e238f1c7901e  vp90-2-00-quantizer-39-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_40.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_40.vp9
deleted file mode 100644
index 2cbb549..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_40.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_40_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_40_vp9_md5
deleted file mode 100644
index 6b3c92a..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_40_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-792660f6589ad5340be4bd0554435866  vp90-2-00-quantizer-40-352x288-0001.i420
-68c84c8a15d679e0a73678b93215c62c  vp90-2-00-quantizer-40-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_41.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_41.vp9
deleted file mode 100644
index 910d486..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_41.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_41_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_41_vp9_md5
deleted file mode 100644
index 7df4a7f..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_41_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-a456bdfc6c1c07b4cb3a3848843743b9  vp90-2-00-quantizer-41-352x288-0001.i420
-fe41a12b8cb6bc5667ba2179e076f3b0  vp90-2-00-quantizer-41-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_42.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_42.vp9
deleted file mode 100644
index 53c6b55..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_42.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_42_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_42_vp9_md5
deleted file mode 100644
index 4abe677..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_42_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-f016dd8431694d989700fb1ba71a5b2d  vp90-2-00-quantizer-42-352x288-0001.i420
-e89c3c5b935157b40f2fb0ab92415828  vp90-2-00-quantizer-42-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_43.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_43.vp9
deleted file mode 100644
index 0d3e706..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_43.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_43_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_43_vp9_md5
deleted file mode 100644
index 2db4096..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_43_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-7b8ab82625f3006bac89d4fb5197e71c  vp90-2-00-quantizer-43-352x288-0001.i420
-18bd3716045563dfba2c72b640b3274b  vp90-2-00-quantizer-43-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_44.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_44.vp9
deleted file mode 100644
index 4b1c580..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_44.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_44_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_44_vp9_md5
deleted file mode 100644
index aa705be..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_44_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-66fde04d8320c750e56406feefd29979  vp90-2-00-quantizer-44-352x288-0001.i420
-f9d01d8fc1722ec345e624e14b404215  vp90-2-00-quantizer-44-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_45.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_45.vp9
deleted file mode 100644
index 12779d6..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_45.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_45_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_45_vp9_md5
deleted file mode 100644
index 4472c2f..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_45_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-cc97597b015896d73f3e60e7ae44c4da  vp90-2-00-quantizer-45-352x288-0001.i420
-fea98bc508f92135641ab99762444b14  vp90-2-00-quantizer-45-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_46.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_46.vp9
deleted file mode 100644
index 8f1aff1..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_46.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_46_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_46_vp9_md5
deleted file mode 100644
index bb306b1..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_46_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-79ed95c741178bb3c0954f1f6f8e21a3  vp90-2-00-quantizer-46-352x288-0001.i420
-f02a06a5e2b5b7619c9a52c5bea0564d  vp90-2-00-quantizer-46-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_47.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_47.vp9
deleted file mode 100644
index e8d81b4..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_47.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_47_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_47_vp9_md5
deleted file mode 100644
index 5734952..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_47_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-9b98e948b8c2a822f21bd8419e6f4410  vp90-2-00-quantizer-47-352x288-0001.i420
-491382d68c16c2a3c6f1746598bc4a97  vp90-2-00-quantizer-47-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_48.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_48.vp9
deleted file mode 100644
index 9644566..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_48.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_48_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_48_vp9_md5
deleted file mode 100644
index 0b79523..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_48_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-f0f095b0edae7262f44d7ed7ef84ded4  vp90-2-00-quantizer-48-352x288-0001.i420
-0e833889ccac81d60251007d1baf6500  vp90-2-00-quantizer-48-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_49.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_49.vp9
deleted file mode 100644
index c0efd85..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_49.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_49_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_49_vp9_md5
deleted file mode 100644
index 72f8300..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_49_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-6c1b7b7827617fb9b8417aca2cfdbcaa  vp90-2-00-quantizer-49-352x288-0001.i420
-4c1fc8a89297fdcf79f0faabd42b8684  vp90-2-00-quantizer-49-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_50.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_50.vp9
deleted file mode 100644
index 3797305..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_50.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_50_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_50_vp9_md5
deleted file mode 100644
index f104046..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_50_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-ca6142db68463487bc28c888ab38476c  vp90-2-00-quantizer-50-352x288-0001.i420
-02a71153ec70f569524c3d814cb62f86  vp90-2-00-quantizer-50-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_51.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_51.vp9
deleted file mode 100644
index ad66216..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_51.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_51_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_51_vp9_md5
deleted file mode 100644
index 7874a6f..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_51_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-eece2627df1ddf0872256eb92352e179  vp90-2-00-quantizer-51-352x288-0001.i420
-0ee9f221246ad747250e4b5e8ba586e2  vp90-2-00-quantizer-51-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_52.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_52.vp9
deleted file mode 100644
index b729121..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_52.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_52_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_52_vp9_md5
deleted file mode 100644
index d5092d6..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_52_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-7290039d974c4e50db9d69f9864bcdbe  vp90-2-00-quantizer-52-352x288-0001.i420
-264765de9d02503038a4da54133b9f85  vp90-2-00-quantizer-52-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_53.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_53.vp9
deleted file mode 100644
index eace52e..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_53.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_53_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_53_vp9_md5
deleted file mode 100644
index 3566f61..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_53_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-917af24da66f143a56a01eb2c2254285  vp90-2-00-quantizer-53-352x288-0001.i420
-45a05d3bc644420519619e4115662a70  vp90-2-00-quantizer-53-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_54.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_54.vp9
deleted file mode 100644
index 0100c2b..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_54.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_54_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_54_vp9_md5
deleted file mode 100644
index 96fdd4b6..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_54_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-6fea2820bb10a9dec9add4d2452b01f5  vp90-2-00-quantizer-54-352x288-0001.i420
-74675169a4bfc2ff5463c4db5d85a79f  vp90-2-00-quantizer-54-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_55.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_55.vp9
deleted file mode 100644
index d84bbb2..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_55.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_55_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_55_vp9_md5
deleted file mode 100644
index ec38867..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_55_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-11e5d196f6537fb7d85988d90195e556  vp90-2-00-quantizer-55-352x288-0001.i420
-8536106795f7c93c5a43a11493527469  vp90-2-00-quantizer-55-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_56.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_56.vp9
deleted file mode 100644
index befee07..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_56.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_56_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_56_vp9_md5
deleted file mode 100644
index a93ced9..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_56_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-40839b7a3a40ec10f96b8a75224f646d  vp90-2-00-quantizer-56-352x288-0001.i420
-11408dd73e8c45ddaab99f5c9650102b  vp90-2-00-quantizer-56-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_57.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_57.vp9
deleted file mode 100644
index 7df44d5..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_57.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_57_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_57_vp9_md5
deleted file mode 100644
index 1979cd8..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_57_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-d0e9fa03dd48da4592ebaadb4e3794e0  vp90-2-00-quantizer-57-352x288-0001.i420
-5172e29b1e04cd543833d6a68aab297c  vp90-2-00-quantizer-57-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_58.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_58.vp9
deleted file mode 100644
index 49a5fa9..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_58.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_58_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_58_vp9_md5
deleted file mode 100644
index cb06866..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_58_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-bef4a27d460e7697e038fe6f1c8bd597  vp90-2-00-quantizer-58-352x288-0001.i420
-124674686cafc5f2ff5bc7ea412b8f3b  vp90-2-00-quantizer-58-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_59.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_59.vp9
deleted file mode 100644
index fd50ac3..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_59.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_59_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_59_vp9_md5
deleted file mode 100644
index 240ea59..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_59_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-ae9d99e9d16ef20073300559566844ae  vp90-2-00-quantizer-59-352x288-0001.i420
-da9405e5a6bfe4ed18d927ba2004008e  vp90-2-00-quantizer-59-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_60.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_60.vp9
deleted file mode 100644
index d2caca9..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_60.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_60_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_60_vp9_md5
deleted file mode 100644
index 550fee9..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_60_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-9e66bb8e1b5e206ea4afe4bf2d335ac5  vp90-2-00-quantizer-60-352x288-0001.i420
-092b74c905c12c1e87e90f5a79857736  vp90-2-00-quantizer-60-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_61.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_61.vp9
deleted file mode 100644
index f20df40..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_61.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_61_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_61_vp9_md5
deleted file mode 100644
index 2e3edd3..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_61_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-d062dc6be246c8042744018765ef50a8  vp90-2-00-quantizer-61-352x288-0001.i420
-45fd9cbacb6a91060a7e49a58a85869d  vp90-2-00-quantizer-61-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_62.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_62.vp9
deleted file mode 100644
index 2b8fd32..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_62.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_62_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_62_vp9_md5
deleted file mode 100644
index 1d266b3..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_62_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-62f7e42fe653e81c5a65a25389e045b5  vp90-2-00-quantizer-62-352x288-0001.i420
-cb0cdd0b25689e0a43328550011d960d  vp90-2-00-quantizer-62-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_63.vp9 b/tests/tests/media/res/raw/vp90_2_00_quantizer_63.vp9
deleted file mode 100644
index 28c2564..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_63.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_00_quantizer_63_vp9_md5 b/tests/tests/media/res/raw/vp90_2_00_quantizer_63_vp9_md5
deleted file mode 100644
index b5d122f..0000000
--- a/tests/tests/media/res/raw/vp90_2_00_quantizer_63_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-8467643dceff827e04acd82eeff1d1b0  vp90-2-00-quantizer-63-352x288-0001.i420
-c786f49d66f4dfd685dea9605821a19f  vp90-2-00-quantizer-63-352x288-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_01_sharpness_1.vp9 b/tests/tests/media/res/raw/vp90_2_01_sharpness_1.vp9
deleted file mode 100644
index dd0f0ee..0000000
--- a/tests/tests/media/res/raw/vp90_2_01_sharpness_1.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_01_sharpness_1_vp9_md5 b/tests/tests/media/res/raw/vp90_2_01_sharpness_1_vp9_md5
deleted file mode 100644
index 1db2ed2..0000000
--- a/tests/tests/media/res/raw/vp90_2_01_sharpness_1_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-a2e5c820fd9733e18f9349fb658ca281  vp90-2-01-sharpness-1-352x288-0001.i420
-aa20a75be3a316193496706c9f760d08  vp90-2-01-sharpness-1-352x288-0002.i420
-95567be97a64d3c9efe45f2524116a2e  vp90-2-01-sharpness-1-352x288-0003.i420
-219e86cd6b3cca312856eead21776b1c  vp90-2-01-sharpness-1-352x288-0004.i420
-4a67fd359ca362398e97c15eb018a2bb  vp90-2-01-sharpness-1-352x288-0005.i420
-9916d4e359274d690827f0eb22547423  vp90-2-01-sharpness-1-352x288-0006.i420
-a07785b52561150c48f1a8eff89d5d75  vp90-2-01-sharpness-1-352x288-0007.i420
-a3382a92982953dfa20018e5ac975b51  vp90-2-01-sharpness-1-352x288-0008.i420
-911836989ca7b148438aa3ec7fc7e303  vp90-2-01-sharpness-1-352x288-0009.i420
-5627b981e3fc9e4401d35d3a5ab25917  vp90-2-01-sharpness-1-352x288-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_01_sharpness_2.vp9 b/tests/tests/media/res/raw/vp90_2_01_sharpness_2.vp9
deleted file mode 100644
index d1d1a06..0000000
--- a/tests/tests/media/res/raw/vp90_2_01_sharpness_2.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_01_sharpness_2_vp9_md5 b/tests/tests/media/res/raw/vp90_2_01_sharpness_2_vp9_md5
deleted file mode 100644
index cb4d78e..0000000
--- a/tests/tests/media/res/raw/vp90_2_01_sharpness_2_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-a2e5c820fd9733e18f9349fb658ca281  vp90-2-01-sharpness-2-352x288-0001.i420
-cd94572239817ae7c9b07de739c3272b  vp90-2-01-sharpness-2-352x288-0002.i420
-383cf752d457e122b5ff49d08960208e  vp90-2-01-sharpness-2-352x288-0003.i420
-1c0a6ec9cd3ce29b8b004e7526f1b07e  vp90-2-01-sharpness-2-352x288-0004.i420
-91c42a8a108d67947cabfc2a5a80df66  vp90-2-01-sharpness-2-352x288-0005.i420
-08c57fc1f3fec0305883315a66c714d1  vp90-2-01-sharpness-2-352x288-0006.i420
-70cb8d8dc83eac82f2d3c4b0376bb1aa  vp90-2-01-sharpness-2-352x288-0007.i420
-ffd62a9ef829ec81f0f74f740488a41f  vp90-2-01-sharpness-2-352x288-0008.i420
-bab0aa23b5854e2a70926046e4618710  vp90-2-01-sharpness-2-352x288-0009.i420
-fec456f38f2a43661e786a8d5f67ed15  vp90-2-01-sharpness-2-352x288-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_01_sharpness_3.vp9 b/tests/tests/media/res/raw/vp90_2_01_sharpness_3.vp9
deleted file mode 100644
index ac4d3c7..0000000
--- a/tests/tests/media/res/raw/vp90_2_01_sharpness_3.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_01_sharpness_3_vp9_md5 b/tests/tests/media/res/raw/vp90_2_01_sharpness_3_vp9_md5
deleted file mode 100644
index 5f66ebd..0000000
--- a/tests/tests/media/res/raw/vp90_2_01_sharpness_3_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-a2e5c820fd9733e18f9349fb658ca281  vp90-2-01-sharpness-3-352x288-0001.i420
-0d487a146393a0b8b84b4be1b371b507  vp90-2-01-sharpness-3-352x288-0002.i420
-68372e191eba620a431cfff226026ac3  vp90-2-01-sharpness-3-352x288-0003.i420
-de7fd274460e36b983fe93acc208d72f  vp90-2-01-sharpness-3-352x288-0004.i420
-afbd36c61bab65b98ff9acf08e215721  vp90-2-01-sharpness-3-352x288-0005.i420
-e1e9fc2ab4e7a187a8d8d84aae48d6b9  vp90-2-01-sharpness-3-352x288-0006.i420
-11d95de6a9cc5e00511e99534779faac  vp90-2-01-sharpness-3-352x288-0007.i420
-cd2f5539fdfc2d8eefe6b6da28c13398  vp90-2-01-sharpness-3-352x288-0008.i420
-a8b3aeed41da7aeb8d5b962ee4a4af93  vp90-2-01-sharpness-3-352x288-0009.i420
-4283670bd1c1c506ef18d3dafca22035  vp90-2-01-sharpness-3-352x288-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_01_sharpness_4.vp9 b/tests/tests/media/res/raw/vp90_2_01_sharpness_4.vp9
deleted file mode 100644
index 4f9ac94..0000000
--- a/tests/tests/media/res/raw/vp90_2_01_sharpness_4.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_01_sharpness_4_vp9_md5 b/tests/tests/media/res/raw/vp90_2_01_sharpness_4_vp9_md5
deleted file mode 100644
index dc3f2c1..0000000
--- a/tests/tests/media/res/raw/vp90_2_01_sharpness_4_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-a2e5c820fd9733e18f9349fb658ca281  vp90-2-01-sharpness-4-352x288-0001.i420
-8bad76c55b5149169d64ce6512521de6  vp90-2-01-sharpness-4-352x288-0002.i420
-c1d986e1f9bf46382e598ba289b9bd7c  vp90-2-01-sharpness-4-352x288-0003.i420
-86c097ac6069c786023d3561dae68bac  vp90-2-01-sharpness-4-352x288-0004.i420
-8c238a2831b8c7c49736b6de6ff76ed8  vp90-2-01-sharpness-4-352x288-0005.i420
-cb5a038ed0a74a317ee72dae93a7ee3e  vp90-2-01-sharpness-4-352x288-0006.i420
-f8fe330a257e3e4e4c39c1c12820a654  vp90-2-01-sharpness-4-352x288-0007.i420
-a73e2fcdcbb9334c0c123f8276a2c881  vp90-2-01-sharpness-4-352x288-0008.i420
-24fccece8ee639e4d0e00e4060e1db0c  vp90-2-01-sharpness-4-352x288-0009.i420
-46d6e9aad69a39c718c5fd1e41e86e6e  vp90-2-01-sharpness-4-352x288-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_01_sharpness_5.vp9 b/tests/tests/media/res/raw/vp90_2_01_sharpness_5.vp9
deleted file mode 100644
index 7f5e528..0000000
--- a/tests/tests/media/res/raw/vp90_2_01_sharpness_5.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_01_sharpness_5_vp9_md5 b/tests/tests/media/res/raw/vp90_2_01_sharpness_5_vp9_md5
deleted file mode 100644
index a545e7c..0000000
--- a/tests/tests/media/res/raw/vp90_2_01_sharpness_5_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-a2e5c820fd9733e18f9349fb658ca281  vp90-2-01-sharpness-5-352x288-0001.i420
-f1ce0a5d57a46c9ff1331804b7b03fdb  vp90-2-01-sharpness-5-352x288-0002.i420
-0364a085b06bee6b980189cf5378eda9  vp90-2-01-sharpness-5-352x288-0003.i420
-4b5358698d734b0ae210909a913d4c1e  vp90-2-01-sharpness-5-352x288-0004.i420
-dc22565aaceee77b15fd8ab3c84bd5e0  vp90-2-01-sharpness-5-352x288-0005.i420
-5f6340b656536292b46ba9a647aeb6e4  vp90-2-01-sharpness-5-352x288-0006.i420
-b7d4bce9a04b2a6caa45801be15e331e  vp90-2-01-sharpness-5-352x288-0007.i420
-534c851cfe59ffc047815ece98d8cede  vp90-2-01-sharpness-5-352x288-0008.i420
-786b0e1564d5c71aabfc2dd528cff4e7  vp90-2-01-sharpness-5-352x288-0009.i420
-cac0366209cf471bb7cc3e64966cbbd4  vp90-2-01-sharpness-5-352x288-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_01_sharpness_6.vp9 b/tests/tests/media/res/raw/vp90_2_01_sharpness_6.vp9
deleted file mode 100644
index 5f8d031..0000000
--- a/tests/tests/media/res/raw/vp90_2_01_sharpness_6.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_01_sharpness_6_vp9_md5 b/tests/tests/media/res/raw/vp90_2_01_sharpness_6_vp9_md5
deleted file mode 100644
index 0c36072..0000000
--- a/tests/tests/media/res/raw/vp90_2_01_sharpness_6_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-a2e5c820fd9733e18f9349fb658ca281  vp90-2-01-sharpness-6-352x288-0001.i420
-45d9ca07ed04210b1ebc743169bc8ec4  vp90-2-01-sharpness-6-352x288-0002.i420
-5b646cc309a711f1d8814f925002d8c4  vp90-2-01-sharpness-6-352x288-0003.i420
-34db8db727fa1ded0a55cc7cf85be249  vp90-2-01-sharpness-6-352x288-0004.i420
-54173d08afe6369b16a9c0c9cc6ce04d  vp90-2-01-sharpness-6-352x288-0005.i420
-76275b0a478cdb3c1fb527ebbce023c3  vp90-2-01-sharpness-6-352x288-0006.i420
-e7643cdf0c42f2af700d8730bfc1a453  vp90-2-01-sharpness-6-352x288-0007.i420
-6e53097e56f680cb658d63100e7736f7  vp90-2-01-sharpness-6-352x288-0008.i420
-1a407c3c8ea1d5245ae68c5ce7de70e1  vp90-2-01-sharpness-6-352x288-0009.i420
-6cbca24912cadf09b20be74f14e359c9  vp90-2-01-sharpness-6-352x288-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_01_sharpness_7.vp9 b/tests/tests/media/res/raw/vp90_2_01_sharpness_7.vp9
deleted file mode 100644
index 325523f..0000000
--- a/tests/tests/media/res/raw/vp90_2_01_sharpness_7.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_01_sharpness_7_vp9_md5 b/tests/tests/media/res/raw/vp90_2_01_sharpness_7_vp9_md5
deleted file mode 100644
index 6c94a52..0000000
--- a/tests/tests/media/res/raw/vp90_2_01_sharpness_7_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-a2e5c820fd9733e18f9349fb658ca281  vp90-2-01-sharpness-7-352x288-0001.i420
-f719d0be18d16a448b4e7da3e2d9bf28  vp90-2-01-sharpness-7-352x288-0002.i420
-83ee8ebc0ca796782a2376a76f2ffc26  vp90-2-01-sharpness-7-352x288-0003.i420
-7cf5afdbc229e1af50a5377cfc23d831  vp90-2-01-sharpness-7-352x288-0004.i420
-44244e896e0362f6376ba5afa563ba8b  vp90-2-01-sharpness-7-352x288-0005.i420
-df5f518d44eb6cb91b2df5a30d27ef82  vp90-2-01-sharpness-7-352x288-0006.i420
-43cc3f151b8337aca7ee659c8abeb783  vp90-2-01-sharpness-7-352x288-0007.i420
-4e89573470d9b97464e10806fc81aa8b  vp90-2-01-sharpness-7-352x288-0008.i420
-62e0ba70f07ece8d85372f0a42e83a9a  vp90-2-01-sharpness-7-352x288-0009.i420
-45ac2928acb11326f6c4a21401f3609c  vp90-2-01-sharpness-7-352x288-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_08x08.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_08x08.vp9
deleted file mode 100644
index 269acbb..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_08x08.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_08x08_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_08x08_vp9_md5
deleted file mode 100644
index c74db82..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_08x08_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-52def242c36123e5a8f5f53d6a971399  vp90-2-02-size-08x08-8x8-0001.i420
-79c93360fbd47179400414bbfee0901c  vp90-2-02-size-08x08-8x8-0002.i420
-c3b1947c79537baa7838905276276a91  vp90-2-02-size-08x08-8x8-0003.i420
-20f35e501bdee0bc63e87b9240265c25  vp90-2-02-size-08x08-8x8-0004.i420
-5e8f1c464bafd54833c51860906b5368  vp90-2-02-size-08x08-8x8-0005.i420
-f57b592600dfc99e634a083278af769a  vp90-2-02-size-08x08-8x8-0006.i420
-7b02191f85590cbad3f148c7b92d6436  vp90-2-02-size-08x08-8x8-0007.i420
-b0a1c9870447a1744f64cd4087ef55ee  vp90-2-02-size-08x08-8x8-0008.i420
-c82712b1ba7a95efb67cbdde0ad708b6  vp90-2-02-size-08x08-8x8-0009.i420
-89f4539f8d7a7b45a91fd2f46335988e  vp90-2-02-size-08x08-8x8-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_08x10.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_08x10.vp9
deleted file mode 100644
index 714467a..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_08x10.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_08x10_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_08x10_vp9_md5
deleted file mode 100644
index c051eb9..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_08x10_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-ea3e0f807304b0eb2d3e329b0124f75c  vp90-2-02-size-08x10-8x10-0001.i420
-8d13cf682d63e7eb13094f55d67fc458  vp90-2-02-size-08x10-8x10-0002.i420
-e729cc6c3684c94a8f6118c618efc3ea  vp90-2-02-size-08x10-8x10-0003.i420
-ac43a0ace8e4112e877c2491ecc14fb5  vp90-2-02-size-08x10-8x10-0004.i420
-53695f90b88d8e8cb838f0faec3238d3  vp90-2-02-size-08x10-8x10-0005.i420
-40afd1c4dfd4a2e3b31631c46d252bcc  vp90-2-02-size-08x10-8x10-0006.i420
-2b656f76f2e84d2f82d9bda2b5be94d3  vp90-2-02-size-08x10-8x10-0007.i420
-b22f004d678d047bc401be5e040cf883  vp90-2-02-size-08x10-8x10-0008.i420
-57c840319abfb9c31013fbde54de3fb0  vp90-2-02-size-08x10-8x10-0009.i420
-0f3dfc156216d7cfb6fd1d8c77dadab9  vp90-2-02-size-08x10-8x10-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_08x16.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_08x16.vp9
deleted file mode 100644
index 815483f..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_08x16.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_08x16_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_08x16_vp9_md5
deleted file mode 100644
index d95f639..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_08x16_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-0553e56a9d89aea496421885aab491f5  vp90-2-02-size-08x16-8x16-0001.i420
-b2a14cf676f7ebf3c50450050f76ad16  vp90-2-02-size-08x16-8x16-0002.i420
-a308d981e09b50571fb0c8ebdcefe505  vp90-2-02-size-08x16-8x16-0003.i420
-d592ec625a0ac0373e82610c3eed9864  vp90-2-02-size-08x16-8x16-0004.i420
-acd19642455e643023b4fb882c3891ba  vp90-2-02-size-08x16-8x16-0005.i420
-5af5390fd8c29b795e0ddf83f3f34284  vp90-2-02-size-08x16-8x16-0006.i420
-473505aa2a76231725cf2107d6c9dbef  vp90-2-02-size-08x16-8x16-0007.i420
-84860db6887e320f2d64f80cf0032e57  vp90-2-02-size-08x16-8x16-0008.i420
-408e9cf60e99ae99d204ff08f3196d1a  vp90-2-02-size-08x16-8x16-0009.i420
-d8af96b79258f9382e911ed38340bdf5  vp90-2-02-size-08x16-8x16-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_08x18.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_08x18.vp9
deleted file mode 100644
index 542ae03..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_08x18.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_08x18_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_08x18_vp9_md5
deleted file mode 100644
index d22d06a..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_08x18_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-4c41f93b1b280b37bc77d7047435eaa4  vp90-2-02-size-08x18-8x18-0001.i420
-c9c80fdba2ebc2b8c3490ae35e34f84f  vp90-2-02-size-08x18-8x18-0002.i420
-089d86acb3263fa5ef4f591a7f44556d  vp90-2-02-size-08x18-8x18-0003.i420
-938fca6d93b83484144f5054e4838a41  vp90-2-02-size-08x18-8x18-0004.i420
-e0592e2ac9f5e09525ce0d3904cadf47  vp90-2-02-size-08x18-8x18-0005.i420
-ea43ff5d1330986e60c08567262ea764  vp90-2-02-size-08x18-8x18-0006.i420
-08b40fe109ee90188f1cba9bbb1b376e  vp90-2-02-size-08x18-8x18-0007.i420
-b067068a2a7e36d5c5b5b405a1e73a18  vp90-2-02-size-08x18-8x18-0008.i420
-9cf2d350296288803434b7451bd2be85  vp90-2-02-size-08x18-8x18-0009.i420
-3c785e21dc228d6396738fbfcb470289  vp90-2-02-size-08x18-8x18-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_08x32.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_08x32.vp9
deleted file mode 100644
index 57dafca..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_08x32.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_08x32_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_08x32_vp9_md5
deleted file mode 100644
index 32a5a7b..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_08x32_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-f92a7777fd69aa2f2914d9a41c4828ba  vp90-2-02-size-08x32-8x32-0001.i420
-62e1cc73487d2249a88a60e35a22d9c7  vp90-2-02-size-08x32-8x32-0002.i420
-aa2619b605cb65eda15fdd99d5775550  vp90-2-02-size-08x32-8x32-0003.i420
-e6f0a491c543b835d0cefe5ca62c3dbe  vp90-2-02-size-08x32-8x32-0004.i420
-361be1a06913c398f09494ca1b2d288f  vp90-2-02-size-08x32-8x32-0005.i420
-0497bf849a973357c0ccb8d43f5bd8b4  vp90-2-02-size-08x32-8x32-0006.i420
-5ac6ac523147c409dd00820622161dd7  vp90-2-02-size-08x32-8x32-0007.i420
-7d07245574a46c524360f09be29a5f19  vp90-2-02-size-08x32-8x32-0008.i420
-fcfa7fbcaf42f81e4e34a4ee5a029ca1  vp90-2-02-size-08x32-8x32-0009.i420
-336e3fe4f15d3d6c82d82b1855dcfeb4  vp90-2-02-size-08x32-8x32-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_08x34.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_08x34.vp9
deleted file mode 100644
index 68ff21f..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_08x34.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_08x34_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_08x34_vp9_md5
deleted file mode 100644
index 626dce9..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_08x34_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-f3f2cd8f157466ff23dace85d77367ce  vp90-2-02-size-08x34-8x34-0001.i420
-639d9b70a14062e95559c12d2b597f91  vp90-2-02-size-08x34-8x34-0002.i420
-b2ee07a6656af583f19593229fa11848  vp90-2-02-size-08x34-8x34-0003.i420
-74e3b5ab4c798a0afe745694e871bbd5  vp90-2-02-size-08x34-8x34-0004.i420
-35f1c30d0f8678f319a392a6c53b5989  vp90-2-02-size-08x34-8x34-0005.i420
-07e2b4c0b92a394bfb11124fe80476f0  vp90-2-02-size-08x34-8x34-0006.i420
-7864bd20dfc5280e5f027d67ea22bf30  vp90-2-02-size-08x34-8x34-0007.i420
-10a2925a7b91dfa9b82de76069388fd4  vp90-2-02-size-08x34-8x34-0008.i420
-79cc7f7a149e8d6e04e065f75e63733c  vp90-2-02-size-08x34-8x34-0009.i420
-6453d10d97532d9bb03f7c06cba9fca0  vp90-2-02-size-08x34-8x34-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_08x64.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_08x64.vp9
deleted file mode 100644
index 337dfb9..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_08x64.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_08x64_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_08x64_vp9_md5
deleted file mode 100644
index f66d0c7..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_08x64_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-764bd02b781a38c621a109c12f3d9393  vp90-2-02-size-08x64-8x64-0001.i420
-79496bd2b9212026af816b3b7a0587d5  vp90-2-02-size-08x64-8x64-0002.i420
-2a3afd47ba3d075033fd94d5c3746c45  vp90-2-02-size-08x64-8x64-0003.i420
-fca00cad8d37a6646337baebadd0ca31  vp90-2-02-size-08x64-8x64-0004.i420
-aca376fb3f8a5ef670ecc2430037262a  vp90-2-02-size-08x64-8x64-0005.i420
-7e6c8d96d1e24855c3e380f1bf2ce02c  vp90-2-02-size-08x64-8x64-0006.i420
-09e051241972969d439f27f324d78490  vp90-2-02-size-08x64-8x64-0007.i420
-2566b2a425caaba41305bf04ff10ea01  vp90-2-02-size-08x64-8x64-0008.i420
-db3995bedee42ada1b4ee63c339daf1b  vp90-2-02-size-08x64-8x64-0009.i420
-b00b8f1bf4fd907f0487738f5b5442c6  vp90-2-02-size-08x64-8x64-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_08x66.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_08x66.vp9
deleted file mode 100644
index 46febdd..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_08x66.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_08x66_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_08x66_vp9_md5
deleted file mode 100644
index 0c4649c..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_08x66_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-df20e8df89449fe50bb610e95a449a95  vp90-2-02-size-08x66-8x66-0001.i420
-18f1a66d463274d1b0489f3a50e86857  vp90-2-02-size-08x66-8x66-0002.i420
-b0cc102875a94c9a92e53826617adbe9  vp90-2-02-size-08x66-8x66-0003.i420
-dfece7c17b4b149283ef51bdc1bd440e  vp90-2-02-size-08x66-8x66-0004.i420
-6e346884f67be259fcabe493109cb63c  vp90-2-02-size-08x66-8x66-0005.i420
-6d282127311eb2d958377490d7cb77f0  vp90-2-02-size-08x66-8x66-0006.i420
-637ac8b14ca5ddbaf7b8910406c3cd08  vp90-2-02-size-08x66-8x66-0007.i420
-e7980f3fcb36969da0d218c4389fa9e8  vp90-2-02-size-08x66-8x66-0008.i420
-730a1c95b9fb165f6e1a2f33a0d25de0  vp90-2-02-size-08x66-8x66-0009.i420
-7bd8424d0783b1c8ad617e17408371bb  vp90-2-02-size-08x66-8x66-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_10x08.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_10x08.vp9
deleted file mode 100644
index a27acd8..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_10x08.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_10x08_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_10x08_vp9_md5
deleted file mode 100644
index 2f8e4be..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_10x08_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-e1e66a88615da98523ef887f1463fc42  vp90-2-02-size-10x08-10x8-0001.i420
-549842fa98c8faf572882d38b0aae390  vp90-2-02-size-10x08-10x8-0002.i420
-17ee85785517705fdc78c6122a4b2548  vp90-2-02-size-10x08-10x8-0003.i420
-1143391d419dac30a6c11f366157c974  vp90-2-02-size-10x08-10x8-0004.i420
-b62d2a962c4c36809ef75a610106715c  vp90-2-02-size-10x08-10x8-0005.i420
-e6f143ca33fbc0e776bb149950cdedff  vp90-2-02-size-10x08-10x8-0006.i420
-01716a1077ec66df00474fd4510d2789  vp90-2-02-size-10x08-10x8-0007.i420
-8cb5b6a865fa2cbb15f0d7736fda88a6  vp90-2-02-size-10x08-10x8-0008.i420
-0fb9fd883e895a540fe1704dddbbab04  vp90-2-02-size-10x08-10x8-0009.i420
-150a3b99aa24ef102c92f87c8adb4386  vp90-2-02-size-10x08-10x8-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_10x10.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_10x10.vp9
deleted file mode 100644
index de3d37c..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_10x10.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_10x10_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_10x10_vp9_md5
deleted file mode 100644
index 13ae622..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_10x10_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-083d638f2e147295d817bb14fff5e4f4  vp90-2-02-size-10x10-10x10-0001.i420
-6dbdc445b6fd6bb99f2025cc2a40977e  vp90-2-02-size-10x10-10x10-0002.i420
-41714089383b181d64fbfa7de5904608  vp90-2-02-size-10x10-10x10-0003.i420
-11fdb8465e1599f7a9227706646d2cba  vp90-2-02-size-10x10-10x10-0004.i420
-907876b3342a10040db0851a936af4e3  vp90-2-02-size-10x10-10x10-0005.i420
-e7b18d47d06b25de205d873d3d941640  vp90-2-02-size-10x10-10x10-0006.i420
-523ce7413c8da7f6a657a9b661f36c44  vp90-2-02-size-10x10-10x10-0007.i420
-23caff863af875c66c903662a3e1e6a1  vp90-2-02-size-10x10-10x10-0008.i420
-ed4cc5557203e5b7a119112ee9ceb00b  vp90-2-02-size-10x10-10x10-0009.i420
-4bb78a996be3188888d1c60e11a08e1b  vp90-2-02-size-10x10-10x10-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_10x16.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_10x16.vp9
deleted file mode 100644
index 843a547..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_10x16.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_10x16_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_10x16_vp9_md5
deleted file mode 100644
index b614000..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_10x16_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-fab07d6209d2413e0a434e1aaaa12154  vp90-2-02-size-10x16-10x16-0001.i420
-f9ffffdb96f98527ba2e553d1265edbb  vp90-2-02-size-10x16-10x16-0002.i420
-56a992264cf7da2b23dd97435e9d0365  vp90-2-02-size-10x16-10x16-0003.i420
-b1db980423d8004bd45a789b02b92a65  vp90-2-02-size-10x16-10x16-0004.i420
-b29496aedc7026566367b634f55ebb28  vp90-2-02-size-10x16-10x16-0005.i420
-2bc9def672da4a2fc17cbd669e2b8081  vp90-2-02-size-10x16-10x16-0006.i420
-8c54721514cdf577a52a8668b9135f13  vp90-2-02-size-10x16-10x16-0007.i420
-2efab81d5e039d82b3bc7b0303b022c4  vp90-2-02-size-10x16-10x16-0008.i420
-bd0f42b91b5d126fd0baec765b1096ad  vp90-2-02-size-10x16-10x16-0009.i420
-c6bfea2735a629167bc6a7a7c76eb7f3  vp90-2-02-size-10x16-10x16-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_10x18.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_10x18.vp9
deleted file mode 100644
index bd9c902..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_10x18.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_10x18_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_10x18_vp9_md5
deleted file mode 100644
index 0639abf..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_10x18_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-0e9182e214aae732d94d007e5fe44888  vp90-2-02-size-10x18-10x18-0001.i420
-2630e2674b5611d68218fddac08815e2  vp90-2-02-size-10x18-10x18-0002.i420
-d5cdd7d6a3de17939f60bb60ef6877da  vp90-2-02-size-10x18-10x18-0003.i420
-29d1961096061029e78963fa82581eca  vp90-2-02-size-10x18-10x18-0004.i420
-5c2629f8aa59757f6b4aafa9f6cbcba1  vp90-2-02-size-10x18-10x18-0005.i420
-1f1a8b61e4fbd6222ddf42e9d0a07032  vp90-2-02-size-10x18-10x18-0006.i420
-cfb9771190ac2d0129907102d6abb63f  vp90-2-02-size-10x18-10x18-0007.i420
-cd98dd856ba573a26a943cbe53221f26  vp90-2-02-size-10x18-10x18-0008.i420
-ca13c161f067c4a4ce22bd58a2aca55b  vp90-2-02-size-10x18-10x18-0009.i420
-de4bd1a474a76a35b796a5fc45b4f893  vp90-2-02-size-10x18-10x18-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_10x32.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_10x32.vp9
deleted file mode 100644
index 4fa4f8b..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_10x32.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_10x32_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_10x32_vp9_md5
deleted file mode 100644
index aca6be0..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_10x32_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-622e6407a051ea08706394d03330ffbf  vp90-2-02-size-10x32-10x32-0001.i420
-1841a0daf7c3ef7be94e01fdb1d3968a  vp90-2-02-size-10x32-10x32-0002.i420
-37790e6cb2415f7add0ac5d3ab354755  vp90-2-02-size-10x32-10x32-0003.i420
-91485880e17c292096a7335566d3648f  vp90-2-02-size-10x32-10x32-0004.i420
-eb6f74983d5fd13d6bd90afbce8836e1  vp90-2-02-size-10x32-10x32-0005.i420
-0069ab5ff7f0d4d601f7d0f9b7a08338  vp90-2-02-size-10x32-10x32-0006.i420
-dbf04254765f7497070387e8c34895c6  vp90-2-02-size-10x32-10x32-0007.i420
-410a9b2d9855b2c29618070994adae96  vp90-2-02-size-10x32-10x32-0008.i420
-7e7f34effd90209f29f1b9ae01488b3b  vp90-2-02-size-10x32-10x32-0009.i420
-471530f74082c01c9b0f1fcf3d240d77  vp90-2-02-size-10x32-10x32-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_10x34.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_10x34.vp9
deleted file mode 100644
index e039c58..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_10x34.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_10x34_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_10x34_vp9_md5
deleted file mode 100644
index 1bd82bf..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_10x34_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-bfeeaf51f972fd0dfe9ee757083cbb54  vp90-2-02-size-10x34-10x34-0001.i420
-10cd4ed6d762004846412d9cd0caa407  vp90-2-02-size-10x34-10x34-0002.i420
-04cca4008d656ed180de88dd2ddb4f21  vp90-2-02-size-10x34-10x34-0003.i420
-ec777e377836895748c06849fa35ed2d  vp90-2-02-size-10x34-10x34-0004.i420
-b55633d0f9239dff3e45a4abce4a35a7  vp90-2-02-size-10x34-10x34-0005.i420
-063c3ab4b4c599942c3a8a5b7bfe5029  vp90-2-02-size-10x34-10x34-0006.i420
-07b920169d32b5fc51d5b9ae16fef5bf  vp90-2-02-size-10x34-10x34-0007.i420
-8d49e727db9d3072b5ab7bab2133d9be  vp90-2-02-size-10x34-10x34-0008.i420
-17441437203447e946a57d2f96966332  vp90-2-02-size-10x34-10x34-0009.i420
-5d3f14af0e5cd81d0c7d2059f13efa5a  vp90-2-02-size-10x34-10x34-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_10x64.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_10x64.vp9
deleted file mode 100644
index 33817f0..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_10x64.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_10x64_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_10x64_vp9_md5
deleted file mode 100644
index 26da4b6..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_10x64_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-835254d0eecb17bed1f2b0f3a1638165  vp90-2-02-size-10x64-10x64-0001.i420
-c0c95ce9890eab339a0e0f8b26cb095c  vp90-2-02-size-10x64-10x64-0002.i420
-f0337d645ade07cb716952b0d19352e8  vp90-2-02-size-10x64-10x64-0003.i420
-7e3deb21cb3f0ead90c8af94464cde14  vp90-2-02-size-10x64-10x64-0004.i420
-c6b1ca6cfce358c411c0637c581157c8  vp90-2-02-size-10x64-10x64-0005.i420
-10fce3f11f1ce90286ff4d74fe44fcfd  vp90-2-02-size-10x64-10x64-0006.i420
-ee0565a1f121bc905a35550619127a50  vp90-2-02-size-10x64-10x64-0007.i420
-0624b601d379616eb792c94be60b6c91  vp90-2-02-size-10x64-10x64-0008.i420
-a1bb79cdf347548f1103f580f2b6930f  vp90-2-02-size-10x64-10x64-0009.i420
-40e96e16c7e065aa7932e5aa57f32398  vp90-2-02-size-10x64-10x64-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_10x66.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_10x66.vp9
deleted file mode 100644
index c0ffdc8..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_10x66.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_10x66_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_10x66_vp9_md5
deleted file mode 100644
index 40a8a9a..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_10x66_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-1bd8b2d3bf679c4b925780bf82e12fae  vp90-2-02-size-10x66-10x66-0001.i420
-a0254b4cd4928fe1080cd6f8828288a9  vp90-2-02-size-10x66-10x66-0002.i420
-e416e99644cca481dc2806708d716ecb  vp90-2-02-size-10x66-10x66-0003.i420
-b1ed3203ffc77ed814f1cda7bfe721d2  vp90-2-02-size-10x66-10x66-0004.i420
-0ff7b9d84765f7b0b0650775ba72b334  vp90-2-02-size-10x66-10x66-0005.i420
-8b6cd91e035bad19b46b132bd411231d  vp90-2-02-size-10x66-10x66-0006.i420
-c714759a9a64402043ad00e5677c954c  vp90-2-02-size-10x66-10x66-0007.i420
-8e4738010b724ce66bcd0a5d5afcfbc1  vp90-2-02-size-10x66-10x66-0008.i420
-998a7aab8ed94f4b69bed39fb487f8d5  vp90-2-02-size-10x66-10x66-0009.i420
-9964683a15a65c032631a4f608e6009b  vp90-2-02-size-10x66-10x66-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_130x132.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_130x132.vp9
deleted file mode 100644
index e14d5cc..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_130x132.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_130x132_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_130x132_vp9_md5
deleted file mode 100644
index 451d950..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_130x132_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-8faddcc51f9bff5759dc15c7e6f5ce3f  vp90_2_02_size_130x132.webm-130x132-0001.i420
-74fe93bd53a03c466da40d67431b6d41  vp90_2_02_size_130x132.webm-130x132-0002.i420
-3a40cd8fdab88af3d15b5d4af7d62245  vp90_2_02_size_130x132.webm-130x132-0003.i420
-5c232e8e11f4254f9bf437dcf91418b9  vp90_2_02_size_130x132.webm-130x132-0004.i420
-eb7f2d1700705697d05e322abe12d732  vp90_2_02_size_130x132.webm-130x132-0005.i420
-f3accfe25de02102fd996622f9b43499  vp90_2_02_size_130x132.webm-130x132-0006.i420
-270a3780fc7b84afbe8a340bc2e61871  vp90_2_02_size_130x132.webm-130x132-0007.i420
-c169f3a5d566a1a4afde6c309f1e4644  vp90_2_02_size_130x132.webm-130x132-0008.i420
-48b6fefacb63f286096fb0b65f8bc7c4  vp90_2_02_size_130x132.webm-130x132-0009.i420
-fcc24b1b542545bab9e45b9d79f6b41f  vp90_2_02_size_130x132.webm-130x132-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_132x130.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_132x130.vp9
deleted file mode 100644
index 5282d3d..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_132x130.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_132x130_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_132x130_vp9_md5
deleted file mode 100644
index 415deb4..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_132x130_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-d75a9541df281c3fb1cd24f8be0788b3  vp90_2_02_size_132x130.webm-132x130-0001.i420
-a060549076fbf8856925c7f4a0e007b3  vp90_2_02_size_132x130.webm-132x130-0002.i420
-73ecf525a1a395deed6a7256e2c501d0  vp90_2_02_size_132x130.webm-132x130-0003.i420
-ec636e97f829b3457b7adda98c1c3580  vp90_2_02_size_132x130.webm-132x130-0004.i420
-f56f3f415b6b5d12fb5824aa82365cb3  vp90_2_02_size_132x130.webm-132x130-0005.i420
-376735c39fea4c2f48b8d2d260f9b73e  vp90_2_02_size_132x130.webm-132x130-0006.i420
-c616f543aaa73342b561f08ec24d9792  vp90_2_02_size_132x130.webm-132x130-0007.i420
-b86a6ecf6e5df70b9505861bcc8ac95e  vp90_2_02_size_132x130.webm-132x130-0008.i420
-1d9bc98446d2068fe37abc60abce0d28  vp90_2_02_size_132x130.webm-132x130-0009.i420
-febd071a35d2407e29f72c46f14f4667  vp90_2_02_size_132x130.webm-132x130-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_132x132.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_132x132.vp9
deleted file mode 100644
index 7c36464..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_132x132.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_132x132_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_132x132_vp9_md5
deleted file mode 100644
index cb04a76..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_132x132_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-5dc0ef6d1452bf220dfe752b9c0a6081  vp90_2_02_size_132x132.webm-132x132-0001.i420
-cdec24d8945577908cd05a3254edc1ea  vp90_2_02_size_132x132.webm-132x132-0002.i420
-ce4978e6ab380156c33943b225145af2  vp90_2_02_size_132x132.webm-132x132-0003.i420
-516c9256ab785f04f41fa7b44ac89e6d  vp90_2_02_size_132x132.webm-132x132-0004.i420
-16071c396c07639360260d6544bbc198  vp90_2_02_size_132x132.webm-132x132-0005.i420
-8876317adaf2ee98682b0dbfa50b9cbc  vp90_2_02_size_132x132.webm-132x132-0006.i420
-a30299b275dfd0a08191f6a9f6633138  vp90_2_02_size_132x132.webm-132x132-0007.i420
-49b3e47e41d00cc283d3906bde82abc7  vp90_2_02_size_132x132.webm-132x132-0008.i420
-a922b8d8d9883b5fd05358724a1a84c2  vp90_2_02_size_132x132.webm-132x132-0009.i420
-1bc5c3b99f979087cd6065a9894b0d6d  vp90_2_02_size_132x132.webm-132x132-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_16x08.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_16x08.vp9
deleted file mode 100644
index 4de0d73..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_16x08.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_16x08_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_16x08_vp9_md5
deleted file mode 100644
index 3e3e92a..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_16x08_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-68dccd167f9aa18df0840ebb8715eb68  vp90-2-02-size-16x08-16x8-0001.i420
-65c90bb99fdbee7abf21031d34cb18dc  vp90-2-02-size-16x08-16x8-0002.i420
-9ef1feb2dcbd4d73f3ee84e9e1cd2668  vp90-2-02-size-16x08-16x8-0003.i420
-b6281f7c88e9aa132d3902046f8cde5a  vp90-2-02-size-16x08-16x8-0004.i420
-4b439b716a294bddf9f56a229705907b  vp90-2-02-size-16x08-16x8-0005.i420
-d42c0a6f0d24522c90bc2233bc1df2c7  vp90-2-02-size-16x08-16x8-0006.i420
-74b763a5a12c4c4a581efb1818a92970  vp90-2-02-size-16x08-16x8-0007.i420
-0c3a0916ddfda5abdd3ac382f036e71f  vp90-2-02-size-16x08-16x8-0008.i420
-26ff590e8ae726f70e8b36f5eaee7a19  vp90-2-02-size-16x08-16x8-0009.i420
-30fa5810995d7132387ea585c4a1cc3a  vp90-2-02-size-16x08-16x8-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_16x10.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_16x10.vp9
deleted file mode 100644
index 541937a..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_16x10.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_16x10_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_16x10_vp9_md5
deleted file mode 100644
index 9e00483..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_16x10_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-fb3cad61d7d9eb511758dbf87dd8abe1  vp90-2-02-size-16x10-16x10-0001.i420
-4fbc1aa5559c8db2930803893bd6ba75  vp90-2-02-size-16x10-16x10-0002.i420
-2d8e2ee04dcc6097ca9e3f27070cdcc8  vp90-2-02-size-16x10-16x10-0003.i420
-05d419f1322855ba3620665b68ce9910  vp90-2-02-size-16x10-16x10-0004.i420
-b004f8d88cb2c94f4e9a13cfa5bd480a  vp90-2-02-size-16x10-16x10-0005.i420
-9d9dec90e2213c0411939131aa9adf7f  vp90-2-02-size-16x10-16x10-0006.i420
-a00874356ff1b1e9da1a400424661f8d  vp90-2-02-size-16x10-16x10-0007.i420
-fda587eb6323cd98c773f05905ac1794  vp90-2-02-size-16x10-16x10-0008.i420
-781c63d221a04d8130806c799d16753a  vp90-2-02-size-16x10-16x10-0009.i420
-f346e311829f3789dc5a94da48ada5f4  vp90-2-02-size-16x10-16x10-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_16x16.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_16x16.vp9
deleted file mode 100644
index 4b7f230..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_16x16.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_16x16_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_16x16_vp9_md5
deleted file mode 100644
index 11de2b8..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_16x16_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-b5c9daafa548e54a8e33e9881fda33f4  vp90-2-02-size-16x16-16x16-0001.i420
-1193acd7ea4b7aac968e35ef83c64378  vp90-2-02-size-16x16-16x16-0002.i420
-cd0e42c0b5a8b3be6f0e1d224062bf99  vp90-2-02-size-16x16-16x16-0003.i420
-ed79c71d17f68f86cbfa75ea2bfe97f3  vp90-2-02-size-16x16-16x16-0004.i420
-1502a859c7e07b31faad5b80e3e27cf7  vp90-2-02-size-16x16-16x16-0005.i420
-df3f093da914ea947db93c3baa188ecb  vp90-2-02-size-16x16-16x16-0006.i420
-480f86eb183b99277c1b38fdaafe2970  vp90-2-02-size-16x16-16x16-0007.i420
-023e0114282e04963f0f52e00e65ac61  vp90-2-02-size-16x16-16x16-0008.i420
-e67f29cf0acc7f9b553458e1e5c59ebf  vp90-2-02-size-16x16-16x16-0009.i420
-a779a14ba718f0c1df8a7edc9467d12e  vp90-2-02-size-16x16-16x16-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_16x18.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_16x18.vp9
deleted file mode 100644
index de0bddc..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_16x18.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_16x18_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_16x18_vp9_md5
deleted file mode 100644
index 7dcc81a..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_16x18_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-5156b11cd9995d0c1638c9b0d2b0786c  vp90-2-02-size-16x18-16x18-0001.i420
-ef78557f93fb3ea770c7d49ab60edf21  vp90-2-02-size-16x18-16x18-0002.i420
-f31fb9bb14566e4538a45ac7bf398b2a  vp90-2-02-size-16x18-16x18-0003.i420
-97633875537f76ade183e975fa91b0fb  vp90-2-02-size-16x18-16x18-0004.i420
-602cf54f9af852175173c21abd63796f  vp90-2-02-size-16x18-16x18-0005.i420
-0b3741a6842cb65d6d21eda891882033  vp90-2-02-size-16x18-16x18-0006.i420
-44240a27a6b6d36c9661d499fb965f87  vp90-2-02-size-16x18-16x18-0007.i420
-9050f263f9a4767f9323ec8aa42cf7e6  vp90-2-02-size-16x18-16x18-0008.i420
-57fa3a8494375f588a95376bc0c3cb28  vp90-2-02-size-16x18-16x18-0009.i420
-084595f2a65aa10e7d3845044a0e7213  vp90-2-02-size-16x18-16x18-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_16x32.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_16x32.vp9
deleted file mode 100644
index 35371d5..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_16x32.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_16x32_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_16x32_vp9_md5
deleted file mode 100644
index f7b1555..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_16x32_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-c73d611490a5ddec6c690589deaf5e86  vp90-2-02-size-16x32-16x32-0001.i420
-5d8eaeb222aa64abda59ce7b09b2f6d9  vp90-2-02-size-16x32-16x32-0002.i420
-34321856b8dd5bbb9b63db04d3532289  vp90-2-02-size-16x32-16x32-0003.i420
-947337d2fec8a09242f60e31e99f4065  vp90-2-02-size-16x32-16x32-0004.i420
-bb7d92f6fc055f0cf0e97bd2be56cc9e  vp90-2-02-size-16x32-16x32-0005.i420
-5d343c82bcdd0e9d08581043cddfd0ca  vp90-2-02-size-16x32-16x32-0006.i420
-612ded93207712e4916d584cc4a7b87c  vp90-2-02-size-16x32-16x32-0007.i420
-6ba5e0d19893e1b96f5ca86e0bfd7e18  vp90-2-02-size-16x32-16x32-0008.i420
-336572e1dcb110b1eb87bea81e0752f4  vp90-2-02-size-16x32-16x32-0009.i420
-705f73d0a39afce59ea571e68bfe25df  vp90-2-02-size-16x32-16x32-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_16x34.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_16x34.vp9
deleted file mode 100644
index a9c1024..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_16x34.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_16x34_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_16x34_vp9_md5
deleted file mode 100644
index 169e06c..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_16x34_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-b8bf711d9a1ce49180ed56407c8a4b0a  vp90-2-02-size-16x34-16x34-0001.i420
-0457929b06ce46aec63d66bd38586e3f  vp90-2-02-size-16x34-16x34-0002.i420
-3b5f417ee5a936797a6f0d138b8ed73b  vp90-2-02-size-16x34-16x34-0003.i420
-5d1a42aeecfd5c8513cb2df94c206c8b  vp90-2-02-size-16x34-16x34-0004.i420
-a0ab2dddbc810a1667d779f6ed69d010  vp90-2-02-size-16x34-16x34-0005.i420
-b150cd7c4ec83e6f9d948e99d7465350  vp90-2-02-size-16x34-16x34-0006.i420
-ea39622ad21312bd8bcecdaf09aa18fb  vp90-2-02-size-16x34-16x34-0007.i420
-467a42e1226a01c8ba244f312f588bab  vp90-2-02-size-16x34-16x34-0008.i420
-f2311e15228ffc7fd377b89c203d0fbf  vp90-2-02-size-16x34-16x34-0009.i420
-5df58b3ac0a7856796a46f27be7dcf4c  vp90-2-02-size-16x34-16x34-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_16x64.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_16x64.vp9
deleted file mode 100644
index 4f9d19c..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_16x64.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_16x64_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_16x64_vp9_md5
deleted file mode 100644
index 5b98188..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_16x64_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-925fdc485f3baa1ed145ae391519d7fd  vp90-2-02-size-16x64-16x64-0001.i420
-d37af656da2d7a727c8451773495d5ed  vp90-2-02-size-16x64-16x64-0002.i420
-8a0f207a99e46f3d3b2aaa3f1b061981  vp90-2-02-size-16x64-16x64-0003.i420
-a3914c7b739d3af2641fd6aae35428ef  vp90-2-02-size-16x64-16x64-0004.i420
-0ba3b49970d7b029f2dfa991fdfc6e61  vp90-2-02-size-16x64-16x64-0005.i420
-55838d1d787dc5a4fa4da2994f04587f  vp90-2-02-size-16x64-16x64-0006.i420
-c089f7ba2b2983df2a4dc2e07798af31  vp90-2-02-size-16x64-16x64-0007.i420
-c23dcb3b109543a61ccfa404a726caae  vp90-2-02-size-16x64-16x64-0008.i420
-01aaf09960f5ca599ca32768f017d0c9  vp90-2-02-size-16x64-16x64-0009.i420
-79fe955692ecba8bbb00b20a42ca8104  vp90-2-02-size-16x64-16x64-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_16x66.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_16x66.vp9
deleted file mode 100644
index 4499869..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_16x66.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_16x66_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_16x66_vp9_md5
deleted file mode 100644
index 34f48af..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_16x66_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-c7b0d91f362dff0a581434af6e902d43  vp90-2-02-size-16x66-16x66-0001.i420
-d8b016ef59c6bc193b29d1c714f342c1  vp90-2-02-size-16x66-16x66-0002.i420
-c520bd8d4b81aafc7687befff66c7396  vp90-2-02-size-16x66-16x66-0003.i420
-92e81bbd3af675c9cdb1cb00d03dabe1  vp90-2-02-size-16x66-16x66-0004.i420
-a271db3defe5daa6d9e0a73a580f4f88  vp90-2-02-size-16x66-16x66-0005.i420
-4077e857321e241bb98dfd89c0aca46f  vp90-2-02-size-16x66-16x66-0006.i420
-0466e1453a94baf876e9f64b60235300  vp90-2-02-size-16x66-16x66-0007.i420
-9d2cb9c7b180d44841e0e4d8a595d912  vp90-2-02-size-16x66-16x66-0008.i420
-500f443eeb0ecef47c34d1e91f0df6ce  vp90-2-02-size-16x66-16x66-0009.i420
-83354487982915c33b1c6243d80adaeb  vp90-2-02-size-16x66-16x66-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_178x180.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_178x180.vp9
deleted file mode 100644
index c7f72dc..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_178x180.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_178x180_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_178x180_vp9_md5
deleted file mode 100644
index 8af554c..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_178x180_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-ca7515c880d0a8230432e77abf3e3d33  vp90_2_02_size_178x180.webm-178x180-0001.i420
-7612d57deeb9d947529f73dd1b64a08d  vp90_2_02_size_178x180.webm-178x180-0002.i420
-a230690af19b975ffaca630e84e648fe  vp90_2_02_size_178x180.webm-178x180-0003.i420
-c6f829cb3462fcc0f7259819797c3283  vp90_2_02_size_178x180.webm-178x180-0004.i420
-3d13df53df5abb8d7602ffb0a3c89bb6  vp90_2_02_size_178x180.webm-178x180-0005.i420
-08ed7474c5630c1d7de6e32906f8b62f  vp90_2_02_size_178x180.webm-178x180-0006.i420
-d09e4324a86be4e4141fcd72b855744b  vp90_2_02_size_178x180.webm-178x180-0007.i420
-2934746d377ee23fd3eaeea27d049210  vp90_2_02_size_178x180.webm-178x180-0008.i420
-9cbad3dfc8a5665f57f483fede1ac91c  vp90_2_02_size_178x180.webm-178x180-0009.i420
-9c2dc6879c5778f293db30eac2fe7103  vp90_2_02_size_178x180.webm-178x180-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_180x178.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_180x178.vp9
deleted file mode 100644
index 340be2b..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_180x178.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_180x178_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_180x178_vp9_md5
deleted file mode 100644
index dd72479..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_180x178_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-461aa52a5658cbb30320be36bf42867d  vp90_2_02_size_180x178.webm-180x178-0001.i420
-a6c5fb033c04b5bdbe47a07a2ea8a001  vp90_2_02_size_180x178.webm-180x178-0002.i420
-de1d2789826b143aaae0b7c337332a69  vp90_2_02_size_180x178.webm-180x178-0003.i420
-aaf60e6369a72ea8fe47b3767b6b4aef  vp90_2_02_size_180x178.webm-180x178-0004.i420
-40c6bfaf1f4bcd39d6c6cf588ea445cb  vp90_2_02_size_180x178.webm-180x178-0005.i420
-3bfe6508595fb0c000c196cb6387531b  vp90_2_02_size_180x178.webm-180x178-0006.i420
-b70dcaad6d9dd7fe378b323460c3a243  vp90_2_02_size_180x178.webm-180x178-0007.i420
-201fce98c70f2623196a44e40a4850ac  vp90_2_02_size_180x178.webm-180x178-0008.i420
-aba16ce70b06355a025d003d6974790b  vp90_2_02_size_180x178.webm-180x178-0009.i420
-39220f4dd594972d258788528d19460c  vp90_2_02_size_180x178.webm-180x178-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_180x180.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_180x180.vp9
deleted file mode 100644
index c01cc6f..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_180x180.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_180x180_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_180x180_vp9_md5
deleted file mode 100644
index f257f21..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_180x180_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-325a336bcaf9987ab1ad3f6a7328d2be  vp90_2_02_size_180x180.webm-180x180-0001.i420
-e7d73157a4861d98318240b60d157f55  vp90_2_02_size_180x180.webm-180x180-0002.i420
-1db60eb53a9756c751325942a021b36e  vp90_2_02_size_180x180.webm-180x180-0003.i420
-c0adb82dc19f4cabcebd18f0d7712ee5  vp90_2_02_size_180x180.webm-180x180-0004.i420
-35b768881097c1e6b99814e4fbf905d1  vp90_2_02_size_180x180.webm-180x180-0005.i420
-c3af16f1334c6baa0a51086f57c7cfd5  vp90_2_02_size_180x180.webm-180x180-0006.i420
-d30718f4a93162e7752e5177096718ee  vp90_2_02_size_180x180.webm-180x180-0007.i420
-b73f17d3affa5a9f69273579c09f4566  vp90_2_02_size_180x180.webm-180x180-0008.i420
-f596f4234d2486985a2d94ce73bd72ad  vp90_2_02_size_180x180.webm-180x180-0009.i420
-aab77693ee7b744c81a0b913f5318ac2  vp90_2_02_size_180x180.webm-180x180-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_18x08.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_18x08.vp9
deleted file mode 100644
index c1b063e..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_18x08.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_18x08_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_18x08_vp9_md5
deleted file mode 100644
index 19f6cbe..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_18x08_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-3219af4ef540636b0f67a989e9966059  vp90-2-02-size-18x08-18x8-0001.i420
-1a3655c2cfd2ee332bc89da5b3faf778  vp90-2-02-size-18x08-18x8-0002.i420
-d638d5b361a6d81440e26993ed86c97d  vp90-2-02-size-18x08-18x8-0003.i420
-d9bc2e7cffd66db4ba9dcbce99448d4d  vp90-2-02-size-18x08-18x8-0004.i420
-399f962e0a0573915bc4da4a9f1effcf  vp90-2-02-size-18x08-18x8-0005.i420
-69d917e19b903e4f07f848e9e557bbe7  vp90-2-02-size-18x08-18x8-0006.i420
-d6311488a58acf6eb0cc45bc4fe3c2da  vp90-2-02-size-18x08-18x8-0007.i420
-0ce360a84d5755307f98d65c83f190e1  vp90-2-02-size-18x08-18x8-0008.i420
-2554828e6dbf94424ccac30fb153872e  vp90-2-02-size-18x08-18x8-0009.i420
-598a55f9735e85b8d45105dd6be7f97b  vp90-2-02-size-18x08-18x8-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_18x10.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_18x10.vp9
deleted file mode 100644
index 5b1d1f4..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_18x10.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_18x10_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_18x10_vp9_md5
deleted file mode 100644
index f79825a..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_18x10_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-bf574489e9360b6475aa012c747e7924  vp90-2-02-size-18x10-18x10-0001.i420
-851100301c2937312a6fd32f5aab5a09  vp90-2-02-size-18x10-18x10-0002.i420
-0f7c1209e44ea7cd4df12d82f9224684  vp90-2-02-size-18x10-18x10-0003.i420
-28d121f9c40de5280435bfdeaec0c072  vp90-2-02-size-18x10-18x10-0004.i420
-bb00898d03ce4dff5f7bee719dd3f5b5  vp90-2-02-size-18x10-18x10-0005.i420
-a098cc66bc25b81f84b0e930b0915cdb  vp90-2-02-size-18x10-18x10-0006.i420
-81e25f19bfcbfce17bd7138eedae04ee  vp90-2-02-size-18x10-18x10-0007.i420
-69c36c5ce555a461f16a1733450f7258  vp90-2-02-size-18x10-18x10-0008.i420
-c95236d9e7c624bb664310bd9ef47fb4  vp90-2-02-size-18x10-18x10-0009.i420
-7ab0942e686939951037314e9402d2c1  vp90-2-02-size-18x10-18x10-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_18x16.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_18x16.vp9
deleted file mode 100644
index f27acd1..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_18x16.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_18x16_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_18x16_vp9_md5
deleted file mode 100644
index aeafea2..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_18x16_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-9535aaa2ea26fbdc16e7fe9cba3fc9b4  vp90-2-02-size-18x16-18x16-0001.i420
-7f6e7ca33c0b27ff052dc2ab6721e37d  vp90-2-02-size-18x16-18x16-0002.i420
-d37e3f169457a9c7f2a197353e39d3d6  vp90-2-02-size-18x16-18x16-0003.i420
-f26d7d81dd81d051680ea2485e812705  vp90-2-02-size-18x16-18x16-0004.i420
-704b01955ced6d101b9e9315d3327f28  vp90-2-02-size-18x16-18x16-0005.i420
-30d46d6a0f6be383dede451cacf465f4  vp90-2-02-size-18x16-18x16-0006.i420
-83c7ed04f0af61ec665041967cbce05d  vp90-2-02-size-18x16-18x16-0007.i420
-152daf37dd37607886c50dd4c7796357  vp90-2-02-size-18x16-18x16-0008.i420
-609d807351ba74b1c432e3d0516add91  vp90-2-02-size-18x16-18x16-0009.i420
-67953f0c735984232cb6782217cdcdf6  vp90-2-02-size-18x16-18x16-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_18x18.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_18x18.vp9
deleted file mode 100644
index 35ec6a7..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_18x18.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_18x18_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_18x18_vp9_md5
deleted file mode 100644
index 9600c40e..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_18x18_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-83790b0e7004d8d89b7134ee1a88d885  vp90-2-02-size-18x18-18x18-0001.i420
-0baf0bf556ae56d2f4b04567e6ac7ed9  vp90-2-02-size-18x18-18x18-0002.i420
-c648854a4d49f7e407a2450cf4ba292a  vp90-2-02-size-18x18-18x18-0003.i420
-510c3aca23339841ffc72ed5c75d184e  vp90-2-02-size-18x18-18x18-0004.i420
-1c1f3116ec4d4ee1ad790652e49233ad  vp90-2-02-size-18x18-18x18-0005.i420
-f94891f4e16fd32d638a2c696f5922e6  vp90-2-02-size-18x18-18x18-0006.i420
-e164814c22e38cbe45312dfd48d987fc  vp90-2-02-size-18x18-18x18-0007.i420
-f582515fcc6c4308ad931d2f6cf371a0  vp90-2-02-size-18x18-18x18-0008.i420
-0a446974bd227ee34a1621a2b7852abb  vp90-2-02-size-18x18-18x18-0009.i420
-beca28bdae8d1fe20036b3646f3109cd  vp90-2-02-size-18x18-18x18-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_18x32.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_18x32.vp9
deleted file mode 100644
index f288c06..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_18x32.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_18x32_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_18x32_vp9_md5
deleted file mode 100644
index 697fa7d..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_18x32_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-62eabc8819ded6ddba2c3a5029497cf0  vp90-2-02-size-18x32-18x32-0001.i420
-b760182fddf8bc05f149e80bbcb2c281  vp90-2-02-size-18x32-18x32-0002.i420
-0c44be0472ebd2653ce9fb174c6180ab  vp90-2-02-size-18x32-18x32-0003.i420
-bbb033c3bfeeb6f59cb43013597b9d92  vp90-2-02-size-18x32-18x32-0004.i420
-a769975cdbc6529525f7cac8a0d9299a  vp90-2-02-size-18x32-18x32-0005.i420
-15b02059bbced62f19c0626efea1ecb9  vp90-2-02-size-18x32-18x32-0006.i420
-47f4b50322ed31649bdcfffb05c70fa2  vp90-2-02-size-18x32-18x32-0007.i420
-8649cdd0a958047839f5b6e7bbf6f288  vp90-2-02-size-18x32-18x32-0008.i420
-2c766e3fd3882a9a5aff52ffe9d1d341  vp90-2-02-size-18x32-18x32-0009.i420
-184a62b7332a1c24acbf03f670fb7ac1  vp90-2-02-size-18x32-18x32-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_18x34.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_18x34.vp9
deleted file mode 100644
index 6b8c072..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_18x34.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_18x34_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_18x34_vp9_md5
deleted file mode 100644
index 2b9926c..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_18x34_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-612cc424eaae924cb25c7732c422f752  vp90-2-02-size-18x34-18x34-0001.i420
-010e8c2a814862529fcf8d7771ba2d7f  vp90-2-02-size-18x34-18x34-0002.i420
-7d791b7a5916738998f77586339d5840  vp90-2-02-size-18x34-18x34-0003.i420
-aeada5f59f3dda9ab3e898f305428cb2  vp90-2-02-size-18x34-18x34-0004.i420
-06af894d38a1f0d3665c0081f5397ddf  vp90-2-02-size-18x34-18x34-0005.i420
-24bf31323c568e652550e9d35de9c96c  vp90-2-02-size-18x34-18x34-0006.i420
-a9681ec47d3e6a19321b9ea47221dc3f  vp90-2-02-size-18x34-18x34-0007.i420
-73ae7268df79c4012952bd3e8011e894  vp90-2-02-size-18x34-18x34-0008.i420
-67aa4145398ca17036959251cb4ce17b  vp90-2-02-size-18x34-18x34-0009.i420
-de247b80114c722da849f5aa23adbb38  vp90-2-02-size-18x34-18x34-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_18x64.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_18x64.vp9
deleted file mode 100644
index da13d78..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_18x64.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_18x64_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_18x64_vp9_md5
deleted file mode 100644
index 0fbd0c0..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_18x64_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-72c74de547d9ed1b17bc962dbd5e0bb1  vp90-2-02-size-18x64-18x64-0001.i420
-462849f9e2204738e9f08b40e682a6ae  vp90-2-02-size-18x64-18x64-0002.i420
-f0ee17692fd816747b11d5737b511cda  vp90-2-02-size-18x64-18x64-0003.i420
-0234d23406660ede76dd22b35a708390  vp90-2-02-size-18x64-18x64-0004.i420
-6544fdb9dc225d155820d3c7dfc909eb  vp90-2-02-size-18x64-18x64-0005.i420
-1c073544794389596177512fb4dcffce  vp90-2-02-size-18x64-18x64-0006.i420
-864709daac7b091d33afa2210c145084  vp90-2-02-size-18x64-18x64-0007.i420
-b049c4ac941743613ede9a41b16acde5  vp90-2-02-size-18x64-18x64-0008.i420
-ad0c4adb0efec03729a79f42eec66267  vp90-2-02-size-18x64-18x64-0009.i420
-146057d941f5a47eb8b2c9eefeaf3100  vp90-2-02-size-18x64-18x64-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_18x66.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_18x66.vp9
deleted file mode 100644
index b1ffba7..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_18x66.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_18x66_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_18x66_vp9_md5
deleted file mode 100644
index 46a7a3d..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_18x66_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-c3fc4a1593b9cc2f3752106af8539386  vp90-2-02-size-18x66-18x66-0001.i420
-7f2ffe6bc1750f6749bb5ad12cbaf34b  vp90-2-02-size-18x66-18x66-0002.i420
-2539b10a981d59ef54efd77cd7276aaa  vp90-2-02-size-18x66-18x66-0003.i420
-0bff22b4dfb7485fbedd6ff5b99673d1  vp90-2-02-size-18x66-18x66-0004.i420
-6a2b38f4abee785260a61bc60f16e7fa  vp90-2-02-size-18x66-18x66-0005.i420
-2fbb69b5519b51548bf1ee425ff79c55  vp90-2-02-size-18x66-18x66-0006.i420
-dbd267028be2256111b2411b91fcc117  vp90-2-02-size-18x66-18x66-0007.i420
-12b2f1003633c9e19cae3d0fda06102d  vp90-2-02-size-18x66-18x66-0008.i420
-d419a756c492867523af5185fd57d989  vp90-2-02-size-18x66-18x66-0009.i420
-8a7d36760bf5db32baef349b97316b47  vp90-2-02-size-18x66-18x66-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_32x08.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_32x08.vp9
deleted file mode 100644
index 97e741c..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_32x08.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_32x08_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_32x08_vp9_md5
deleted file mode 100644
index b744f57..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_32x08_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-c7b30cde5664387b0f7a80d9b01e4fe2  vp90-2-02-size-32x08-32x8-0001.i420
-2228a2a4e54ab5145525e5803c314dcd  vp90-2-02-size-32x08-32x8-0002.i420
-8c048469eba24f3163c36b7461b3b42a  vp90-2-02-size-32x08-32x8-0003.i420
-f6b8e8e701dea09dcf1158e9a52921c6  vp90-2-02-size-32x08-32x8-0004.i420
-b3a5fde0daf2eef8fc08521f88f79692  vp90-2-02-size-32x08-32x8-0005.i420
-653ae11cc1380ae7f39b2e007f896d81  vp90-2-02-size-32x08-32x8-0006.i420
-6e66fe002a7dff95e13cc9d3d13d9686  vp90-2-02-size-32x08-32x8-0007.i420
-13308c917a1e22c2f702afc32b8a23c2  vp90-2-02-size-32x08-32x8-0008.i420
-4fee1e63f9452dc3f81c1d634bd7f41d  vp90-2-02-size-32x08-32x8-0009.i420
-666b43ead5c7c99ae5b7637da5aa4d62  vp90-2-02-size-32x08-32x8-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_32x10.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_32x10.vp9
deleted file mode 100644
index acfa19b..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_32x10.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_32x10_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_32x10_vp9_md5
deleted file mode 100644
index cb40846..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_32x10_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-7c5b5df373ebfd31d210ff910e02213b  vp90-2-02-size-32x10-32x10-0001.i420
-c5b0a5e3eceb792b15818324a43aa2a8  vp90-2-02-size-32x10-32x10-0002.i420
-1d9c0eafd4638dfe4fe308174fde2faf  vp90-2-02-size-32x10-32x10-0003.i420
-47301d12055944b35008028761cf5e7b  vp90-2-02-size-32x10-32x10-0004.i420
-9586ac1087423dcd3b0ff96d43ae475e  vp90-2-02-size-32x10-32x10-0005.i420
-26bfe1afea96c7ef2084fffd1fa99a33  vp90-2-02-size-32x10-32x10-0006.i420
-0995c8a1935266159a7ef3f95d7f4697  vp90-2-02-size-32x10-32x10-0007.i420
-8cfcc0ea67507ab7f3551d8ac50f93a5  vp90-2-02-size-32x10-32x10-0008.i420
-658cf3cb887b055d9de7d50db4eb78a9  vp90-2-02-size-32x10-32x10-0009.i420
-856bd5189688f7ccfe9995752bc0f1f6  vp90-2-02-size-32x10-32x10-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_32x16.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_32x16.vp9
deleted file mode 100644
index dec3c01..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_32x16.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_32x16_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_32x16_vp9_md5
deleted file mode 100644
index 7609114..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_32x16_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-7c2818db2632e5c5beee17e7105d9209  vp90-2-02-size-32x16-32x16-0001.i420
-cead72bd22995e98b54a91c7b4a20975  vp90-2-02-size-32x16-32x16-0002.i420
-eb6baee5d65d778052c88ba5db2f9174  vp90-2-02-size-32x16-32x16-0003.i420
-1f5f38e89e985e9e4172446de05e91fd  vp90-2-02-size-32x16-32x16-0004.i420
-57b57ffcb03627942fc5868324a10feb  vp90-2-02-size-32x16-32x16-0005.i420
-4b4066a452d8e9cd687cd611f5d9cb88  vp90-2-02-size-32x16-32x16-0006.i420
-113e5069b2a4d2c2e802b72649eb435d  vp90-2-02-size-32x16-32x16-0007.i420
-e176bb233f76f9fd4c55d62d53487b60  vp90-2-02-size-32x16-32x16-0008.i420
-f2ff3def712a846ea7b678bd9078e32b  vp90-2-02-size-32x16-32x16-0009.i420
-21007ed1c727c5ccc5955188a2cec276  vp90-2-02-size-32x16-32x16-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_32x18.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_32x18.vp9
deleted file mode 100644
index 2062e61..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_32x18.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_32x18_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_32x18_vp9_md5
deleted file mode 100644
index 4bd047f..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_32x18_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-9da5409d344e7b8380688569e54803a5  vp90-2-02-size-32x18-32x18-0001.i420
-9b51e14e2e624ee2b430e9eaf1a48798  vp90-2-02-size-32x18-32x18-0002.i420
-b8811779f363b9a595e3a92737771ea9  vp90-2-02-size-32x18-32x18-0003.i420
-e5a0c335e5e713a3e77fff0b65127fb9  vp90-2-02-size-32x18-32x18-0004.i420
-1bffa3283b463a356794c8f7a73f8c54  vp90-2-02-size-32x18-32x18-0005.i420
-97c13270621a583eb9e13c05f9d792f0  vp90-2-02-size-32x18-32x18-0006.i420
-a6f81a4dde1ffc352ebe9d8ab8782f35  vp90-2-02-size-32x18-32x18-0007.i420
-91a955a86ce9378ff3442794ce0934c6  vp90-2-02-size-32x18-32x18-0008.i420
-2e4f8938e9c88b328a258a0b99366ea6  vp90-2-02-size-32x18-32x18-0009.i420
-adbbbc192cf36e1fc7c308824765d482  vp90-2-02-size-32x18-32x18-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_32x32.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_32x32.vp9
deleted file mode 100644
index fbfa4ab..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_32x32.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_32x32_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_32x32_vp9_md5
deleted file mode 100644
index 4e5b3c4..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_32x32_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-117915db1856cee26f05a609c8c8de2e  vp90-2-02-size-32x32-32x32-0001.i420
-943771a98b26b174e88ed1f4e872e504  vp90-2-02-size-32x32-32x32-0002.i420
-3e0d2585e1f1cb540998d107aca5c395  vp90-2-02-size-32x32-32x32-0003.i420
-e64a9e1e0232983a69ab48453025b23d  vp90-2-02-size-32x32-32x32-0004.i420
-2c6ef6637fb7b9425f7d7ea28cd84087  vp90-2-02-size-32x32-32x32-0005.i420
-419a5a31a43955d408c13ee8a5ddce9c  vp90-2-02-size-32x32-32x32-0006.i420
-2ab13e1c236553d42d59498ca350b190  vp90-2-02-size-32x32-32x32-0007.i420
-b8068beb037f3232d4da38fe33a8a885  vp90-2-02-size-32x32-32x32-0008.i420
-160df68b9e3f75e9b1f8ed7cce327bc2  vp90-2-02-size-32x32-32x32-0009.i420
-1ccafa8c7babdce0983aeb20d298b0ee  vp90-2-02-size-32x32-32x32-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_32x34.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_32x34.vp9
deleted file mode 100644
index 7ea9965..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_32x34.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_32x34_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_32x34_vp9_md5
deleted file mode 100644
index 28b1e11..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_32x34_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-770582911fd0095ebbeae384e87665ac  vp90-2-02-size-32x34-32x34-0001.i420
-f99d7e3131f04413cba2f9de6818976d  vp90-2-02-size-32x34-32x34-0002.i420
-3bfbb8c9c48f24cd596973a6deb33a3f  vp90-2-02-size-32x34-32x34-0003.i420
-0b8166afdd357f20c76f77d228bb7171  vp90-2-02-size-32x34-32x34-0004.i420
-3a3d7f2a03e19a82250d6ca0238f9791  vp90-2-02-size-32x34-32x34-0005.i420
-9b558f9b8744b016059f69f3fca90d2c  vp90-2-02-size-32x34-32x34-0006.i420
-c857736342f1145d919cb77732120006  vp90-2-02-size-32x34-32x34-0007.i420
-11dc5dda4c883a3146db060dd50343d0  vp90-2-02-size-32x34-32x34-0008.i420
-7526a62ae87de174be86eac7bb36c7f3  vp90-2-02-size-32x34-32x34-0009.i420
-9ef38f47cfc461710ff0dd75690473c0  vp90-2-02-size-32x34-32x34-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_32x64.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_32x64.vp9
deleted file mode 100644
index 0bc9223..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_32x64.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_32x64_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_32x64_vp9_md5
deleted file mode 100644
index d00ccc6..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_32x64_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-caa8471a8b381d53c3e8fc627946a871  vp90-2-02-size-32x64-32x64-0001.i420
-2cba86ea14c0f28e242625b08f5e9b88  vp90-2-02-size-32x64-32x64-0002.i420
-cea0440ff6569fc82c3030e0340fb649  vp90-2-02-size-32x64-32x64-0003.i420
-c18ef37f1356ade96a2f40af954b31c8  vp90-2-02-size-32x64-32x64-0004.i420
-21e6e549378bcff47913ef292e74dc37  vp90-2-02-size-32x64-32x64-0005.i420
-a9d3d483f74a5afe5d80725ce696fd20  vp90-2-02-size-32x64-32x64-0006.i420
-a436e2586b0963747deaf5e450e2b230  vp90-2-02-size-32x64-32x64-0007.i420
-9daaadf265df56974cb0950843d9fd8c  vp90-2-02-size-32x64-32x64-0008.i420
-e0b84714bad2519e62b7d16705fb09d5  vp90-2-02-size-32x64-32x64-0009.i420
-8cdfce574edbe548da7f6cd9a7076b9e  vp90-2-02-size-32x64-32x64-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_32x66.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_32x66.vp9
deleted file mode 100644
index 9d96d3d..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_32x66.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_32x66_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_32x66_vp9_md5
deleted file mode 100644
index 4a00973..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_32x66_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-920ea4b8a00d41489d122d641d6e4fe5  vp90-2-02-size-32x66-32x66-0001.i420
-8bfc8d452a79f2978b8e973b77cbf8a8  vp90-2-02-size-32x66-32x66-0002.i420
-09f3f0d31d3377a844fa5385d9b36b9f  vp90-2-02-size-32x66-32x66-0003.i420
-df43fae763da9360c8062bb92ee091a8  vp90-2-02-size-32x66-32x66-0004.i420
-445d8c675bb865d1814fcfa6b8a9afd3  vp90-2-02-size-32x66-32x66-0005.i420
-dc7d43db86aac6636724de8790eda555  vp90-2-02-size-32x66-32x66-0006.i420
-d3a9fc272424449ffc5b7e69f8f9948b  vp90-2-02-size-32x66-32x66-0007.i420
-11ef33b9bccca54b3703bf24ab55e2d6  vp90-2-02-size-32x66-32x66-0008.i420
-ce31b8bf9b00b427ca956abb800d8034  vp90-2-02-size-32x66-32x66-0009.i420
-e707f824d6e95d482bf3a0b4d52ea069  vp90-2-02-size-32x66-32x66-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_34x08.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_34x08.vp9
deleted file mode 100644
index 3a1d276..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_34x08.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_34x08_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_34x08_vp9_md5
deleted file mode 100644
index 2940416..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_34x08_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-c14f2ba5b4582c9d3a488976814691b3  vp90-2-02-size-34x08-34x8-0001.i420
-4387a4dce19007b7efb810b5a4069749  vp90-2-02-size-34x08-34x8-0002.i420
-ecfe868d28f4861a5612edfd57447a02  vp90-2-02-size-34x08-34x8-0003.i420
-5cba54f568534d29169ac31c8fa505e0  vp90-2-02-size-34x08-34x8-0004.i420
-fe9aab7b3378b9fc3e373ee626b887db  vp90-2-02-size-34x08-34x8-0005.i420
-fce72dfc7f9c0cb50ff73761b4d82c1f  vp90-2-02-size-34x08-34x8-0006.i420
-d4d98f42b1377e0f0ffaa66aa81d40c3  vp90-2-02-size-34x08-34x8-0007.i420
-65c027646dc95a749ce2d7ad0a6beccc  vp90-2-02-size-34x08-34x8-0008.i420
-317b283a0d907270f671272771022e69  vp90-2-02-size-34x08-34x8-0009.i420
-d3e2c008584608502f3e24c5c5f64028  vp90-2-02-size-34x08-34x8-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_34x10.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_34x10.vp9
deleted file mode 100644
index 336a18a..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_34x10.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_34x10_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_34x10_vp9_md5
deleted file mode 100644
index 9e19ab4..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_34x10_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-fd7212b519783cf4831ce4bff91f2312  vp90-2-02-size-34x10-34x10-0001.i420
-9768722ee939d80a6716865fdebca33d  vp90-2-02-size-34x10-34x10-0002.i420
-328ee0f774eeafde00dcc4b9a8f4e9af  vp90-2-02-size-34x10-34x10-0003.i420
-f882fa6015fcb042094eadab5fa952cf  vp90-2-02-size-34x10-34x10-0004.i420
-4331a3dabeae27d2bf3590eb96ce914a  vp90-2-02-size-34x10-34x10-0005.i420
-0e15106bd8e90377f6ed8b464d17159c  vp90-2-02-size-34x10-34x10-0006.i420
-8f062653ac2b83f7e541393e838d0e0f  vp90-2-02-size-34x10-34x10-0007.i420
-eeb98c1728c1a74510f8bfaf10fc0002  vp90-2-02-size-34x10-34x10-0008.i420
-30bb058a67d6a5ee3693b21cbca5349a  vp90-2-02-size-34x10-34x10-0009.i420
-7ce4b79983b3abc37b141a3bea56e0b7  vp90-2-02-size-34x10-34x10-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_34x16.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_34x16.vp9
deleted file mode 100644
index 41d41f3..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_34x16.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_34x16_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_34x16_vp9_md5
deleted file mode 100644
index 1c01cd4..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_34x16_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-e443c43101be00470c6a61c1a2995b5a  vp90-2-02-size-34x16-34x16-0001.i420
-1e79b1b46ec704d360b5fb725913b0f1  vp90-2-02-size-34x16-34x16-0002.i420
-6d5e77cafab6bc43498980c515d299d3  vp90-2-02-size-34x16-34x16-0003.i420
-91c3bba5fd2aa29ee54c8f3783cfe5a2  vp90-2-02-size-34x16-34x16-0004.i420
-9548d07c2a6204694d34e973e8339077  vp90-2-02-size-34x16-34x16-0005.i420
-6819a34c7e3c13bee3ea2b18e12e92fd  vp90-2-02-size-34x16-34x16-0006.i420
-f75920457f01f65bf30ba1ec41076d4e  vp90-2-02-size-34x16-34x16-0007.i420
-3a04f6cc0c348c21464b173ac6005043  vp90-2-02-size-34x16-34x16-0008.i420
-93a3336374e8cc4dfb2c0b4716ab60ec  vp90-2-02-size-34x16-34x16-0009.i420
-148af188b8a2ee93de406a01c2af180d  vp90-2-02-size-34x16-34x16-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_34x18.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_34x18.vp9
deleted file mode 100644
index 9c2f4ea..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_34x18.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_34x18_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_34x18_vp9_md5
deleted file mode 100644
index 74ee172..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_34x18_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-ab7eabb355e5163e7451945018fadebd  vp90-2-02-size-34x18-34x18-0001.i420
-b9a77cc0c769535808996a6de7b374ff  vp90-2-02-size-34x18-34x18-0002.i420
-bd773f11d89091b3c9ebc22d8291dd49  vp90-2-02-size-34x18-34x18-0003.i420
-278c215d6c188752818f07f4d317c0e0  vp90-2-02-size-34x18-34x18-0004.i420
-b59856932c675c1ba587644c23cdb002  vp90-2-02-size-34x18-34x18-0005.i420
-2bcaef04f89326a56025269a68742043  vp90-2-02-size-34x18-34x18-0006.i420
-5abb4a1b96b4bc003cd19a146347c54e  vp90-2-02-size-34x18-34x18-0007.i420
-26e36058f451ff80d498ac1c0343489f  vp90-2-02-size-34x18-34x18-0008.i420
-57ac43fcc6f1a2c863188aca68d52524  vp90-2-02-size-34x18-34x18-0009.i420
-282467118b5b7a986ccd28d16dab3ea7  vp90-2-02-size-34x18-34x18-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_34x32.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_34x32.vp9
deleted file mode 100644
index 2c020b4..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_34x32.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_34x32_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_34x32_vp9_md5
deleted file mode 100644
index fb6d77d..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_34x32_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-7e334867e27046fabf0f39365311c38c  vp90-2-02-size-34x32-34x32-0001.i420
-d2a49216ecedea62f546e54c1552f163  vp90-2-02-size-34x32-34x32-0002.i420
-f66e10d1779533e5b6e2b98369134833  vp90-2-02-size-34x32-34x32-0003.i420
-0054b8d4393df58eee87784862a29901  vp90-2-02-size-34x32-34x32-0004.i420
-b9cdf3ebea0d1e3f1e0c42db2e11a3c2  vp90-2-02-size-34x32-34x32-0005.i420
-c08a728d955a559457c82e44c3296148  vp90-2-02-size-34x32-34x32-0006.i420
-d05f4c4a8b0e606525c3d388d26a9351  vp90-2-02-size-34x32-34x32-0007.i420
-78fc2544da88a1a21d6626b0f7bbcf8c  vp90-2-02-size-34x32-34x32-0008.i420
-90832c4fed05390377551359bb9a91f7  vp90-2-02-size-34x32-34x32-0009.i420
-5290a0e77081863398f36c7ae192710b  vp90-2-02-size-34x32-34x32-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_34x34.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_34x34.vp9
deleted file mode 100644
index bcc9c17..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_34x34.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_34x34_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_34x34_vp9_md5
deleted file mode 100644
index 36d92f5..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_34x34_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-1bb98ba89abf6b86f47a851f8126e1ff  vp90-2-02-size-34x34-34x34-0001.i420
-b960cc795c179afe7eec360c57fddd7f  vp90-2-02-size-34x34-34x34-0002.i420
-a93cd094a80c542ecb7b6ac7720c5eff  vp90-2-02-size-34x34-34x34-0003.i420
-f1cd34e4f0bf9b1238769f028708b742  vp90-2-02-size-34x34-34x34-0004.i420
-f01437ad14450d2136a8fc971f180eb7  vp90-2-02-size-34x34-34x34-0005.i420
-8778230f1182c2227bf1e253bd85df4c  vp90-2-02-size-34x34-34x34-0006.i420
-1d1d5cf6c5cc9e73a1fa5b882e441d74  vp90-2-02-size-34x34-34x34-0007.i420
-2f7a1867487c56c252e35225f71adb55  vp90-2-02-size-34x34-34x34-0008.i420
-1d1aea21f70ceed596f22ec32d8712ee  vp90-2-02-size-34x34-34x34-0009.i420
-260e66df92f32bc853f4cd4ede692ea4  vp90-2-02-size-34x34-34x34-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_34x64.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_34x64.vp9
deleted file mode 100644
index daa63a3..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_34x64.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_34x64_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_34x64_vp9_md5
deleted file mode 100644
index 6a6795e..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_34x64_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-3856635223f578e1e7f7e7250a53cb8d  vp90-2-02-size-34x64-34x64-0001.i420
-ee8d7c3a0ea165420d7e733b9e59219a  vp90-2-02-size-34x64-34x64-0002.i420
-3d33f06bac22131f04e3411fc216dc02  vp90-2-02-size-34x64-34x64-0003.i420
-7aea667775077de32250dac25fd24bb3  vp90-2-02-size-34x64-34x64-0004.i420
-43fb534551f153c5e9e60240df0bf3b4  vp90-2-02-size-34x64-34x64-0005.i420
-d42b721aa2242d4258d97f840fdcc901  vp90-2-02-size-34x64-34x64-0006.i420
-e876200d720cbe6e36e0ffb775c5ad6c  vp90-2-02-size-34x64-34x64-0007.i420
-453078449d8701270564086e58a1d69e  vp90-2-02-size-34x64-34x64-0008.i420
-22cb799a817d45a7591489e6faa31cb9  vp90-2-02-size-34x64-34x64-0009.i420
-628dc3f03bf5dd5cae135ad1e4b9ebf7  vp90-2-02-size-34x64-34x64-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_34x66.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_34x66.vp9
deleted file mode 100644
index ca90995..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_34x66.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_34x66_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_34x66_vp9_md5
deleted file mode 100644
index af3cde6..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_34x66_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-bf4e568217906ee4b58dc4707bee8ef6  vp90-2-02-size-34x66-34x66-0001.i420
-f823f8c7b6e47ba43215f3becd35208e  vp90-2-02-size-34x66-34x66-0002.i420
-1d986d65b502e77764428e21e77503a6  vp90-2-02-size-34x66-34x66-0003.i420
-73520382bc54d6aee165402518dd7b5d  vp90-2-02-size-34x66-34x66-0004.i420
-c84e943758f2d7e37126172728838640  vp90-2-02-size-34x66-34x66-0005.i420
-1d4b298da98e4b66b31ad6874f726aa6  vp90-2-02-size-34x66-34x66-0006.i420
-e67748eeb3c818deb8b51d321cd16a9c  vp90-2-02-size-34x66-34x66-0007.i420
-4d1514c63e669261beef9e35b04c241e  vp90-2-02-size-34x66-34x66-0008.i420
-57705e2131e2129efbc68b74a1e0459c  vp90-2-02-size-34x66-34x66-0009.i420
-681acf1b384856d6e544d8e7a79fc628  vp90-2-02-size-34x66-34x66-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_64x08.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_64x08.vp9
deleted file mode 100644
index cfb8189..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_64x08.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_64x08_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_64x08_vp9_md5
deleted file mode 100644
index 0b40ce8..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_64x08_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-d801797c94039b0a166d46e151ec912c  vp90-2-02-size-64x08-64x8-0001.i420
-161ec22caa3689b214d9ab993424584b  vp90-2-02-size-64x08-64x8-0002.i420
-499b589ecf1873e388c256ce948eabb9  vp90-2-02-size-64x08-64x8-0003.i420
-22bc77650e3df70e3e36f2a1b8d8aa71  vp90-2-02-size-64x08-64x8-0004.i420
-750e40530257a68211596a60de18bffa  vp90-2-02-size-64x08-64x8-0005.i420
-4f812a92157e7186642656b59bc28a3d  vp90-2-02-size-64x08-64x8-0006.i420
-a3f141cec127a2c2e16740b8dd4ce56a  vp90-2-02-size-64x08-64x8-0007.i420
-a5ba9959bf65ab6e254e5b359a3d59b5  vp90-2-02-size-64x08-64x8-0008.i420
-baa72b8a57277d9e9ad4b92aab04f5d1  vp90-2-02-size-64x08-64x8-0009.i420
-4cb9aebb6c9d5bd164461726de201549  vp90-2-02-size-64x08-64x8-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_64x10.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_64x10.vp9
deleted file mode 100644
index 243962a..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_64x10.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_64x10_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_64x10_vp9_md5
deleted file mode 100644
index acd1ed1..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_64x10_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-97eb5fd0599d482662eb0a1def5c5ef2  vp90-2-02-size-64x10-64x10-0001.i420
-dfdc1b61b478dcca8d411021486aa2ec  vp90-2-02-size-64x10-64x10-0002.i420
-2cf560f068bdcb9e345951739091808e  vp90-2-02-size-64x10-64x10-0003.i420
-33cacb04c0797fc7bd774251e04b7fb9  vp90-2-02-size-64x10-64x10-0004.i420
-7fca126c0542c0dcdcf769b156bd85f5  vp90-2-02-size-64x10-64x10-0005.i420
-8a46c5a48cb5bd34be8e647c127f8d61  vp90-2-02-size-64x10-64x10-0006.i420
-1ddf07562c0b7dc68ed61b8e1a09fcf0  vp90-2-02-size-64x10-64x10-0007.i420
-d75911d5eb7fc75ffc3ee40344fc7ed2  vp90-2-02-size-64x10-64x10-0008.i420
-498329c8a01d950286af11e1fcf3ac07  vp90-2-02-size-64x10-64x10-0009.i420
-7a6ec019df5f3e419d389699094f87c3  vp90-2-02-size-64x10-64x10-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_64x16.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_64x16.vp9
deleted file mode 100644
index 28663da..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_64x16.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_64x16_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_64x16_vp9_md5
deleted file mode 100644
index dd67756..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_64x16_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-a43068a364cc42619e62406dcf17ddfc  vp90-2-02-size-64x16-64x16-0001.i420
-94691f93299bbf5b6ba3022b02b3e069  vp90-2-02-size-64x16-64x16-0002.i420
-3c8fc275490b4daf63ef6d8f9b7f81f6  vp90-2-02-size-64x16-64x16-0003.i420
-96c06031f0fcad49dfed256c5c737d07  vp90-2-02-size-64x16-64x16-0004.i420
-f722d3a51790b55d070d57d3b9a53d0d  vp90-2-02-size-64x16-64x16-0005.i420
-a753b3dfe13f5778f9f054e73e512ef1  vp90-2-02-size-64x16-64x16-0006.i420
-fa12cbe6cbc38fa8a38ecbcf1af8833c  vp90-2-02-size-64x16-64x16-0007.i420
-cb42303391ef6f76f77d14d2600cce12  vp90-2-02-size-64x16-64x16-0008.i420
-e0c18bb1d4dcc8168b5fdd7c7963987e  vp90-2-02-size-64x16-64x16-0009.i420
-581b5291cb60e50326c0dfa6a2d09d8a  vp90-2-02-size-64x16-64x16-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_64x18.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_64x18.vp9
deleted file mode 100644
index 9fb5e37..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_64x18.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_64x18_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_64x18_vp9_md5
deleted file mode 100644
index 4a01c17..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_64x18_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-adf7e84a351847683f6a8dd177019e29  vp90-2-02-size-64x18-64x18-0001.i420
-8227cf283a27277fbab3d7826e340337  vp90-2-02-size-64x18-64x18-0002.i420
-a5551b16db948e395537310d12128e76  vp90-2-02-size-64x18-64x18-0003.i420
-4b57ed07dbc15de9ab6143656b2a7e8e  vp90-2-02-size-64x18-64x18-0004.i420
-a15489495f0acc41f446e9689e4142d6  vp90-2-02-size-64x18-64x18-0005.i420
-b0a0d5d3ff756e8ae19797455432755c  vp90-2-02-size-64x18-64x18-0006.i420
-094a440243d36edcdd3e9d0d070de011  vp90-2-02-size-64x18-64x18-0007.i420
-a780bd61e1abbfbb28581784531608bd  vp90-2-02-size-64x18-64x18-0008.i420
-55886a8c7aad65683aa9366a38382512  vp90-2-02-size-64x18-64x18-0009.i420
-5ae5b24383f66720a62ed1001664051f  vp90-2-02-size-64x18-64x18-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_64x32.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_64x32.vp9
deleted file mode 100644
index c80dcf2..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_64x32.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_64x32_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_64x32_vp9_md5
deleted file mode 100644
index 15e0b11..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_64x32_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-931ab6a2482c3e84bc7ef8dfbc251307  vp90-2-02-size-64x32-64x32-0001.i420
-3552a9d8470a64ed627a6dbb799b7811  vp90-2-02-size-64x32-64x32-0002.i420
-cae1863fc606a0e3df3e708b7eefdf99  vp90-2-02-size-64x32-64x32-0003.i420
-4b825a07e235c4708b12a726da8e4cdf  vp90-2-02-size-64x32-64x32-0004.i420
-0dac578ef616a13be2b9db3c0d775524  vp90-2-02-size-64x32-64x32-0005.i420
-bfd47cbab8285f301777351c8bc5553c  vp90-2-02-size-64x32-64x32-0006.i420
-f29f9a0cfeaaae3bdeb26933bc7c17dc  vp90-2-02-size-64x32-64x32-0007.i420
-c7f3a4d24dcf72ef195a402eff77d8f6  vp90-2-02-size-64x32-64x32-0008.i420
-88ede6207441a7953cf893032c353663  vp90-2-02-size-64x32-64x32-0009.i420
-258f4e86541813e3edb1fe5332ff4ab1  vp90-2-02-size-64x32-64x32-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_64x34.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_64x34.vp9
deleted file mode 100644
index ddd6d64..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_64x34.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_64x34_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_64x34_vp9_md5
deleted file mode 100644
index 2727525..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_64x34_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-68d00958a78e6252dd75d632806e2022  vp90-2-02-size-64x34-64x34-0001.i420
-f7b6266e74200a669eecd241db787ee2  vp90-2-02-size-64x34-64x34-0002.i420
-c8b88d43aee037857310edeb74bc66f4  vp90-2-02-size-64x34-64x34-0003.i420
-c6d9a52baf3ca962574bff1364fcb8dc  vp90-2-02-size-64x34-64x34-0004.i420
-b384fbf3ceef0affa69f5e81681edc6e  vp90-2-02-size-64x34-64x34-0005.i420
-cd473f0c8d1cde98153402123a3ee7cf  vp90-2-02-size-64x34-64x34-0006.i420
-c0f320a23c3e39719a3b3590fe3c2ab5  vp90-2-02-size-64x34-64x34-0007.i420
-751207d15a791728c1022f711a25cd68  vp90-2-02-size-64x34-64x34-0008.i420
-7396df89a0d88044cf7527420d193636  vp90-2-02-size-64x34-64x34-0009.i420
-b772dd247838b0c3ed12713447894323  vp90-2-02-size-64x34-64x34-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_64x64.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_64x64.vp9
deleted file mode 100644
index af3b43d..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_64x64.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_64x64_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_64x64_vp9_md5
deleted file mode 100644
index 9733f63..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_64x64_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-35f17db9076fa20368fddfa01543c746  vp90-2-02-size-64x64-64x64-0001.i420
-61cd775dfc177262da9a91d3912e6718  vp90-2-02-size-64x64-64x64-0002.i420
-8b8cf175f91425d703332b22b46c1c0e  vp90-2-02-size-64x64-64x64-0003.i420
-6041afbdd81e228f8f16384d3f9e988e  vp90-2-02-size-64x64-64x64-0004.i420
-d30bd08897b50f518920014c7fa55df9  vp90-2-02-size-64x64-64x64-0005.i420
-fb67222a183876b502f93e48bb779b70  vp90-2-02-size-64x64-64x64-0006.i420
-60830425ca1dcf3df4ee9c6cd75f066a  vp90-2-02-size-64x64-64x64-0007.i420
-3e178df858f7fcaa2552a1c5c719b5cc  vp90-2-02-size-64x64-64x64-0008.i420
-66718eb0c3981beb7c1119df8a2cd27e  vp90-2-02-size-64x64-64x64-0009.i420
-7c1912448c7756f7451888050760d73d  vp90-2-02-size-64x64-64x64-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_64x66.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_64x66.vp9
deleted file mode 100644
index eecb1c0..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_64x66.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_64x66_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_64x66_vp9_md5
deleted file mode 100644
index 1c4d7e9..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_64x66_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-88587de65acfc85ff56daac8ef5d12e6  vp90-2-02-size-64x66-64x66-0001.i420
-be41f6c788b929b5b6b27c5674f40abd  vp90-2-02-size-64x66-64x66-0002.i420
-04ab3f88ca062a6911405fd84c7e9de4  vp90-2-02-size-64x66-64x66-0003.i420
-231436e0a68d19d3882f285d38aca3fb  vp90-2-02-size-64x66-64x66-0004.i420
-1a067e147a6740bb4ce57c4184437eea  vp90-2-02-size-64x66-64x66-0005.i420
-be0c47e06c7e9439570473adf4713f5f  vp90-2-02-size-64x66-64x66-0006.i420
-a213b0611247eafab0711748c25e88a0  vp90-2-02-size-64x66-64x66-0007.i420
-b1df495aa3afb74399f91c74b527b93c  vp90-2-02-size-64x66-64x66-0008.i420
-46319f21069541e1ee1652621b957860  vp90-2-02-size-64x66-64x66-0009.i420
-313517a5721b2b14683e7eefc83e51b1  vp90-2-02-size-64x66-64x66-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_66x08.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_66x08.vp9
deleted file mode 100644
index 3b05d4f..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_66x08.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_66x08_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_66x08_vp9_md5
deleted file mode 100644
index 1879fe4..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_66x08_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-3b16847e60786706fc339abc452746ff  vp90-2-02-size-66x08-66x8-0001.i420
-365a5951cb127d6df183fe5d5000f493  vp90-2-02-size-66x08-66x8-0002.i420
-6d4bceb815ca7717c4a3f86a6670703a  vp90-2-02-size-66x08-66x8-0003.i420
-5a0a03d4788934285448c85788ae8d71  vp90-2-02-size-66x08-66x8-0004.i420
-8712f9a82d07447e7a0d0a37ddc3858d  vp90-2-02-size-66x08-66x8-0005.i420
-cff32e6c183c16962207a86d7c6cf0a0  vp90-2-02-size-66x08-66x8-0006.i420
-dc933d90f87110651d7efb39854d3d46  vp90-2-02-size-66x08-66x8-0007.i420
-d1299562a022521f0c3cb30668f83b6d  vp90-2-02-size-66x08-66x8-0008.i420
-5054254ca125d7c7e6df4001397170cd  vp90-2-02-size-66x08-66x8-0009.i420
-a6bd7c7c0b02afa8d25f911ec847c61a  vp90-2-02-size-66x08-66x8-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_66x10.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_66x10.vp9
deleted file mode 100644
index 32c62e4..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_66x10.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_66x10_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_66x10_vp9_md5
deleted file mode 100644
index 56a9c16..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_66x10_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-7cbd8c6b2fb35c0c3063cb7a379944c9  vp90-2-02-size-66x10-66x10-0001.i420
-14062e74b98bed1ca982f408bc14326c  vp90-2-02-size-66x10-66x10-0002.i420
-f6d6868d849aa74b27df1c5f40c7096e  vp90-2-02-size-66x10-66x10-0003.i420
-719c8d7e3769466ee8e3dca3f4747a0e  vp90-2-02-size-66x10-66x10-0004.i420
-a72e1a7a4c82ec09ea77f87b0e6f25aa  vp90-2-02-size-66x10-66x10-0005.i420
-a5163d142b429afa155cc2f1401a0b8a  vp90-2-02-size-66x10-66x10-0006.i420
-27762d813dd1f80d6aaed5f197124fa5  vp90-2-02-size-66x10-66x10-0007.i420
-02e94454660f3528abbde8f50e94288f  vp90-2-02-size-66x10-66x10-0008.i420
-1d57dcfa57a55d96f14cfe471aac2e0b  vp90-2-02-size-66x10-66x10-0009.i420
-7804477923c0cd067bd09ebca3529775  vp90-2-02-size-66x10-66x10-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_66x16.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_66x16.vp9
deleted file mode 100644
index 6a0d1ac..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_66x16.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_66x16_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_66x16_vp9_md5
deleted file mode 100644
index 2aae0a2..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_66x16_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-fa2f292d273c37dc2804a70d1cae1e9d  vp90-2-02-size-66x16-66x16-0001.i420
-ba75d90652c021bc7ca061352e6e94ce  vp90-2-02-size-66x16-66x16-0002.i420
-e65d9a205bd17d100e50c7b6a7ea772d  vp90-2-02-size-66x16-66x16-0003.i420
-46f9e9ff891576b9462f21d48b7b9e2b  vp90-2-02-size-66x16-66x16-0004.i420
-d23cedacf3a37cf6b2774e0b18b6b9d7  vp90-2-02-size-66x16-66x16-0005.i420
-84329f7716a6db5a7e64a68a1155bfc6  vp90-2-02-size-66x16-66x16-0006.i420
-ad62286b0e13f4e54df4445cdd4fd4e3  vp90-2-02-size-66x16-66x16-0007.i420
-4511529eb24b21eb63e280070f888642  vp90-2-02-size-66x16-66x16-0008.i420
-4e1c122df1785e0e9134c43c85082e05  vp90-2-02-size-66x16-66x16-0009.i420
-ac3a3747a00be3f9f58155648fcf9b24  vp90-2-02-size-66x16-66x16-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_66x18.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_66x18.vp9
deleted file mode 100644
index e2535f0..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_66x18.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_66x18_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_66x18_vp9_md5
deleted file mode 100644
index 05e3eaf..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_66x18_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-fda5ad9bf70a51b3a41bdcabf2cce32a  vp90-2-02-size-66x18-66x18-0001.i420
-91916fb20ad542a7a3ad276e6505f9b0  vp90-2-02-size-66x18-66x18-0002.i420
-e18e5d11aec483c76afd68f7e64415a4  vp90-2-02-size-66x18-66x18-0003.i420
-c13da01c2b6c09101bda7af93ad5fd07  vp90-2-02-size-66x18-66x18-0004.i420
-ed8d2568b2ad9c7bd980cba0d3b95cff  vp90-2-02-size-66x18-66x18-0005.i420
-e6f3cf312b69d37579e77f2e52cc936b  vp90-2-02-size-66x18-66x18-0006.i420
-e509f3682e9c4bcdb0889e044b1979b7  vp90-2-02-size-66x18-66x18-0007.i420
-acc3945e557cd7a9642f08a656444976  vp90-2-02-size-66x18-66x18-0008.i420
-44ddd03aa8f03ba393f12fc6a1b3fc17  vp90-2-02-size-66x18-66x18-0009.i420
-fdd3e68132c742d9f0cf0ea6fff2a074  vp90-2-02-size-66x18-66x18-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_66x32.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_66x32.vp9
deleted file mode 100644
index 445d975..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_66x32.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_66x32_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_66x32_vp9_md5
deleted file mode 100644
index 996f32b..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_66x32_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-013cd22aea6bfeccc8ec809abd52be5c  vp90-2-02-size-66x32-66x32-0001.i420
-0980adfb0ef879b3c960797272f025ad  vp90-2-02-size-66x32-66x32-0002.i420
-d1411ffa0429befb8c71d3ab45acee92  vp90-2-02-size-66x32-66x32-0003.i420
-6c6f825379eaf21709a45be77def7a63  vp90-2-02-size-66x32-66x32-0004.i420
-bab632ef00a080739a41c692f2b21c3a  vp90-2-02-size-66x32-66x32-0005.i420
-fc0f6045aca252f2e904730227b8f337  vp90-2-02-size-66x32-66x32-0006.i420
-c8dbea209329463bfd9238a11b8d5b17  vp90-2-02-size-66x32-66x32-0007.i420
-457247bf4186ed8459e0a1564f0e68f2  vp90-2-02-size-66x32-66x32-0008.i420
-baa55e20bd7c73960b080d8a0c8db4d5  vp90-2-02-size-66x32-66x32-0009.i420
-dc8933e8edc98cd0cfca44ae22997c62  vp90-2-02-size-66x32-66x32-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_66x34.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_66x34.vp9
deleted file mode 100644
index 8705e9f..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_66x34.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_66x34_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_66x34_vp9_md5
deleted file mode 100644
index ca0e251..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_66x34_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-6821eb3fcd1d10db32eff70468dcf9c1  vp90-2-02-size-66x34-66x34-0001.i420
-ed0094d347d9f250d46b4903cbc14801  vp90-2-02-size-66x34-66x34-0002.i420
-fd018555dc9a62b8074d46e7c0fd0b40  vp90-2-02-size-66x34-66x34-0003.i420
-05d5baf9f2e62bbeeb3809a099e84147  vp90-2-02-size-66x34-66x34-0004.i420
-7a150c265214269c08e05fe4f296122d  vp90-2-02-size-66x34-66x34-0005.i420
-9a7ae61d4bb125ee4c4ccce9cc1c3664  vp90-2-02-size-66x34-66x34-0006.i420
-5a88fd6d96dcbc4255e98dfe19ff96b8  vp90-2-02-size-66x34-66x34-0007.i420
-4192c273a46b2b196c871ead0e61ec71  vp90-2-02-size-66x34-66x34-0008.i420
-e79ebfc47e755f5db221f392c3216278  vp90-2-02-size-66x34-66x34-0009.i420
-b995c5f483a2e553baf4f66d1a47fc57  vp90-2-02-size-66x34-66x34-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_66x64.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_66x64.vp9
deleted file mode 100644
index c91df34..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_66x64.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_66x64_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_66x64_vp9_md5
deleted file mode 100644
index 9802722..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_66x64_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-929086fbb3e117bd53110b64c1ee915b  vp90-2-02-size-66x64-66x64-0001.i420
-9ed45f5e40dd2393434e14a0c0160c63  vp90-2-02-size-66x64-66x64-0002.i420
-5cdade692b1baf23e61896da18e3e44f  vp90-2-02-size-66x64-66x64-0003.i420
-11a2ebac61a3f826ec41c8031899e55c  vp90-2-02-size-66x64-66x64-0004.i420
-621a1e0142b94d14db9c2121553a11fb  vp90-2-02-size-66x64-66x64-0005.i420
-029a29590f7255f1bc9ff9b7a000ca25  vp90-2-02-size-66x64-66x64-0006.i420
-5fde42becf6bf054d04e2a0fa1b2d55e  vp90-2-02-size-66x64-66x64-0007.i420
-5b8ba552cef1931e1412fb4f3420748b  vp90-2-02-size-66x64-66x64-0008.i420
-d41cd7d418f6ec1db802a01a90cfee1e  vp90-2-02-size-66x64-66x64-0009.i420
-cea99c93a84a82edff8c6069d131453f  vp90-2-02-size-66x64-66x64-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_66x66.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_66x66.vp9
deleted file mode 100644
index e50c30a..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_66x66.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_66x66_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_66x66_vp9_md5
deleted file mode 100644
index 4cf3ed2..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_66x66_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-69f9028d52f95d2e7f986c57b19fc018  vp90-2-02-size-66x66-66x66-0001.i420
-068e611f62b3f6222f6b1699748c8fbf  vp90-2-02-size-66x66-66x66-0002.i420
-3d3fec78ff2274241a7958f17a773a19  vp90-2-02-size-66x66-66x66-0003.i420
-93d71ef1a2d00c7e70e76ccc1859143d  vp90-2-02-size-66x66-66x66-0004.i420
-5a35a640d52bc0930825b963b0b9e830  vp90-2-02-size-66x66-66x66-0005.i420
-782223239e6b1ca1bedbd25d9652a07c  vp90-2-02-size-66x66-66x66-0006.i420
-a4b5e8a319cbc9a12d3e36127c7f0fbb  vp90-2-02-size-66x66-66x66-0007.i420
-a3e2d9a78fa42b3c817aadfd31fd2d16  vp90-2-02-size-66x66-66x66-0008.i420
-e9fc6b83535735f46006f3e4b376755f  vp90-2-02-size-66x66-66x66-0009.i420
-80223f600dfe86021bd0e83fecdc4b2b  vp90-2-02-size-66x66-66x66-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_lf_1920x1080.vp9 b/tests/tests/media/res/raw/vp90_2_02_size_lf_1920x1080.vp9
deleted file mode 100644
index d7cfc93..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_lf_1920x1080.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_02_size_lf_1920x1080_vp9_md5 b/tests/tests/media/res/raw/vp90_2_02_size_lf_1920x1080_vp9_md5
deleted file mode 100644
index 557ac7a..0000000
--- a/tests/tests/media/res/raw/vp90_2_02_size_lf_1920x1080_vp9_md5
+++ /dev/null
@@ -1,217 +0,0 @@
-3fb5a1b268b017332fda7fa981032c2c  vp90-2-02-size-lf-1920x1080-1920x1080-0001.i420
-7380f42c862bb0418274010f71f8291f  vp90-2-02-size-lf-1920x1080-1920x1080-0002.i420
-1931968e92c34f693582d1ae28e7a145  vp90-2-02-size-lf-1920x1080-1920x1080-0003.i420
-40606221248726f3412d8e08e489a94f  vp90-2-02-size-lf-1920x1080-1920x1080-0004.i420
-5ecd3fd1d4b607e3d84fb597a948d84b  vp90-2-02-size-lf-1920x1080-1920x1080-0005.i420
-db805d6f9289f1525c4ea594bf323fdc  vp90-2-02-size-lf-1920x1080-1920x1080-0006.i420
-7584c857279bfcf6e5e1e29557c2a6f0  vp90-2-02-size-lf-1920x1080-1920x1080-0007.i420
-bf436864c58c4d2db1d9b31ce06a8f70  vp90-2-02-size-lf-1920x1080-1920x1080-0008.i420
-9712ccf78bcddc0c44c221c2767e1f28  vp90-2-02-size-lf-1920x1080-1920x1080-0009.i420
-3071176342e59678d99dd8686336e476  vp90-2-02-size-lf-1920x1080-1920x1080-0010.i420
-92cfa56092e8e4d5269de441d31ec739  vp90-2-02-size-lf-1920x1080-1920x1080-0011.i420
-d0bc77ad1997bc38f312846a40d11a16  vp90-2-02-size-lf-1920x1080-1920x1080-0012.i420
-c656c39e3527eee973033b42d4b9deef  vp90-2-02-size-lf-1920x1080-1920x1080-0013.i420
-725ccfe5d0736997aa78f7d948692cdb  vp90-2-02-size-lf-1920x1080-1920x1080-0014.i420
-51f2245ebc2da1e3bdd0708e9d18e1eb  vp90-2-02-size-lf-1920x1080-1920x1080-0015.i420
-530c48d99fad9cddad22ee67ba4fd4d4  vp90-2-02-size-lf-1920x1080-1920x1080-0016.i420
-d55a6ebe71df8d47ac0f2b2f243f740a  vp90-2-02-size-lf-1920x1080-1920x1080-0017.i420
-aa84ff7d5dc665441376f8a75bd9bf05  vp90-2-02-size-lf-1920x1080-1920x1080-0018.i420
-70459811c09abf51e7e421656bff1939  vp90-2-02-size-lf-1920x1080-1920x1080-0019.i420
-bb69e3d69ef55a6d19506dd556168901  vp90-2-02-size-lf-1920x1080-1920x1080-0020.i420
-4f1daad761f0949509ffd9873ca03cd4  vp90-2-02-size-lf-1920x1080-1920x1080-0021.i420
-37a037e9de60b411701fda7706db37d6  vp90-2-02-size-lf-1920x1080-1920x1080-0022.i420
-09869838e806717791fe867b018d18ff  vp90-2-02-size-lf-1920x1080-1920x1080-0023.i420
-367385d264306ddd25231bb9f8681160  vp90-2-02-size-lf-1920x1080-1920x1080-0024.i420
-42c9da4939d435fcec3def2fa2bc5e26  vp90-2-02-size-lf-1920x1080-1920x1080-0025.i420
-26da302e6e86a632dfa8d8a78e83e269  vp90-2-02-size-lf-1920x1080-1920x1080-0026.i420
-8387287bfa4e62dd575941fab6f95f96  vp90-2-02-size-lf-1920x1080-1920x1080-0027.i420
-7fcc408015aed7f70c0c2321b61d166d  vp90-2-02-size-lf-1920x1080-1920x1080-0028.i420
-2394b1c14a156421cc7b30fa95c1a49b  vp90-2-02-size-lf-1920x1080-1920x1080-0029.i420
-34d91c69395380155f6f1020cda78bf9  vp90-2-02-size-lf-1920x1080-1920x1080-0030.i420
-3f081ccd624b2648b7fde66e23b05e1d  vp90-2-02-size-lf-1920x1080-1920x1080-0031.i420
-ca08738b7c81f2f10ea2f65bf5fd7876  vp90-2-02-size-lf-1920x1080-1920x1080-0032.i420
-f65c4dc7c172666ba3bb9bd402d5767c  vp90-2-02-size-lf-1920x1080-1920x1080-0033.i420
-d7ea91467fea6c268b6cd8da9067d12b  vp90-2-02-size-lf-1920x1080-1920x1080-0034.i420
-9888aa4a9b3ff09ada838b5ab0f1216c  vp90-2-02-size-lf-1920x1080-1920x1080-0035.i420
-015d788822a605d03877454c8ffd065a  vp90-2-02-size-lf-1920x1080-1920x1080-0036.i420
-d9d6a53eed5627764c107aafaa64d9a8  vp90-2-02-size-lf-1920x1080-1920x1080-0037.i420
-0b4a40dc0a6a1f5caf16ddd4dde26186  vp90-2-02-size-lf-1920x1080-1920x1080-0038.i420
-4a3f4c2e6d559a1a93b50e716dddf0bf  vp90-2-02-size-lf-1920x1080-1920x1080-0039.i420
-d10f631f4a15b6f1060233a6519eefcc  vp90-2-02-size-lf-1920x1080-1920x1080-0040.i420
-cc650873b637c244cb1415e39051d013  vp90-2-02-size-lf-1920x1080-1920x1080-0041.i420
-44a697f932e97b7f53a989e429fdca29  vp90-2-02-size-lf-1920x1080-1920x1080-0042.i420
-a09c7c567353412a36776398975fbe6a  vp90-2-02-size-lf-1920x1080-1920x1080-0043.i420
-49e3469e2b27fc776bcc0e146910ce2b  vp90-2-02-size-lf-1920x1080-1920x1080-0044.i420
-dd3261b098648b62fa0eab900b0056ba  vp90-2-02-size-lf-1920x1080-1920x1080-0045.i420
-853f90bb3e23e837ad0cb33106c2256f  vp90-2-02-size-lf-1920x1080-1920x1080-0046.i420
-0df1eadd74d643e029188f242af2f533  vp90-2-02-size-lf-1920x1080-1920x1080-0047.i420
-c1d3b56a0a622b176b81400421e87176  vp90-2-02-size-lf-1920x1080-1920x1080-0048.i420
-3c723084af1b727f78fdb9a0e5912a58  vp90-2-02-size-lf-1920x1080-1920x1080-0049.i420
-9806a519be5c399ae8c2b816772786ec  vp90-2-02-size-lf-1920x1080-1920x1080-0050.i420
-f25fd27140575595c5f944446e57e502  vp90-2-02-size-lf-1920x1080-1920x1080-0051.i420
-8c8e4f402372d76e2844794d2ddada43  vp90-2-02-size-lf-1920x1080-1920x1080-0052.i420
-c2cce3cc8291978008779f567e912361  vp90-2-02-size-lf-1920x1080-1920x1080-0053.i420
-d3d2819296938ded08b07b2206387afd  vp90-2-02-size-lf-1920x1080-1920x1080-0054.i420
-fce62f1e083bf305f966696617549fc8  vp90-2-02-size-lf-1920x1080-1920x1080-0055.i420
-70ccdb87e5d4458ab60fb6b7a263880f  vp90-2-02-size-lf-1920x1080-1920x1080-0056.i420
-a8def4b2a416924ac1a8933901e6cdee  vp90-2-02-size-lf-1920x1080-1920x1080-0057.i420
-a4f09f6e2f534716e0ab92c094cd0525  vp90-2-02-size-lf-1920x1080-1920x1080-0058.i420
-91e264c9da9dd14b631ef6483a458ead  vp90-2-02-size-lf-1920x1080-1920x1080-0059.i420
-8506e8b6033f50212c7a4fb751074667  vp90-2-02-size-lf-1920x1080-1920x1080-0060.i420
-eb14b107652f8f71ff06b1f73fbc8ec7  vp90-2-02-size-lf-1920x1080-1920x1080-0061.i420
-4684a67783e8663bdf275352108f4eef  vp90-2-02-size-lf-1920x1080-1920x1080-0062.i420
-9568285e9a9542f5a708a31e2e157c5b  vp90-2-02-size-lf-1920x1080-1920x1080-0063.i420
-b5349702a8cb8679a362ba8bc550bf7c  vp90-2-02-size-lf-1920x1080-1920x1080-0064.i420
-fb7920dc58fd81ddf221fc9031fbc19f  vp90-2-02-size-lf-1920x1080-1920x1080-0065.i420
-b8f752ad92003e481c94beb3b8599214  vp90-2-02-size-lf-1920x1080-1920x1080-0066.i420
-3d93fc99118832ac7c3897f3e9b3a82e  vp90-2-02-size-lf-1920x1080-1920x1080-0067.i420
-98003f945aa8ba7aae4d9f6255002f62  vp90-2-02-size-lf-1920x1080-1920x1080-0068.i420
-a18ff6d6fa7645f922de2f3ba4053f49  vp90-2-02-size-lf-1920x1080-1920x1080-0069.i420
-1232126ef24ff4787b11b32223d34018  vp90-2-02-size-lf-1920x1080-1920x1080-0070.i420
-a83f92c62e008939b3de91cdf9c1282f  vp90-2-02-size-lf-1920x1080-1920x1080-0071.i420
-cd47127ea0b864e5636222b40cdb5fbe  vp90-2-02-size-lf-1920x1080-1920x1080-0072.i420
-544233ce095abea8ffe427a603224ddd  vp90-2-02-size-lf-1920x1080-1920x1080-0073.i420
-7192883aca7eda74dd7e61d1cc6f6e2e  vp90-2-02-size-lf-1920x1080-1920x1080-0074.i420
-e8db34581dd264810ad683cd6475cf23  vp90-2-02-size-lf-1920x1080-1920x1080-0075.i420
-c215af24670915f3a123beb970ccba22  vp90-2-02-size-lf-1920x1080-1920x1080-0076.i420
-40d89931ddef819030a46d81e114f0b5  vp90-2-02-size-lf-1920x1080-1920x1080-0077.i420
-064781c2e9e9d564c9098be2aa5b6299  vp90-2-02-size-lf-1920x1080-1920x1080-0078.i420
-9ebab2d14446bdd11b62a6b308889b64  vp90-2-02-size-lf-1920x1080-1920x1080-0079.i420
-77ca0761cab449ea90bc8b1e1de5ae3a  vp90-2-02-size-lf-1920x1080-1920x1080-0080.i420
-74cb71b2755157dc7c1ef211b2346270  vp90-2-02-size-lf-1920x1080-1920x1080-0081.i420
-23ce88228df42b9e69ad3f4f25dd20cf  vp90-2-02-size-lf-1920x1080-1920x1080-0082.i420
-52ac5c9e14482dfde27ad838145c5986  vp90-2-02-size-lf-1920x1080-1920x1080-0083.i420
-929381d60199bb8c250324ca96323008  vp90-2-02-size-lf-1920x1080-1920x1080-0084.i420
-94f9ca3acbe3ed61bffec3f48e1dc43a  vp90-2-02-size-lf-1920x1080-1920x1080-0085.i420
-955a4095051cdf3699e5385396a04d69  vp90-2-02-size-lf-1920x1080-1920x1080-0086.i420
-dd784f3a18eae98cae4f795f854d6f03  vp90-2-02-size-lf-1920x1080-1920x1080-0087.i420
-1ebeb7d3d528292c8ae1b54b30692c81  vp90-2-02-size-lf-1920x1080-1920x1080-0088.i420
-f38b83c5b2827c4efddcb6777fd6cd5d  vp90-2-02-size-lf-1920x1080-1920x1080-0089.i420
-011dff2cf18e5b4bac6035edf57372d6  vp90-2-02-size-lf-1920x1080-1920x1080-0090.i420
-a1e8ae0f840b6aeddf283f44aa57262e  vp90-2-02-size-lf-1920x1080-1920x1080-0091.i420
-bf8f75c177756e4e8c8ad0d494b7921c  vp90-2-02-size-lf-1920x1080-1920x1080-0092.i420
-d3e9bf1a44f61e47a3d0f4ca04921a11  vp90-2-02-size-lf-1920x1080-1920x1080-0093.i420
-874f5b4db9dfdb78d9a654a9ce3da4ba  vp90-2-02-size-lf-1920x1080-1920x1080-0094.i420
-a8f7ef85e67a1b3c6c730565e0e1ab3e  vp90-2-02-size-lf-1920x1080-1920x1080-0095.i420
-33d6e20c9921719b4dcd9ccdcf242ebf  vp90-2-02-size-lf-1920x1080-1920x1080-0096.i420
-ee13704be5bb72bc91e05dc07154c8b4  vp90-2-02-size-lf-1920x1080-1920x1080-0097.i420
-8edfa18ab4a51243581302b7b12655c5  vp90-2-02-size-lf-1920x1080-1920x1080-0098.i420
-4d71c47f48e498c525b3a2907b4dad10  vp90-2-02-size-lf-1920x1080-1920x1080-0099.i420
-6de62f06881c7db2e37391f3928f9ac1  vp90-2-02-size-lf-1920x1080-1920x1080-0100.i420
-70f76a47c7ed5568ff4d21c53c58482e  vp90-2-02-size-lf-1920x1080-1920x1080-0101.i420
-e7faf1645e75a6d0927336c08a018a34  vp90-2-02-size-lf-1920x1080-1920x1080-0102.i420
-e206df8ed03f809e31f704863851ec77  vp90-2-02-size-lf-1920x1080-1920x1080-0103.i420
-03eb13cf9426514e58deeda33f4766d0  vp90-2-02-size-lf-1920x1080-1920x1080-0104.i420
-e06bc2064d306de26356f6d67c2bc21b  vp90-2-02-size-lf-1920x1080-1920x1080-0105.i420
-dd8a993039b6d9c78e2f03c7efcb4984  vp90-2-02-size-lf-1920x1080-1920x1080-0106.i420
-26cb793df8bc7f1ddcd9bd897e877ef0  vp90-2-02-size-lf-1920x1080-1920x1080-0107.i420
-7e3d32618b104c9c47d4464aa2df4709  vp90-2-02-size-lf-1920x1080-1920x1080-0108.i420
-64b1e12d7b87decd877e6c23ffd275d7  vp90-2-02-size-lf-1920x1080-1920x1080-0109.i420
-323ddc3a19c198f7768dacaf6faad602  vp90-2-02-size-lf-1920x1080-1920x1080-0110.i420
-126d984b9bdaf3397ea4ebec52775e7f  vp90-2-02-size-lf-1920x1080-1920x1080-0111.i420
-76a4586be73d0401c339790c1045abab  vp90-2-02-size-lf-1920x1080-1920x1080-0112.i420
-68466c976fb0309ada2cc7bc514c7d78  vp90-2-02-size-lf-1920x1080-1920x1080-0113.i420
-38135b5505f21ec8d23f97cb29ef1161  vp90-2-02-size-lf-1920x1080-1920x1080-0114.i420
-d657d27a111e9d81b1fbedc7f9c035c9  vp90-2-02-size-lf-1920x1080-1920x1080-0115.i420
-f399d1dc319f560206f09ca5fb59c837  vp90-2-02-size-lf-1920x1080-1920x1080-0116.i420
-269b8a8582e28e11ca3d21dc0f4dc2a6  vp90-2-02-size-lf-1920x1080-1920x1080-0117.i420
-3550fd48042d272f051bb4a6fc76c9df  vp90-2-02-size-lf-1920x1080-1920x1080-0118.i420
-5be1f4ed7eea3b62d6c55003ded2906a  vp90-2-02-size-lf-1920x1080-1920x1080-0119.i420
-7c607aade4b3451f9a081367584ae5f7  vp90-2-02-size-lf-1920x1080-1920x1080-0120.i420
-a724b1ee8504955503aca7af81425008  vp90-2-02-size-lf-1920x1080-1920x1080-0121.i420
-f58ea230bd73fa111982093742f22055  vp90-2-02-size-lf-1920x1080-1920x1080-0122.i420
-8ad4a70efa7bbc936049de2cd5b973b8  vp90-2-02-size-lf-1920x1080-1920x1080-0123.i420
-4ecbe738e3d31d546332ae248e6ba075  vp90-2-02-size-lf-1920x1080-1920x1080-0124.i420
-507a6fe3e6c95dfec41950382ed49f0e  vp90-2-02-size-lf-1920x1080-1920x1080-0125.i420
-833dc6d11dbfc1fa8465b292a66afa32  vp90-2-02-size-lf-1920x1080-1920x1080-0126.i420
-0ac2d4983e91ba36a69d11ae9a32f31a  vp90-2-02-size-lf-1920x1080-1920x1080-0127.i420
-0e61c144b842d46b7f63f433dc7be802  vp90-2-02-size-lf-1920x1080-1920x1080-0128.i420
-e93dc18eddef0a93ba652ed898fc4898  vp90-2-02-size-lf-1920x1080-1920x1080-0129.i420
-6745736a1f8ce3dae8532a007023ac6a  vp90-2-02-size-lf-1920x1080-1920x1080-0130.i420
-75f9739dc3e003fdb356221a5654c0e4  vp90-2-02-size-lf-1920x1080-1920x1080-0131.i420
-d189cf9fffb8118f31a294deab61585a  vp90-2-02-size-lf-1920x1080-1920x1080-0132.i420
-2738879f462aca9015e212e644420b7b  vp90-2-02-size-lf-1920x1080-1920x1080-0133.i420
-eff4b276b3c4f454b0822ae4f8d88a0b  vp90-2-02-size-lf-1920x1080-1920x1080-0134.i420
-2e461ae7d93bb4cfd4e072a35b651d17  vp90-2-02-size-lf-1920x1080-1920x1080-0135.i420
-bf9a82ea0e3628e4fd1eeb03cb1f50bc  vp90-2-02-size-lf-1920x1080-1920x1080-0136.i420
-c8dff3e50d37f9e1ce8b92a0762c57be  vp90-2-02-size-lf-1920x1080-1920x1080-0137.i420
-51e6f9efc88a795de0a4d16a6a71d497  vp90-2-02-size-lf-1920x1080-1920x1080-0138.i420
-761b5005e7f8ab8185ccedb660ded250  vp90-2-02-size-lf-1920x1080-1920x1080-0139.i420
-f98da0c03436b1c759d368b9d42db679  vp90-2-02-size-lf-1920x1080-1920x1080-0140.i420
-dec3590e5c11737670703e73ed69783f  vp90-2-02-size-lf-1920x1080-1920x1080-0141.i420
-0481f4aec0c9eafb3f9a10cf80c0b056  vp90-2-02-size-lf-1920x1080-1920x1080-0142.i420
-67478cb1e4de699d529046f983105477  vp90-2-02-size-lf-1920x1080-1920x1080-0143.i420
-80f371f7fa43cab698b832a4010e5a88  vp90-2-02-size-lf-1920x1080-1920x1080-0144.i420
-4e9095ab5204a387f63118949bb90f9e  vp90-2-02-size-lf-1920x1080-1920x1080-0145.i420
-f943ce3342b90b01fabd3d5bc779bb01  vp90-2-02-size-lf-1920x1080-1920x1080-0146.i420
-1b12d49c5685111fa4faa8edc8b683ad  vp90-2-02-size-lf-1920x1080-1920x1080-0147.i420
-8ee848ae53f7b86a254e49562bbfe849  vp90-2-02-size-lf-1920x1080-1920x1080-0148.i420
-2d83c434c41329ae3a8b56c10a27f2e7  vp90-2-02-size-lf-1920x1080-1920x1080-0149.i420
-af6a63fc13b919dabedd86db735990f3  vp90-2-02-size-lf-1920x1080-1920x1080-0150.i420
-a807fce07a52227202dcdcbbfb4eb1bc  vp90-2-02-size-lf-1920x1080-1920x1080-0151.i420
-95aebea323577226684914c6b74830c5  vp90-2-02-size-lf-1920x1080-1920x1080-0152.i420
-65d64ebdaadb116608f06add0e8fada2  vp90-2-02-size-lf-1920x1080-1920x1080-0153.i420
-b064af776f8c562ea6b41e0c74710869  vp90-2-02-size-lf-1920x1080-1920x1080-0154.i420
-26291594af160501023eb0035443b7c3  vp90-2-02-size-lf-1920x1080-1920x1080-0155.i420
-79a414d560d3e36314c981f1e30e053b  vp90-2-02-size-lf-1920x1080-1920x1080-0156.i420
-3455e01e2cd146aefbad54cb032b15f1  vp90-2-02-size-lf-1920x1080-1920x1080-0157.i420
-eaa2e271058202cbc0933dea8f46f570  vp90-2-02-size-lf-1920x1080-1920x1080-0158.i420
-42da27c94aaa56ae27fddf75bf51f47f  vp90-2-02-size-lf-1920x1080-1920x1080-0159.i420
-746cca013c7b6df41e3233214ca7a5d7  vp90-2-02-size-lf-1920x1080-1920x1080-0160.i420
-ab20ad95d6b3e0d689186cde51e4a86a  vp90-2-02-size-lf-1920x1080-1920x1080-0161.i420
-b8a02e44615a697da3de946e8cf4e8e4  vp90-2-02-size-lf-1920x1080-1920x1080-0162.i420
-4df5b10cb1c784362035f69bdb183be0  vp90-2-02-size-lf-1920x1080-1920x1080-0163.i420
-f2e5dd616e8125b1b46c410141180fb0  vp90-2-02-size-lf-1920x1080-1920x1080-0164.i420
-e09ab4ca180cb477a3a87bc8fd1e2ce0  vp90-2-02-size-lf-1920x1080-1920x1080-0165.i420
-5ee431b26d6c83689bf18eb8d805f31e  vp90-2-02-size-lf-1920x1080-1920x1080-0166.i420
-bca8aaf030c959ac37c3e084be6cf8b3  vp90-2-02-size-lf-1920x1080-1920x1080-0167.i420
-8dd977323d8a5dba5c98c6671821e066  vp90-2-02-size-lf-1920x1080-1920x1080-0168.i420
-aed8ef2c20f9726542c78fade0fb0968  vp90-2-02-size-lf-1920x1080-1920x1080-0169.i420
-e19775ba9c5b6dbf1e84fd0531bd1f2a  vp90-2-02-size-lf-1920x1080-1920x1080-0170.i420
-a69c5daf6e6e3b579a3430fc95f37dac  vp90-2-02-size-lf-1920x1080-1920x1080-0171.i420
-3503bc793f86b75d9aa1c9c51b2d0f6f  vp90-2-02-size-lf-1920x1080-1920x1080-0172.i420
-bdcee02e245b92acf06588370df2e5e6  vp90-2-02-size-lf-1920x1080-1920x1080-0173.i420
-8bbb9460d0f419969491669664891d88  vp90-2-02-size-lf-1920x1080-1920x1080-0174.i420
-d4b993d87c2f4042c0b647e4e50cca38  vp90-2-02-size-lf-1920x1080-1920x1080-0175.i420
-5acb9f10167b208a32babbe56fd07587  vp90-2-02-size-lf-1920x1080-1920x1080-0176.i420
-958900bb713559d272470f1e85cffcda  vp90-2-02-size-lf-1920x1080-1920x1080-0177.i420
-f355f1858fd2c8a4932dfd6d6cfe7673  vp90-2-02-size-lf-1920x1080-1920x1080-0178.i420
-45caac733e395f63c82c9d8ab050c858  vp90-2-02-size-lf-1920x1080-1920x1080-0179.i420
-8b05c2c352c4adc5cabc0184a1f510f5  vp90-2-02-size-lf-1920x1080-1920x1080-0180.i420
-167c3fe4df204bab9cceb17ae655aa61  vp90-2-02-size-lf-1920x1080-1920x1080-0181.i420
-3859339e9a63d0e05797f0de535f7be8  vp90-2-02-size-lf-1920x1080-1920x1080-0182.i420
-2d5cc539454cb6aace19ab9bba60b066  vp90-2-02-size-lf-1920x1080-1920x1080-0183.i420
-f51299a0601fb1621d2de6b0e2391a9a  vp90-2-02-size-lf-1920x1080-1920x1080-0184.i420
-92b0ed2528c0756b0c84721a306ba61b  vp90-2-02-size-lf-1920x1080-1920x1080-0185.i420
-8f1870cce38718b02d0a4e26a5a2619e  vp90-2-02-size-lf-1920x1080-1920x1080-0186.i420
-e0ed74a244b8698baaefd837ab1590ff  vp90-2-02-size-lf-1920x1080-1920x1080-0187.i420
-c8b10e2ac68bd0106e34a57943f23e12  vp90-2-02-size-lf-1920x1080-1920x1080-0188.i420
-f5e505e3d681763fd447214aed863ab9  vp90-2-02-size-lf-1920x1080-1920x1080-0189.i420
-c2cc70d65ba1c13c5e07a1d28611792a  vp90-2-02-size-lf-1920x1080-1920x1080-0190.i420
-e518aac5c551f7c09652c25905cce41f  vp90-2-02-size-lf-1920x1080-1920x1080-0191.i420
-66379f7a3b2de153486a76b459e2ce3b  vp90-2-02-size-lf-1920x1080-1920x1080-0192.i420
-552afad8181d6d138e2e62c971a10a42  vp90-2-02-size-lf-1920x1080-1920x1080-0193.i420
-ac21d5c2ef3ccaabbaa9f08fcc9d0db8  vp90-2-02-size-lf-1920x1080-1920x1080-0194.i420
-f67af966e3fa79a6fce48b7d9e1fb593  vp90-2-02-size-lf-1920x1080-1920x1080-0195.i420
-dd6331e4361f8b8bd45d571db2e0344b  vp90-2-02-size-lf-1920x1080-1920x1080-0196.i420
-14a0db3c0a39b7431c337622ed4078a5  vp90-2-02-size-lf-1920x1080-1920x1080-0197.i420
-8d3394abad260b5e4e24abe4a898cb7b  vp90-2-02-size-lf-1920x1080-1920x1080-0198.i420
-e085ce3274d77fa874ab70183353b4c1  vp90-2-02-size-lf-1920x1080-1920x1080-0199.i420
-de083fffb4226ec227d3aa9c873dfcf7  vp90-2-02-size-lf-1920x1080-1920x1080-0200.i420
-4628eff51846a97fb708c4d3753ffee4  vp90-2-02-size-lf-1920x1080-1920x1080-0201.i420
-b480e4409fa8ca9c2e0d4bd57b7e8cf6  vp90-2-02-size-lf-1920x1080-1920x1080-0202.i420
-ff21164cc573b6f79739165b61b68dd0  vp90-2-02-size-lf-1920x1080-1920x1080-0203.i420
-ec391026b77527ed48029adfbd1afc93  vp90-2-02-size-lf-1920x1080-1920x1080-0204.i420
-23186dd93e32603c3709aa3419963ca9  vp90-2-02-size-lf-1920x1080-1920x1080-0205.i420
-6a1968207b37594cc82736f086a0a023  vp90-2-02-size-lf-1920x1080-1920x1080-0206.i420
-57358a332af03e5d96d8c1cd5e4a497d  vp90-2-02-size-lf-1920x1080-1920x1080-0207.i420
-584ac2ecc56e1a9f0f1a5356b161a7a6  vp90-2-02-size-lf-1920x1080-1920x1080-0208.i420
-f566d1e385f25ef9b74989cbe7bbca7b  vp90-2-02-size-lf-1920x1080-1920x1080-0209.i420
-a4bf059ee8207d1edeebc3193e8db8e0  vp90-2-02-size-lf-1920x1080-1920x1080-0210.i420
-cc5948fa18d6e73afa253eedbfaecd41  vp90-2-02-size-lf-1920x1080-1920x1080-0211.i420
-61d44c8bfca18b6742fed974366898b8  vp90-2-02-size-lf-1920x1080-1920x1080-0212.i420
-c48d67da0d72daaf635226b9e30e05e3  vp90-2-02-size-lf-1920x1080-1920x1080-0213.i420
-b4596a68e708f304875fd2306fec56e9  vp90-2-02-size-lf-1920x1080-1920x1080-0214.i420
-b59be425ebea3d15b4be140e552ab944  vp90-2-02-size-lf-1920x1080-1920x1080-0215.i420
-1e966f137918375ae060d4c49cf38664  vp90-2-02-size-lf-1920x1080-1920x1080-0216.i420
-0ff25f8e98719fd57dc31d391bb930c4  vp90-2-02-size-lf-1920x1080-1920x1080-0217.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_deltaq.vp9 b/tests/tests/media/res/raw/vp90_2_03_deltaq.vp9
deleted file mode 100644
index 9033b23..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_deltaq.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_deltaq_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_deltaq_vp9_md5
deleted file mode 100644
index aca350c..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_deltaq_vp9_md5
+++ /dev/null
@@ -1,2 +0,0 @@
-2f90d606edc511c8c960530dd915cb98  vp90-2-03-deltaq-352x240-0001.i420
-7fd451a057d6341b2b0d116f59e41a13  vp90-2-03-deltaq-352x240-0002.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_196x196.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_196x196.vp9
deleted file mode 100644
index 06988f1..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_196x196.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_196x196_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_196x196_vp9_md5
deleted file mode 100644
index 847972f..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_196x196_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-14cc1c34b8106e35238d4650a9123852  vp90-2-03-size-196x196-196x196-0001.i420
-66e0bb9136ea24e30b781a4610b428a1  vp90-2-03-size-196x196-196x196-0002.i420
-8e36679c20a3a3e974fdacf7a9343817  vp90-2-03-size-196x196-196x196-0003.i420
-2669fd03ce7ce01f4fc9db23e06fffdb  vp90-2-03-size-196x196-196x196-0004.i420
-46ced29eb6edf2136c8ee19e9a87380f  vp90-2-03-size-196x196-196x196-0005.i420
-4e4138b65a30bc56cd18663a1799f98f  vp90-2-03-size-196x196-196x196-0006.i420
-580b0431b5f808c67e50ed34e62f39ad  vp90-2-03-size-196x196-196x196-0007.i420
-1339bbe256d8499ab17d6a550f7dac70  vp90-2-03-size-196x196-196x196-0008.i420
-89b9dac29a4c4136249c40a3763dc114  vp90-2-03-size-196x196-196x196-0009.i420
-a735d341d7df9dcd0b6e51a82b813f61  vp90-2-03-size-196x196-196x196-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_196x198.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_196x198.vp9
deleted file mode 100644
index cffe250..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_196x198.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_196x198_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_196x198_vp9_md5
deleted file mode 100644
index 33056c5..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_196x198_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-d2bd2dfaf2ac22b3f2499844f228d89a  vp90-2-03-size-196x198-196x198-0001.i420
-e066448baeb39da04b22d4d2ebd27b0a  vp90-2-03-size-196x198-196x198-0002.i420
-aace53c0ecca2596c51dd5e70da7abc4  vp90-2-03-size-196x198-196x198-0003.i420
-077256d024ab101918d10ae61142f203  vp90-2-03-size-196x198-196x198-0004.i420
-e2bfdad36b0365d41dc6813a371111ee  vp90-2-03-size-196x198-196x198-0005.i420
-17495af68b0a2c075899849382f3b046  vp90-2-03-size-196x198-196x198-0006.i420
-7853db163344798e5c37672adaac92d8  vp90-2-03-size-196x198-196x198-0007.i420
-7b2ee2e1ca709c58457c7d818e47c95c  vp90-2-03-size-196x198-196x198-0008.i420
-f7eb3ce10561628f932861358a30b414  vp90-2-03-size-196x198-196x198-0009.i420
-3182374f5aa539fd0faa44ed4a7492e5  vp90-2-03-size-196x198-196x198-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_196x200.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_196x200.vp9
deleted file mode 100644
index 53e2c03..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_196x200.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_196x200_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_196x200_vp9_md5
deleted file mode 100644
index 7746aba..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_196x200_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-b2f2ac3e3833ae1b4dd075fe00210373  vp90-2-03-size-196x200-196x200-0001.i420
-c0cce05e56a07111fe62553fa3a87074  vp90-2-03-size-196x200-196x200-0002.i420
-626aab3de03242073e03504e166b4697  vp90-2-03-size-196x200-196x200-0003.i420
-574d2c810f0bbfac57f1f06c2b97445c  vp90-2-03-size-196x200-196x200-0004.i420
-7d5bc5860bd1422d08396fe080452099  vp90-2-03-size-196x200-196x200-0005.i420
-5d47bbfb0f5cdecfe8415ca2caddc206  vp90-2-03-size-196x200-196x200-0006.i420
-fbef6a0fa51029d0475975945ccf4b36  vp90-2-03-size-196x200-196x200-0007.i420
-c9179c153bcb2a8e9d17ed04e5e2c39c  vp90-2-03-size-196x200-196x200-0008.i420
-107d796592cf2140d4d492beadba2d68  vp90-2-03-size-196x200-196x200-0009.i420
-eee46f9ee67fc1121bffb63aeb7c768f  vp90-2-03-size-196x200-196x200-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_196x202.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_196x202.vp9
deleted file mode 100644
index 87394bd..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_196x202.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_196x202_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_196x202_vp9_md5
deleted file mode 100644
index 351cf95..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_196x202_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-7109d2ef160828ece26337f36fcfc092  vp90-2-03-size-196x202-196x202-0001.i420
-bdaa6612f81a956d9b20d55a04df8346  vp90-2-03-size-196x202-196x202-0002.i420
-15eb75495d2713a64415b990b058d5ca  vp90-2-03-size-196x202-196x202-0003.i420
-b997c84553475ba84e8ba3d7ee19ae4e  vp90-2-03-size-196x202-196x202-0004.i420
-63a8badd691bcf643cf676d029ce8a6c  vp90-2-03-size-196x202-196x202-0005.i420
-b8ca23d9b3418c4c36040a215b2b7917  vp90-2-03-size-196x202-196x202-0006.i420
-1be0da18386c35e4a5e5d5d32d9a4468  vp90-2-03-size-196x202-196x202-0007.i420
-e75a03fa70fe7e6b3a8d8ce7dc8305f1  vp90-2-03-size-196x202-196x202-0008.i420
-cbd2b60df9209025c8e890771a05321d  vp90-2-03-size-196x202-196x202-0009.i420
-c655d6fcc3333917b66358a9ac2b1357  vp90-2-03-size-196x202-196x202-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_196x208.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_196x208.vp9
deleted file mode 100644
index d20e7cc..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_196x208.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_196x208_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_196x208_vp9_md5
deleted file mode 100644
index 94a9277..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_196x208_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-efa2a2a76a0fe709a78e491346cfcf29  vp90-2-03-size-196x208-196x208-0001.i420
-97de85e21b408878853fa870104707d7  vp90-2-03-size-196x208-196x208-0002.i420
-419bd1157e156d3059190d6b561c57dd  vp90-2-03-size-196x208-196x208-0003.i420
-fbb6e01c524fc7c8007c6cfe2c64f467  vp90-2-03-size-196x208-196x208-0004.i420
-7453994c2e9901fa23f295ec0b556f9c  vp90-2-03-size-196x208-196x208-0005.i420
-ba39dc984789fa2c4b833cd88013cc97  vp90-2-03-size-196x208-196x208-0006.i420
-cea5061cac1be18d5f9a9301a5460491  vp90-2-03-size-196x208-196x208-0007.i420
-1c583018c425b1a91949e0c3eb0a4152  vp90-2-03-size-196x208-196x208-0008.i420
-b48be02280ac6f97731af69bcf18de25  vp90-2-03-size-196x208-196x208-0009.i420
-6f8ab465214d8374c9ff77b939da333e  vp90-2-03-size-196x208-196x208-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_196x210.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_196x210.vp9
deleted file mode 100644
index c1dfbb3..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_196x210.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_196x210_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_196x210_vp9_md5
deleted file mode 100644
index eddddaf..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_196x210_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-fccc18714a9ed3840bd6e9c6ca4858e5  vp90-2-03-size-196x210-196x210-0001.i420
-a8f6eb43cf6ed670eb180c5051de06f7  vp90-2-03-size-196x210-196x210-0002.i420
-6a9baf9eae6e799deaefd6e801f7ace3  vp90-2-03-size-196x210-196x210-0003.i420
-3bb44c8a45aab088c9887c11bc6a4acf  vp90-2-03-size-196x210-196x210-0004.i420
-0907a7e926be9e54bbb087251b4715d9  vp90-2-03-size-196x210-196x210-0005.i420
-10fef2876c20eb3f9570c0c23e5acc69  vp90-2-03-size-196x210-196x210-0006.i420
-ffe5d2b6d874af0f878075c97940ccfb  vp90-2-03-size-196x210-196x210-0007.i420
-d10fae10144ff88075048827203f7e9c  vp90-2-03-size-196x210-196x210-0008.i420
-bdf35736ac625f2178902c1f24d513c0  vp90-2-03-size-196x210-196x210-0009.i420
-30882bf2c21785be6234b637c4b16b28  vp90-2-03-size-196x210-196x210-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_196x224.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_196x224.vp9
deleted file mode 100644
index 605dddf..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_196x224.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_196x224_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_196x224_vp9_md5
deleted file mode 100644
index 18395ce..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_196x224_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-13263674ea5aa619250dfd139bda872f  vp90-2-03-size-196x224-196x224-0001.i420
-39f5cbd8917f2b3a1df8cf2b786266de  vp90-2-03-size-196x224-196x224-0002.i420
-f9aade31f9e3065f3d5b8645ef099ac6  vp90-2-03-size-196x224-196x224-0003.i420
-124f9664380f092e692b5e881f5a8fcc  vp90-2-03-size-196x224-196x224-0004.i420
-e8e040e417830f5e911537828ace21b7  vp90-2-03-size-196x224-196x224-0005.i420
-84ce09882b9c184a787e8022e6d8c8de  vp90-2-03-size-196x224-196x224-0006.i420
-b1397fd91814e4fdc4f75c89161ced26  vp90-2-03-size-196x224-196x224-0007.i420
-d64f39d64d248f0223ed359e092d46cb  vp90-2-03-size-196x224-196x224-0008.i420
-e04ee663dcc52eebd74255671c6f4ec9  vp90-2-03-size-196x224-196x224-0009.i420
-955303cb73bf072c693f37d9778ca2b6  vp90-2-03-size-196x224-196x224-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_196x226.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_196x226.vp9
deleted file mode 100644
index 29f7381..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_196x226.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_196x226_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_196x226_vp9_md5
deleted file mode 100644
index 1c250d6..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_196x226_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-5cb240f10761f59687612ed589759800  vp90-2-03-size-196x226-196x226-0001.i420
-9d8d5b57336ddfa5c9c5100a0302197d  vp90-2-03-size-196x226-196x226-0002.i420
-9db74997d23b16f527c63e88795331dc  vp90-2-03-size-196x226-196x226-0003.i420
-52758cd901533e790334d464bee516da  vp90-2-03-size-196x226-196x226-0004.i420
-40e671b9b85d07b13acba85eb64bbbaa  vp90-2-03-size-196x226-196x226-0005.i420
-8524b2cd2c9bb3e41c6167f8269e75d2  vp90-2-03-size-196x226-196x226-0006.i420
-ff194ad6fa180fde86cc05a99c0580ec  vp90-2-03-size-196x226-196x226-0007.i420
-22ab303cb37745a73c227cd7d1c70003  vp90-2-03-size-196x226-196x226-0008.i420
-01986c58e82e0b5194418f5b75a8599c  vp90-2-03-size-196x226-196x226-0009.i420
-eedfc9c14cbf3fa10402dbed52103848  vp90-2-03-size-196x226-196x226-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_198x196.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_198x196.vp9
deleted file mode 100644
index 78d6b72..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_198x196.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_198x196_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_198x196_vp9_md5
deleted file mode 100644
index fc8de27..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_198x196_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-c980866a6f17d4107ce128ee112d74cf  vp90-2-03-size-198x196-198x196-0001.i420
-d4d5d2a10e73f1d09919355dc4d63d48  vp90-2-03-size-198x196-198x196-0002.i420
-82c76ed020acb68ff9d8bd81899aa6f8  vp90-2-03-size-198x196-198x196-0003.i420
-8330705fa354fb5838af56dcf9cc0980  vp90-2-03-size-198x196-198x196-0004.i420
-e47b63d839a592e6372d18249bf5bc0c  vp90-2-03-size-198x196-198x196-0005.i420
-b6095b6f752a50e96cab52e7c3fd52f3  vp90-2-03-size-198x196-198x196-0006.i420
-fc4786f48b6ee31043d94f79c5c8a54f  vp90-2-03-size-198x196-198x196-0007.i420
-7d3d06c96496bd5ab44fe5489877771d  vp90-2-03-size-198x196-198x196-0008.i420
-5b96de089a9faa2dc01697fe9dd97f7f  vp90-2-03-size-198x196-198x196-0009.i420
-d7361203b4c264067dcb7bf6912e8df2  vp90-2-03-size-198x196-198x196-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_198x198.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_198x198.vp9
deleted file mode 100644
index b66e0d8..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_198x198.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_198x198_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_198x198_vp9_md5
deleted file mode 100644
index 7eae1b0..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_198x198_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-ee0760611da9938e72f551d219671c76  vp90-2-03-size-198x198-198x198-0001.i420
-c512cb8a864c25318254438c7170f373  vp90-2-03-size-198x198-198x198-0002.i420
-aaea10aeb7dfd1f9f6dc77adccfcd56f  vp90-2-03-size-198x198-198x198-0003.i420
-fb4e68ce202d9c6ecbddc6fe50b1cd7b  vp90-2-03-size-198x198-198x198-0004.i420
-57a803d02f0d71ec4c3c17a112574525  vp90-2-03-size-198x198-198x198-0005.i420
-526d0beaf7ef721c3a6ae8bf3505fd78  vp90-2-03-size-198x198-198x198-0006.i420
-972ab31f81dbb79c2273bcfc98569e8b  vp90-2-03-size-198x198-198x198-0007.i420
-e1f05d62691bd1a9494d57449417415c  vp90-2-03-size-198x198-198x198-0008.i420
-bc39a559b25e5a1ac698e0101bd6bf29  vp90-2-03-size-198x198-198x198-0009.i420
-04caed04ac21c76af873e21899860fb2  vp90-2-03-size-198x198-198x198-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_198x200.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_198x200.vp9
deleted file mode 100644
index 5f6d62e..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_198x200.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_198x200_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_198x200_vp9_md5
deleted file mode 100644
index 777aeef..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_198x200_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-fb0e8171b0f91d9b2ceb5430db27a67b  vp90-2-03-size-198x200-198x200-0001.i420
-73f121e6aa0e6290cfd06ac9b033c772  vp90-2-03-size-198x200-198x200-0002.i420
-4113897efc44f49f5169a579bee03596  vp90-2-03-size-198x200-198x200-0003.i420
-aec1d4cf1a15e12b689980cfe136d5d6  vp90-2-03-size-198x200-198x200-0004.i420
-1322af65f647254330120e67ddae38bd  vp90-2-03-size-198x200-198x200-0005.i420
-5d28c1684451812c9db41433e6286d85  vp90-2-03-size-198x200-198x200-0006.i420
-33843fc49d1d8655520c2f42332222ca  vp90-2-03-size-198x200-198x200-0007.i420
-92a8125d8c75eaf6159d5f431c5c71bf  vp90-2-03-size-198x200-198x200-0008.i420
-5bc96553842f65a3e37f012b72b580f5  vp90-2-03-size-198x200-198x200-0009.i420
-de5eb6299ee5034dc3b01cdc94bf810a  vp90-2-03-size-198x200-198x200-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_198x202.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_198x202.vp9
deleted file mode 100644
index 89f03df..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_198x202.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_198x202_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_198x202_vp9_md5
deleted file mode 100644
index a5eef00..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_198x202_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-f5e1cf4cc56742fadddf42189a3f65e3  vp90-2-03-size-198x202-198x202-0001.i420
-f3e8ca2c8deb29a6b5bfe415b39c901e  vp90-2-03-size-198x202-198x202-0002.i420
-89c513049e41e145bca46a7f7119567c  vp90-2-03-size-198x202-198x202-0003.i420
-419089035739e84f1aa14ccdf34edcb1  vp90-2-03-size-198x202-198x202-0004.i420
-4962c98c23b16b9257869a8ad5138731  vp90-2-03-size-198x202-198x202-0005.i420
-fde9e858ec895c36c2d8071e69f68db6  vp90-2-03-size-198x202-198x202-0006.i420
-42e1271915f31a00be3627fa866ce3ee  vp90-2-03-size-198x202-198x202-0007.i420
-c15f794933f913861a6d0041ff2fccdb  vp90-2-03-size-198x202-198x202-0008.i420
-35dab245ba952dc6fddc1a9668c30b28  vp90-2-03-size-198x202-198x202-0009.i420
-30bb4ef77cdde9cf5aea0f1287183b23  vp90-2-03-size-198x202-198x202-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_198x208.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_198x208.vp9
deleted file mode 100644
index 49eca9f..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_198x208.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_198x208_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_198x208_vp9_md5
deleted file mode 100644
index eccf93d..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_198x208_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-d45b561f81cbfcca8a1dddbc2bf8ca31  vp90-2-03-size-198x208-198x208-0001.i420
-3664f63b2e59e380622caadb7a05545e  vp90-2-03-size-198x208-198x208-0002.i420
-0662fa199512320704efecc10af1aaa4  vp90-2-03-size-198x208-198x208-0003.i420
-d8dc00882e73be89d0585663892cbcff  vp90-2-03-size-198x208-198x208-0004.i420
-ff64b8d50b7c5b484a06dab09a26147c  vp90-2-03-size-198x208-198x208-0005.i420
-1771b6a55112eb7ea10885d1390339cc  vp90-2-03-size-198x208-198x208-0006.i420
-0d5944e8a13e3c2faffb562bbe2671a8  vp90-2-03-size-198x208-198x208-0007.i420
-744bed3a88407b75a8ff27a1b0cec64e  vp90-2-03-size-198x208-198x208-0008.i420
-3887415f2ab10d2a265c4a413e7060b9  vp90-2-03-size-198x208-198x208-0009.i420
-7dd683019b19b464bc0436f41e0b7c87  vp90-2-03-size-198x208-198x208-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_198x210.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_198x210.vp9
deleted file mode 100644
index 97dfd89..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_198x210.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_198x210_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_198x210_vp9_md5
deleted file mode 100644
index 0c19c2f..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_198x210_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-8525a27170982c059d5904c1af3b43fb  vp90-2-03-size-198x210-198x210-0001.i420
-c4eb329733913360384d3917a58f6f36  vp90-2-03-size-198x210-198x210-0002.i420
-ec118b87c9cba0e4bd89fd43567cca4e  vp90-2-03-size-198x210-198x210-0003.i420
-7e57c6caba7924823977e2c9bc11f7fa  vp90-2-03-size-198x210-198x210-0004.i420
-f77ffb7228a5eda848acc40ff636ecad  vp90-2-03-size-198x210-198x210-0005.i420
-c5dddafbe3badcbbcaaebe97076e0394  vp90-2-03-size-198x210-198x210-0006.i420
-34d69ae2e5b4c4fbcc51627237c9abc5  vp90-2-03-size-198x210-198x210-0007.i420
-d9c63fa8b18d6c54e5fa31db866c06cc  vp90-2-03-size-198x210-198x210-0008.i420
-7ab392764a399328bf35977539e3148a  vp90-2-03-size-198x210-198x210-0009.i420
-7fbb7bae3ec775298aaa49a286dfb9d1  vp90-2-03-size-198x210-198x210-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_198x224.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_198x224.vp9
deleted file mode 100644
index 360ab98..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_198x224.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_198x224_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_198x224_vp9_md5
deleted file mode 100644
index 12c6979..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_198x224_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-5f69230bfd8bb485bd85552b18339fc0  vp90-2-03-size-198x224-198x224-0001.i420
-f5c365774fc1d0bffd5025ce2e931aaf  vp90-2-03-size-198x224-198x224-0002.i420
-2898234103c3624e6470ae82c916e000  vp90-2-03-size-198x224-198x224-0003.i420
-d82a7fa705180b68a8ee8cb7de0cdd2d  vp90-2-03-size-198x224-198x224-0004.i420
-144a162d418deae62883a2cc4c341b4c  vp90-2-03-size-198x224-198x224-0005.i420
-b3419a48385e42ca15717289ff2daa1c  vp90-2-03-size-198x224-198x224-0006.i420
-d6306b5737f88f989bf2e6a1084a94fe  vp90-2-03-size-198x224-198x224-0007.i420
-5669761d7417b52b3cf81d44a13e3fb7  vp90-2-03-size-198x224-198x224-0008.i420
-3f730b8658d7a6657d1af38c75357512  vp90-2-03-size-198x224-198x224-0009.i420
-27df68d515148f732325bf821037d59f  vp90-2-03-size-198x224-198x224-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_198x226.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_198x226.vp9
deleted file mode 100644
index c4d1a7c..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_198x226.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_198x226_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_198x226_vp9_md5
deleted file mode 100644
index 31305ef..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_198x226_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-412c33a8fd71c99e68e6701b050b107c  vp90-2-03-size-198x226-198x226-0001.i420
-8e69483ff8a094096dd550b30be20dde  vp90-2-03-size-198x226-198x226-0002.i420
-b8df87ab3d2613be31a3743e34d7e794  vp90-2-03-size-198x226-198x226-0003.i420
-ec4b08a4014950f1fe04e83f8a790af0  vp90-2-03-size-198x226-198x226-0004.i420
-030da2b60627d879730108826ce6632c  vp90-2-03-size-198x226-198x226-0005.i420
-03aab0c9b4d75bc0b47fa5237e9efe3d  vp90-2-03-size-198x226-198x226-0006.i420
-fd01e369df258f340eb8e486c07ae136  vp90-2-03-size-198x226-198x226-0007.i420
-1c301f0e60c96008fd7b6e8de1ebaa29  vp90-2-03-size-198x226-198x226-0008.i420
-912723f43b2b36366c3e6ab122d31801  vp90-2-03-size-198x226-198x226-0009.i420
-b2774a66f7aa0fb7dd7e64b0d67818cd  vp90-2-03-size-198x226-198x226-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_200x196.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_200x196.vp9
deleted file mode 100644
index 2d8ea87..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_200x196.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_200x196_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_200x196_vp9_md5
deleted file mode 100644
index 0b38c2b..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_200x196_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-651a0627c6cdaee8b46e1f8c4121a368  vp90-2-03-size-200x196-200x196-0001.i420
-3e63075148df16f69c933cf6c63e078c  vp90-2-03-size-200x196-200x196-0002.i420
-edf18e52b7d52af2bb7594ed358542d8  vp90-2-03-size-200x196-200x196-0003.i420
-30284124756d00d10f4f8428206ceab8  vp90-2-03-size-200x196-200x196-0004.i420
-6f6ecde53cd0ea5298f4529d396460c6  vp90-2-03-size-200x196-200x196-0005.i420
-0431d389278957fbef3e72f69f3ce008  vp90-2-03-size-200x196-200x196-0006.i420
-a047c60c4c60d2ea1f79c86dc98cdf8e  vp90-2-03-size-200x196-200x196-0007.i420
-dceda8bf128a8cdcadfa6c5db49cde51  vp90-2-03-size-200x196-200x196-0008.i420
-d8a6283637f5abda17e0bf150eac2983  vp90-2-03-size-200x196-200x196-0009.i420
-33dca31ef26fdd0daf9971c8de685d01  vp90-2-03-size-200x196-200x196-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_200x198.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_200x198.vp9
deleted file mode 100644
index e910dea6..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_200x198.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_200x198_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_200x198_vp9_md5
deleted file mode 100644
index 055811c..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_200x198_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-d4b3578d800c747bcabaa484a140ffb0  vp90-2-03-size-200x198-200x198-0001.i420
-a40f6f8c384c5dc3d5546d960bb6d9e5  vp90-2-03-size-200x198-200x198-0002.i420
-e270ae8754d9906dd88b1c7d05280801  vp90-2-03-size-200x198-200x198-0003.i420
-bde7fde5012840c5e188f3b29f4f0003  vp90-2-03-size-200x198-200x198-0004.i420
-8f8510c1130615b64fb8469af66ff678  vp90-2-03-size-200x198-200x198-0005.i420
-79b9d4e0c64f82a6e9540394222a593d  vp90-2-03-size-200x198-200x198-0006.i420
-34852ac9ca5c6bfa51736296784343c7  vp90-2-03-size-200x198-200x198-0007.i420
-b055218509dbed644113642f8f0ac8a8  vp90-2-03-size-200x198-200x198-0008.i420
-1628866b436f1c4b892474025226e545  vp90-2-03-size-200x198-200x198-0009.i420
-3fdec760c04e30c90e74afb38dbf757c  vp90-2-03-size-200x198-200x198-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_200x200.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_200x200.vp9
deleted file mode 100644
index 039ccef..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_200x200.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_200x200_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_200x200_vp9_md5
deleted file mode 100644
index b6d78f8..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_200x200_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-b339f4e563afadb25f43b8c05b12dc03  vp90-2-03-size-200x200-200x200-0001.i420
-3bd5280e7fb42400085b0b1dbba1905e  vp90-2-03-size-200x200-200x200-0002.i420
-acf1c84cabff763fe2073d2c1f183bfc  vp90-2-03-size-200x200-200x200-0003.i420
-eaa4983b6baf907efb11d137644569d2  vp90-2-03-size-200x200-200x200-0004.i420
-8a1871c8dc38a19dfd4ac571ad7f39be  vp90-2-03-size-200x200-200x200-0005.i420
-0be539bd51f5f364828dd0abc70360be  vp90-2-03-size-200x200-200x200-0006.i420
-df60622d2c9f294f61d738be9e3bd16c  vp90-2-03-size-200x200-200x200-0007.i420
-22b3f1d51ddf92c7d2add305ba0ef405  vp90-2-03-size-200x200-200x200-0008.i420
-01ba29be721e64a5a50526de0797c7d3  vp90-2-03-size-200x200-200x200-0009.i420
-7b7aa7fa0e58202b3104671375762587  vp90-2-03-size-200x200-200x200-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_200x202.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_200x202.vp9
deleted file mode 100644
index 10ed70e..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_200x202.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_200x202_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_200x202_vp9_md5
deleted file mode 100644
index f93617e..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_200x202_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-c4a13df44e66f06961dd72fc990439e9  vp90-2-03-size-200x202-200x202-0001.i420
-81c73b8d3806ad96af8f422914a253f8  vp90-2-03-size-200x202-200x202-0002.i420
-05f77526125e802be9cb306e375ded6e  vp90-2-03-size-200x202-200x202-0003.i420
-ab2e224840ff89abec2c675a23a73094  vp90-2-03-size-200x202-200x202-0004.i420
-c30f58f88819eb57102678b169e15188  vp90-2-03-size-200x202-200x202-0005.i420
-33e5e2799eb4a9c548c8372fd6769db9  vp90-2-03-size-200x202-200x202-0006.i420
-fa53c1c7e60bd1d00335af542ec69ed7  vp90-2-03-size-200x202-200x202-0007.i420
-534cafe658af10a314d6d084e55b3620  vp90-2-03-size-200x202-200x202-0008.i420
-502529e4fbecc8b890abf665fa21f53c  vp90-2-03-size-200x202-200x202-0009.i420
-bf1f73c6e77370bc51a770c8ae87bd12  vp90-2-03-size-200x202-200x202-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_200x208.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_200x208.vp9
deleted file mode 100644
index a78b114..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_200x208.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_200x208_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_200x208_vp9_md5
deleted file mode 100644
index 4611a4a..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_200x208_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-702748bec18c500dd41d93ae74b11d56  vp90-2-03-size-200x208-200x208-0001.i420
-4fb542190dab2fd673724d47451ff6ee  vp90-2-03-size-200x208-200x208-0002.i420
-dbb4d27d52797dab67e39d32092c9d44  vp90-2-03-size-200x208-200x208-0003.i420
-e4a0ed1572207b7ba433896bba711148  vp90-2-03-size-200x208-200x208-0004.i420
-28ec32bc165f4f9d455efec8a7aa8737  vp90-2-03-size-200x208-200x208-0005.i420
-a95910575a6423abffb28ca38c384b34  vp90-2-03-size-200x208-200x208-0006.i420
-791f1c558c5467725f4614a75a8a687e  vp90-2-03-size-200x208-200x208-0007.i420
-cfd3e12f84f7a811966721e890228313  vp90-2-03-size-200x208-200x208-0008.i420
-824c5fdf938551c28ac1c996645ae52f  vp90-2-03-size-200x208-200x208-0009.i420
-7465917fdd0206e393968232a0ec5193  vp90-2-03-size-200x208-200x208-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_200x210.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_200x210.vp9
deleted file mode 100644
index 27a3f40..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_200x210.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_200x210_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_200x210_vp9_md5
deleted file mode 100644
index 75c190c..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_200x210_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-31ef44bd12ae702f306c55eba10d2ba7  vp90-2-03-size-200x210-200x210-0001.i420
-83e9d913f5aa058d79a81047ca45e4a2  vp90-2-03-size-200x210-200x210-0002.i420
-b5e21313b859f1e2c67aaac5fefc9f68  vp90-2-03-size-200x210-200x210-0003.i420
-959d63c1b219c3479af673a9a8b8d82c  vp90-2-03-size-200x210-200x210-0004.i420
-ffcfaf42b69c7cd92f6e3c21987ff7df  vp90-2-03-size-200x210-200x210-0005.i420
-e9667d3ee4d8179da44de4fbffcb7df2  vp90-2-03-size-200x210-200x210-0006.i420
-5e2c841bcf4ec6f3a05020d36986fe5b  vp90-2-03-size-200x210-200x210-0007.i420
-19fe287c30bd4c90b00a9631409568c0  vp90-2-03-size-200x210-200x210-0008.i420
-58a8843e50b19860a0a91e1e1bb63bfd  vp90-2-03-size-200x210-200x210-0009.i420
-0ebd31e18597a567f96645acbb2500cf  vp90-2-03-size-200x210-200x210-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_200x224.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_200x224.vp9
deleted file mode 100644
index 61d8df6..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_200x224.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_200x224_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_200x224_vp9_md5
deleted file mode 100644
index 0f64dfc..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_200x224_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-315d69847bf752a84231a368278eb0b6  vp90-2-03-size-200x224-200x224-0001.i420
-d245738f8627fc345ab38a547bc7d352  vp90-2-03-size-200x224-200x224-0002.i420
-982681cdca448919c2eead94435772ad  vp90-2-03-size-200x224-200x224-0003.i420
-7b67b2d96476e17cd407bbccb19fd070  vp90-2-03-size-200x224-200x224-0004.i420
-c38dde73ca097049d1fc689e18a49b5d  vp90-2-03-size-200x224-200x224-0005.i420
-525f323b81d780c669a03655bb0d0b56  vp90-2-03-size-200x224-200x224-0006.i420
-5dbeb96f65e383771c1c877ec559044a  vp90-2-03-size-200x224-200x224-0007.i420
-7d96e976265ef0f9faf173376caaa9e9  vp90-2-03-size-200x224-200x224-0008.i420
-6047c805a724701b80a133486aae0e65  vp90-2-03-size-200x224-200x224-0009.i420
-eb8895dd994076a52aa3a0c1758ccbb7  vp90-2-03-size-200x224-200x224-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_200x226.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_200x226.vp9
deleted file mode 100644
index cc08073..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_200x226.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_200x226_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_200x226_vp9_md5
deleted file mode 100644
index 42f870c..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_200x226_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-e45b6b9dce4a8509b7d26bc3cfdf7c86  vp90-2-03-size-200x226-200x226-0001.i420
-ddb9d5033ecfa2d6e9a5505dce374bda  vp90-2-03-size-200x226-200x226-0002.i420
-52c495d3137143e0bce9382fe5506057  vp90-2-03-size-200x226-200x226-0003.i420
-d09f3d6ad084f2966196acd48246f951  vp90-2-03-size-200x226-200x226-0004.i420
-1556d006d0119a3172b98a500b27f8d0  vp90-2-03-size-200x226-200x226-0005.i420
-904f86cfbcc3fa683d3d7744a286cd88  vp90-2-03-size-200x226-200x226-0006.i420
-b35907456b8ccab0ae8efc8405b04c89  vp90-2-03-size-200x226-200x226-0007.i420
-b7f2648fe0f873f7e9ea4a6d913e45ec  vp90-2-03-size-200x226-200x226-0008.i420
-2da76544bc7e295486c335e17047e12e  vp90-2-03-size-200x226-200x226-0009.i420
-10fd6424caf837d37564ef15f1c6f93d  vp90-2-03-size-200x226-200x226-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_202x196.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_202x196.vp9
deleted file mode 100644
index 5961c56..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_202x196.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_202x196_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_202x196_vp9_md5
deleted file mode 100644
index 1e76804..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_202x196_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-1261466179df96099e598e46c50fa7c1  vp90-2-03-size-202x196-202x196-0001.i420
-cc0fe373cd0399cf0c95edf92d9ab01f  vp90-2-03-size-202x196-202x196-0002.i420
-7a2dc0afd06ecfcf54321fb759f57601  vp90-2-03-size-202x196-202x196-0003.i420
-db9c138503d27f87449f870ab07cab03  vp90-2-03-size-202x196-202x196-0004.i420
-ddea2e5e2659e97132a537566d5ed989  vp90-2-03-size-202x196-202x196-0005.i420
-c31e90b5eee032526c4e0603332fd160  vp90-2-03-size-202x196-202x196-0006.i420
-7e5b40f03b905d9ee749d3097a484ea0  vp90-2-03-size-202x196-202x196-0007.i420
-93e9f7defa94ff03c041448ae1e55cea  vp90-2-03-size-202x196-202x196-0008.i420
-aef8e03f0146699faa16ec28dea49dbe  vp90-2-03-size-202x196-202x196-0009.i420
-a651d949b4c8f0e455c6592dc98385f7  vp90-2-03-size-202x196-202x196-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_202x198.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_202x198.vp9
deleted file mode 100644
index de8d042..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_202x198.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_202x198_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_202x198_vp9_md5
deleted file mode 100644
index fa76001..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_202x198_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-181edc4ebeeff7f0527b93b84d5d8efb  vp90-2-03-size-202x198-202x198-0001.i420
-132c71b634fb67eed51fcdef1775b6b2  vp90-2-03-size-202x198-202x198-0002.i420
-fd41144770765fc893adc5843ebe32e4  vp90-2-03-size-202x198-202x198-0003.i420
-77dcbaea101142940b6a78a271842829  vp90-2-03-size-202x198-202x198-0004.i420
-01737c38c1ac711a9744256788211177  vp90-2-03-size-202x198-202x198-0005.i420
-31cd0b5f621daac309c6f249f4c26cd8  vp90-2-03-size-202x198-202x198-0006.i420
-e06d34e570dc46904fdb9eeb55811464  vp90-2-03-size-202x198-202x198-0007.i420
-71bf55030373bde1eaeb52d1e97bfa4a  vp90-2-03-size-202x198-202x198-0008.i420
-e96063ff02e8a23a666222b59391de9c  vp90-2-03-size-202x198-202x198-0009.i420
-5aa0079168ab5069e8a3064f9e2a6d8b  vp90-2-03-size-202x198-202x198-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_202x200.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_202x200.vp9
deleted file mode 100644
index 79ec044..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_202x200.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_202x200_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_202x200_vp9_md5
deleted file mode 100644
index 1e7817e..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_202x200_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-20c41d4a1271183dbbc7a44e6b90ea80  vp90-2-03-size-202x200-202x200-0001.i420
-bd8c1fba8d8742f4d98b7d5097c8c828  vp90-2-03-size-202x200-202x200-0002.i420
-55cbe06a925009c1b1f9b609b60b4c1d  vp90-2-03-size-202x200-202x200-0003.i420
-78e80c7cf1f142e2dda1bc269b5b3e00  vp90-2-03-size-202x200-202x200-0004.i420
-42ee8157a4c8af6670b81e9324b251e9  vp90-2-03-size-202x200-202x200-0005.i420
-022bdf5a2e1ea5f98503cd25b383ae53  vp90-2-03-size-202x200-202x200-0006.i420
-c2073865386a991da01966878ce1ce6d  vp90-2-03-size-202x200-202x200-0007.i420
-6a5b95cd4eff0836b9180a25f663d36a  vp90-2-03-size-202x200-202x200-0008.i420
-5e5498c357340d4755dc98eb0669f103  vp90-2-03-size-202x200-202x200-0009.i420
-0907d5e4020111b1ecfe707df71bcd8a  vp90-2-03-size-202x200-202x200-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_202x202.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_202x202.vp9
deleted file mode 100644
index 27a554c..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_202x202.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_202x202_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_202x202_vp9_md5
deleted file mode 100644
index f5ef776..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_202x202_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-610cef52d35e9c641f2b8c10489c3d12  vp90-2-03-size-202x202-202x202-0001.i420
-1f84062e607d4798b0544739fe0da99c  vp90-2-03-size-202x202-202x202-0002.i420
-ea379947b5c52ea3989dfc3f47c729d9  vp90-2-03-size-202x202-202x202-0003.i420
-1d06b72f06178cbb6bb5d188d22bff43  vp90-2-03-size-202x202-202x202-0004.i420
-25bd41bd7607f88a01aa0cdc336c9975  vp90-2-03-size-202x202-202x202-0005.i420
-86836a95a7a9fb1eefb20f7c5a15a9ab  vp90-2-03-size-202x202-202x202-0006.i420
-d8eb3fecce1b646b9877cd4fcca9f9bf  vp90-2-03-size-202x202-202x202-0007.i420
-a057e0b29e4ac9717452cc478c418c12  vp90-2-03-size-202x202-202x202-0008.i420
-9a3bab91b4f0fff174536b1609c9632c  vp90-2-03-size-202x202-202x202-0009.i420
-d1cd93975f746b6cae490aae31f89e7e  vp90-2-03-size-202x202-202x202-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_202x208.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_202x208.vp9
deleted file mode 100644
index 3a532a0..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_202x208.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_202x208_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_202x208_vp9_md5
deleted file mode 100644
index 7eae1c8..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_202x208_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-d2128e290be81bb0700ebe19e3faed4f  vp90-2-03-size-202x208-202x208-0001.i420
-dccaecb7e4ddb7e4224221a659af2a43  vp90-2-03-size-202x208-202x208-0002.i420
-be8e0966aaf3a9fe9164f63695dc3b62  vp90-2-03-size-202x208-202x208-0003.i420
-da944fadc3a239c2254678cadb4cf7fa  vp90-2-03-size-202x208-202x208-0004.i420
-3c270f3c02fcbd192b7f896f3f9ee6d9  vp90-2-03-size-202x208-202x208-0005.i420
-0b3ccda0a87c37e40104ae2f1060e8e9  vp90-2-03-size-202x208-202x208-0006.i420
-254253aba91758f302e7177e614596be  vp90-2-03-size-202x208-202x208-0007.i420
-b1501a4e372a5249e74aab77e57a28f1  vp90-2-03-size-202x208-202x208-0008.i420
-c4497fea1cefed5cf2b2908620153d26  vp90-2-03-size-202x208-202x208-0009.i420
-5ba20dfa2400b15b5394f315c5c3707d  vp90-2-03-size-202x208-202x208-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_202x210.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_202x210.vp9
deleted file mode 100644
index 69c00a0..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_202x210.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_202x210_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_202x210_vp9_md5
deleted file mode 100644
index 3d0ee16..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_202x210_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-e4663a28cabbfdd3815efda2d38debcc  vp90-2-03-size-202x210-202x210-0001.i420
-3cc7dbec64e9f697f40d740a72c09fc7  vp90-2-03-size-202x210-202x210-0002.i420
-f108981e0ce9c6c501b9ac61d0f1ba44  vp90-2-03-size-202x210-202x210-0003.i420
-63191c7aceb8ac6b030cc1a4b3cda18c  vp90-2-03-size-202x210-202x210-0004.i420
-b0a527ae3aafe94d13573199c6f4944f  vp90-2-03-size-202x210-202x210-0005.i420
-1be14b213ebf1d653468b8c16bae03fb  vp90-2-03-size-202x210-202x210-0006.i420
-44e5a8333a043cd93b9d1cc78e5f188f  vp90-2-03-size-202x210-202x210-0007.i420
-bfd7619f990f20e23b47d0738a6a8449  vp90-2-03-size-202x210-202x210-0008.i420
-800405f45ca5198014ef8d8521b044fa  vp90-2-03-size-202x210-202x210-0009.i420
-dca4eda872349708f54486433efc8225  vp90-2-03-size-202x210-202x210-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_202x224.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_202x224.vp9
deleted file mode 100644
index 9e24686..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_202x224.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_202x224_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_202x224_vp9_md5
deleted file mode 100644
index 50b423d..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_202x224_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-1d318f05310f6d40646f23c62c7eafe4  vp90-2-03-size-202x224-202x224-0001.i420
-42870bd73e1a0c5d84b986db3d24f0f0  vp90-2-03-size-202x224-202x224-0002.i420
-afaac676150286143c6fec7992a81467  vp90-2-03-size-202x224-202x224-0003.i420
-128f84400c272628e802c2369b6bf548  vp90-2-03-size-202x224-202x224-0004.i420
-9adc24d69f12349d8b17c84f5c111767  vp90-2-03-size-202x224-202x224-0005.i420
-b33d2f7a1955248652701f2ade8ab55d  vp90-2-03-size-202x224-202x224-0006.i420
-b8acc23721097fce6c8835f5fcfaa6ee  vp90-2-03-size-202x224-202x224-0007.i420
-b63bf9a08e4dc5879bbd91efaec95960  vp90-2-03-size-202x224-202x224-0008.i420
-96e8fe29935266f6bd486b99f917eabc  vp90-2-03-size-202x224-202x224-0009.i420
-54be14f8dde6857867cd4581f8557044  vp90-2-03-size-202x224-202x224-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_202x226.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_202x226.vp9
deleted file mode 100644
index eff9809..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_202x226.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_202x226_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_202x226_vp9_md5
deleted file mode 100644
index 88d3400..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_202x226_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-5aa0f439c58c6335cd86d4238a8c4b68  vp90-2-03-size-202x226-202x226-0001.i420
-3616cc306ec05f89d9b0db63200e4abf  vp90-2-03-size-202x226-202x226-0002.i420
-424e98f8ec0ebf2a326a917ee0159bbe  vp90-2-03-size-202x226-202x226-0003.i420
-ed5710e412f056fa8c1a277d86dd45d7  vp90-2-03-size-202x226-202x226-0004.i420
-760b850feab485f0bda6cde9943102bc  vp90-2-03-size-202x226-202x226-0005.i420
-f4bd90ca72aa707f9b68e6192ac230fd  vp90-2-03-size-202x226-202x226-0006.i420
-58e4aad0bc2a9f3fc279df10208bd6f6  vp90-2-03-size-202x226-202x226-0007.i420
-b42f84723dd167d5c544d539275ad537  vp90-2-03-size-202x226-202x226-0008.i420
-5f54feca21331646e68797380260932a  vp90-2-03-size-202x226-202x226-0009.i420
-8e787dd318024aff25af8b4d85040f3c  vp90-2-03-size-202x226-202x226-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_208x196.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_208x196.vp9
deleted file mode 100644
index 6f6807f..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_208x196.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_208x196_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_208x196_vp9_md5
deleted file mode 100644
index f32709e..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_208x196_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-6195975181969789e101a83a555d13f7  vp90-2-03-size-208x196-208x196-0001.i420
-2aca5e3307d68a5e969564a943b8e723  vp90-2-03-size-208x196-208x196-0002.i420
-aee4b00472ee0b6b7a13e31069181db4  vp90-2-03-size-208x196-208x196-0003.i420
-7808595b650a7c14d8a4800db7c014e0  vp90-2-03-size-208x196-208x196-0004.i420
-746eb763b176286aa875ae06b81118c4  vp90-2-03-size-208x196-208x196-0005.i420
-0e8a78ec061319e27d49ca25e333e017  vp90-2-03-size-208x196-208x196-0006.i420
-ac4432db2bb0971d5f70a7dda1210c19  vp90-2-03-size-208x196-208x196-0007.i420
-78870f4bd767f8ab65d369a5b322735d  vp90-2-03-size-208x196-208x196-0008.i420
-eee9ddd91209348a64259db6a4a3f80c  vp90-2-03-size-208x196-208x196-0009.i420
-c48d21e36a9c0d0d1c64db3f776b3002  vp90-2-03-size-208x196-208x196-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_208x198.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_208x198.vp9
deleted file mode 100644
index d6bea55..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_208x198.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_208x198_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_208x198_vp9_md5
deleted file mode 100644
index a57dc44..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_208x198_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-1f1fa3cdf865d8c75183f4ba6203b675  vp90-2-03-size-208x198-208x198-0001.i420
-ead33ead8fea5bd5d831a79f4c75a590  vp90-2-03-size-208x198-208x198-0002.i420
-9a406b4464989fd4bb7cbcb1b18aeaa7  vp90-2-03-size-208x198-208x198-0003.i420
-fab3d228e7032f2cdc440dbfcb17c4c1  vp90-2-03-size-208x198-208x198-0004.i420
-f2f3f8b8d9ece21c359c89245157c613  vp90-2-03-size-208x198-208x198-0005.i420
-321f5a8ecb2cec1780013fe72c237bde  vp90-2-03-size-208x198-208x198-0006.i420
-6f025b1f4ef61d261f05ca149a9470e6  vp90-2-03-size-208x198-208x198-0007.i420
-85abcc8d8e6b5f286ed6aa6c588cf416  vp90-2-03-size-208x198-208x198-0008.i420
-b28d710dd44389f774aa02edd6327d5c  vp90-2-03-size-208x198-208x198-0009.i420
-79374bef9819eecafa7396d70c80be7f  vp90-2-03-size-208x198-208x198-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_208x200.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_208x200.vp9
deleted file mode 100644
index 40aebf2..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_208x200.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_208x200_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_208x200_vp9_md5
deleted file mode 100644
index 35756a2..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_208x200_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-ff2dda3ddbe8b461d960baba0ad132bf  vp90-2-03-size-208x200-208x200-0001.i420
-d6935ac8f2250316f498e8f01afa04fd  vp90-2-03-size-208x200-208x200-0002.i420
-57173ebaef7b21698c62fa959cb40ead  vp90-2-03-size-208x200-208x200-0003.i420
-f354c76d7cf45e9f3adfdde0f6b3b5c9  vp90-2-03-size-208x200-208x200-0004.i420
-fbc968ecd214b01509a76996e45dd09a  vp90-2-03-size-208x200-208x200-0005.i420
-9c314b51a80f2a081adf9b9cc26f5f8a  vp90-2-03-size-208x200-208x200-0006.i420
-f22883a6a5b74ffa4bb16f22d496b5a5  vp90-2-03-size-208x200-208x200-0007.i420
-eb4fa914fc5658d43e32c48a0c39bab3  vp90-2-03-size-208x200-208x200-0008.i420
-d763c0c2f44b68e1e3fe9e165334eb0b  vp90-2-03-size-208x200-208x200-0009.i420
-344e1075a48cd61e79b0550809b4c91f  vp90-2-03-size-208x200-208x200-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_208x202.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_208x202.vp9
deleted file mode 100644
index eb6c574..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_208x202.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_208x202_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_208x202_vp9_md5
deleted file mode 100644
index cd27e7c..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_208x202_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-e5164f87feadf4b65257f578affc3e04  vp90-2-03-size-208x202-208x202-0001.i420
-6aee5a3b6c3a096dfc1594762b2b248f  vp90-2-03-size-208x202-208x202-0002.i420
-cb1c9dce6fdf7372e0eb2397251f0ade  vp90-2-03-size-208x202-208x202-0003.i420
-4fe5f24c08690c966b6a14ac3422510b  vp90-2-03-size-208x202-208x202-0004.i420
-b22a273814523251b365f3278d8a3a9c  vp90-2-03-size-208x202-208x202-0005.i420
-190d9dff373023a25427fc859545ea24  vp90-2-03-size-208x202-208x202-0006.i420
-a6307f38718ed686cb195e3833ab27ab  vp90-2-03-size-208x202-208x202-0007.i420
-79630bec5a91d69aca42a910413c2800  vp90-2-03-size-208x202-208x202-0008.i420
-2231cec9c03714b8671e5e1456b148c9  vp90-2-03-size-208x202-208x202-0009.i420
-278458f6734a24f2eb9bc877a6e9d7df  vp90-2-03-size-208x202-208x202-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_208x208.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_208x208.vp9
deleted file mode 100644
index 16612c0..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_208x208.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_208x208_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_208x208_vp9_md5
deleted file mode 100644
index 921cbdd..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_208x208_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-6bff7c1f4c5ef8412ebf669852c70de6  vp90-2-03-size-208x208-208x208-0001.i420
-fdfd7a2308de9509a41fed2880a8f0f5  vp90-2-03-size-208x208-208x208-0002.i420
-d8b464811e9c3b8a6db9cc277ac88c59  vp90-2-03-size-208x208-208x208-0003.i420
-b8fa29e79be3126dd74310d6dd09c747  vp90-2-03-size-208x208-208x208-0004.i420
-dad29803fed686887a0873eb78a469c6  vp90-2-03-size-208x208-208x208-0005.i420
-684de29bbf800f52aea4af9850bcc5b3  vp90-2-03-size-208x208-208x208-0006.i420
-06862dbce7571b4487766b179a596e1d  vp90-2-03-size-208x208-208x208-0007.i420
-99582a966bc7070112e214ce7912e485  vp90-2-03-size-208x208-208x208-0008.i420
-a61158581a5719cb0cf13fb3301cb8c4  vp90-2-03-size-208x208-208x208-0009.i420
-9c2295332f34fee3a249262c8ba843bc  vp90-2-03-size-208x208-208x208-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_208x210.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_208x210.vp9
deleted file mode 100644
index dfec3e8..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_208x210.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_208x210_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_208x210_vp9_md5
deleted file mode 100644
index ab5c7d8..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_208x210_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-b15c7e98ddd137237b062cb51667522f  vp90-2-03-size-208x210-208x210-0001.i420
-00c594c68b19ef39a79a38e86853dc64  vp90-2-03-size-208x210-208x210-0002.i420
-e6742abe3d2c178af4298e121391c299  vp90-2-03-size-208x210-208x210-0003.i420
-efe5387b38c32f1c25c0fc9836921074  vp90-2-03-size-208x210-208x210-0004.i420
-e0e696f4c18af09a74e052903db1468c  vp90-2-03-size-208x210-208x210-0005.i420
-f1960270c6704ca47caed63161716025  vp90-2-03-size-208x210-208x210-0006.i420
-a1542d7749cfa447481acd7835db838a  vp90-2-03-size-208x210-208x210-0007.i420
-a91fb10a17d1d056667860cc43c81dae  vp90-2-03-size-208x210-208x210-0008.i420
-b673bfbb722522b4e7b5e9c5b85cc31f  vp90-2-03-size-208x210-208x210-0009.i420
-8b4bb57d3cf609cbf9564a96a6ca6ade  vp90-2-03-size-208x210-208x210-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_208x224.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_208x224.vp9
deleted file mode 100644
index b60fb5d..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_208x224.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_208x224_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_208x224_vp9_md5
deleted file mode 100644
index bcb9657..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_208x224_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-479d07bb96905ad7d5f0ec3ee12b41ba  vp90-2-03-size-208x224-208x224-0001.i420
-4b6555aaed8e5a45879773f1bf87962e  vp90-2-03-size-208x224-208x224-0002.i420
-c5f42cb796dd7b6622957016ca6b502f  vp90-2-03-size-208x224-208x224-0003.i420
-f06c954483560866fbff10bae7ba0785  vp90-2-03-size-208x224-208x224-0004.i420
-af83aff39999852310395fe241ccb49b  vp90-2-03-size-208x224-208x224-0005.i420
-108377d6f30ceba6f2377330af2da38f  vp90-2-03-size-208x224-208x224-0006.i420
-e81e6e0b37a7b92368ede9cab124567c  vp90-2-03-size-208x224-208x224-0007.i420
-59dbe51caaed8e6e825c78c5901fb22c  vp90-2-03-size-208x224-208x224-0008.i420
-24686123ea14c8d1a9b447733df0aaab  vp90-2-03-size-208x224-208x224-0009.i420
-ce2035c49237c8076f8dac0d3f61848e  vp90-2-03-size-208x224-208x224-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_208x226.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_208x226.vp9
deleted file mode 100644
index 4541cf9..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_208x226.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_208x226_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_208x226_vp9_md5
deleted file mode 100644
index e0a7e53..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_208x226_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-33aa4af6153570518c59960a0c959053  vp90-2-03-size-208x226-208x226-0001.i420
-024fa27dee80ad199528052aaa8d42c7  vp90-2-03-size-208x226-208x226-0002.i420
-b949ef118c7e7e62a8b88e2308219ef9  vp90-2-03-size-208x226-208x226-0003.i420
-3061ee13696ced5e10a646fdd5ca6c34  vp90-2-03-size-208x226-208x226-0004.i420
-c4984bd53dcb7b9e2570f2965d077b2f  vp90-2-03-size-208x226-208x226-0005.i420
-d564c35c5caadcfd9f80377fa414af72  vp90-2-03-size-208x226-208x226-0006.i420
-9b7d7b10ee2f3eb7a9ffddcebff45b97  vp90-2-03-size-208x226-208x226-0007.i420
-a0ede7085b04cbb3519d56b2e4347d14  vp90-2-03-size-208x226-208x226-0008.i420
-63d7af745f9e6a34b618db28fe878ffd  vp90-2-03-size-208x226-208x226-0009.i420
-85077809087e7bdfb9215bfcd1f1bbc0  vp90-2-03-size-208x226-208x226-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_210x196.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_210x196.vp9
deleted file mode 100644
index a5eca1f..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_210x196.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_210x196_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_210x196_vp9_md5
deleted file mode 100644
index c23a9af..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_210x196_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-5c69f80da667bfd20394995e93e4cd2b  vp90-2-03-size-210x196-210x196-0001.i420
-13363cd8e52ca8c1053db1c84c111bc9  vp90-2-03-size-210x196-210x196-0002.i420
-108976afdf99f59276d6f89879e3bdc3  vp90-2-03-size-210x196-210x196-0003.i420
-770ce25985e6b479d52a9185876cfe83  vp90-2-03-size-210x196-210x196-0004.i420
-eba7cbb3c91989aa4c13487ed01675b5  vp90-2-03-size-210x196-210x196-0005.i420
-f391c30a47c33a250dd20cb12f0a6e01  vp90-2-03-size-210x196-210x196-0006.i420
-c38e12de302177d19dd744a3ea227e90  vp90-2-03-size-210x196-210x196-0007.i420
-8c9370439a0b7289919c6ee68e00570f  vp90-2-03-size-210x196-210x196-0008.i420
-ac3748c4b99c4f1aba7430ae12c19cfd  vp90-2-03-size-210x196-210x196-0009.i420
-e5228dc84f7933ccc9306907d737ad3c  vp90-2-03-size-210x196-210x196-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_210x198.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_210x198.vp9
deleted file mode 100644
index b11e214..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_210x198.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_210x198_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_210x198_vp9_md5
deleted file mode 100644
index 7776c06..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_210x198_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-d83ee2413e701ae405a2b74863d4c5a9  vp90-2-03-size-210x198-210x198-0001.i420
-f2ebc0f7dc171e0e5d2911c7ee2df5e1  vp90-2-03-size-210x198-210x198-0002.i420
-e189ef4d8add227352a0d6ee62748ee7  vp90-2-03-size-210x198-210x198-0003.i420
-6dcb1dca1a0e2ba85034aba9f021427e  vp90-2-03-size-210x198-210x198-0004.i420
-e98c633ba8912f6d65374055ec9af543  vp90-2-03-size-210x198-210x198-0005.i420
-82111cb7d5addce16d9bcba9e0a99503  vp90-2-03-size-210x198-210x198-0006.i420
-bbbc73002f794ab0261fe384b2524226  vp90-2-03-size-210x198-210x198-0007.i420
-0bcdc427df47123959f7de9c44fe291e  vp90-2-03-size-210x198-210x198-0008.i420
-505776b3d82e38612393d60b6aa55c1d  vp90-2-03-size-210x198-210x198-0009.i420
-feb93758242b847f3d53bb4c97b0ad9c  vp90-2-03-size-210x198-210x198-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_210x200.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_210x200.vp9
deleted file mode 100644
index 93ace8c..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_210x200.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_210x200_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_210x200_vp9_md5
deleted file mode 100644
index 20dea3f..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_210x200_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-2465560246c1ee24d937cb9cbc1422f1  vp90-2-03-size-210x200-210x200-0001.i420
-8926b628dcdf2182516822c7d0d778ec  vp90-2-03-size-210x200-210x200-0002.i420
-9bd14d3ebc7fe81c4223116de1b9c2ec  vp90-2-03-size-210x200-210x200-0003.i420
-2d029d8461c20236066c0786950540fb  vp90-2-03-size-210x200-210x200-0004.i420
-39412b6e62de43bd40c58d4e2e38daf8  vp90-2-03-size-210x200-210x200-0005.i420
-3ea211c24f606b29582147bf872994dd  vp90-2-03-size-210x200-210x200-0006.i420
-261c37f88bf7f40549642578d9464aeb  vp90-2-03-size-210x200-210x200-0007.i420
-98551d44de1e23165e05975babb72446  vp90-2-03-size-210x200-210x200-0008.i420
-1d85ad052dd27e7e6bfea5d2babf5176  vp90-2-03-size-210x200-210x200-0009.i420
-ad18b6a3698a3674c2488f927810eb0d  vp90-2-03-size-210x200-210x200-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_210x202.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_210x202.vp9
deleted file mode 100644
index e84b816..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_210x202.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_210x202_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_210x202_vp9_md5
deleted file mode 100644
index 8d7e06e..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_210x202_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-5d01848aee2b324f2e356627f9c39532  vp90-2-03-size-210x202-210x202-0001.i420
-b671fe34bc0e5a682baff929d26ea627  vp90-2-03-size-210x202-210x202-0002.i420
-e9a40f87ca5aaa5af9772e286feb9063  vp90-2-03-size-210x202-210x202-0003.i420
-4730f60d4c856e8ad877c0d8b1729ec4  vp90-2-03-size-210x202-210x202-0004.i420
-317fc01349e0984c23d15f97a3a0f442  vp90-2-03-size-210x202-210x202-0005.i420
-aea89116ffe48340d1752d1ad5195529  vp90-2-03-size-210x202-210x202-0006.i420
-14694ba65b6308e5f5571486b62ca1cc  vp90-2-03-size-210x202-210x202-0007.i420
-53c6102d877c9a30eaa20ddc45207ea0  vp90-2-03-size-210x202-210x202-0008.i420
-7d1e898b1bead878224e8ff15d624bd9  vp90-2-03-size-210x202-210x202-0009.i420
-37b684bfae5dbd33e8dbb8332b94ce8a  vp90-2-03-size-210x202-210x202-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_210x208.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_210x208.vp9
deleted file mode 100644
index c69fb3f..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_210x208.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_210x208_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_210x208_vp9_md5
deleted file mode 100644
index 72f9259..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_210x208_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-1156d318c00d299cf5bdc7e485966dab  vp90-2-03-size-210x208-210x208-0001.i420
-a8094f8f1e7e04e54251bee8c4c800ce  vp90-2-03-size-210x208-210x208-0002.i420
-e2a07d99ffe1cfe6b9fce36e93677fe1  vp90-2-03-size-210x208-210x208-0003.i420
-63d179b00816dbad75b778d2c23955c6  vp90-2-03-size-210x208-210x208-0004.i420
-407de5fb2dfdd52e6173905b09ff22f2  vp90-2-03-size-210x208-210x208-0005.i420
-36900199c56310e651723de4e3ad2f2c  vp90-2-03-size-210x208-210x208-0006.i420
-908db56e975b5db07af17fdc51b12be8  vp90-2-03-size-210x208-210x208-0007.i420
-400e32490b1262009a481cc331a00e44  vp90-2-03-size-210x208-210x208-0008.i420
-dc43b786cba033cc92b9921d12f7b3d7  vp90-2-03-size-210x208-210x208-0009.i420
-e8c94c5965c729f5d1ef3ba4509c97c8  vp90-2-03-size-210x208-210x208-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_210x210.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_210x210.vp9
deleted file mode 100644
index ad6e896..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_210x210.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_210x210_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_210x210_vp9_md5
deleted file mode 100644
index 6b88d01..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_210x210_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-b65725c68978bdaaafdf735dfbafa9e3  vp90-2-03-size-210x210-210x210-0001.i420
-35be2f16bd5dedc9d3f7a016f0d71701  vp90-2-03-size-210x210-210x210-0002.i420
-8c2873a97b51510d7449869e24a348f5  vp90-2-03-size-210x210-210x210-0003.i420
-724a30e8ae539e797db8889dc08aec5e  vp90-2-03-size-210x210-210x210-0004.i420
-e3ae1246a63ea22afd026bfb859fe165  vp90-2-03-size-210x210-210x210-0005.i420
-7e1fa363cf3f44c7a3019f29c14a6da4  vp90-2-03-size-210x210-210x210-0006.i420
-c6f26619ab5687a2a698c8766b79f2eb  vp90-2-03-size-210x210-210x210-0007.i420
-be5b8c50a772afe95d72bf3cc7c4fd2f  vp90-2-03-size-210x210-210x210-0008.i420
-9eab1417ac249ce31c79750143d52084  vp90-2-03-size-210x210-210x210-0009.i420
-9d2455048dbc3cdc2343a818c5a2bcb1  vp90-2-03-size-210x210-210x210-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_210x224.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_210x224.vp9
deleted file mode 100644
index 4a01426..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_210x224.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_210x224_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_210x224_vp9_md5
deleted file mode 100644
index 7bd7a82..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_210x224_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-bb903b926c4b34ae336e21d65ad8fd25  vp90-2-03-size-210x224-210x224-0001.i420
-c4c0bc3b112487e994d22176817ace3c  vp90-2-03-size-210x224-210x224-0002.i420
-24e699f7a92ab1b0fe12e0b747470b5b  vp90-2-03-size-210x224-210x224-0003.i420
-200f403694d3acfda63f52e8373f1420  vp90-2-03-size-210x224-210x224-0004.i420
-6df417a8ec1810562301c89724b739d1  vp90-2-03-size-210x224-210x224-0005.i420
-55757b633d8fe669fc0f507dab4fa9f7  vp90-2-03-size-210x224-210x224-0006.i420
-45bc82bee02cb45422be3ac1019896d0  vp90-2-03-size-210x224-210x224-0007.i420
-4aaf5d07d2796910767d5084556c9cf9  vp90-2-03-size-210x224-210x224-0008.i420
-f100fa26da47250b98d95a18915f521d  vp90-2-03-size-210x224-210x224-0009.i420
-f5a8def53b4638b6ce7c8588d595d0ad  vp90-2-03-size-210x224-210x224-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_210x226.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_210x226.vp9
deleted file mode 100644
index f88afa6..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_210x226.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_210x226_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_210x226_vp9_md5
deleted file mode 100644
index 48fa3d4..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_210x226_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-03707b2f5c392933f7336f380423a0a1  vp90-2-03-size-210x226-210x226-0001.i420
-b388553c79573555a3b660f5e36d4e36  vp90-2-03-size-210x226-210x226-0002.i420
-a1a7fd8ba7fb0fe7733cdf5440c7c1f3  vp90-2-03-size-210x226-210x226-0003.i420
-9daff7ef71dd54951f0b75a902065259  vp90-2-03-size-210x226-210x226-0004.i420
-60218a4b8bc0a5b0b40fa560a40fb4c0  vp90-2-03-size-210x226-210x226-0005.i420
-21229bfed833468fafc27ce93db1450c  vp90-2-03-size-210x226-210x226-0006.i420
-7aa290c6e503315d7aa3517258d5f63a  vp90-2-03-size-210x226-210x226-0007.i420
-63fd08ae2e859ff3d874ab2c2ce41a42  vp90-2-03-size-210x226-210x226-0008.i420
-725b371247fae28ef4b912368738df64  vp90-2-03-size-210x226-210x226-0009.i420
-7cf2d8d9e464307311b499ff0c3ea05e  vp90-2-03-size-210x226-210x226-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_224x196.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_224x196.vp9
deleted file mode 100644
index 8fd0876..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_224x196.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_224x196_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_224x196_vp9_md5
deleted file mode 100644
index 3edb492..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_224x196_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-3ffc096f1b42b4d319d4a9efbefc7625  vp90-2-03-size-224x196-224x196-0001.i420
-78b3655d5cad30fa6b2c2d8fd29463de  vp90-2-03-size-224x196-224x196-0002.i420
-ab197553d9599b2a03aff62d1d694848  vp90-2-03-size-224x196-224x196-0003.i420
-be368d1f3d3fcc710565b5433940f0df  vp90-2-03-size-224x196-224x196-0004.i420
-374c5db60ea9c110b871bb45be0efff1  vp90-2-03-size-224x196-224x196-0005.i420
-ec50085400d626de5833bc0a94d9941f  vp90-2-03-size-224x196-224x196-0006.i420
-d4ae69937e2a8d9bf2023d4215749635  vp90-2-03-size-224x196-224x196-0007.i420
-9b0b81eb6d62b8014e0639932fe35bc0  vp90-2-03-size-224x196-224x196-0008.i420
-cd02d0cc268e6b6df0b2dbd3f3b137e6  vp90-2-03-size-224x196-224x196-0009.i420
-5322ba1085c114f93534e1761a0d8aa1  vp90-2-03-size-224x196-224x196-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_224x198.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_224x198.vp9
deleted file mode 100644
index c0b6e4c..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_224x198.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_224x198_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_224x198_vp9_md5
deleted file mode 100644
index d0b35cd..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_224x198_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-cf35dffc80946e87bb9d3e18aab9d320  vp90-2-03-size-224x198-224x198-0001.i420
-a76ac92f05e9b097f8ac5882e1ffe656  vp90-2-03-size-224x198-224x198-0002.i420
-faa1e8a11c9df3e9c9a9dafbebea6d04  vp90-2-03-size-224x198-224x198-0003.i420
-905a28289c8ac793b335096ca7f84e1d  vp90-2-03-size-224x198-224x198-0004.i420
-cb480fa6977baf98a74bddf213ecba82  vp90-2-03-size-224x198-224x198-0005.i420
-35224d3708e3ba1dafcc58b803d5ea77  vp90-2-03-size-224x198-224x198-0006.i420
-d166d764e87854bca47ab7a2bc8b1f9b  vp90-2-03-size-224x198-224x198-0007.i420
-562f1e06ae36abba5f1fb53e3d6cd7e8  vp90-2-03-size-224x198-224x198-0008.i420
-1599cebef060f6464aeef15aacbde446  vp90-2-03-size-224x198-224x198-0009.i420
-3316ebca2864a9dc04db86069efb1dd1  vp90-2-03-size-224x198-224x198-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_224x200.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_224x200.vp9
deleted file mode 100644
index 94cc4c7..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_224x200.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_224x200_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_224x200_vp9_md5
deleted file mode 100644
index bb368ce..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_224x200_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-0819e6d715c9b4d94f05f63a7ca86199  vp90-2-03-size-224x200-224x200-0001.i420
-9b9a4b01ed4c8a93687e45245b3092a3  vp90-2-03-size-224x200-224x200-0002.i420
-3a076f5b8dba60552e84a391ee04d1c7  vp90-2-03-size-224x200-224x200-0003.i420
-7aafc561f5b96e9d286bd8deb5687774  vp90-2-03-size-224x200-224x200-0004.i420
-daa43a89ab6b2761eedaa183e33a3465  vp90-2-03-size-224x200-224x200-0005.i420
-c14874409872357b11b65f35a283e058  vp90-2-03-size-224x200-224x200-0006.i420
-37d2ef52a9c694b2596d58ed9ca0d90b  vp90-2-03-size-224x200-224x200-0007.i420
-c97bc860c006896d80f52ccc0759f472  vp90-2-03-size-224x200-224x200-0008.i420
-5f8618114a723a017e39a1af695996f3  vp90-2-03-size-224x200-224x200-0009.i420
-ee8234fc5ccd41d05eb87e1510f9795e  vp90-2-03-size-224x200-224x200-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_224x202.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_224x202.vp9
deleted file mode 100644
index ac4f494..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_224x202.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_224x202_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_224x202_vp9_md5
deleted file mode 100644
index 0c6b78c..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_224x202_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-e1e3b4af5910383ff6f66b6ab1a29544  vp90-2-03-size-224x202-224x202-0001.i420
-8668ef92b72f35728ebb456665d48b95  vp90-2-03-size-224x202-224x202-0002.i420
-dffc7c28f86f07bf28451292990e9594  vp90-2-03-size-224x202-224x202-0003.i420
-aebfb446fa6d48db36dbd9b5cd147f1e  vp90-2-03-size-224x202-224x202-0004.i420
-e3c6cb8c5bb3a26928493bfc297ab827  vp90-2-03-size-224x202-224x202-0005.i420
-68dabae76c1d27ab0e1079d99cb6d413  vp90-2-03-size-224x202-224x202-0006.i420
-d1f7745eef748688f3871d00a7e67ef8  vp90-2-03-size-224x202-224x202-0007.i420
-36738851cc2af83fd250dea4cd63941b  vp90-2-03-size-224x202-224x202-0008.i420
-16c0315c43427e7e6719806a89551703  vp90-2-03-size-224x202-224x202-0009.i420
-c4d589c0ea4cdfc1dd6dff72084c61fd  vp90-2-03-size-224x202-224x202-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_224x208.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_224x208.vp9
deleted file mode 100644
index 47eae82..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_224x208.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_224x208_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_224x208_vp9_md5
deleted file mode 100644
index 1bcdd2c..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_224x208_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-85f08afadfd1204d4131b9ee9c8cc10b  vp90-2-03-size-224x208-224x208-0001.i420
-f893de5432a082b3dffcf7499827f548  vp90-2-03-size-224x208-224x208-0002.i420
-cb81e0d7b657bc5a4a9cf8ad75a76a77  vp90-2-03-size-224x208-224x208-0003.i420
-8a40842123965731c15fc23fb6366d1d  vp90-2-03-size-224x208-224x208-0004.i420
-09c6d92af14a3fcfb12705cd5da57f2a  vp90-2-03-size-224x208-224x208-0005.i420
-6bede4dc8770df534b599021b0425309  vp90-2-03-size-224x208-224x208-0006.i420
-334b0b0448e9e4e6a0cddcd2e3a0af3f  vp90-2-03-size-224x208-224x208-0007.i420
-09f491f0f3870ef96cff0384cd7183d1  vp90-2-03-size-224x208-224x208-0008.i420
-c9e5f81186ac947a77b051c8f0e76eac  vp90-2-03-size-224x208-224x208-0009.i420
-917565c3327bff78b53a78ea739472ff  vp90-2-03-size-224x208-224x208-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_224x210.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_224x210.vp9
deleted file mode 100644
index 50d6389..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_224x210.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_224x210_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_224x210_vp9_md5
deleted file mode 100644
index d522202..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_224x210_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-427421e5fd2087c6ff7b87a27982332f  vp90-2-03-size-224x210-224x210-0001.i420
-b68311fd44e189e4174ac357d5415068  vp90-2-03-size-224x210-224x210-0002.i420
-2c822ff45be7a1ea412d21ff82c7bc1d  vp90-2-03-size-224x210-224x210-0003.i420
-34659186d93516eae1dd4d9a391d1c3f  vp90-2-03-size-224x210-224x210-0004.i420
-1990dd822abc3a10f511589db5aa50f4  vp90-2-03-size-224x210-224x210-0005.i420
-4a4dc076172c79d9fde3e17b47109835  vp90-2-03-size-224x210-224x210-0006.i420
-51874c79850120537fa5c405721d0107  vp90-2-03-size-224x210-224x210-0007.i420
-15d7897a128de9be90be17f1679012c9  vp90-2-03-size-224x210-224x210-0008.i420
-a8d9480accf8585e94161a5f7c371cef  vp90-2-03-size-224x210-224x210-0009.i420
-8a9d3f09561b895b423ae9428f620b9b  vp90-2-03-size-224x210-224x210-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_224x224.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_224x224.vp9
deleted file mode 100644
index 6397922..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_224x224.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_224x224_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_224x224_vp9_md5
deleted file mode 100644
index 1a8a55e..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_224x224_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-bedd5d2725ffff06a50e23841bc2dfb8  vp90-2-03-size-224x224-224x224-0001.i420
-8c363f68b0b30f507563516aa99e23ac  vp90-2-03-size-224x224-224x224-0002.i420
-9cb7d51ca4439614dc3f5980507a4d32  vp90-2-03-size-224x224-224x224-0003.i420
-b393a18de28ab6b8d1c6afd67a7794e0  vp90-2-03-size-224x224-224x224-0004.i420
-81f69ee1e3d89cb78cac192c352f7741  vp90-2-03-size-224x224-224x224-0005.i420
-aabb51f029a9a02e71524cf3500931e9  vp90-2-03-size-224x224-224x224-0006.i420
-6581aec620c508d2b42ccceaa2c6044d  vp90-2-03-size-224x224-224x224-0007.i420
-993cde759158c30dcf0f0a9fdcdfb0d8  vp90-2-03-size-224x224-224x224-0008.i420
-85985ae8d35514d601800a06c8226625  vp90-2-03-size-224x224-224x224-0009.i420
-0eba1d7c193e473586e4a5c87d0e0d21  vp90-2-03-size-224x224-224x224-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_224x226.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_224x226.vp9
deleted file mode 100644
index 7672e82..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_224x226.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_224x226_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_224x226_vp9_md5
deleted file mode 100644
index b3a8eee..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_224x226_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-dca556e648a576b3973fbe4b34d0328c  vp90-2-03-size-224x226-224x226-0001.i420
-34a49e4aba4aca5c76ab0f751341c32b  vp90-2-03-size-224x226-224x226-0002.i420
-4b7cc6d500b273efe7e30fc3a3946f74  vp90-2-03-size-224x226-224x226-0003.i420
-1960f0f1edf9196c96b0de742a3cd53c  vp90-2-03-size-224x226-224x226-0004.i420
-3cb7d90178636911c5d53a5f8e75599c  vp90-2-03-size-224x226-224x226-0005.i420
-84b56c60c2282f85102048cc2cf40b88  vp90-2-03-size-224x226-224x226-0006.i420
-3ca34d2978307ec0fca05130d81bcc26  vp90-2-03-size-224x226-224x226-0007.i420
-c15560be737e02ea9d1deeca0af9bb77  vp90-2-03-size-224x226-224x226-0008.i420
-391439789a6aa7bb02d7e699795a9559  vp90-2-03-size-224x226-224x226-0009.i420
-9f681e91cbcbe9920f21236b8ff093c7  vp90-2-03-size-224x226-224x226-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_226x196.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_226x196.vp9
deleted file mode 100644
index e88ffc4..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_226x196.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_226x196_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_226x196_vp9_md5
deleted file mode 100644
index a995846..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_226x196_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-4757a31842453f806de2f2256329547e  vp90-2-03-size-226x196-226x196-0001.i420
-fe5fb955a4143091c5bfae7c4a4afe0f  vp90-2-03-size-226x196-226x196-0002.i420
-93766c5a03d71f99afb7705add7b63f0  vp90-2-03-size-226x196-226x196-0003.i420
-30c91162aa6fb0ed3e47325146bb6d8a  vp90-2-03-size-226x196-226x196-0004.i420
-501fe67785b970b1b62c2ae0b36b19ad  vp90-2-03-size-226x196-226x196-0005.i420
-836be5e778e3d20e75c4fcd71f765b3d  vp90-2-03-size-226x196-226x196-0006.i420
-21a9fd5e78212fe71719e173844bc6e6  vp90-2-03-size-226x196-226x196-0007.i420
-81b3919208e345d93dde62740b47dd93  vp90-2-03-size-226x196-226x196-0008.i420
-df010555a929ba88a2f25c6267e3786e  vp90-2-03-size-226x196-226x196-0009.i420
-d2cff8282e5e7a5bbd879c73df0670c3  vp90-2-03-size-226x196-226x196-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_226x198.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_226x198.vp9
deleted file mode 100644
index fa201ed..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_226x198.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_226x198_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_226x198_vp9_md5
deleted file mode 100644
index 3c4d3f5b..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_226x198_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-b97087eb8c53cf56dc44576912654fb2  vp90-2-03-size-226x198-226x198-0001.i420
-219bb68a59dc166806a5b5689a943b66  vp90-2-03-size-226x198-226x198-0002.i420
-67b2ec19dd3b74d828b51912c25249d6  vp90-2-03-size-226x198-226x198-0003.i420
-73dd9625538e10a0f94d31ac9fe3db23  vp90-2-03-size-226x198-226x198-0004.i420
-51e68f201130da18beb0cb27adcf6fa9  vp90-2-03-size-226x198-226x198-0005.i420
-455d9753b3c0ac5ad7d9da022f69acd0  vp90-2-03-size-226x198-226x198-0006.i420
-60a8905a63db4cdd2560583fb6415030  vp90-2-03-size-226x198-226x198-0007.i420
-48c156f4b2c9f936487b43713a4573fd  vp90-2-03-size-226x198-226x198-0008.i420
-a5c8f4190cb34b3ecd42ca8e09bf1646  vp90-2-03-size-226x198-226x198-0009.i420
-233a5d5187137e047993532fc2e725d3  vp90-2-03-size-226x198-226x198-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_226x200.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_226x200.vp9
deleted file mode 100644
index a61270b..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_226x200.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_226x200_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_226x200_vp9_md5
deleted file mode 100644
index edab982..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_226x200_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-0ae27db338f73f37eaed806b1c789593  vp90-2-03-size-226x200-226x200-0001.i420
-3f69273752f43699a3bc7b22a88cc3aa  vp90-2-03-size-226x200-226x200-0002.i420
-ce0dfafb59910241d2b1a2275a2c2143  vp90-2-03-size-226x200-226x200-0003.i420
-8d20f404e25766c819ee728858bcbc76  vp90-2-03-size-226x200-226x200-0004.i420
-67bc5604c5b0f6c3484b605c1f93c83a  vp90-2-03-size-226x200-226x200-0005.i420
-1c82def3a06430d205cce0db7b5714de  vp90-2-03-size-226x200-226x200-0006.i420
-654d7a676e3b8b64541ed8cdefbd7286  vp90-2-03-size-226x200-226x200-0007.i420
-6c80c78c7b652c5b3b117a0960e89951  vp90-2-03-size-226x200-226x200-0008.i420
-ae73e3c69ec6747c5234d58c5e1e36eb  vp90-2-03-size-226x200-226x200-0009.i420
-e40d716efd8caf2d4004d299fb914328  vp90-2-03-size-226x200-226x200-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_226x202.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_226x202.vp9
deleted file mode 100644
index 28732e2..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_226x202.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_226x202_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_226x202_vp9_md5
deleted file mode 100644
index 80e7ac2..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_226x202_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-0cd2876640e71de3a6df7839bd6f0b51  vp90-2-03-size-226x202-226x202-0001.i420
-f887db6839c0cddd1ea9ae6bfd2cc16d  vp90-2-03-size-226x202-226x202-0002.i420
-ff2a890cf4c4973bf181ba8424c2eadc  vp90-2-03-size-226x202-226x202-0003.i420
-f69f2e4f3036a21deb43a0bf4b95771f  vp90-2-03-size-226x202-226x202-0004.i420
-93f511739c19f1a3b356dda39d945c93  vp90-2-03-size-226x202-226x202-0005.i420
-7f79633c93765b504fef0324bd10fdba  vp90-2-03-size-226x202-226x202-0006.i420
-d6c53d3937c9a40b227b4486452e0b33  vp90-2-03-size-226x202-226x202-0007.i420
-4e26625e8997ad6fe08ae68fbdfdbfd7  vp90-2-03-size-226x202-226x202-0008.i420
-3bf4c8ac0279351bf904cf57b0fc13c1  vp90-2-03-size-226x202-226x202-0009.i420
-12d64d856025185fa9e610dfa62b05af  vp90-2-03-size-226x202-226x202-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_226x208.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_226x208.vp9
deleted file mode 100644
index f88a8b8..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_226x208.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_226x208_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_226x208_vp9_md5
deleted file mode 100644
index 364227a..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_226x208_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-6006cac6628cf9e7cea58aec07471b06  vp90-2-03-size-226x208-226x208-0001.i420
-f7e994921248b6933920c984880ec96c  vp90-2-03-size-226x208-226x208-0002.i420
-c0aeeb9d2009538d8d5e837f45e1542d  vp90-2-03-size-226x208-226x208-0003.i420
-7dacf9d00e85bd52045eb47bae5225b3  vp90-2-03-size-226x208-226x208-0004.i420
-024fd008a099ae954e38a3f0a8ebb6c9  vp90-2-03-size-226x208-226x208-0005.i420
-fb6c368a1b3578ab59aa30e0b5cc4853  vp90-2-03-size-226x208-226x208-0006.i420
-07815251f7020b627c365a7a7be694c7  vp90-2-03-size-226x208-226x208-0007.i420
-db8b8f48f3693867d2bd8208cf4f929a  vp90-2-03-size-226x208-226x208-0008.i420
-88b42d943c0978d832333a8a3f7b6bbc  vp90-2-03-size-226x208-226x208-0009.i420
-7aa760190f9328ba4f6fa87d1d9e8d3e  vp90-2-03-size-226x208-226x208-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_226x210.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_226x210.vp9
deleted file mode 100644
index 2a60796..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_226x210.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_226x210_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_226x210_vp9_md5
deleted file mode 100644
index f4afd83..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_226x210_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-a6c1b7686202f5cc64335f92be595309  vp90-2-03-size-226x210-226x210-0001.i420
-3e573d4c693a39c5d6cd46b8873e99bb  vp90-2-03-size-226x210-226x210-0002.i420
-d2388f6f641c8ddec98f11493f1a1390  vp90-2-03-size-226x210-226x210-0003.i420
-16473e33532ebc8de2f02077c406346b  vp90-2-03-size-226x210-226x210-0004.i420
-6c75d1c01276838fce40837e373f49db  vp90-2-03-size-226x210-226x210-0005.i420
-b718e7445e2b08dde78fa7f30be01346  vp90-2-03-size-226x210-226x210-0006.i420
-2f556ed5afd60b1bbae76984ce073107  vp90-2-03-size-226x210-226x210-0007.i420
-4e5d59daed044c39a14c35f18cb4fb7a  vp90-2-03-size-226x210-226x210-0008.i420
-c14901a9906ffcd0eb1efc068ce32941  vp90-2-03-size-226x210-226x210-0009.i420
-3d73b7f87bcd16c1ec565b5cc8d0fe93  vp90-2-03-size-226x210-226x210-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_226x224.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_226x224.vp9
deleted file mode 100644
index 8735e4d..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_226x224.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_226x224_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_226x224_vp9_md5
deleted file mode 100644
index 24df8e0..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_226x224_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-80fb3a643384386beadc0991f171669d  vp90-2-03-size-226x224-226x224-0001.i420
-65a4a51163f49a75f8eeecd94cb2ba47  vp90-2-03-size-226x224-226x224-0002.i420
-d5b2aac9889d2991b83fd4360ada0258  vp90-2-03-size-226x224-226x224-0003.i420
-7958ff5535358567ea7df351d78256a7  vp90-2-03-size-226x224-226x224-0004.i420
-7e7413b9a61967d0ade07b81944e9a15  vp90-2-03-size-226x224-226x224-0005.i420
-40a008016adbf9673adbbc4c0edb4454  vp90-2-03-size-226x224-226x224-0006.i420
-fef7b5e2809ef79917ab394a067ef4be  vp90-2-03-size-226x224-226x224-0007.i420
-91ee2360faf46a25b95927c55eea603f  vp90-2-03-size-226x224-226x224-0008.i420
-a47f14a80a529f79f97accbe23188046  vp90-2-03-size-226x224-226x224-0009.i420
-3613bcd41ff13006fbba3bd0087c44f4  vp90-2-03-size-226x224-226x224-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_226x226.vp9 b/tests/tests/media/res/raw/vp90_2_03_size_226x226.vp9
deleted file mode 100644
index c7f8202..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_226x226.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_03_size_226x226_vp9_md5 b/tests/tests/media/res/raw/vp90_2_03_size_226x226_vp9_md5
deleted file mode 100644
index 24f20a6..0000000
--- a/tests/tests/media/res/raw/vp90_2_03_size_226x226_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-f2370fc802dafdf5082beffc1907a9c6  vp90-2-03-size-226x226-226x226-0001.i420
-aad6de7b986234a1d621935b272501c9  vp90-2-03-size-226x226-226x226-0002.i420
-8a6d3784e22e3b4f735e78916fbc3821  vp90-2-03-size-226x226-226x226-0003.i420
-0c4afce19c43fdf3bb1b972810cc9126  vp90-2-03-size-226x226-226x226-0004.i420
-814a68dd76a3135221131988910f51ba  vp90-2-03-size-226x226-226x226-0005.i420
-b2379c4b28dca10e67ac58631f9731c0  vp90-2-03-size-226x226-226x226-0006.i420
-b16fd651884340a428cea3fe0ac18ba6  vp90-2-03-size-226x226-226x226-0007.i420
-cb65cd4c421cfd6a19fb123ec27abbe6  vp90-2-03-size-226x226-226x226-0008.i420
-7f1d2686b9808de8ecc723b18136d57d  vp90-2-03-size-226x226-226x226-0009.i420
-da7fd4bff4b6db0221c42492876c5c4d  vp90-2-03-size-226x226-226x226-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_06_bilinear.vp9 b/tests/tests/media/res/raw/vp90_2_06_bilinear.vp9
deleted file mode 100644
index a492d03..0000000
--- a/tests/tests/media/res/raw/vp90_2_06_bilinear.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_06_bilinear_vp9_md5 b/tests/tests/media/res/raw/vp90_2_06_bilinear_vp9_md5
deleted file mode 100644
index 25231b98..0000000
--- a/tests/tests/media/res/raw/vp90_2_06_bilinear_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-818a5af531c921ae58dfedc75234f3c5  -352x288-0001.i420
-f863f8c68b5c87c721d345c5a894336d  -352x288-0002.i420
-3f1213e44db416530bc0717f0a795b5d  -352x288-0003.i420
-4b99c16a62c3d6687c78236fa13e1f41  -352x288-0004.i420
-80f23a3f04215dd7542128e7c53d68d0  -352x288-0005.i420
-b40b7aa34a77fe773d82d75b5bdd9c13  -352x288-0006.i420
-dd4af6263d20bbaf9afedb6695c1ba67  -352x288-0007.i420
-1f2ccf88f15c10e3c27b2368dacc3727  -352x288-0008.i420
-232b027c4e9b598f50d078bb7b7a165e  -352x288-0009.i420
-2b44367332aa0fe42362d61f18e7f8dd  -352x288-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_07_frame_parallel.vp9 b/tests/tests/media/res/raw/vp90_2_07_frame_parallel.vp9
deleted file mode 100644
index 2c80a2d..0000000
--- a/tests/tests/media/res/raw/vp90_2_07_frame_parallel.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_07_frame_parallel_1.vp9 b/tests/tests/media/res/raw/vp90_2_07_frame_parallel_1.vp9
deleted file mode 100644
index 10f6eb7..0000000
--- a/tests/tests/media/res/raw/vp90_2_07_frame_parallel_1.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_07_frame_parallel_1_vp9_md5 b/tests/tests/media/res/raw/vp90_2_07_frame_parallel_1_vp9_md5
deleted file mode 100644
index a6261c8..0000000
--- a/tests/tests/media/res/raw/vp90_2_07_frame_parallel_1_vp9_md5
+++ /dev/null
@@ -1,40 +0,0 @@
-b5d461894f957709576d15f6dce3d69e  vp90-2-07-frame_parallel-1.webm-352x288-0001.i420
-54e45dfe575d9843c198270f62154c09  vp90-2-07-frame_parallel-1.webm-352x288-0002.i420
-c3798fe06d2c0adbb43410b76c67c0cd  vp90-2-07-frame_parallel-1.webm-352x288-0003.i420
-2cc4ad256a586ff2be650adce4d7f332  vp90-2-07-frame_parallel-1.webm-352x288-0004.i420
-3e63839f0aaedfeaf71cf2868e506bdd  vp90-2-07-frame_parallel-1.webm-352x288-0005.i420
-ca0a10c9144084231f801fa6f0433eb4  vp90-2-07-frame_parallel-1.webm-352x288-0006.i420
-c920d177c21a8b0dee8fdbce1edfd75c  vp90-2-07-frame_parallel-1.webm-352x288-0007.i420
-6afe32287ff1dcaa42630bbf9fe32bad  vp90-2-07-frame_parallel-1.webm-352x288-0008.i420
-0bc39f7c6fbc1fb18dce622d17b0856e  vp90-2-07-frame_parallel-1.webm-352x288-0009.i420
-6f92688afcd228649627c1757417bfe5  vp90-2-07-frame_parallel-1.webm-352x288-0010.i420
-338920379e1746eff6bc1c53553c400e  vp90-2-07-frame_parallel-1.webm-352x288-0011.i420
-2beb514ca62779c7c20e1dff0ccc496a  vp90-2-07-frame_parallel-1.webm-352x288-0012.i420
-e7b4dcc8437af45f363a3b24439323d2  vp90-2-07-frame_parallel-1.webm-352x288-0013.i420
-10bac4f44ae04e2d9f3219044a273f3c  vp90-2-07-frame_parallel-1.webm-352x288-0014.i420
-45581dbebb5074f698ad6d22d52f02b6  vp90-2-07-frame_parallel-1.webm-352x288-0015.i420
-9480f12b47b834003d6d572b9fdfdda1  vp90-2-07-frame_parallel-1.webm-352x288-0016.i420
-b31f361b8971a56338b3960c18177b7c  vp90-2-07-frame_parallel-1.webm-352x288-0017.i420
-79d631a53008d36f8ff5248a8592ffdc  vp90-2-07-frame_parallel-1.webm-352x288-0018.i420
-0efc005919f5a1cdded77ae91245d3be  vp90-2-07-frame_parallel-1.webm-352x288-0019.i420
-bf0d1144000094b3eb333b3dab466ace  vp90-2-07-frame_parallel-1.webm-352x288-0020.i420
-80c0d7ccfa044dc8fe1967951c4d4fea  vp90-2-07-frame_parallel-1.webm-352x288-0021.i420
-28c8e8c406a804cde7feba37e0fda689  vp90-2-07-frame_parallel-1.webm-352x288-0022.i420
-8bef0cfaa4c298d93d20b88c17ef4864  vp90-2-07-frame_parallel-1.webm-352x288-0023.i420
-9488e35310228d5930fccc4a2ee5a96d  vp90-2-07-frame_parallel-1.webm-352x288-0024.i420
-638394b668015141ba1ff97c89034e32  vp90-2-07-frame_parallel-1.webm-352x288-0025.i420
-85aff2c821b25962d3f72208a5f05992  vp90-2-07-frame_parallel-1.webm-352x288-0026.i420
-ec68bb46a7ef2e90c07b7dcfb406eb20  vp90-2-07-frame_parallel-1.webm-352x288-0027.i420
-7b0f3a57f320b1fe33ad5ac03ba0e568  vp90-2-07-frame_parallel-1.webm-352x288-0028.i420
-da461e5510f591c17675d9d7ec9532c4  vp90-2-07-frame_parallel-1.webm-352x288-0029.i420
-d2997aa173f757dd2ef78b58f5d5a109  vp90-2-07-frame_parallel-1.webm-352x288-0030.i420
-ff70094752edf348767a47db71d2dfd0  vp90-2-07-frame_parallel-1.webm-352x288-0031.i420
-52ec9a87ad6df24714fbe6b3384b3f10  vp90-2-07-frame_parallel-1.webm-352x288-0032.i420
-665a0ee3f3ce1a100aae8ff12e8f5193  vp90-2-07-frame_parallel-1.webm-352x288-0033.i420
-98e6fcabfa61b3ca20844c4ce02cdc59  vp90-2-07-frame_parallel-1.webm-352x288-0034.i420
-8e9a1c517df8a280b27e525e3b60ec6f  vp90-2-07-frame_parallel-1.webm-352x288-0035.i420
-58701ab08edeed3f9f969742b64dbb35  vp90-2-07-frame_parallel-1.webm-352x288-0036.i420
-d901de4fdc5fc2352578116bacefade2  vp90-2-07-frame_parallel-1.webm-352x288-0037.i420
-3b9d9902ea331b3fb5ceb255e66731b3  vp90-2-07-frame_parallel-1.webm-352x288-0038.i420
-3ac2e9b87a373667686c82fc7f14e6be  vp90-2-07-frame_parallel-1.webm-352x288-0039.i420
-fe198064dd4e6ef3ef829ba41c92d002  vp90-2-07-frame_parallel-1.webm-352x288-0040.i420
diff --git a/tests/tests/media/res/raw/vp90_2_07_frame_parallel_vp9_md5 b/tests/tests/media/res/raw/vp90_2_07_frame_parallel_vp9_md5
deleted file mode 100644
index 7e598ae..0000000
--- a/tests/tests/media/res/raw/vp90_2_07_frame_parallel_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-4480e19849cb7b042355a42011fa2d89  vp90-2-07-frame_parallel-352x240-0001.i420
-1d48490e61c0109b301938facb648987  vp90-2-07-frame_parallel-352x240-0002.i420
-9c9140e23a56114ea3cc9bae01c6f2be  vp90-2-07-frame_parallel-352x240-0003.i420
-cbdd934532bd9c9c27079d17e570e4af  vp90-2-07-frame_parallel-352x240-0004.i420
-db86f11f02c0936371f59a292e32976d  vp90-2-07-frame_parallel-352x240-0005.i420
-6fc5f675eb7e1ccdfa5230208dcbc608  vp90-2-07-frame_parallel-352x240-0006.i420
-39fcd15c8cf524a9acce7a66982acec5  vp90-2-07-frame_parallel-352x240-0007.i420
-8c24475c41ec9d5aaa7954f997da12c4  vp90-2-07-frame_parallel-352x240-0008.i420
-5b9747332e303f62b73d4cd2728ac93c  vp90-2-07-frame_parallel-352x240-0009.i420
-706f3fc0042b9e6e8b91318ecd55fce8  vp90-2-07-frame_parallel-352x240-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_08_tile_1x2.vp9 b/tests/tests/media/res/raw/vp90_2_08_tile_1x2.vp9
deleted file mode 100644
index de3593a..0000000
--- a/tests/tests/media/res/raw/vp90_2_08_tile_1x2.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_08_tile_1x2_frame_parallel.vp9 b/tests/tests/media/res/raw/vp90_2_08_tile_1x2_frame_parallel.vp9
deleted file mode 100644
index 1895056..0000000
--- a/tests/tests/media/res/raw/vp90_2_08_tile_1x2_frame_parallel.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_08_tile_1x2_frame_parallel_vp9_md5 b/tests/tests/media/res/raw/vp90_2_08_tile_1x2_frame_parallel_vp9_md5
deleted file mode 100644
index 7e6b4f2..0000000
--- a/tests/tests/media/res/raw/vp90_2_08_tile_1x2_frame_parallel_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-124dcaf4393bbc676cefc1dcfc1474b9  /tmp/test-vector/vp90-2-08-tile_1x2_frame_parallel-1920x1080-0001.i420
-02e0c145da3e3c711f13dad6d5d9f2ec  /tmp/test-vector/vp90-2-08-tile_1x2_frame_parallel-1920x1080-0002.i420
-bd276b44124d01ea89cb428a3532a87e  /tmp/test-vector/vp90-2-08-tile_1x2_frame_parallel-1920x1080-0003.i420
-fc1eb96ba3b93382a8cf3dee39928d85  /tmp/test-vector/vp90-2-08-tile_1x2_frame_parallel-1920x1080-0004.i420
-0b7b92b084684377795f6fcc549f7677  /tmp/test-vector/vp90-2-08-tile_1x2_frame_parallel-1920x1080-0005.i420
-208972b2d34f0a7a6616570d8279c1f1  /tmp/test-vector/vp90-2-08-tile_1x2_frame_parallel-1920x1080-0006.i420
-33f15b325f9367cf1f58e2e25ccc7bed  /tmp/test-vector/vp90-2-08-tile_1x2_frame_parallel-1920x1080-0007.i420
-d7f75036195e89dcbcaba566c1d6cad8  /tmp/test-vector/vp90-2-08-tile_1x2_frame_parallel-1920x1080-0008.i420
-bdc3a5b228f0afa3f969d5f99685a501  /tmp/test-vector/vp90-2-08-tile_1x2_frame_parallel-1920x1080-0009.i420
-d436084146d6be84df15f5fb94067d53  /tmp/test-vector/vp90-2-08-tile_1x2_frame_parallel-1920x1080-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_08_tile_1x2_vp9_md5 b/tests/tests/media/res/raw/vp90_2_08_tile_1x2_vp9_md5
deleted file mode 100644
index f979f7f..0000000
--- a/tests/tests/media/res/raw/vp90_2_08_tile_1x2_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-124dcaf4393bbc676cefc1dcfc1474b9  /tmp/test-vector/vp90-2-08-tile_1x2-1920x1080-0001.i420
-5f3357dc102c9db11e7b68d277f31f99  /tmp/test-vector/vp90-2-08-tile_1x2-1920x1080-0002.i420
-a5fb34b4a52fbc7b8290bffe988ffb01  /tmp/test-vector/vp90-2-08-tile_1x2-1920x1080-0003.i420
-1405fa1086ac63d4f5e8ed1ca0ad192a  /tmp/test-vector/vp90-2-08-tile_1x2-1920x1080-0004.i420
-0ead62c1d7c7c44f316e601d8fea16ba  /tmp/test-vector/vp90-2-08-tile_1x2-1920x1080-0005.i420
-204e05b399becce6e936bb3ac739fbe3  /tmp/test-vector/vp90-2-08-tile_1x2-1920x1080-0006.i420
-a27c70e46f6b2c40d6d0a13befede3ac  /tmp/test-vector/vp90-2-08-tile_1x2-1920x1080-0007.i420
-71434072992ec693ae809086760cad22  /tmp/test-vector/vp90-2-08-tile_1x2-1920x1080-0008.i420
-790a525234048c0645cc81f6a042c9c3  /tmp/test-vector/vp90-2-08-tile_1x2-1920x1080-0009.i420
-751b37a7b9401a5ca30dc2673070f881  /tmp/test-vector/vp90-2-08-tile_1x2-1920x1080-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_08_tile_1x4.vp9 b/tests/tests/media/res/raw/vp90_2_08_tile_1x4.vp9
deleted file mode 100644
index 2cc32ae..0000000
--- a/tests/tests/media/res/raw/vp90_2_08_tile_1x4.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_08_tile_1x4_frame_parallel.vp9 b/tests/tests/media/res/raw/vp90_2_08_tile_1x4_frame_parallel.vp9
deleted file mode 100644
index d712a9c..0000000
--- a/tests/tests/media/res/raw/vp90_2_08_tile_1x4_frame_parallel.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_08_tile_1x4_frame_parallel_vp9_md5 b/tests/tests/media/res/raw/vp90_2_08_tile_1x4_frame_parallel_vp9_md5
deleted file mode 100644
index 0541f98..0000000
--- a/tests/tests/media/res/raw/vp90_2_08_tile_1x4_frame_parallel_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-c8a7f0299fb945318bbb6fd531885339  /tmp/test-vector/vp90-2-08-tile_1x4_frame_parallel-1920x1080-0001.i420
-88001dece48c52b0f34afc9137915c9e  /tmp/test-vector/vp90-2-08-tile_1x4_frame_parallel-1920x1080-0002.i420
-71c3bc238c76f1e3a81bc70aa7dcacfc  /tmp/test-vector/vp90-2-08-tile_1x4_frame_parallel-1920x1080-0003.i420
-32726efd04e67dc09c055481f0189c76  /tmp/test-vector/vp90-2-08-tile_1x4_frame_parallel-1920x1080-0004.i420
-7c8fa7372885d16b73f79cbddfd7d45c  /tmp/test-vector/vp90-2-08-tile_1x4_frame_parallel-1920x1080-0005.i420
-0d9a3324f574bccd9903ee040eee1787  /tmp/test-vector/vp90-2-08-tile_1x4_frame_parallel-1920x1080-0006.i420
-630fb9507a52803b50ea959a36ff60b8  /tmp/test-vector/vp90-2-08-tile_1x4_frame_parallel-1920x1080-0007.i420
-d5d7b249db773ec3c5b49567aff761e9  /tmp/test-vector/vp90-2-08-tile_1x4_frame_parallel-1920x1080-0008.i420
-b480f582b52d291aeffb97e6d572731b  /tmp/test-vector/vp90-2-08-tile_1x4_frame_parallel-1920x1080-0009.i420
-be72a4c2f29317441344cc4d73b24333  /tmp/test-vector/vp90-2-08-tile_1x4_frame_parallel-1920x1080-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_08_tile_1x4_vp9_md5 b/tests/tests/media/res/raw/vp90_2_08_tile_1x4_vp9_md5
deleted file mode 100644
index 23297f5..0000000
--- a/tests/tests/media/res/raw/vp90_2_08_tile_1x4_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-c8a7f0299fb945318bbb6fd531885339  /tmp/test-vector/vp90-2-08-tile_1x4-1920x1080-0001.i420
-22dde3e7feb2177aa350db7331e8fa8f  /tmp/test-vector/vp90-2-08-tile_1x4-1920x1080-0002.i420
-ba644eea2bd5cded05a7b82224a02d30  /tmp/test-vector/vp90-2-08-tile_1x4-1920x1080-0003.i420
-0611f83948b22eb4bd5973fa0485dcda  /tmp/test-vector/vp90-2-08-tile_1x4-1920x1080-0004.i420
-a8eea6193af51dbd06d953165b3de261  /tmp/test-vector/vp90-2-08-tile_1x4-1920x1080-0005.i420
-1e76d8ec66941c9185e0747307a1496c  /tmp/test-vector/vp90-2-08-tile_1x4-1920x1080-0006.i420
-d8404c3e80c2773173e362ff622b6f3c  /tmp/test-vector/vp90-2-08-tile_1x4-1920x1080-0007.i420
-beed5600864a9b961c983d7a7a670bc1  /tmp/test-vector/vp90-2-08-tile_1x4-1920x1080-0008.i420
-9efbe9228f6a437fe450215f711ea429  /tmp/test-vector/vp90-2-08-tile_1x4-1920x1080-0009.i420
-1b65f47a5c11c5b763123d337482bd92  /tmp/test-vector/vp90-2-08-tile_1x4-1920x1080-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_08_tile_1x8.vp9 b/tests/tests/media/res/raw/vp90_2_08_tile_1x8.vp9
deleted file mode 100644
index 4e9374f..0000000
--- a/tests/tests/media/res/raw/vp90_2_08_tile_1x8.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_08_tile_1x8_frame_parallel.vp9 b/tests/tests/media/res/raw/vp90_2_08_tile_1x8_frame_parallel.vp9
deleted file mode 100644
index ba4e864..0000000
--- a/tests/tests/media/res/raw/vp90_2_08_tile_1x8_frame_parallel.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_08_tile_1x8_frame_parallel_vp9_md5 b/tests/tests/media/res/raw/vp90_2_08_tile_1x8_frame_parallel_vp9_md5
deleted file mode 100644
index f36f297..0000000
--- a/tests/tests/media/res/raw/vp90_2_08_tile_1x8_frame_parallel_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-f91ceda125d592a3f9537d02df06c4f3  /tmp/vids/vp90-2-08-tile_1x8_frame_parallel-3840x2160-0001.i420
-563dae097075cd4002b16ffb2be42cf2  /tmp/vids/vp90-2-08-tile_1x8_frame_parallel-3840x2160-0002.i420
-1f035d79632516b58c56813c113e0f23  /tmp/vids/vp90-2-08-tile_1x8_frame_parallel-3840x2160-0003.i420
-0db334dafa73ec37699a96e21bf065d0  /tmp/vids/vp90-2-08-tile_1x8_frame_parallel-3840x2160-0004.i420
-445a1d62a17f7362c1a14179bededcab  /tmp/vids/vp90-2-08-tile_1x8_frame_parallel-3840x2160-0005.i420
-4c80d03262518f957c54afd6e02d3610  /tmp/vids/vp90-2-08-tile_1x8_frame_parallel-3840x2160-0006.i420
-bc6be97c7e509af0903509a260f5ccb6  /tmp/vids/vp90-2-08-tile_1x8_frame_parallel-3840x2160-0007.i420
-27a679a8bbf2eef3eb1dc6cb221ec467  /tmp/vids/vp90-2-08-tile_1x8_frame_parallel-3840x2160-0008.i420
-eb3b064727f265bd29407f334a51c1ab  /tmp/vids/vp90-2-08-tile_1x8_frame_parallel-3840x2160-0009.i420
-3e0caeeef59797f9ec278e190170c285  /tmp/vids/vp90-2-08-tile_1x8_frame_parallel-3840x2160-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_08_tile_1x8_vp9_md5 b/tests/tests/media/res/raw/vp90_2_08_tile_1x8_vp9_md5
deleted file mode 100644
index a13a4d7..0000000
--- a/tests/tests/media/res/raw/vp90_2_08_tile_1x8_vp9_md5
+++ /dev/null
@@ -1,10 +0,0 @@
-f91ceda125d592a3f9537d02df06c4f3  /tmp/vids/vp90-2-08-tile_1x8-3840x2160-0001.i420
-a911be78a743ed0f21463bfb82efbd44  /tmp/vids/vp90-2-08-tile_1x8-3840x2160-0002.i420
-85d7cddba48b9e26b089da7f40fd4c71  /tmp/vids/vp90-2-08-tile_1x8-3840x2160-0003.i420
-39241fe3e171fafbc95966c03042699d  /tmp/vids/vp90-2-08-tile_1x8-3840x2160-0004.i420
-7b8500c53fce2702d204b6fc888f33fb  /tmp/vids/vp90-2-08-tile_1x8-3840x2160-0005.i420
-8197c61dcecdbd975fe54771f34c5df2  /tmp/vids/vp90-2-08-tile_1x8-3840x2160-0006.i420
-f28ebf18412521df51b9d6a3ffd44f4b  /tmp/vids/vp90-2-08-tile_1x8-3840x2160-0007.i420
-0d576800a02952e825f1721fc13ac695  /tmp/vids/vp90-2-08-tile_1x8-3840x2160-0008.i420
-0eb34a14d7a89ee4c951759a35673b13  /tmp/vids/vp90-2-08-tile_1x8-3840x2160-0009.i420
-11fb21038d63e3b431f92e0a4152c2f4  /tmp/vids/vp90-2-08-tile_1x8-3840x2160-0010.i420
diff --git a/tests/tests/media/res/raw/vp90_2_08_tile_4x1.vp9 b/tests/tests/media/res/raw/vp90_2_08_tile_4x1.vp9
deleted file mode 100644
index e4f9580..0000000
--- a/tests/tests/media/res/raw/vp90_2_08_tile_4x1.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_08_tile_4x1_vp9_md5 b/tests/tests/media/res/raw/vp90_2_08_tile_4x1_vp9_md5
deleted file mode 100644
index 85d3f2a..0000000
--- a/tests/tests/media/res/raw/vp90_2_08_tile_4x1_vp9_md5
+++ /dev/null
@@ -1,5 +0,0 @@
-82fe82552fc693418e68f7757c67bbcb  vp90-2-08-tile-4x1-1920x1080-0001.i420
-28db6328c54d2dbe7e9efae5ca58cec8  vp90-2-08-tile-4x1-1920x1080-0002.i420
-72f6459dd217ddd05f42cd9e8d6f689f  vp90-2-08-tile-4x1-1920x1080-0003.i420
-12eeebc1533f812d01df0e2b2b8cf0f3  vp90-2-08-tile-4x1-1920x1080-0004.i420
-7ddc1f11bb28f6ad235832e6a1bb88dd  vp90-2-08-tile-4x1-1920x1080-0005.i420
diff --git a/tests/tests/media/res/raw/vp90_2_08_tile_4x4.vp9 b/tests/tests/media/res/raw/vp90_2_08_tile_4x4.vp9
deleted file mode 100644
index 99e18c7..0000000
--- a/tests/tests/media/res/raw/vp90_2_08_tile_4x4.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_08_tile_4x4_vp9_md5 b/tests/tests/media/res/raw/vp90_2_08_tile_4x4_vp9_md5
deleted file mode 100644
index 5bb175c..0000000
--- a/tests/tests/media/res/raw/vp90_2_08_tile_4x4_vp9_md5
+++ /dev/null
@@ -1,5 +0,0 @@
-a3b9b715a7e2aed15430faabb3c8b7b3  vp90-2-08-tile-4x4-1920x1080-0001.i420
-85fa2105aa554e680056d1a413ac9673  vp90-2-08-tile-4x4-1920x1080-0002.i420
-4abb371be22d7914bb62b30d901c30ce  vp90-2-08-tile-4x4-1920x1080-0003.i420
-83c2528204ae3fd4d4cc8fc67b641d3a  vp90-2-08-tile-4x4-1920x1080-0004.i420
-86fcc862b8c8d64690ba3c4a6bff9f74  vp90-2-08-tile-4x4-1920x1080-0005.i420
diff --git a/tests/tests/media/res/raw/vp90_2_09_aq2.vp9 b/tests/tests/media/res/raw/vp90_2_09_aq2.vp9
deleted file mode 100644
index 26c09a5..0000000
--- a/tests/tests/media/res/raw/vp90_2_09_aq2.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_09_aq2_vp9_md5 b/tests/tests/media/res/raw/vp90_2_09_aq2_vp9_md5
deleted file mode 100644
index 57ce2c8..0000000
--- a/tests/tests/media/res/raw/vp90_2_09_aq2_vp9_md5
+++ /dev/null
@@ -1,100 +0,0 @@
-7fd2573f979a4c0fcc74c6ed37599738  vp90-2-09-aq2-352x240-0001.i420
-c2fba96de0561d78d96425813bdf0da0  vp90-2-09-aq2-352x240-0002.i420
-108b4bfeae261da9758675bce8b4645f  vp90-2-09-aq2-352x240-0003.i420
-43b6e3bb1c3f6d15033f16fbd4355265  vp90-2-09-aq2-352x240-0004.i420
-e5a63b53ba5c19370c6f5fdb812014b5  vp90-2-09-aq2-352x240-0005.i420
-de4aa11cfd57d3fa11c8e29faec64bea  vp90-2-09-aq2-352x240-0006.i420
-b70e555bc41eafa68db19d81780fe7b9  vp90-2-09-aq2-352x240-0007.i420
-8a49e3307faef41ecfecfdaa29f48d1f  vp90-2-09-aq2-352x240-0008.i420
-ed01509dcb01ba6644137e7f0f588f13  vp90-2-09-aq2-352x240-0009.i420
-15630dcfe0ec0f27abace3e2ac80d47a  vp90-2-09-aq2-352x240-0010.i420
-2f023d334f0d0d7ea7724ddd075b41a3  vp90-2-09-aq2-352x240-0011.i420
-3fd72535813e4943d1e4b19f7e554b00  vp90-2-09-aq2-352x240-0012.i420
-360db62794959e018a04c3650e832d60  vp90-2-09-aq2-352x240-0013.i420
-33638c46202958cabd78356f18101b88  vp90-2-09-aq2-352x240-0014.i420
-d8a3d7541654307f3b500cb6399fccd1  vp90-2-09-aq2-352x240-0015.i420
-cd2a41d7d0f21c02919ffb87b9510b55  vp90-2-09-aq2-352x240-0016.i420
-54b8f6b3d7e2edb67db7c3aa7f5a973b  vp90-2-09-aq2-352x240-0017.i420
-ddabc76c8b2af158e5feed0f48106429  vp90-2-09-aq2-352x240-0018.i420
-b22c40581501676d588a77b502cb5e48  vp90-2-09-aq2-352x240-0019.i420
-e25c4976462fe37b0119e719e7a9a65b  vp90-2-09-aq2-352x240-0020.i420
-1fcf289ba81a469926b63e9fa70fc184  vp90-2-09-aq2-352x240-0021.i420
-6a7392c22ffac7c6a4bfe7012e8dfa29  vp90-2-09-aq2-352x240-0022.i420
-9b74dc670c67073a582b3c8d390caaf5  vp90-2-09-aq2-352x240-0023.i420
-23b18dc9b7eb27b55e0068c1d75de8ad  vp90-2-09-aq2-352x240-0024.i420
-0a94a263b90e08e88909deafd5c42b7c  vp90-2-09-aq2-352x240-0025.i420
-9b940506b41816d2030f7a2089d83ea3  vp90-2-09-aq2-352x240-0026.i420
-da88cae2ec9324ad19365871ec893d45  vp90-2-09-aq2-352x240-0027.i420
-323cf97cddde5a9cea5f338b7ab17860  vp90-2-09-aq2-352x240-0028.i420
-455506b023df603e494bcc36ffcce179  vp90-2-09-aq2-352x240-0029.i420
-7dc8cf924ca17b6f19c7ed5e7d584835  vp90-2-09-aq2-352x240-0030.i420
-88e4c47e343182051fef005676fc3112  vp90-2-09-aq2-352x240-0031.i420
-e4891dfcc239d80f3240b85fe48f3957  vp90-2-09-aq2-352x240-0032.i420
-e559abcb6717ca8b211159010beebef8  vp90-2-09-aq2-352x240-0033.i420
-3b96d340f65e415d40d60bf6a3bedefc  vp90-2-09-aq2-352x240-0034.i420
-51131241975195394fb3eaa13ca1b43f  vp90-2-09-aq2-352x240-0035.i420
-ceefc4774251000943f2d58c68f2b3d3  vp90-2-09-aq2-352x240-0036.i420
-76524ef8a7f1ab5199124e8bff7bc559  vp90-2-09-aq2-352x240-0037.i420
-906cf4fc07aacb1f0a3ceaf7eeda2e74  vp90-2-09-aq2-352x240-0038.i420
-c7ad9d7bc30af316285b962b9eda4c9a  vp90-2-09-aq2-352x240-0039.i420
-424a7133c0bb45a2601733a39f8d70fa  vp90-2-09-aq2-352x240-0040.i420
-e76eac1e8e9529609ad1bf3e4c44e4d0  vp90-2-09-aq2-352x240-0041.i420
-e238dcef853fed9f7322cb1d73dceef5  vp90-2-09-aq2-352x240-0042.i420
-a0f2d7cd7f628fca6992ccb2ca418133  vp90-2-09-aq2-352x240-0043.i420
-4d07e59c0935554b624409bd904264ef  vp90-2-09-aq2-352x240-0044.i420
-d0944fdf52b02c4ff8fd7fcb944ae00c  vp90-2-09-aq2-352x240-0045.i420
-f719c346201b393262d4764bc989c4fd  vp90-2-09-aq2-352x240-0046.i420
-951d18cb2791c55ebed8321dba537eb9  vp90-2-09-aq2-352x240-0047.i420
-f764f5aaac4f19b131377e16d034de9a  vp90-2-09-aq2-352x240-0048.i420
-871f7a2201dd951ba541625219a8f000  vp90-2-09-aq2-352x240-0049.i420
-05e9bf3f38aacd65a796400247c8d149  vp90-2-09-aq2-352x240-0050.i420
-7bdc6fc1fe6a1e24cb952e10ed19ab68  vp90-2-09-aq2-352x240-0051.i420
-a92e8a9e7ba4d24adcf63ab897057e68  vp90-2-09-aq2-352x240-0052.i420
-7ec84b978b27052954fac85142582c2c  vp90-2-09-aq2-352x240-0053.i420
-10153d3889093a27aa2aa7a4380d6372  vp90-2-09-aq2-352x240-0054.i420
-1313e1ab4c7c6c01b3b25ff7fc84da9f  vp90-2-09-aq2-352x240-0055.i420
-810d9122895dcb90fae58be03af9980b  vp90-2-09-aq2-352x240-0056.i420
-f77fb637d12d958099d534f4a1689eb7  vp90-2-09-aq2-352x240-0057.i420
-3570f0094d3f06efa648ff4d9db2a25d  vp90-2-09-aq2-352x240-0058.i420
-8f22721b7e56e04d41d2af7cbf2ca349  vp90-2-09-aq2-352x240-0059.i420
-fee5d638fa94a6d1a2fa1dfc86a3f131  vp90-2-09-aq2-352x240-0060.i420
-c9e2f58d5f3f8c3ad527e9bd53e12372  vp90-2-09-aq2-352x240-0061.i420
-6507534d0c9fbd22c76f1f7753f000ce  vp90-2-09-aq2-352x240-0062.i420
-cd944cf2a7dbd30ab4fc4b99f4041379  vp90-2-09-aq2-352x240-0063.i420
-15bbc0674190eeb1112a27746dce3726  vp90-2-09-aq2-352x240-0064.i420
-7270c42f643a9f27095dade9f1b6b62e  vp90-2-09-aq2-352x240-0065.i420
-7f47919091ccd7072a2068904f582679  vp90-2-09-aq2-352x240-0066.i420
-1e3c77d769a978bf9dc9188c0f1ed105  vp90-2-09-aq2-352x240-0067.i420
-4a4613749f272b7a04e6ead37844f73c  vp90-2-09-aq2-352x240-0068.i420
-8967e0f52af43110004dce3f78c8fc75  vp90-2-09-aq2-352x240-0069.i420
-e3b979ec8ed4e389abaeea149b86b407  vp90-2-09-aq2-352x240-0070.i420
-fd3c72c5249c214a85e0957279090781  vp90-2-09-aq2-352x240-0071.i420
-7fe861180df75e21f4b8937ae506d601  vp90-2-09-aq2-352x240-0072.i420
-8804a39483b5a8d7ae03003ee8b3152a  vp90-2-09-aq2-352x240-0073.i420
-30a1b0bd147277f8fc50de11c2c8dc93  vp90-2-09-aq2-352x240-0074.i420
-7cb788efedd325f45bd4785f89432115  vp90-2-09-aq2-352x240-0075.i420
-a162c8ab7fa0dafdc3313a69bc7f1e38  vp90-2-09-aq2-352x240-0076.i420
-83905de481bd1cafa16cd96698337c25  vp90-2-09-aq2-352x240-0077.i420
-3d75f99043ea4bf2364844474e180079  vp90-2-09-aq2-352x240-0078.i420
-89975274a8a72af7d2cdee9fbe907852  vp90-2-09-aq2-352x240-0079.i420
-e05c9a7af0ea61d4ef4476de4d7c97cd  vp90-2-09-aq2-352x240-0080.i420
-dfc99210a942a7427033cce9b596e0fa  vp90-2-09-aq2-352x240-0081.i420
-544361eecb8c3b45feb1dbef5c0a39a2  vp90-2-09-aq2-352x240-0082.i420
-7aaae6bbf8af4f7f6556f2285a9d9476  vp90-2-09-aq2-352x240-0083.i420
-485716ddd13576464d1ca47b4859cc22  vp90-2-09-aq2-352x240-0084.i420
-00194b66bafdb6a252852bd087200c6b  vp90-2-09-aq2-352x240-0085.i420
-d21b316ba1006c2381d78e5b7652b12a  vp90-2-09-aq2-352x240-0086.i420
-56506d53dc2333ccddcedb449977ce57  vp90-2-09-aq2-352x240-0087.i420
-0c6787858208959270dde59e38c544ca  vp90-2-09-aq2-352x240-0088.i420
-913b906f645964f57913db70e21aa6d8  vp90-2-09-aq2-352x240-0089.i420
-f9c5d447dd4c060d3610d22b6ff8f1d7  vp90-2-09-aq2-352x240-0090.i420
-ece0a0110c14dccde0ea4d0484b60d38  vp90-2-09-aq2-352x240-0091.i420
-fbcb7e878673c8287a1ed57a6feef818  vp90-2-09-aq2-352x240-0092.i420
-be5aed5dd5538c3ad8c9d88fb4a4207f  vp90-2-09-aq2-352x240-0093.i420
-4c668204dd2c45d039bf7c5f44203803  vp90-2-09-aq2-352x240-0094.i420
-06f9b1207289ed7fbf03c4be3f0349f5  vp90-2-09-aq2-352x240-0095.i420
-26275672bc752789d0a175ca48344643  vp90-2-09-aq2-352x240-0096.i420
-1b56fde58558ec9ae00f24815c13f672  vp90-2-09-aq2-352x240-0097.i420
-ff65dec4cab5d10ea34321f34d369b5e  vp90-2-09-aq2-352x240-0098.i420
-3d419dded34673cf487b39106af08da6  vp90-2-09-aq2-352x240-0099.i420
-ab8a99b2a88bab0238e5d3d3204098e0  vp90-2-09-aq2-352x240-0100.i420
diff --git a/tests/tests/media/res/raw/vp90_2_09_lf_deltas.vp9 b/tests/tests/media/res/raw/vp90_2_09_lf_deltas.vp9
deleted file mode 100644
index 72c747b..0000000
--- a/tests/tests/media/res/raw/vp90_2_09_lf_deltas.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_09_lf_deltas_vp9_md5 b/tests/tests/media/res/raw/vp90_2_09_lf_deltas_vp9_md5
deleted file mode 100644
index b212aaa..0000000
--- a/tests/tests/media/res/raw/vp90_2_09_lf_deltas_vp9_md5
+++ /dev/null
@@ -1,30 +0,0 @@
-a83c7f4602f595fd09e97f8c8a7277ec  vp90-2-09-lf_deltas-352x240-0001.i420
-53e1a3fd44932883a8dd112bbb0e359f  vp90-2-09-lf_deltas-352x240-0002.i420
-4bb16d168f9f0a7702c31a68bb8ff36c  vp90-2-09-lf_deltas-352x240-0003.i420
-1b2df157913aba96553aaf8d51491bf3  vp90-2-09-lf_deltas-352x240-0004.i420
-9d041532e42fca7a4062cd3e9b75413b  vp90-2-09-lf_deltas-352x240-0005.i420
-0dbac5ca06e13714d10e99042aefe375  vp90-2-09-lf_deltas-352x240-0006.i420
-bb83a507a65d2a640b08f42a77bb37f6  vp90-2-09-lf_deltas-352x240-0007.i420
-176f992d37c7daa36135cddb49398de3  vp90-2-09-lf_deltas-352x240-0008.i420
-c41834f72b3281cf6aaa66fd7416e6c3  vp90-2-09-lf_deltas-352x240-0009.i420
-790d4e6b1609dec782ff978e2003d318  vp90-2-09-lf_deltas-352x240-0010.i420
-449622f741f7577c1d721f2e9eb25091  vp90-2-09-lf_deltas-352x240-0011.i420
-8ef8543f7895c87ab04491b0150628e5  vp90-2-09-lf_deltas-352x240-0012.i420
-88ef626aca4b2bcb8c58a69db20a7b02  vp90-2-09-lf_deltas-352x240-0013.i420
-4b2f7adc2e1872ecdd9ffa7d1f1df4a6  vp90-2-09-lf_deltas-352x240-0014.i420
-7b162660225022ef31e39c34fee3418e  vp90-2-09-lf_deltas-352x240-0015.i420
-2b439a4b846edcc69cdf6075de5ac8fb  vp90-2-09-lf_deltas-352x240-0016.i420
-ba2eb1ba0ed9abf701a53a94c9c626fc  vp90-2-09-lf_deltas-352x240-0017.i420
-9fbec5d5334fd5e917feee756b652d93  vp90-2-09-lf_deltas-352x240-0018.i420
-93b5eb99ea54abc5fa90c5674499e27e  vp90-2-09-lf_deltas-352x240-0019.i420
-04a98408e9b0aed28932ef1dfdcfdb6c  vp90-2-09-lf_deltas-352x240-0020.i420
-9856ba976bed30bc790a3f28e926b092  vp90-2-09-lf_deltas-352x240-0021.i420
-2b0f450e9724cfc57b846148ff876e51  vp90-2-09-lf_deltas-352x240-0022.i420
-163757f3529369b9789ea606387b831d  vp90-2-09-lf_deltas-352x240-0023.i420
-de5ed2aff936c54f3378d0dcc2575d13  vp90-2-09-lf_deltas-352x240-0024.i420
-1f642826b8a6fb111c7c6130481dab89  vp90-2-09-lf_deltas-352x240-0025.i420
-b8e3a77c7d3c5c56f67aa7409fb5404c  vp90-2-09-lf_deltas-352x240-0026.i420
-eb06cb4f471e42d7fc06929a442cca8b  vp90-2-09-lf_deltas-352x240-0027.i420
-53471649a5080b306d2c04a4f7673bdf  vp90-2-09-lf_deltas-352x240-0028.i420
-70996be0cc5d2bd97025015dd50caa99  vp90-2-09-lf_deltas-352x240-0029.i420
-ff3280a8562fdf6697c4a7cb9c1bf0a0  vp90-2-09-lf_deltas-352x240-0030.i420
diff --git a/tests/tests/media/res/raw/vp90_2_09_subpixel_00.vp9 b/tests/tests/media/res/raw/vp90_2_09_subpixel_00.vp9
deleted file mode 100644
index 78900f9..0000000
--- a/tests/tests/media/res/raw/vp90_2_09_subpixel_00.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_09_subpixel_00_vp9_md5 b/tests/tests/media/res/raw/vp90_2_09_subpixel_00_vp9_md5
deleted file mode 100644
index 1144632..0000000
--- a/tests/tests/media/res/raw/vp90_2_09_subpixel_00_vp9_md5
+++ /dev/null
@@ -1,20 +0,0 @@
-50233551e96b74ebfdaabbc8a154303c  vp90-hantro-stream-001-320x180-0001.i420
-047109ae2e488be8ee953dca4f09a0e2  vp90-hantro-stream-001-320x180-0002.i420
-5e2ba01240e39566a607f10f0d7eaed3  vp90-hantro-stream-001-320x180-0003.i420
-01f1c635ce56efcc13def2ac3bcccc3f  vp90-hantro-stream-001-320x180-0004.i420
-6e800d75da797409eb2f5b458027b05d  vp90-hantro-stream-001-320x180-0005.i420
-a88b9c2cfad5367d934fd067c2c6452d  vp90-hantro-stream-001-320x180-0006.i420
-a898a33e443dba4c2d61c27caa0fb068  vp90-hantro-stream-001-320x180-0007.i420
-321f16df155169f1fbd117a258b065ed  vp90-hantro-stream-001-320x180-0008.i420
-a71b4df17c37e423a2a6129be8058c66  vp90-hantro-stream-001-320x180-0009.i420
-b168dad8dd0be2e945ada495320e1ec3  vp90-hantro-stream-001-320x180-0010.i420
-4b4e227f6558b9a0e80bbeaebdc50b63  vp90-hantro-stream-001-320x180-0011.i420
-929ad97d05c62b56d908378beeedb68e  vp90-hantro-stream-001-320x180-0012.i420
-f952dc4b2a6e6cdcb0740e67eec87c96  vp90-hantro-stream-001-320x180-0013.i420
-f42500b60e2bbfee44b7e5b4068d9061  vp90-hantro-stream-001-320x180-0014.i420
-802f7975005cc8d77a3801b72ee08ca1  vp90-hantro-stream-001-320x180-0015.i420
-e685e147c9400dd6742c749dc1e18fd6  vp90-hantro-stream-001-320x180-0016.i420
-4080f9db1e9a98478af9c0575a7f31fc  vp90-hantro-stream-001-320x180-0017.i420
-70fcce378d2bade12d2dab44b3fbd4b6  vp90-hantro-stream-001-320x180-0018.i420
-81e539130d2dbb2eb69fe63eb1bb9cbb  vp90-hantro-stream-001-320x180-0019.i420
-2952c0eae93f3dadd1aa84c50d3fd6d2  vp90-hantro-stream-001-320x180-0020.i420
diff --git a/tests/tests/media/res/raw/vp90_2_10_show_existing_frame.vp9 b/tests/tests/media/res/raw/vp90_2_10_show_existing_frame.vp9
deleted file mode 100644
index bd5531e..0000000
--- a/tests/tests/media/res/raw/vp90_2_10_show_existing_frame.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_10_show_existing_frame2.vp9 b/tests/tests/media/res/raw/vp90_2_10_show_existing_frame2.vp9
deleted file mode 100644
index 665a236..0000000
--- a/tests/tests/media/res/raw/vp90_2_10_show_existing_frame2.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_10_show_existing_frame2_vp9_md5 b/tests/tests/media/res/raw/vp90_2_10_show_existing_frame2_vp9_md5
deleted file mode 100644
index 51940b6..0000000
--- a/tests/tests/media/res/raw/vp90_2_10_show_existing_frame2_vp9_md5
+++ /dev/null
@@ -1,16 +0,0 @@
-382b12c33cd86b38758706b8ebca8a85  -352x288-0001.i420
-799544370b35c91711a5b49a28cf86a8  -352x288-0002.i420
-7218eb4b6d1c7aea4f96ee47ad675e8e  -352x288-0003.i420
-627466200370e6ad60ea570d31be66e3  -352x288-0004.i420
-7dc65a2af108379f2b9265a9a1ea7cf8  -352x288-0005.i420
-c979e2f084760775a567f60f79f28198  -352x288-0006.i420
-fe668a6417aa0543e4ed4d1c67c5cbcb  -352x288-0007.i420
-bf9901e39815fa93cce0ed5b02b2ef2d  -352x288-0008.i420
-627466200370e6ad60ea570d31be66e3  -352x288-0009.i420
-7dc65a2af108379f2b9265a9a1ea7cf8  -352x288-0010.i420
-c979e2f084760775a567f60f79f28198  -352x288-0011.i420
-fe668a6417aa0543e4ed4d1c67c5cbcb  -352x288-0012.i420
-bf9901e39815fa93cce0ed5b02b2ef2d  -352x288-0013.i420
-627466200370e6ad60ea570d31be66e3  -352x288-0014.i420
-7dc65a2af108379f2b9265a9a1ea7cf8  -352x288-0015.i420
-c979e2f084760775a567f60f79f28198  -352x288-0016.i420
diff --git a/tests/tests/media/res/raw/vp90_2_10_show_existing_frame_vp9_md5 b/tests/tests/media/res/raw/vp90_2_10_show_existing_frame_vp9_md5
deleted file mode 100644
index 85d421d..0000000
--- a/tests/tests/media/res/raw/vp90_2_10_show_existing_frame_vp9_md5
+++ /dev/null
@@ -1,13 +0,0 @@
-18981342ec178e082519451062c3a67f  vp90-2-10-show-existing-frame-352x288-0001.i420
-04ab9dbeac49ec31be58f6e671698e05  vp90-2-10-show-existing-frame-352x288-0002.i420
-4ed58a0ba93a5d97a232a50c5876cda2  vp90-2-10-show-existing-frame-352x288-0003.i420
-a41f00034923e56ba51a0b598acc2e3a  vp90-2-10-show-existing-frame-352x288-0004.i420
-63fa55ae9535ccdf06d44cce8065dda6  vp90-2-10-show-existing-frame-352x288-0005.i420
-a41f00034923e56ba51a0b598acc2e3a  vp90-2-10-show-existing-frame-352x288-0006.i420
-0e4b08e14d919edee2bbff2ecd47de57  vp90-2-10-show-existing-frame-352x288-0007.i420
-0e4b08e14d919edee2bbff2ecd47de57  vp90-2-10-show-existing-frame-352x288-0008.i420
-5d4af03fc3d410413ef2b5a6275528b7  vp90-2-10-show-existing-frame-352x288-0009.i420
-9e932915c67a789f6877e6d3f76d3649  vp90-2-10-show-existing-frame-352x288-0010.i420
-12f2e975c217e7ffcf334524e8acec35  vp90-2-10-show-existing-frame-352x288-0011.i420
-9e932915c67a789f6877e6d3f76d3649  vp90-2-10-show-existing-frame-352x288-0012.i420
-12f2e975c217e7ffcf334524e8acec35  vp90-2-10-show-existing-frame-352x288-0013.i420
diff --git a/tests/tests/media/res/raw/vp90_2_12_droppable_1.vp9 b/tests/tests/media/res/raw/vp90_2_12_droppable_1.vp9
deleted file mode 100644
index 666d187..0000000
--- a/tests/tests/media/res/raw/vp90_2_12_droppable_1.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_12_droppable_1_vp9_md5 b/tests/tests/media/res/raw/vp90_2_12_droppable_1_vp9_md5
deleted file mode 100644
index 7b1abf8..0000000
--- a/tests/tests/media/res/raw/vp90_2_12_droppable_1_vp9_md5
+++ /dev/null
@@ -1,99 +0,0 @@
-1839e5db94dc99681d690d544cbe28a4  vp90-2-12-droppable_1.ivf-352x288-0001.i420
-dae2db51b91745edddb33ddbeb4e0988  vp90-2-12-droppable_1.ivf-352x288-0002.i420
-046639dbef310bf9016a54498a3ef0a3  vp90-2-12-droppable_1.ivf-352x288-0003.i420
-947044a5dbc918e8be468c2bc9eaeeaa  vp90-2-12-droppable_1.ivf-352x288-0004.i420
-f96322ba3bf86065829d15c4394a1ab2  vp90-2-12-droppable_1.ivf-352x288-0005.i420
-4dfcf05608b399d56b0b29e3447ac24a  vp90-2-12-droppable_1.ivf-352x288-0006.i420
-b772fd5f5e3221d9c1daf690aeca89e8  vp90-2-12-droppable_1.ivf-352x288-0007.i420
-d8838cf1a4316c6c9ba7f42f8cba205c  vp90-2-12-droppable_1.ivf-352x288-0008.i420
-368f762830ed3d29d642798ff88107bd  vp90-2-12-droppable_1.ivf-352x288-0009.i420
-f3e614a8f67681f814242c75e6ac66f7  vp90-2-12-droppable_1.ivf-352x288-0010.i420
-f49458a915dd853e53c15e52e280085b  vp90-2-12-droppable_1.ivf-352x288-0011.i420
-65cbd3f3f8447d3caf935cddfcb6cb15  vp90-2-12-droppable_1.ivf-352x288-0012.i420
-8f4764c45093050a78b4b6055648cda0  vp90-2-12-droppable_1.ivf-352x288-0013.i420
-16d399bff977cdac0543daffba3a14bd  vp90-2-12-droppable_1.ivf-352x288-0014.i420
-59f16bc632697d20514a55814cf0a9ae  vp90-2-12-droppable_1.ivf-352x288-0015.i420
-058ba53139a3f48883ae4e668177d564  vp90-2-12-droppable_1.ivf-352x288-0016.i420
-85796d9edf6a5fe5d0c804e8b80f4469  vp90-2-12-droppable_1.ivf-352x288-0017.i420
-94b7bf54b3dd8d007cb932c330e4e7cf  vp90-2-12-droppable_1.ivf-352x288-0018.i420
-964732ac0abf132fe8c65a845eeaea39  vp90-2-12-droppable_1.ivf-352x288-0019.i420
-dda8408b95868ea683f921e88ca0f8f4  vp90-2-12-droppable_1.ivf-352x288-0020.i420
-33b008d0b3932abd28d1c0d484a89cb0  vp90-2-12-droppable_1.ivf-352x288-0021.i420
-bbf8f8edda10ab20cde304b362f6fc7c  vp90-2-12-droppable_1.ivf-352x288-0022.i420
-6a08c9c1d4444f6b706a9193823e4866  vp90-2-12-droppable_1.ivf-352x288-0023.i420
-f3cfb225730f103c76083220b55aaf7e  vp90-2-12-droppable_1.ivf-352x288-0024.i420
-aa43de9fd852ffca405f9e1be0c517b9  vp90-2-12-droppable_1.ivf-352x288-0025.i420
-e5bcd2084c06d7e391af0710a3f56f86  vp90-2-12-droppable_1.ivf-352x288-0026.i420
-e16276389746853039a5c1353e3f830e  vp90-2-12-droppable_1.ivf-352x288-0027.i420
-8ecf32a7649dd9df718b5a31512aa17b  vp90-2-12-droppable_1.ivf-352x288-0028.i420
-db63be2b267a77061f40a48a5ad94129  vp90-2-12-droppable_1.ivf-352x288-0029.i420
-94c6a699e9b5382e1e4a30d462d1b05d  vp90-2-12-droppable_1.ivf-352x288-0030.i420
-340102d21a9c8d9119aed97d7bd408ba  vp90-2-12-droppable_1.ivf-352x288-0031.i420
-a369b32d71a6daf9a589614cba76d06c  vp90-2-12-droppable_1.ivf-352x288-0032.i420
-7c6f24525d07f08cfaaf8b57c1b1e0c7  vp90-2-12-droppable_1.ivf-352x288-0033.i420
-f99b35baf3e4f3967ad08b5475041959  vp90-2-12-droppable_1.ivf-352x288-0034.i420
-b1dede9bbe4a9542d10e7e2dcc225208  vp90-2-12-droppable_1.ivf-352x288-0035.i420
-d627915070dd5e6e11d1dff7b1dc4243  vp90-2-12-droppable_1.ivf-352x288-0036.i420
-2f176951d8716e1ac316f30388be269d  vp90-2-12-droppable_1.ivf-352x288-0037.i420
-215828b89c294b2568a575438c75d4e0  vp90-2-12-droppable_1.ivf-352x288-0038.i420
-3a29b4bf698713cbd575e6b14257fc87  vp90-2-12-droppable_1.ivf-352x288-0039.i420
-b930a1eef6838edc9abb769909b87cd9  vp90-2-12-droppable_1.ivf-352x288-0040.i420
-532c260abbd6d1181be3ff7a77f2d350  vp90-2-12-droppable_1.ivf-352x288-0041.i420
-b9ee7c0ab6c7cf8881fe5ed165454638  vp90-2-12-droppable_1.ivf-352x288-0042.i420
-d516f6949c3704ab9f154e3720f5f9ec  vp90-2-12-droppable_1.ivf-352x288-0043.i420
-bf05478086e97057856c3c987b220958  vp90-2-12-droppable_1.ivf-352x288-0044.i420
-92202af7ea355a8d4678e618c0344134  vp90-2-12-droppable_1.ivf-352x288-0045.i420
-ca870c59afab60c5da07e688a89be1a9  vp90-2-12-droppable_1.ivf-352x288-0046.i420
-92429a1763b07d2a0bf843a2953fcc1c  vp90-2-12-droppable_1.ivf-352x288-0047.i420
-1614a4655799cd08875b1271767ce85e  vp90-2-12-droppable_1.ivf-352x288-0048.i420
-2b30362c459109cafcff5f1bb8217e34  vp90-2-12-droppable_1.ivf-352x288-0049.i420
-6568f3dd687762489b7fd2c4a59dd38c  vp90-2-12-droppable_1.ivf-352x288-0050.i420
-6121d029cf4e402f9999a6719b3d6d97  vp90-2-12-droppable_1.ivf-352x288-0051.i420
-085cc85c56e35b4a19b48b502d606ffb  vp90-2-12-droppable_1.ivf-352x288-0052.i420
-63a7dc5d70bd142cb167c20f645a90bb  vp90-2-12-droppable_1.ivf-352x288-0053.i420
-b3ae931ee6f2724304f6a67070a386c0  vp90-2-12-droppable_1.ivf-352x288-0054.i420
-07fcd2b18c1c8a6c46151acff26ce2c0  vp90-2-12-droppable_1.ivf-352x288-0055.i420
-658758a58b92693bafeff41a2424e2a9  vp90-2-12-droppable_1.ivf-352x288-0056.i420
-3619120dfca7b24434ebe8e87936996c  vp90-2-12-droppable_1.ivf-352x288-0057.i420
-17152bbf314be8c30837cbece6fb53cd  vp90-2-12-droppable_1.ivf-352x288-0058.i420
-bc3352c6948fac5a681bf37abcc9b8b4  vp90-2-12-droppable_1.ivf-352x288-0059.i420
-5a4e0a19a7653a5ad120b1f46f9905b4  vp90-2-12-droppable_1.ivf-352x288-0060.i420
-2632db035652049f5340d1e59d577d42  vp90-2-12-droppable_1.ivf-352x288-0061.i420
-95a28f288602ae1f859a02055103aa39  vp90-2-12-droppable_1.ivf-352x288-0062.i420
-3d01e40359a3cfca996908d331492848  vp90-2-12-droppable_1.ivf-352x288-0063.i420
-4b6243114b09dbf590c1250419327b01  vp90-2-12-droppable_1.ivf-352x288-0064.i420
-f9aae29d9168366933f2bcc57a5afcb8  vp90-2-12-droppable_1.ivf-352x288-0065.i420
-6bca12015a807fdf48cda90cbe042ab4  vp90-2-12-droppable_1.ivf-352x288-0066.i420
-7769b6fa16f8c09973d1a2c08cf18dbb  vp90-2-12-droppable_1.ivf-352x288-0067.i420
-3457395b67960b1566007e764b0c0e81  vp90-2-12-droppable_1.ivf-352x288-0068.i420
-0d0ea9bdd5c4b164bbefc31000a28e49  vp90-2-12-droppable_1.ivf-352x288-0069.i420
-9fb6b2afb53b73a658b579beb3008bcd  vp90-2-12-droppable_1.ivf-352x288-0070.i420
-c9a941b87dcdd09afaab68cca0ed668a  vp90-2-12-droppable_1.ivf-352x288-0071.i420
-9a2baa4c442f3ebdf251e9bbef0dbf83  vp90-2-12-droppable_1.ivf-352x288-0072.i420
-ef90237bc4ed3d795ba78c8a4ef9f1d6  vp90-2-12-droppable_1.ivf-352x288-0073.i420
-68cabdcf5d934e279f1c45207e983d43  vp90-2-12-droppable_1.ivf-352x288-0074.i420
-ac5d93877691c05bb581a10bfcd058e5  vp90-2-12-droppable_1.ivf-352x288-0075.i420
-c4e09feb0a88d765c7681c7d427eda87  vp90-2-12-droppable_1.ivf-352x288-0076.i420
-690734960471ab41d5cdf052be87bd30  vp90-2-12-droppable_1.ivf-352x288-0077.i420
-4abaaa7e31a3a6e30b242e42587363d5  vp90-2-12-droppable_1.ivf-352x288-0078.i420
-b9c46f294e7a23b608004ff8aa2b9ea3  vp90-2-12-droppable_1.ivf-352x288-0079.i420
-b6a6a0e45c30de0f03880f753b6e75de  vp90-2-12-droppable_1.ivf-352x288-0080.i420
-c8725906463cb71ed8a64ba8af6a79be  vp90-2-12-droppable_1.ivf-352x288-0081.i420
-d0e28c090e859834a33bc0867a0f7ed7  vp90-2-12-droppable_1.ivf-352x288-0082.i420
-1ad8bf201d9898d562631226a2ef85fa  vp90-2-12-droppable_1.ivf-352x288-0083.i420
-962fe544b1a76bafe8a1b77cd64679ba  vp90-2-12-droppable_1.ivf-352x288-0084.i420
-89f9a77223961cc5ad49a11913ff9774  vp90-2-12-droppable_1.ivf-352x288-0085.i420
-483782bf6d14bbb19c749d58b8535e3e  vp90-2-12-droppable_1.ivf-352x288-0086.i420
-dfbe1b7ecc880ce5da758728f7375d63  vp90-2-12-droppable_1.ivf-352x288-0087.i420
-11a51b22418cc8dad57a20b37dd10630  vp90-2-12-droppable_1.ivf-352x288-0088.i420
-50b90506f9666ccb7dd94b6d59096489  vp90-2-12-droppable_1.ivf-352x288-0089.i420
-101294ecaff7edf5155ddc6cf3595021  vp90-2-12-droppable_1.ivf-352x288-0090.i420
-177e8f9d8aaf40b17d0b677133fc7955  vp90-2-12-droppable_1.ivf-352x288-0091.i420
-c029f78e758a27b8fc4214abf5ddad07  vp90-2-12-droppable_1.ivf-352x288-0092.i420
-45b6df0756e3f98218f4e9f0f33b1f13  vp90-2-12-droppable_1.ivf-352x288-0093.i420
-82d1fd8cc9fa0a072a0fc6177e7f8805  vp90-2-12-droppable_1.ivf-352x288-0094.i420
-bf6c3e8df105fdb82a614f8e8f6d68af  vp90-2-12-droppable_1.ivf-352x288-0095.i420
-2e66eccd31c0e1792f3019c0a7b43af6  vp90-2-12-droppable_1.ivf-352x288-0096.i420
-d7eab4f351bd3c03e873b93afc9b7803  vp90-2-12-droppable_1.ivf-352x288-0097.i420
-f7bc200d54ec154779521311c54a22d1  vp90-2-12-droppable_1.ivf-352x288-0098.i420
-8e2624d762102b6dbe13b7cf20ee1708  vp90-2-12-droppable_1.ivf-352x288-0099.i420
diff --git a/tests/tests/media/res/raw/vp90_2_12_droppable_2.vp9 b/tests/tests/media/res/raw/vp90_2_12_droppable_2.vp9
deleted file mode 100644
index 672af0b..0000000
--- a/tests/tests/media/res/raw/vp90_2_12_droppable_2.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_12_droppable_2_vp9_md5 b/tests/tests/media/res/raw/vp90_2_12_droppable_2_vp9_md5
deleted file mode 100644
index 4ee5724..0000000
--- a/tests/tests/media/res/raw/vp90_2_12_droppable_2_vp9_md5
+++ /dev/null
@@ -1,99 +0,0 @@
-1839e5db94dc99681d690d544cbe28a4  vp90-2-12-droppable_2.ivf-352x288-0001.i420
-dae2db51b91745edddb33ddbeb4e0988  vp90-2-12-droppable_2.ivf-352x288-0002.i420
-046639dbef310bf9016a54498a3ef0a3  vp90-2-12-droppable_2.ivf-352x288-0003.i420
-947044a5dbc918e8be468c2bc9eaeeaa  vp90-2-12-droppable_2.ivf-352x288-0004.i420
-f96322ba3bf86065829d15c4394a1ab2  vp90-2-12-droppable_2.ivf-352x288-0005.i420
-4dfcf05608b399d56b0b29e3447ac24a  vp90-2-12-droppable_2.ivf-352x288-0006.i420
-b772fd5f5e3221d9c1daf690aeca89e8  vp90-2-12-droppable_2.ivf-352x288-0007.i420
-d8838cf1a4316c6c9ba7f42f8cba205c  vp90-2-12-droppable_2.ivf-352x288-0008.i420
-368f762830ed3d29d642798ff88107bd  vp90-2-12-droppable_2.ivf-352x288-0009.i420
-f3e614a8f67681f814242c75e6ac66f7  vp90-2-12-droppable_2.ivf-352x288-0010.i420
-f49458a915dd853e53c15e52e280085b  vp90-2-12-droppable_2.ivf-352x288-0011.i420
-65cbd3f3f8447d3caf935cddfcb6cb15  vp90-2-12-droppable_2.ivf-352x288-0012.i420
-8f4764c45093050a78b4b6055648cda0  vp90-2-12-droppable_2.ivf-352x288-0013.i420
-16d399bff977cdac0543daffba3a14bd  vp90-2-12-droppable_2.ivf-352x288-0014.i420
-59f16bc632697d20514a55814cf0a9ae  vp90-2-12-droppable_2.ivf-352x288-0015.i420
-058ba53139a3f48883ae4e668177d564  vp90-2-12-droppable_2.ivf-352x288-0016.i420
-85796d9edf6a5fe5d0c804e8b80f4469  vp90-2-12-droppable_2.ivf-352x288-0017.i420
-94b7bf54b3dd8d007cb932c330e4e7cf  vp90-2-12-droppable_2.ivf-352x288-0018.i420
-964732ac0abf132fe8c65a845eeaea39  vp90-2-12-droppable_2.ivf-352x288-0019.i420
-dda8408b95868ea683f921e88ca0f8f4  vp90-2-12-droppable_2.ivf-352x288-0020.i420
-33b008d0b3932abd28d1c0d484a89cb0  vp90-2-12-droppable_2.ivf-352x288-0021.i420
-bbf8f8edda10ab20cde304b362f6fc7c  vp90-2-12-droppable_2.ivf-352x288-0022.i420
-6a08c9c1d4444f6b706a9193823e4866  vp90-2-12-droppable_2.ivf-352x288-0023.i420
-f3cfb225730f103c76083220b55aaf7e  vp90-2-12-droppable_2.ivf-352x288-0024.i420
-aa43de9fd852ffca405f9e1be0c517b9  vp90-2-12-droppable_2.ivf-352x288-0025.i420
-e5bcd2084c06d7e391af0710a3f56f86  vp90-2-12-droppable_2.ivf-352x288-0026.i420
-e16276389746853039a5c1353e3f830e  vp90-2-12-droppable_2.ivf-352x288-0027.i420
-8ecf32a7649dd9df718b5a31512aa17b  vp90-2-12-droppable_2.ivf-352x288-0028.i420
-db63be2b267a77061f40a48a5ad94129  vp90-2-12-droppable_2.ivf-352x288-0029.i420
-94c6a699e9b5382e1e4a30d462d1b05d  vp90-2-12-droppable_2.ivf-352x288-0030.i420
-340102d21a9c8d9119aed97d7bd408ba  vp90-2-12-droppable_2.ivf-352x288-0031.i420
-a369b32d71a6daf9a589614cba76d06c  vp90-2-12-droppable_2.ivf-352x288-0032.i420
-7c6f24525d07f08cfaaf8b57c1b1e0c7  vp90-2-12-droppable_2.ivf-352x288-0033.i420
-f99b35baf3e4f3967ad08b5475041959  vp90-2-12-droppable_2.ivf-352x288-0034.i420
-b1dede9bbe4a9542d10e7e2dcc225208  vp90-2-12-droppable_2.ivf-352x288-0035.i420
-d627915070dd5e6e11d1dff7b1dc4243  vp90-2-12-droppable_2.ivf-352x288-0036.i420
-2f176951d8716e1ac316f30388be269d  vp90-2-12-droppable_2.ivf-352x288-0037.i420
-215828b89c294b2568a575438c75d4e0  vp90-2-12-droppable_2.ivf-352x288-0038.i420
-3a29b4bf698713cbd575e6b14257fc87  vp90-2-12-droppable_2.ivf-352x288-0039.i420
-b930a1eef6838edc9abb769909b87cd9  vp90-2-12-droppable_2.ivf-352x288-0040.i420
-532c260abbd6d1181be3ff7a77f2d350  vp90-2-12-droppable_2.ivf-352x288-0041.i420
-b9ee7c0ab6c7cf8881fe5ed165454638  vp90-2-12-droppable_2.ivf-352x288-0042.i420
-d516f6949c3704ab9f154e3720f5f9ec  vp90-2-12-droppable_2.ivf-352x288-0043.i420
-bf05478086e97057856c3c987b220958  vp90-2-12-droppable_2.ivf-352x288-0044.i420
-92202af7ea355a8d4678e618c0344134  vp90-2-12-droppable_2.ivf-352x288-0045.i420
-ca870c59afab60c5da07e688a89be1a9  vp90-2-12-droppable_2.ivf-352x288-0046.i420
-92429a1763b07d2a0bf843a2953fcc1c  vp90-2-12-droppable_2.ivf-352x288-0047.i420
-1614a4655799cd08875b1271767ce85e  vp90-2-12-droppable_2.ivf-352x288-0048.i420
-2b30362c459109cafcff5f1bb8217e34  vp90-2-12-droppable_2.ivf-352x288-0049.i420
-6568f3dd687762489b7fd2c4a59dd38c  vp90-2-12-droppable_2.ivf-352x288-0050.i420
-6121d029cf4e402f9999a6719b3d6d97  vp90-2-12-droppable_2.ivf-352x288-0051.i420
-085cc85c56e35b4a19b48b502d606ffb  vp90-2-12-droppable_2.ivf-352x288-0052.i420
-63a7dc5d70bd142cb167c20f645a90bb  vp90-2-12-droppable_2.ivf-352x288-0053.i420
-b3ae931ee6f2724304f6a67070a386c0  vp90-2-12-droppable_2.ivf-352x288-0054.i420
-07fcd2b18c1c8a6c46151acff26ce2c0  vp90-2-12-droppable_2.ivf-352x288-0055.i420
-658758a58b92693bafeff41a2424e2a9  vp90-2-12-droppable_2.ivf-352x288-0056.i420
-3619120dfca7b24434ebe8e87936996c  vp90-2-12-droppable_2.ivf-352x288-0057.i420
-17152bbf314be8c30837cbece6fb53cd  vp90-2-12-droppable_2.ivf-352x288-0058.i420
-bc3352c6948fac5a681bf37abcc9b8b4  vp90-2-12-droppable_2.ivf-352x288-0059.i420
-5a4e0a19a7653a5ad120b1f46f9905b4  vp90-2-12-droppable_2.ivf-352x288-0060.i420
-2632db035652049f5340d1e59d577d42  vp90-2-12-droppable_2.ivf-352x288-0061.i420
-95a28f288602ae1f859a02055103aa39  vp90-2-12-droppable_2.ivf-352x288-0062.i420
-3d01e40359a3cfca996908d331492848  vp90-2-12-droppable_2.ivf-352x288-0063.i420
-4b6243114b09dbf590c1250419327b01  vp90-2-12-droppable_2.ivf-352x288-0064.i420
-f9aae29d9168366933f2bcc57a5afcb8  vp90-2-12-droppable_2.ivf-352x288-0065.i420
-6bca12015a807fdf48cda90cbe042ab4  vp90-2-12-droppable_2.ivf-352x288-0066.i420
-7769b6fa16f8c09973d1a2c08cf18dbb  vp90-2-12-droppable_2.ivf-352x288-0067.i420
-3457395b67960b1566007e764b0c0e81  vp90-2-12-droppable_2.ivf-352x288-0068.i420
-0d0ea9bdd5c4b164bbefc31000a28e49  vp90-2-12-droppable_2.ivf-352x288-0069.i420
-9fb6b2afb53b73a658b579beb3008bcd  vp90-2-12-droppable_2.ivf-352x288-0070.i420
-c9a941b87dcdd09afaab68cca0ed668a  vp90-2-12-droppable_2.ivf-352x288-0071.i420
-9a2baa4c442f3ebdf251e9bbef0dbf83  vp90-2-12-droppable_2.ivf-352x288-0072.i420
-ef90237bc4ed3d795ba78c8a4ef9f1d6  vp90-2-12-droppable_2.ivf-352x288-0073.i420
-68cabdcf5d934e279f1c45207e983d43  vp90-2-12-droppable_2.ivf-352x288-0074.i420
-ac5d93877691c05bb581a10bfcd058e5  vp90-2-12-droppable_2.ivf-352x288-0075.i420
-c4e09feb0a88d765c7681c7d427eda87  vp90-2-12-droppable_2.ivf-352x288-0076.i420
-690734960471ab41d5cdf052be87bd30  vp90-2-12-droppable_2.ivf-352x288-0077.i420
-4abaaa7e31a3a6e30b242e42587363d5  vp90-2-12-droppable_2.ivf-352x288-0078.i420
-b9c46f294e7a23b608004ff8aa2b9ea3  vp90-2-12-droppable_2.ivf-352x288-0079.i420
-b6a6a0e45c30de0f03880f753b6e75de  vp90-2-12-droppable_2.ivf-352x288-0080.i420
-c8725906463cb71ed8a64ba8af6a79be  vp90-2-12-droppable_2.ivf-352x288-0081.i420
-d0e28c090e859834a33bc0867a0f7ed7  vp90-2-12-droppable_2.ivf-352x288-0082.i420
-1ad8bf201d9898d562631226a2ef85fa  vp90-2-12-droppable_2.ivf-352x288-0083.i420
-962fe544b1a76bafe8a1b77cd64679ba  vp90-2-12-droppable_2.ivf-352x288-0084.i420
-89f9a77223961cc5ad49a11913ff9774  vp90-2-12-droppable_2.ivf-352x288-0085.i420
-483782bf6d14bbb19c749d58b8535e3e  vp90-2-12-droppable_2.ivf-352x288-0086.i420
-dfbe1b7ecc880ce5da758728f7375d63  vp90-2-12-droppable_2.ivf-352x288-0087.i420
-11a51b22418cc8dad57a20b37dd10630  vp90-2-12-droppable_2.ivf-352x288-0088.i420
-50b90506f9666ccb7dd94b6d59096489  vp90-2-12-droppable_2.ivf-352x288-0089.i420
-101294ecaff7edf5155ddc6cf3595021  vp90-2-12-droppable_2.ivf-352x288-0090.i420
-177e8f9d8aaf40b17d0b677133fc7955  vp90-2-12-droppable_2.ivf-352x288-0091.i420
-c029f78e758a27b8fc4214abf5ddad07  vp90-2-12-droppable_2.ivf-352x288-0092.i420
-45b6df0756e3f98218f4e9f0f33b1f13  vp90-2-12-droppable_2.ivf-352x288-0093.i420
-82d1fd8cc9fa0a072a0fc6177e7f8805  vp90-2-12-droppable_2.ivf-352x288-0094.i420
-bf6c3e8df105fdb82a614f8e8f6d68af  vp90-2-12-droppable_2.ivf-352x288-0095.i420
-2e66eccd31c0e1792f3019c0a7b43af6  vp90-2-12-droppable_2.ivf-352x288-0096.i420
-d7eab4f351bd3c03e873b93afc9b7803  vp90-2-12-droppable_2.ivf-352x288-0097.i420
-f7bc200d54ec154779521311c54a22d1  vp90-2-12-droppable_2.ivf-352x288-0098.i420
-8e2624d762102b6dbe13b7cf20ee1708  vp90-2-12-droppable_2.ivf-352x288-0099.i420
diff --git a/tests/tests/media/res/raw/vp90_2_12_droppable_3.vp9 b/tests/tests/media/res/raw/vp90_2_12_droppable_3.vp9
deleted file mode 100644
index 1f26178..0000000
--- a/tests/tests/media/res/raw/vp90_2_12_droppable_3.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_12_droppable_3_vp9_md5 b/tests/tests/media/res/raw/vp90_2_12_droppable_3_vp9_md5
deleted file mode 100644
index 9fdb07c..0000000
--- a/tests/tests/media/res/raw/vp90_2_12_droppable_3_vp9_md5
+++ /dev/null
@@ -1,31 +0,0 @@
-7ab6428314a7bce2ebae83b78acf9d1c  vp90-2-12-droppable_3.ivf-640x480-0001.i420
-373cfc7765ea8038e64d95ff90b6d9e8  vp90-2-12-droppable_3.ivf-640x480-0002.i420
-58d782daf8249542df4a4f0e66994b86  vp90-2-12-droppable_3.ivf-640x480-0003.i420
-38b13b37c460f67dbbda8847a37e5a58  vp90-2-12-droppable_3.ivf-640x480-0004.i420
-902d00e196093fcebad74ef608d7c3ff  vp90-2-12-droppable_3.ivf-640x480-0005.i420
-f3549650a4581de21916b189576b6a52  vp90-2-12-droppable_3.ivf-640x480-0006.i420
-a44d4bf06a241f31d1755ff6a118060a  vp90-2-12-droppable_3.ivf-640x480-0007.i420
-8eeef076eec9eec2861f3376ebf87d0a  vp90-2-12-droppable_3.ivf-640x480-0008.i420
-9a81bf95fc7210526b79c47ff80ae968  vp90-2-12-droppable_3.ivf-640x480-0009.i420
-bf215dfd9b764292de4d064389015e55  vp90-2-12-droppable_3.ivf-640x480-0010.i420
-283b1efdedde5633606d8a5d68097768  vp90-2-12-droppable_3.ivf-640x480-0011.i420
-dbb74ee6ec5f32b9ecb58b73d465be26  vp90-2-12-droppable_3.ivf-640x480-0012.i420
-ca1e21e458f674036addf08a79f6164e  vp90-2-12-droppable_3.ivf-640x480-0013.i420
-24c3b279ecb0559ac146abed5976c54a  vp90-2-12-droppable_3.ivf-640x480-0014.i420
-5f6796e3fa0e85d65b46ba66932ee09c  vp90-2-12-droppable_3.ivf-640x480-0015.i420
-7b22b5642e42e79fcc339ca6652f8f39  vp90-2-12-droppable_3.ivf-640x480-0016.i420
-7478595483ce62a5906f979ad296b6c5  vp90-2-12-droppable_3.ivf-640x480-0017.i420
-55d843f54af65305f7e298013e90a839  vp90-2-12-droppable_3.ivf-640x480-0018.i420
-6ab0a82b5f0736d951b58f2245adb793  vp90-2-12-droppable_3.ivf-640x480-0019.i420
-1a9f6adde0d6ecd7bc83301ffeb15e51  vp90-2-12-droppable_3.ivf-640x480-0020.i420
-07552d44c99801657a3301d50c6d3897  vp90-2-12-droppable_3.ivf-640x480-0021.i420
-e9cdeec3accd4d19aa199a64e6cd163d  vp90-2-12-droppable_3.ivf-640x480-0022.i420
-5dedc5eeb214bc4356bfa53e1c00d723  vp90-2-12-droppable_3.ivf-640x480-0023.i420
-dfd4bf2f664b46c36de24edf799c5c2a  vp90-2-12-droppable_3.ivf-640x480-0024.i420
-deb33fefe4f20f09b6e84a037a7c2755  vp90-2-12-droppable_3.ivf-640x480-0025.i420
-e7425d6d380be060a89a2ca85660042f  vp90-2-12-droppable_3.ivf-640x480-0026.i420
-74e3b4f750566b09c2fd0baafa5d69d1  vp90-2-12-droppable_3.ivf-640x480-0027.i420
-dd9f990aa7d858290a970be4681b7a1f  vp90-2-12-droppable_3.ivf-640x480-0028.i420
-f7e8c6e20722b6a69e7f6766f41f2805  vp90-2-12-droppable_3.ivf-640x480-0029.i420
-835fca0a38539ef2632f85a051544326  vp90-2-12-droppable_3.ivf-640x480-0030.i420
-9c10a225363aa167ccef6e53b19ee64f  vp90-2-12-droppable_3.ivf-640x480-0031.i420
diff --git a/tests/tests/media/res/raw/vp90_2_15_segkey.vp9 b/tests/tests/media/res/raw/vp90_2_15_segkey.vp9
deleted file mode 100644
index b67d891..0000000
--- a/tests/tests/media/res/raw/vp90_2_15_segkey.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_15_segkey_adpq.vp9 b/tests/tests/media/res/raw/vp90_2_15_segkey_adpq.vp9
deleted file mode 100644
index 9e54de9..0000000
--- a/tests/tests/media/res/raw/vp90_2_15_segkey_adpq.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_15_segkey_adpq_vp9_md5 b/tests/tests/media/res/raw/vp90_2_15_segkey_adpq_vp9_md5
deleted file mode 100644
index e3ee4d7..0000000
--- a/tests/tests/media/res/raw/vp90_2_15_segkey_adpq_vp9_md5
+++ /dev/null
@@ -1,150 +0,0 @@
-d4f0e4b606ddb40b482aecb24cf3bc63  vp90-2-15-segkey_adpq.webm-1280x720-0001.i420
-692ec092bc5928fa6430d056e883759a  vp90-2-15-segkey_adpq.webm-1280x720-0002.i420
-dad790df33430899fed98886a24b37e5  vp90-2-15-segkey_adpq.webm-1280x720-0003.i420
-7e66e793ac9462a40dd5b963fb62e667  vp90-2-15-segkey_adpq.webm-1280x720-0004.i420
-0d795c6e20f42f09aca0ddb9dffaa6e8  vp90-2-15-segkey_adpq.webm-1280x720-0005.i420
-0ef3739c4ab2c51f0ab8e290eadad77e  vp90-2-15-segkey_adpq.webm-1280x720-0006.i420
-04a15f765960263c1b4a5a8822e17322  vp90-2-15-segkey_adpq.webm-1280x720-0007.i420
-116d518830c958bf46759fd79bc74198  vp90-2-15-segkey_adpq.webm-1280x720-0008.i420
-58ea67addab05825cc2e5f2ab99fca4b  vp90-2-15-segkey_adpq.webm-1280x720-0009.i420
-590f6e5deea6dde21dc1098fa2017c2f  vp90-2-15-segkey_adpq.webm-1280x720-0010.i420
-895479957b0882ccce4159782dee8deb  vp90-2-15-segkey_adpq.webm-1280x720-0011.i420
-cc8e05afdfb6f9c7042fd6f9e9d49140  vp90-2-15-segkey_adpq.webm-1280x720-0012.i420
-3e47c556a63af90f1ca4609f97f25d2c  vp90-2-15-segkey_adpq.webm-1280x720-0013.i420
-e5ca5dce8cbd39412db2fe219d6d2594  vp90-2-15-segkey_adpq.webm-1280x720-0014.i420
-c62b456e12230660d26eb7226f257d0c  vp90-2-15-segkey_adpq.webm-1280x720-0015.i420
-e184c961b373de465d3242f32f7cf3ed  vp90-2-15-segkey_adpq.webm-1280x720-0016.i420
-7466b91858f740fc28965a63effe05d6  vp90-2-15-segkey_adpq.webm-1280x720-0017.i420
-c8f06a3b1e471c4e7a9efd71a30dfe3b  vp90-2-15-segkey_adpq.webm-1280x720-0018.i420
-d4fb95148963b2eaff0211ddc5117c13  vp90-2-15-segkey_adpq.webm-1280x720-0019.i420
-c646526b40277289520d47ed8ca3b644  vp90-2-15-segkey_adpq.webm-1280x720-0020.i420
-e441ae686fa444e4e3584543611043ba  vp90-2-15-segkey_adpq.webm-1280x720-0021.i420
-68d707ef6909bfbc02dcbd9e392a04f6  vp90-2-15-segkey_adpq.webm-1280x720-0022.i420
-1ff285d17a26622b61bd2651754602b1  vp90-2-15-segkey_adpq.webm-1280x720-0023.i420
-c272192987e44e54e5335e6416bd15a5  vp90-2-15-segkey_adpq.webm-1280x720-0024.i420
-8f6f02572181eb4855dcd4c957e57d2e  vp90-2-15-segkey_adpq.webm-1280x720-0025.i420
-baf03eb567fd092eeb6f08ff5e098350  vp90-2-15-segkey_adpq.webm-1280x720-0026.i420
-479c78bd3da0892b8d4e32c99ec4739f  vp90-2-15-segkey_adpq.webm-1280x720-0027.i420
-d39a52f6e30ef10462bdef1006809e88  vp90-2-15-segkey_adpq.webm-1280x720-0028.i420
-d58395369806221efe9ba88513319d8a  vp90-2-15-segkey_adpq.webm-1280x720-0029.i420
-459e77e83c510ee1d79bf069752d44e5  vp90-2-15-segkey_adpq.webm-1280x720-0030.i420
-438027c8eacb9c795f8267a151ef5a4e  vp90-2-15-segkey_adpq.webm-1280x720-0031.i420
-ea6b73fb0d4b23ebbdaeb0267135d083  vp90-2-15-segkey_adpq.webm-1280x720-0032.i420
-48160c624d4d5050a4c8abcbe0edf4b2  vp90-2-15-segkey_adpq.webm-1280x720-0033.i420
-6fc6d5b4751cf137fc0204c0026f2503  vp90-2-15-segkey_adpq.webm-1280x720-0034.i420
-5ea20f6483fc5cde854313ed8288c7ca  vp90-2-15-segkey_adpq.webm-1280x720-0035.i420
-dafa41fa3468f684ca5538593cd1a0de  vp90-2-15-segkey_adpq.webm-1280x720-0036.i420
-b73d3336c83a27874e24b691c34c3421  vp90-2-15-segkey_adpq.webm-1280x720-0037.i420
-d0b0488a5871a49442746ac8ea1343bc  vp90-2-15-segkey_adpq.webm-1280x720-0038.i420
-df6fe9cb354624b69908730f24f51b88  vp90-2-15-segkey_adpq.webm-1280x720-0039.i420
-a388b159a024ace9437976206e62473c  vp90-2-15-segkey_adpq.webm-1280x720-0040.i420
-9007423410201a70b6997477ed9040f6  vp90-2-15-segkey_adpq.webm-1280x720-0041.i420
-7f7425cc018ad391e06b867f51d69513  vp90-2-15-segkey_adpq.webm-1280x720-0042.i420
-2ef51a3a15c627f803eee7f351cdfa4e  vp90-2-15-segkey_adpq.webm-1280x720-0043.i420
-260cded2461ab87181d650c58a8a0656  vp90-2-15-segkey_adpq.webm-1280x720-0044.i420
-fdd7a93b5f25ec2b74d93736fa7bb475  vp90-2-15-segkey_adpq.webm-1280x720-0045.i420
-810bb95ef0221b50ef12c7d0a4740fec  vp90-2-15-segkey_adpq.webm-1280x720-0046.i420
-f7eb4d63c16aebfeba4804c4e9c2c134  vp90-2-15-segkey_adpq.webm-1280x720-0047.i420
-a1ae94b85bced552e2c4f15ab5c5096d  vp90-2-15-segkey_adpq.webm-1280x720-0048.i420
-4b7b9e460b4a4ceab5deb5c6876cea05  vp90-2-15-segkey_adpq.webm-1280x720-0049.i420
-514472399dc39fcc4e833e166b81ea8e  vp90-2-15-segkey_adpq.webm-1280x720-0050.i420
-dca73ca76936d0a7eeb71c20955ea3a3  vp90-2-15-segkey_adpq.webm-1280x720-0051.i420
-927b185567b515a6bd102e1199ee1836  vp90-2-15-segkey_adpq.webm-1280x720-0052.i420
-63e1fffd59b77c53811d75a116fbac60  vp90-2-15-segkey_adpq.webm-1280x720-0053.i420
-5ca302497e81d564cfd455e2b606b262  vp90-2-15-segkey_adpq.webm-1280x720-0054.i420
-6e317d469ee664bc511a8286650f0b79  vp90-2-15-segkey_adpq.webm-1280x720-0055.i420
-d93e1909f3bdda983e0b3c73a8c51754  vp90-2-15-segkey_adpq.webm-1280x720-0056.i420
-836072cb1c4dc3dc32c935ba4ac3f716  vp90-2-15-segkey_adpq.webm-1280x720-0057.i420
-014e61666ba819260a25f09ae97768a8  vp90-2-15-segkey_adpq.webm-1280x720-0058.i420
-997fa6283e48ff017ce04041b9022fb9  vp90-2-15-segkey_adpq.webm-1280x720-0059.i420
-b2c35749c6b848601193c2eff7f0bdf1  vp90-2-15-segkey_adpq.webm-1280x720-0060.i420
-813e9f562ef53589afbfe7d73002c136  vp90-2-15-segkey_adpq.webm-1280x720-0061.i420
-be876a05cfc72fe6138e1c24b6e94c3f  vp90-2-15-segkey_adpq.webm-1280x720-0062.i420
-2a33b99f67fe5579ddbd62bac085ae8a  vp90-2-15-segkey_adpq.webm-1280x720-0063.i420
-8d374a1886861cfd9ca6f16a0aff1b6c  vp90-2-15-segkey_adpq.webm-1280x720-0064.i420
-eff4e17b08c67a1663c8f1cc614bd94a  vp90-2-15-segkey_adpq.webm-1280x720-0065.i420
-39e4d97460cf02ecfbc666e0413d7db1  vp90-2-15-segkey_adpq.webm-1280x720-0066.i420
-732f41606146dfb0c6a8cf130df969a8  vp90-2-15-segkey_adpq.webm-1280x720-0067.i420
-9b724b808bc26f21aaa32653185b2cf3  vp90-2-15-segkey_adpq.webm-1280x720-0068.i420
-e18598cb7ac70cdb5dea29b35ae5accb  vp90-2-15-segkey_adpq.webm-1280x720-0069.i420
-afbcad9f7bad0b58a5bccdb8977a60fb  vp90-2-15-segkey_adpq.webm-1280x720-0070.i420
-6ec24c40cd8a0cf2e15339ce4f60c232  vp90-2-15-segkey_adpq.webm-1280x720-0071.i420
-76616dbe8207235f6890360566f9e8df  vp90-2-15-segkey_adpq.webm-1280x720-0072.i420
-49a5c751ed430e9bc41c3a3334295025  vp90-2-15-segkey_adpq.webm-1280x720-0073.i420
-f657e47dbbcc2a04e9e7b71ecd8451ff  vp90-2-15-segkey_adpq.webm-1280x720-0074.i420
-8e85f3d26b26f26ccd804061d2f37bbb  vp90-2-15-segkey_adpq.webm-1280x720-0075.i420
-5a9dd5c0390491cd21163da01dc21f4d  vp90-2-15-segkey_adpq.webm-1280x720-0076.i420
-3cf88ad2d2d7ecf1223afa5d1b849317  vp90-2-15-segkey_adpq.webm-1280x720-0077.i420
-27385b23461b5f1c137c2f29354595ed  vp90-2-15-segkey_adpq.webm-1280x720-0078.i420
-e6eacbe2890389c586f2936a75ab3509  vp90-2-15-segkey_adpq.webm-1280x720-0079.i420
-19a48ffafdcdb6fb1d6b9808daed2f86  vp90-2-15-segkey_adpq.webm-1280x720-0080.i420
-f8c9419d4944fb214e06a2c30a560d93  vp90-2-15-segkey_adpq.webm-1280x720-0081.i420
-3f3d3dd54e5aa6bd59af1be86ec9be3d  vp90-2-15-segkey_adpq.webm-1280x720-0082.i420
-28be5316ed79dc47b6a142cef0c16ab7  vp90-2-15-segkey_adpq.webm-1280x720-0083.i420
-6fbed684bfe8dfd354210293d7eb4d0b  vp90-2-15-segkey_adpq.webm-1280x720-0084.i420
-e60cd76f68c95f8b484d0b6424eea4cc  vp90-2-15-segkey_adpq.webm-1280x720-0085.i420
-e05a0cf382f49039faddaffeff2cec16  vp90-2-15-segkey_adpq.webm-1280x720-0086.i420
-42ea736ebbfe50f1ebd460d71781e5d6  vp90-2-15-segkey_adpq.webm-1280x720-0087.i420
-80f78066700b6752bbc1a41390ddb482  vp90-2-15-segkey_adpq.webm-1280x720-0088.i420
-14671354929fcf10677b2ed2db3c8cb4  vp90-2-15-segkey_adpq.webm-1280x720-0089.i420
-96a7d68407f1a2c96bd3cafe0c696bf5  vp90-2-15-segkey_adpq.webm-1280x720-0090.i420
-2f2adb990cfa42229db987a668b19d38  vp90-2-15-segkey_adpq.webm-1280x720-0091.i420
-a8233951004e1bb0d0937435a517fad2  vp90-2-15-segkey_adpq.webm-1280x720-0092.i420
-6163e872c38adfde7b0c8891cbb2c969  vp90-2-15-segkey_adpq.webm-1280x720-0093.i420
-990165e0905fb80ccc29d2de062d4f9b  vp90-2-15-segkey_adpq.webm-1280x720-0094.i420
-e6f3224c4c60098ee93fca870f8636b2  vp90-2-15-segkey_adpq.webm-1280x720-0095.i420
-8c561667345f932618f8b3aaa43ffde0  vp90-2-15-segkey_adpq.webm-1280x720-0096.i420
-1acb3999bacd483d1153beb43ee09772  vp90-2-15-segkey_adpq.webm-1280x720-0097.i420
-2a075c7bc49190df83b8285ee6e124d3  vp90-2-15-segkey_adpq.webm-1280x720-0098.i420
-890a134a3c77d9b64d83fe6d2def02de  vp90-2-15-segkey_adpq.webm-1280x720-0099.i420
-d0b41422b89f03ffcbde7c85889ad2c2  vp90-2-15-segkey_adpq.webm-1280x720-0100.i420
-fdc4f855d70ef16ec9baeb05c3a73f44  vp90-2-15-segkey_adpq.webm-1280x720-0101.i420
-ed9f847a3b4280cfe306018825c76508  vp90-2-15-segkey_adpq.webm-1280x720-0102.i420
-5deb2536bba158c722bc0d909f45e611  vp90-2-15-segkey_adpq.webm-1280x720-0103.i420
-fc7880ca8680e03fb1978adce8066027  vp90-2-15-segkey_adpq.webm-1280x720-0104.i420
-6e1c351c6b102e9185f688a02190b87f  vp90-2-15-segkey_adpq.webm-1280x720-0105.i420
-1f6169bf490ed1b4c391383f770fec02  vp90-2-15-segkey_adpq.webm-1280x720-0106.i420
-80ac3b673b1504fb1e88d883a91a539c  vp90-2-15-segkey_adpq.webm-1280x720-0107.i420
-d2e7654f961ff3767c1e9e8558c2f20d  vp90-2-15-segkey_adpq.webm-1280x720-0108.i420
-365368d813eb10c5adc53e47afeb414d  vp90-2-15-segkey_adpq.webm-1280x720-0109.i420
-5f74f55478377dd31da91cf195332480  vp90-2-15-segkey_adpq.webm-1280x720-0110.i420
-827b7b3853ea3b1855583b59ed7b09c2  vp90-2-15-segkey_adpq.webm-1280x720-0111.i420
-2017c1a57a271308172bd84d3887d063  vp90-2-15-segkey_adpq.webm-1280x720-0112.i420
-d65b95c71db9972dc051bec7df19f85f  vp90-2-15-segkey_adpq.webm-1280x720-0113.i420
-7243da9072729ffa75209a6699e77ac3  vp90-2-15-segkey_adpq.webm-1280x720-0114.i420
-112da8d27907ab6a66b030e9c8864e46  vp90-2-15-segkey_adpq.webm-1280x720-0115.i420
-e2837b6409de4bc6e71ff9eca8eab391  vp90-2-15-segkey_adpq.webm-1280x720-0116.i420
-567eba2ddb91a02665ac96fa10703f00  vp90-2-15-segkey_adpq.webm-1280x720-0117.i420
-474a99d56fce0e7e96ac3585b905956f  vp90-2-15-segkey_adpq.webm-1280x720-0118.i420
-3087edb09f1ef2e63130b7c03e696028  vp90-2-15-segkey_adpq.webm-1280x720-0119.i420
-574f7328da31760ecf237617aebd7784  vp90-2-15-segkey_adpq.webm-1280x720-0120.i420
-c3a7669bb496bec766a74a800275ff6c  vp90-2-15-segkey_adpq.webm-1280x720-0121.i420
-c0d87245a92e7140e6b729c26fe97a95  vp90-2-15-segkey_adpq.webm-1280x720-0122.i420
-467e33e84435fe64cb14653600ec5163  vp90-2-15-segkey_adpq.webm-1280x720-0123.i420
-1c7a5b2472c00e9dc63f679b51ead6a9  vp90-2-15-segkey_adpq.webm-1280x720-0124.i420
-8fb7197463cdae6c45437a73dcb4a3d8  vp90-2-15-segkey_adpq.webm-1280x720-0125.i420
-f352fee36f51536175b05b5ff5a3187a  vp90-2-15-segkey_adpq.webm-1280x720-0126.i420
-ac1ed4392a38268a2495508245032d74  vp90-2-15-segkey_adpq.webm-1280x720-0127.i420
-b8179a306c4fbc6f207d15acaae92dfb  vp90-2-15-segkey_adpq.webm-1280x720-0128.i420
-7f263b0fd68652d83b75d24cc11c89e8  vp90-2-15-segkey_adpq.webm-1280x720-0129.i420
-39e33d02a01247cefe19d8bf9fbdecae  vp90-2-15-segkey_adpq.webm-1280x720-0130.i420
-49a4e89c9fcc66f7e6e679aee4af0852  vp90-2-15-segkey_adpq.webm-1280x720-0131.i420
-0af52a32e6d74694a0a1f12aa78293fe  vp90-2-15-segkey_adpq.webm-1280x720-0132.i420
-fedde75a5c093ea12f0ed328da7350c9  vp90-2-15-segkey_adpq.webm-1280x720-0133.i420
-2ab788cf689fdbe8fbc74dde165605ad  vp90-2-15-segkey_adpq.webm-1280x720-0134.i420
-682c2316cbd2e8a5e54edd1e9309a6c7  vp90-2-15-segkey_adpq.webm-1280x720-0135.i420
-f155e8fa47625f18dffea813a7070c71  vp90-2-15-segkey_adpq.webm-1280x720-0136.i420
-2611eb2b2da8f6995ac2159012ec540a  vp90-2-15-segkey_adpq.webm-1280x720-0137.i420
-a1130a4ddf7dbd592e23001c4b98b3fc  vp90-2-15-segkey_adpq.webm-1280x720-0138.i420
-84eef6f47bff223c6a0916c0688d2f7c  vp90-2-15-segkey_adpq.webm-1280x720-0139.i420
-ccfab0b84c7fc59d850ac5cb8d36da41  vp90-2-15-segkey_adpq.webm-1280x720-0140.i420
-6866845dfb320ecd9c22444ca7e52c8b  vp90-2-15-segkey_adpq.webm-1280x720-0141.i420
-3068ceb83ee4d047df3880c64754efd7  vp90-2-15-segkey_adpq.webm-1280x720-0142.i420
-7f9a74e20cfe10972961e7f21529f7f4  vp90-2-15-segkey_adpq.webm-1280x720-0143.i420
-29156833963ec7f218d38fca7df132bf  vp90-2-15-segkey_adpq.webm-1280x720-0144.i420
-f8feb4c2ae1ce371fc8b4a83d7dc34e0  vp90-2-15-segkey_adpq.webm-1280x720-0145.i420
-0e5fe8965da239c17b02f0c902feeaec  vp90-2-15-segkey_adpq.webm-1280x720-0146.i420
-e8d37eb1b8c2576658ebc58a7cc6c0d4  vp90-2-15-segkey_adpq.webm-1280x720-0147.i420
-0a89fd2784112bbd54eb559a8272ab1e  vp90-2-15-segkey_adpq.webm-1280x720-0148.i420
-342bc99cdd618272d12d045698b9cb20  vp90-2-15-segkey_adpq.webm-1280x720-0149.i420
-a489a32bb43559b8a1989b13660e3cf6  vp90-2-15-segkey_adpq.webm-1280x720-0150.i420
diff --git a/tests/tests/media/res/raw/vp90_2_15_segkey_vp9_md5 b/tests/tests/media/res/raw/vp90_2_15_segkey_vp9_md5
deleted file mode 100644
index 809e25e..0000000
--- a/tests/tests/media/res/raw/vp90_2_15_segkey_vp9_md5
+++ /dev/null
@@ -1 +0,0 @@
-d3805a0d832b9bdd69ad99d68490be7b  vp90-2-15-segkey.webm-1280x720-0001.i420
diff --git a/tests/tests/media/res/raw/vp90_2_16_intra_only.vp9 b/tests/tests/media/res/raw/vp90_2_16_intra_only.vp9
deleted file mode 100644
index a88750f..0000000
--- a/tests/tests/media/res/raw/vp90_2_16_intra_only.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_16_intra_only_vp9_md5 b/tests/tests/media/res/raw/vp90_2_16_intra_only_vp9_md5
deleted file mode 100644
index 112a52a..0000000
--- a/tests/tests/media/res/raw/vp90_2_16_intra_only_vp9_md5
+++ /dev/null
@@ -1,7 +0,0 @@
-d57529601178948afa4818c3c8938884  vp90-2-16-intra-only-352x288-0001.i420
-d47e00250c45733d64af067a417bcd06  vp90-2-16-intra-only-352x288-0002.i420
-984e41cd8350808ac6129746b2377818  vp90-2-16-intra-only-352x288-0003.i420
-a5fa62996b4bb52e72e335722cf55bef  vp90-2-16-intra-only-352x288-0004.i420
-b71ca5ad650170ac921a71a6440fb508  vp90-2-16-intra-only-352x288-0005.i420
-76ba63001170b8992fc72be5c4ace731  vp90-2-16-intra-only-352x288-0006.i420
-c4e7f96a8fd58d901b1d881926ddae09  vp90-2-16-intra-only-352x288-0007.i420
diff --git a/tests/tests/media/res/raw/vp90_2_17_show_existing_frame.vp9 b/tests/tests/media/res/raw/vp90_2_17_show_existing_frame.vp9
deleted file mode 100644
index 4748eeb..0000000
--- a/tests/tests/media/res/raw/vp90_2_17_show_existing_frame.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_17_show_existing_frame_vp9_md5 b/tests/tests/media/res/raw/vp90_2_17_show_existing_frame_vp9_md5
deleted file mode 100644
index 50394da..0000000
--- a/tests/tests/media/res/raw/vp90_2_17_show_existing_frame_vp9_md5
+++ /dev/null
@@ -1,30 +0,0 @@
-b71ca5ad650170ac921a71a6440fb508  vp90-2-17-show-existing-frame.webm-352x288-0001.i420
-edc30ba14b73198ca827c1b216957dec  vp90-2-17-show-existing-frame.webm-352x288-0002.i420
-1902c5b3a82f6bdeb80a5b053909df04  vp90-2-17-show-existing-frame.webm-352x288-0003.i420
-9a96e33ed546d7961c6e5bc48244a5c7  vp90-2-17-show-existing-frame.webm-352x288-0004.i420
-b02a48630b0f3c08c61dd2518b55ea39  vp90-2-17-show-existing-frame.webm-352x288-0005.i420
-8ac9cec1101a46bf4ba20191b7ba3f07  vp90-2-17-show-existing-frame.webm-352x288-0006.i420
-88ea8c3cb9eca47152b5d22435a06675  vp90-2-17-show-existing-frame.webm-352x288-0007.i420
-bff3406209ec0d592a891dff2b58d6cd  vp90-2-17-show-existing-frame.webm-352x288-0008.i420
-b71ca5ad650170ac921a71a6440fb508  vp90-2-17-show-existing-frame.webm-352x288-0009.i420
-edc30ba14b73198ca827c1b216957dec  vp90-2-17-show-existing-frame.webm-352x288-0010.i420
-1902c5b3a82f6bdeb80a5b053909df04  vp90-2-17-show-existing-frame.webm-352x288-0011.i420
-9a96e33ed546d7961c6e5bc48244a5c7  vp90-2-17-show-existing-frame.webm-352x288-0012.i420
-b02a48630b0f3c08c61dd2518b55ea39  vp90-2-17-show-existing-frame.webm-352x288-0013.i420
-8ac9cec1101a46bf4ba20191b7ba3f07  vp90-2-17-show-existing-frame.webm-352x288-0014.i420
-88ea8c3cb9eca47152b5d22435a06675  vp90-2-17-show-existing-frame.webm-352x288-0015.i420
-bff3406209ec0d592a891dff2b58d6cd  vp90-2-17-show-existing-frame.webm-352x288-0016.i420
-b71ca5ad650170ac921a71a6440fb508  vp90-2-17-show-existing-frame.webm-352x288-0017.i420
-edc30ba14b73198ca827c1b216957dec  vp90-2-17-show-existing-frame.webm-352x288-0018.i420
-1902c5b3a82f6bdeb80a5b053909df04  vp90-2-17-show-existing-frame.webm-352x288-0019.i420
-9a96e33ed546d7961c6e5bc48244a5c7  vp90-2-17-show-existing-frame.webm-352x288-0020.i420
-b02a48630b0f3c08c61dd2518b55ea39  vp90-2-17-show-existing-frame.webm-352x288-0021.i420
-8ac9cec1101a46bf4ba20191b7ba3f07  vp90-2-17-show-existing-frame.webm-352x288-0022.i420
-88ea8c3cb9eca47152b5d22435a06675  vp90-2-17-show-existing-frame.webm-352x288-0023.i420
-bff3406209ec0d592a891dff2b58d6cd  vp90-2-17-show-existing-frame.webm-352x288-0024.i420
-a36428fd889ddf9983638c581c1d9146  vp90-2-17-show-existing-frame.webm-352x288-0025.i420
-689bd5fba1b7dff9abb1332e56f224fa  vp90-2-17-show-existing-frame.webm-352x288-0026.i420
-e883aa425fa13c6d4eda2707d114d61d  vp90-2-17-show-existing-frame.webm-352x288-0027.i420
-94d0bce08beb8a19c4ae12194a646935  vp90-2-17-show-existing-frame.webm-352x288-0028.i420
-cd317e97f5fd4be166308911c874f4e1  vp90-2-17-show-existing-frame.webm-352x288-0029.i420
-2fa245acd72d377cbb79c08faa02b330  vp90-2-17-show-existing-frame.webm-352x288-0030.i420
diff --git a/tests/tests/media/res/raw/vp90_2_19_skip.vp9 b/tests/tests/media/res/raw/vp90_2_19_skip.vp9
deleted file mode 100644
index 51c1173..0000000
--- a/tests/tests/media/res/raw/vp90_2_19_skip.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_19_skip_01.vp9 b/tests/tests/media/res/raw/vp90_2_19_skip_01.vp9
deleted file mode 100644
index b108df8..0000000
--- a/tests/tests/media/res/raw/vp90_2_19_skip_01.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_19_skip_01_vp9_md5 b/tests/tests/media/res/raw/vp90_2_19_skip_01_vp9_md5
deleted file mode 100644
index 98fdce2..0000000
--- a/tests/tests/media/res/raw/vp90_2_19_skip_01_vp9_md5
+++ /dev/null
@@ -1,60 +0,0 @@
-6e350ec33af4ce08c18e884d7fd795aa  01.yuv
-abfb6e52a5a9d896b65e2c54e1f35f20  02.yuv
-e40e57536810c196f277f2d86fd7ef4d  03.yuv
-0b25dbe7b8218fcc67e700d332ef7ad7  04.yuv
-20f7737828b9a686a02a1b01cebb637f  05.yuv
-06d41fe61fbd8d96750882baac56954f  06.yuv
-9e6661eb3424978e105dfa393407c293  07.yuv
-2d9dd8d9625dc67cb342b9db51a9bf85  08.yuv
-d8d8671e8e921484acd0fd67c7046382  09.yuv
-f6513fee6d2de65d51239a689f45f1d6  10.yuv
-5a8c26cbe9cefc79481a1e24c36d1b07  11.yuv
-918c1080ca4f2d61049caaa963d58069  12.yuv
-9d028868e407a2a596ede1c7ec71997c  13.yuv
-0bf06f2b16acc2c9691953d0ba134e7b  14.yuv
-f340480004fd45b579bfa04487c94136  15.yuv
-a6ab04e5c72ab3612842e891644ef2f2  16.yuv
-cf5da560e869a73ac6dc37ff1812b14e  17.yuv
-4b9e24121a05b7f95e4c2ed5dc25aac9  18.yuv
-5e7c43edbf51d19cae31e348920e5848  19.yuv
-96e421b17ce7fea2428ea1fe8f7b500a  20.yuv
-0e2b1ef0e3d1cf4a2af7dd7cbb160f04  21.yuv
-bdcc399223320df2fab20bf365e4f3df  22.yuv
-26cf7f3d9c3e36c6d2f8af6e1c9f9b15  23.yuv
-d2ef6d0dfd7eca3d77b60f9c82191bf3  24.yuv
-76c07306ce9a627f37a6a5c8d66820a2  25.yuv
-7ee2428a7fbc3c88418167a8e52d438d  26.yuv
-68b267345e01d2fc72576f984f757a3c  27.yuv
-541bfb03ae1db20d693a0a92550e8df6  28.yuv
-e87cf619aefdb81e26a8ec70d6a12c2c  29.yuv
-621f1ed3976088b247d79504bdf03ca3  30.yuv
-2c6023819babc72f8ad936ec0f0ca85e  31.yuv
-9f5eae1311cfdd2c02ee63a978b8d6d2  32.yuv
-902112ada88fbd3fe006b713cf08f5aa  33.yuv
-ab5b451f7174520c57b096268272759c  34.yuv
-b686cba2b4c454de4e8e16f088db8354  35.yuv
-a68e934aa397819bb80bf4bd29134103  36.yuv
-6982347a3aa730c2f8a15c94bfb42b3d  37.yuv
-57c3f83402184dd80beb9f78f0c5cfc8  38.yuv
-adf66470bfdb88a860a17b74d0f5e99b  39.yuv
-e98d09d8d34d3c8d1cb6619794b1ed5b  40.yuv
-f839dce9aabf7db8b007d83766e05fa7  41.yuv
-3bad23fa7f6052582e319b9774e26030  42.yuv
-4220ba420816a3bc7030e1582942e74d  43.yuv
-f404671eaf5310565d0831684ff0f3ba  44.yuv
-8ba48a53a0178bcd596b880c8a96a61f  45.yuv
-7a8fbb7356e494a6cefe52c2b07e6dce  46.yuv
-fb7974be2a11fcfc71cc450727bf71ad  47.yuv
-5c9be4d4acac0b375be851cd3774a918  48.yuv
-83c84c97c9c5efd6dd56668cdbf18428  49.yuv
-626c9ab1e52f7d9c711e142b46e82a42  50.yuv
-8012dbe193dfa5d787445eaeecd9091b  51.yuv
-bc36350c60b92f77473158a9249d5383  52.yuv
-4e81e00620020b4c55f273796f023145  53.yuv
-f6161f425f0476821f8caa46360d87af  54.yuv
-509f724002e54baac7dd37b514c345da  55.yuv
-4ab2368ffa3854f433fd568883db0e55  56.yuv
-9934a8d1ae0bdd65aab070efa91ac778  57.yuv
-2f2c1b110107c1141053513f2596a599  58.yuv
-9da6ca6ef375a095f0c86cb8cb41db74  59.yuv
-125c735dc1fb523c8088e0815cd4cde1  60.yuv
diff --git a/tests/tests/media/res/raw/vp90_2_19_skip_02.vp9 b/tests/tests/media/res/raw/vp90_2_19_skip_02.vp9
deleted file mode 100644
index 770e311..0000000
--- a/tests/tests/media/res/raw/vp90_2_19_skip_02.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_19_skip_02_vp9_md5 b/tests/tests/media/res/raw/vp90_2_19_skip_02_vp9_md5
deleted file mode 100644
index 80b3d65..0000000
--- a/tests/tests/media/res/raw/vp90_2_19_skip_02_vp9_md5
+++ /dev/null
@@ -1,12 +0,0 @@
-1ee94a4b059cd7380dabf71553aedf32  vp90-2-19-skip-02.webm-208x144-0001.i420
-d86167bfd6bca76c476c79361894a3f0  vp90-2-19-skip-02.webm-208x144-0002.i420
-421c9cd3b3474af8893fa44832b6fca7  vp90-2-19-skip-02.webm-208x144-0003.i420
-db0585dc48220105b8a3326222a66292  vp90-2-19-skip-02.webm-208x144-0004.i420
-15e5a53f39d7e350d356b0c4b2be4c82  vp90-2-19-skip-02.webm-208x144-0005.i420
-4d35f23245c90b5c0f013b4b2a085b2a  vp90-2-19-skip-02.webm-208x144-0006.i420
-1e46a9945accfec93e345f50ebb520a0  vp90-2-19-skip-02.webm-208x144-0007.i420
-ea53419be2de85e9505aaed3a03a10e0  vp90-2-19-skip-02.webm-208x144-0008.i420
-14c17560d0690e929a40b6f2e46a458a  vp90-2-19-skip-02.webm-208x144-0009.i420
-7c5eb58b81b57530391717a076114728  vp90-2-19-skip-02.webm-208x144-0010.i420
-57d4952e50ba519388ce7efca7ee505b  vp90-2-19-skip-02.webm-208x144-0011.i420
-7bb3d99c86e135354ad437e5d80bf089  vp90-2-19-skip-02.webm-208x144-0012.i420
diff --git a/tests/tests/media/res/raw/vp90_2_19_skip_vp9_md5 b/tests/tests/media/res/raw/vp90_2_19_skip_vp9_md5
deleted file mode 100644
index 472b59a..0000000
--- a/tests/tests/media/res/raw/vp90_2_19_skip_vp9_md5
+++ /dev/null
@@ -1,60 +0,0 @@
-6e350ec33af4ce08c18e884d7fd795aa  01.yuv
-3f77603d7a5727db4017202310da1724  02.yuv
-983aae5424ab39af07adcf78d43a23ba  03.yuv
-a0cdeaa0eb6eda3750d268434391a7ab  04.yuv
-64325c99444e566989c6eeaa8ffeee32  05.yuv
-8320f52b7fcd0565465941c50a01b801  06.yuv
-d6bb76bf65b70b86bda891fe807fcd26  07.yuv
-c44b46422d2be0b831d27fab61a0d374  08.yuv
-414ce4220e0aef53cb5966990ae00bb6  09.yuv
-2bf82867941dc68b0d60cede97f2d4d7  10.yuv
-593c676743ffaf1a5be85d74529dbb3f  11.yuv
-ccac5f0992545c35d227a021cb91b6f6  12.yuv
-bbb637aaed37f7cc6068802531152b77  13.yuv
-41e2d71a3ff3ed9d225348eb6be72853  14.yuv
-7ed3f76508059c281f75e2043d7d6677  15.yuv
-ed330eefed85685bed2bc1c5dc409d24  16.yuv
-61c4c435237e06623b6994f43b469833  17.yuv
-1e27f96fe683a654b228360f7a1beee1  18.yuv
-090e025ec148ec53f802cdb8ed0bfd77  19.yuv
-20d0caa6d4ab9db05869fd0532a2265f  20.yuv
-e11d108db8822b07a6fe8216b34fa259  21.yuv
-bdb3421bffee6eeafa00255ffcdcf1fe  22.yuv
-cb090c2f2d28679d1e2eb2c04150d751  23.yuv
-7f8eec67552bbac654f9a374d7a985ca  24.yuv
-5c039c621c9c20947f75b98b7e579ce8  25.yuv
-464be7de183b98138d8e9fb61ef613ec  26.yuv
-b887a102c6399d33307ac434d0ab3fd4  27.yuv
-e8fa163067c77e27b9089b4a48b444c0  28.yuv
-d92e13465475df261f9469171ac962cc  29.yuv
-8e6a8ba99387bc4cf7aee0aab6d132f4  30.yuv
-4625d7b6b23ddc840941a4f4d7739daa  31.yuv
-3b8533887142da49fdb24569dd34c2ac  32.yuv
-9ff94cefac26936cbf284e7482b2433d  33.yuv
-68b2fec46494c24501e48927fe9636e5  34.yuv
-7d76bfa0ebb09f27482288a0d61cd0e8  35.yuv
-27b630a10fc1790884e16bbb0fef37ee  36.yuv
-322de7f87166725fdd48373b28156593  37.yuv
-d73c7bd37eccd47df4a5b27cecbb8cea  38.yuv
-c3679a0317d1efc2b76e3dd97baa4070  39.yuv
-e3f9523bd41a280b922cdcf188911de2  40.yuv
-b57f28d944f4f39ab9c97a5ae8e3beda  41.yuv
-520a2b794f4384cf4c38f8d4c5b9c7bb  42.yuv
-bc215f65a73183da31b4bd896db178b4  43.yuv
-ab3c86d15728db474a45c544c2103745  44.yuv
-1287678d28e400a47a4f21b8854339d7  45.yuv
-be3f1eb3f48706e4e37aff83f0434fab  46.yuv
-dbc71f50dd620e058da88c414041ca57  47.yuv
-3d68bf9ae1e6065bf70eee87fbb9a2ce  48.yuv
-c901fac66677a4be1b624d6995af1ea3  49.yuv
-0756c5dd31c691df91a535910d8756e0  50.yuv
-b9c30e56f000a71148ababdf7c7bbae3  51.yuv
-2dc2917b1c0e498dd8e83abcdc48e3ca  52.yuv
-057ce1fe6eb8800ec8ec47720e70ed74  53.yuv
-1c25a6c9e182fa7fbef473ad9be476ea  54.yuv
-3ae770d42403b5069d0fa97e11cec3b0  55.yuv
-e5c19d46df1c711a650229867073246c  56.yuv
-cfc5f6cbb0a319d8bfb3feffddbb8f48  57.yuv
-86e42a5e03bc537505589f7fa39bff2b  58.yuv
-cdf32bda09d594763068d6fa0ff67b98  59.yuv
-0d6be7f95a7e3941950f14e20be11020  60.yuv
diff --git a/tests/tests/media/res/raw/vp90_2_20_big_superframe_01.vp9 b/tests/tests/media/res/raw/vp90_2_20_big_superframe_01.vp9
deleted file mode 100644
index 6a45085..0000000
--- a/tests/tests/media/res/raw/vp90_2_20_big_superframe_01.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_20_big_superframe_01_vp9_md5 b/tests/tests/media/res/raw/vp90_2_20_big_superframe_01_vp9_md5
deleted file mode 100644
index 4fe4dcc..0000000
--- a/tests/tests/media/res/raw/vp90_2_20_big_superframe_01_vp9_md5
+++ /dev/null
@@ -1,13 +0,0 @@
-b5d461894f957709576d15f6dce3d69e  vp90-2-20-big_superframe-01.webm-352x288-0001.i420
-b14448e30621b5d2d0a18c2e12ef0d95  vp90-2-20-big_superframe-01.webm-352x288-0002.i420
-4584cf6ffe6ca91fa3926cb88b6dab2d  vp90-2-20-big_superframe-01.webm-352x288-0003.i420
-ff83dd3c0dfdd8740523f560a9d7abfe  vp90-2-20-big_superframe-01.webm-352x288-0004.i420
-a2a1dc9b91b0e4fd6ecc8fa53a156ed9  vp90-2-20-big_superframe-01.webm-352x288-0005.i420
-13f953ae1cfa25c5996d77fc88070452  vp90-2-20-big_superframe-01.webm-352x288-0006.i420
-81dd4bdf32f7998fdc221a4612e022ce  vp90-2-20-big_superframe-01.webm-352x288-0007.i420
-518bbee70ad6488ea3d69e0e34a133a4  vp90-2-20-big_superframe-01.webm-352x288-0008.i420
-acae8f0ab72c6daa3a280fa41fbbb22e  vp90-2-20-big_superframe-01.webm-352x288-0009.i420
-fbfb93207c09242ee49637e740f3f870  vp90-2-20-big_superframe-01.webm-352x288-0010.i420
-20b072932f592e67d92cb67b224620b1  vp90-2-20-big_superframe-01.webm-352x288-0011.i420
-ddab6752606406c5b25d4e3b3208e381  vp90-2-20-big_superframe-01.webm-352x288-0012.i420
-6525d6826964e8b54fa982a300088ce3  vp90-2-20-big_superframe-01.webm-352x288-0013.i420
diff --git a/tests/tests/media/res/raw/vp90_2_20_big_superframe_02.vp9 b/tests/tests/media/res/raw/vp90_2_20_big_superframe_02.vp9
deleted file mode 100644
index 73137af..0000000
--- a/tests/tests/media/res/raw/vp90_2_20_big_superframe_02.vp9
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/raw/vp90_2_20_big_superframe_02_vp9_md5 b/tests/tests/media/res/raw/vp90_2_20_big_superframe_02_vp9_md5
deleted file mode 100644
index 8ca8576..0000000
--- a/tests/tests/media/res/raw/vp90_2_20_big_superframe_02_vp9_md5
+++ /dev/null
@@ -1,18 +0,0 @@
-b5d461894f957709576d15f6dce3d69e  vp90-2-20-big_superframe-02.webm-352x288-0001.i420
-54e45dfe575d9843c198270f62154c09  vp90-2-20-big_superframe-02.webm-352x288-0002.i420
-87749847c291a46c0ae0ca5d5002cb5f  vp90-2-20-big_superframe-02.webm-352x288-0003.i420
-04d7f341b081b35fd14ddfd777607fb1  vp90-2-20-big_superframe-02.webm-352x288-0004.i420
-81c73e1129b94936d53d33f8c66588e9  vp90-2-20-big_superframe-02.webm-352x288-0005.i420
-678b99102426df6a69184acc142c0c6a  vp90-2-20-big_superframe-02.webm-352x288-0006.i420
-a91f8d509a3e853e71b78b7ebe162428  vp90-2-20-big_superframe-02.webm-352x288-0007.i420
-9981ac3b4b78627c4474222823a9b288  vp90-2-20-big_superframe-02.webm-352x288-0008.i420
-400adf7ab42c47954db9086b5fcb2ef8  vp90-2-20-big_superframe-02.webm-352x288-0009.i420
-fc917ebef7115a04f0bf4e06e1e1a2a9  vp90-2-20-big_superframe-02.webm-352x288-0010.i420
-72271e7946c9dd99a947df787caaadfe  vp90-2-20-big_superframe-02.webm-352x288-0011.i420
-acb81daaaa35d651a87a9f8e87f813b3  vp90-2-20-big_superframe-02.webm-352x288-0012.i420
-e6ffc22ab1a918e3f1af384f0dd22ff9  vp90-2-20-big_superframe-02.webm-352x288-0013.i420
-3ecbc78c737312948d8c172d1c2d2383  vp90-2-20-big_superframe-02.webm-352x288-0014.i420
-320edb7fddfe8c98e616702d11f8f456  vp90-2-20-big_superframe-02.webm-352x288-0015.i420
-cf8363cebf34bdefd2c8e2178de5ef23  vp90-2-20-big_superframe-02.webm-352x288-0016.i420
-d15c8f1bc21ad09ad881a59b5f2b8167  vp90-2-20-big_superframe-02.webm-352x288-0017.i420
-c5c9f8b1826fac50655ed1454ae78279  vp90-2-20-big_superframe-02.webm-352x288-0018.i420
diff --git a/tests/tests/media/res/raw/vp9_test_vectors b/tests/tests/media/res/raw/vp9_test_vectors
deleted file mode 100644
index a9dc4f3..0000000
--- a/tests/tests/media/res/raw/vp9_test_vectors
+++ /dev/null
@@ -1,235 +0,0 @@
-vp90_2_00_quantizer_00
-vp90_2_00_quantizer_01
-vp90_2_00_quantizer_02
-vp90_2_00_quantizer_03
-vp90_2_00_quantizer_04
-vp90_2_00_quantizer_05
-vp90_2_00_quantizer_06
-vp90_2_00_quantizer_07
-vp90_2_00_quantizer_08
-vp90_2_00_quantizer_09
-vp90_2_00_quantizer_10
-vp90_2_00_quantizer_11
-vp90_2_00_quantizer_12
-vp90_2_00_quantizer_13
-vp90_2_00_quantizer_14
-vp90_2_00_quantizer_15
-vp90_2_00_quantizer_16
-vp90_2_00_quantizer_17
-vp90_2_00_quantizer_18
-vp90_2_00_quantizer_19
-vp90_2_00_quantizer_20
-vp90_2_00_quantizer_21
-vp90_2_00_quantizer_22
-vp90_2_00_quantizer_23
-vp90_2_00_quantizer_24
-vp90_2_00_quantizer_25
-vp90_2_00_quantizer_26
-vp90_2_00_quantizer_27
-vp90_2_00_quantizer_28
-vp90_2_00_quantizer_29
-vp90_2_00_quantizer_30
-vp90_2_00_quantizer_31
-vp90_2_00_quantizer_32
-vp90_2_00_quantizer_33
-vp90_2_00_quantizer_34
-vp90_2_00_quantizer_35
-vp90_2_00_quantizer_36
-vp90_2_00_quantizer_37
-vp90_2_00_quantizer_38
-vp90_2_00_quantizer_39
-vp90_2_00_quantizer_40
-vp90_2_00_quantizer_41
-vp90_2_00_quantizer_42
-vp90_2_00_quantizer_43
-vp90_2_00_quantizer_44
-vp90_2_00_quantizer_45
-vp90_2_00_quantizer_46
-vp90_2_00_quantizer_47
-vp90_2_00_quantizer_48
-vp90_2_00_quantizer_49
-vp90_2_00_quantizer_50
-vp90_2_00_quantizer_51
-vp90_2_00_quantizer_52
-vp90_2_00_quantizer_53
-vp90_2_00_quantizer_54
-vp90_2_00_quantizer_55
-vp90_2_00_quantizer_56
-vp90_2_00_quantizer_57
-vp90_2_00_quantizer_58
-vp90_2_00_quantizer_59
-vp90_2_00_quantizer_60
-vp90_2_00_quantizer_61
-vp90_2_00_quantizer_62
-vp90_2_00_quantizer_63
-vp90_2_01_sharpness_1
-vp90_2_01_sharpness_2
-vp90_2_01_sharpness_3
-vp90_2_01_sharpness_4
-vp90_2_01_sharpness_5
-vp90_2_01_sharpness_6
-vp90_2_01_sharpness_7
-vp90_2_02_size_08x08
-vp90_2_02_size_08x10
-vp90_2_02_size_08x16
-vp90_2_02_size_08x18
-vp90_2_02_size_08x32
-vp90_2_02_size_08x34
-vp90_2_02_size_08x64
-vp90_2_02_size_08x66
-vp90_2_02_size_10x08
-vp90_2_02_size_10x10
-vp90_2_02_size_10x16
-vp90_2_02_size_10x18
-vp90_2_02_size_10x32
-vp90_2_02_size_10x34
-vp90_2_02_size_10x64
-vp90_2_02_size_10x66
-vp90_2_02_size_16x08
-vp90_2_02_size_16x10
-vp90_2_02_size_16x16
-vp90_2_02_size_16x18
-vp90_2_02_size_16x32
-vp90_2_02_size_16x34
-vp90_2_02_size_16x64
-vp90_2_02_size_16x66
-vp90_2_02_size_18x08
-vp90_2_02_size_18x10
-vp90_2_02_size_18x16
-vp90_2_02_size_18x18
-vp90_2_02_size_18x32
-vp90_2_02_size_18x34
-vp90_2_02_size_18x64
-vp90_2_02_size_18x66
-vp90_2_02_size_32x08
-vp90_2_02_size_32x10
-vp90_2_02_size_32x16
-vp90_2_02_size_32x18
-vp90_2_02_size_32x32
-vp90_2_02_size_32x34
-vp90_2_02_size_32x64
-vp90_2_02_size_32x66
-vp90_2_02_size_34x08
-vp90_2_02_size_34x10
-vp90_2_02_size_34x16
-vp90_2_02_size_34x18
-vp90_2_02_size_34x32
-vp90_2_02_size_34x34
-vp90_2_02_size_34x64
-vp90_2_02_size_34x66
-vp90_2_02_size_64x08
-vp90_2_02_size_64x10
-vp90_2_02_size_64x16
-vp90_2_02_size_64x18
-vp90_2_02_size_64x32
-vp90_2_02_size_64x34
-vp90_2_02_size_64x64
-vp90_2_02_size_64x66
-vp90_2_02_size_66x08
-vp90_2_02_size_66x10
-vp90_2_02_size_66x16
-vp90_2_02_size_66x18
-vp90_2_02_size_66x32
-vp90_2_02_size_66x34
-vp90_2_02_size_66x64
-vp90_2_02_size_66x66
-vp90_2_02_size_130x132
-vp90_2_02_size_132x130
-vp90_2_02_size_132x132
-vp90_2_02_size_178x180
-vp90_2_02_size_180x178
-vp90_2_02_size_180x180
-vp90_2_03_size_196x196
-vp90_2_03_size_196x198
-vp90_2_03_size_196x200
-vp90_2_03_size_196x202
-vp90_2_03_size_196x208
-vp90_2_03_size_196x210
-vp90_2_03_size_196x224
-vp90_2_03_size_196x226
-vp90_2_03_size_198x196
-vp90_2_03_size_198x198
-vp90_2_03_size_198x200
-vp90_2_03_size_198x202
-vp90_2_03_size_198x208
-vp90_2_03_size_198x210
-vp90_2_03_size_198x224
-vp90_2_03_size_198x226
-vp90_2_03_size_200x196
-vp90_2_03_size_200x198
-vp90_2_03_size_200x200
-vp90_2_03_size_200x202
-vp90_2_03_size_200x208
-vp90_2_03_size_200x210
-vp90_2_03_size_200x224
-vp90_2_03_size_200x226
-vp90_2_03_size_202x196
-vp90_2_03_size_202x198
-vp90_2_03_size_202x200
-vp90_2_03_size_202x202
-vp90_2_03_size_202x208
-vp90_2_03_size_202x210
-vp90_2_03_size_202x224
-vp90_2_03_size_202x226
-vp90_2_03_size_208x196
-vp90_2_03_size_208x198
-vp90_2_03_size_208x200
-vp90_2_03_size_208x202
-vp90_2_03_size_208x208
-vp90_2_03_size_208x210
-vp90_2_03_size_208x224
-vp90_2_03_size_208x226
-vp90_2_03_size_210x196
-vp90_2_03_size_210x198
-vp90_2_03_size_210x200
-vp90_2_03_size_210x202
-vp90_2_03_size_210x208
-vp90_2_03_size_210x210
-vp90_2_03_size_210x224
-vp90_2_03_size_210x226
-vp90_2_03_size_224x196
-vp90_2_03_size_224x198
-vp90_2_03_size_224x200
-vp90_2_03_size_224x202
-vp90_2_03_size_224x208
-vp90_2_03_size_224x210
-vp90_2_03_size_224x224
-vp90_2_03_size_224x226
-vp90_2_03_size_226x196
-vp90_2_03_size_226x198
-vp90_2_03_size_226x200
-vp90_2_03_size_226x202
-vp90_2_03_size_226x208
-vp90_2_03_size_226x210
-vp90_2_03_size_226x224
-vp90_2_03_size_226x226
-vp90_2_02_size_lf_1920x1080
-vp90_2_03_deltaq
-vp90_2_06_bilinear
-vp90_2_07_frame_parallel_1
-vp90_2_07_frame_parallel
-vp90_2_08_tile_1x2_frame_parallel
-vp90_2_08_tile_1x2
-vp90_2_08_tile_1x4_frame_parallel
-vp90_2_08_tile_1x4
-vp90_2_08_tile_1x8_frame_parallel
-vp90_2_08_tile_1x8
-vp90_2_08_tile_4x1
-vp90_2_08_tile_4x4
-vp90_2_09_aq2
-vp90_2_09_lf_deltas
-vp90_2_09_subpixel_00
-vp90_2_10_show_existing_frame2
-vp90_2_10_show_existing_frame
-vp90_2_12_droppable_1
-vp90_2_12_droppable_2
-vp90_2_12_droppable_3
-vp90_2_15_segkey_adpq
-vp90_2_15_segkey
-vp90_2_16_intra_only
-vp90_2_17_show_existing_frame
-vp90_2_19_skip_01
-vp90_2_19_skip_02
-vp90_2_19_skip
-vp90_2_20_big_superframe_01
-vp90_2_20_big_superframe_02
diff --git a/tests/tests/media/res/raw/webp_with_exif.webp b/tests/tests/media/res/raw/webp_with_exif.webp
deleted file mode 100644
index 20706bb..0000000
--- a/tests/tests/media/res/raw/webp_with_exif.webp
+++ /dev/null
Binary files differ
diff --git a/tests/tests/media/res/values/exifinterface.xml b/tests/tests/media/res/values/exifinterface.xml
index 1fcd987..d19d128 100644
--- a/tests/tests/media/res/values/exifinterface.xml
+++ b/tests/tests/media/res/values/exifinterface.xml
@@ -15,7 +15,7 @@
 -->
 
 <resources>
-    <array name="exifbyteorderii_jpg">
+    <array name="jpeg_with_exif_byte_order_ii">
         <!--Whether thumbnail exists-->
         <item>true</item>
         <item>3500</item>
@@ -59,7 +59,7 @@
         <item />
         <item />
     </array>
-    <array name="exifbyteorderii_standalone">
+    <array name="standalone_data_with_exif_byte_order_ii">
         <!--Whether thumbnail exists-->
         <item>true</item>
         <item>3494</item>
@@ -103,7 +103,7 @@
         <item>0</item>
         <item>0</item>
     </array>
-    <array name="exifbyteordermm_jpg">
+    <array name="jpeg_with_exif_byte_order_mm">
         <!--Whether thumbnail exists-->
         <item>false</item>
         <item />
@@ -147,7 +147,7 @@
         <item />
         <item />
     </array>
-    <array name="exifbyteordermm_standalone">
+    <array name="standalone_data_with_exif_byte_order_mm">
         <!--Whether thumbnail exists-->
         <item>false</item>
         <item>0</item>
@@ -191,7 +191,7 @@
         <item>0</item>
         <item>0</item>
     </array>
-    <array name="lg_g4_iso_800_dng">
+    <array name="dng_with_exif_with_xmp">
         <!--Whether thumbnail exists-->
         <item>true</item>
         <item>12570</item>
@@ -235,7 +235,7 @@
         <item>826</item>
         <item>10067</item>
     </array>
-    <array name="lg_g4_iso_800_jpg">
+    <array name="jpeg_with_exif_with_xmp">
         <!--Whether thumbnail exists-->
         <item>false</item>
         <item />
@@ -719,7 +719,7 @@
         <item />
         <item />
     </array>
-    <array name="exifbyteorderii_png">
+    <array name="png_with_exif_byte_order_ii">
         <!--Whether thumbnail exists-->
         <item>true</item>
         <item>212271</item>
@@ -763,7 +763,7 @@
         <item>0</item>
         <item>0</item>
     </array>
-    <array name="exifbyteorderii_webp">
+    <array name="webp_with_exif">
         <!--Whether thumbnail exists-->
         <item>true</item>
         <item>9646</item>
diff --git a/tests/tests/media/res/values/strings.xml b/tests/tests/media/res/values/strings.xml
index 018ab70..bd98b55 100644
--- a/tests/tests/media/res/values/strings.xml
+++ b/tests/tests/media/res/values/strings.xml
@@ -17,4 +17,5 @@
     <string name="test_user_route_name">User route\'s name for test</string>
     <string name="test_route_category_name">Route category\'s name for test</string>
     <string name="test_localizable_title">Translatable Ringtone Title</string>
+    <string name="testcanonicalize_localizable_title">Translatable Ringtone Title for canonicalizeTest</string>
 </resources>
\ No newline at end of file
diff --git a/tests/tests/media/src/android/media/cts/AdaptivePlaybackTest.java b/tests/tests/media/src/android/media/cts/AdaptivePlaybackTest.java
index 1d519df..ead4412 100644
--- a/tests/tests/media/src/android/media/cts/AdaptivePlaybackTest.java
+++ b/tests/tests/media/src/android/media/cts/AdaptivePlaybackTest.java
@@ -16,11 +16,7 @@
 
 package android.media.cts;
 
-import android.media.cts.R;
-
-import android.content.Context;
 import android.content.pm.PackageManager;
-import android.content.res.AssetFileDescriptor;
 import android.media.MediaCodec;
 import android.media.MediaCodecInfo;
 import android.media.MediaCodecInfo.CodecCapabilities;
@@ -45,83 +41,76 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.Vector;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.zip.CRC32;
 
 @MediaHeavyPresubmitTest
 @AppModeFull
 public class AdaptivePlaybackTest extends MediaPlayerTestBase {
     private static final String TAG = "AdaptivePlaybackTest";
-    private boolean sanity = false;
+    private boolean verify = false;
     private static final int MIN_FRAMES_BEFORE_DRC = 2;
 
     public Iterable<Codec> H264(CodecFactory factory) {
         return factory.createCodecList(
-                mContext,
                 MediaFormat.MIMETYPE_VIDEO_AVC,
-                R.raw.video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz,
-                R.raw.video_1280x720_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz,
-                R.raw.bbb_s1_720x480_mp4_h264_mp3_2mbps_30fps_aac_lc_5ch_320kbps_48000hz);
+                "video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4",
+                "video_1280x720_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4",
+                "bbb_s1_720x480_mp4_h264_mp3_2mbps_30fps_aac_lc_5ch_320kbps_48000hz.mp4");
     }
 
     public Iterable<Codec> HEVC(CodecFactory factory) {
         return factory.createCodecList(
-                mContext,
                 MediaFormat.MIMETYPE_VIDEO_HEVC,
-                R.raw.bbb_s1_720x480_mp4_hevc_mp3_1600kbps_30fps_aac_he_6ch_240kbps_48000hz,
-                R.raw.bbb_s4_1280x720_mp4_hevc_mp31_4mbps_30fps_aac_he_stereo_80kbps_32000hz,
-                R.raw.bbb_s1_352x288_mp4_hevc_mp2_600kbps_30fps_aac_he_stereo_96kbps_48000hz);
+                "bbb_s1_720x480_mp4_hevc_mp3_1600kbps_30fps_aac_he_6ch_240kbps_48000hz.mp4",
+                "bbb_s4_1280x720_mp4_hevc_mp31_4mbps_30fps_aac_he_stereo_80kbps_32000hz.mp4",
+                "bbb_s1_352x288_mp4_hevc_mp2_600kbps_30fps_aac_he_stereo_96kbps_48000hz.mp4");
     }
 
     public Iterable<Codec> Mpeg2(CodecFactory factory) {
         return factory.createCodecList(
-                mContext,
                 MediaFormat.MIMETYPE_VIDEO_MPEG2,
-                R.raw.video_640x360_mp4_mpeg2_2000kbps_30fps_aac_stereo_128kbps_48000hz,
-                R.raw.video_1280x720_mp4_mpeg2_3000kbps_30fps_aac_stereo_128kbps_48000hz);
+                "video_640x360_mp4_mpeg2_2000kbps_30fps_aac_stereo_128kbps_48000hz.mp4",
+                "video_1280x720_mp4_mpeg2_3000kbps_30fps_aac_stereo_128kbps_48000hz.mp4");
     }
 
     public Iterable<Codec> H263(CodecFactory factory) {
         return factory.createCodecList(
-                mContext,
                 MediaFormat.MIMETYPE_VIDEO_H263,
-                R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz,
-                R.raw.video_352x288_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz);
+                "video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz.3gp",
+                "video_352x288_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz.3gp");
     }
 
     public Iterable<Codec> Mpeg4(CodecFactory factory) {
         return factory.createCodecList(
-                mContext,
                 MediaFormat.MIMETYPE_VIDEO_MPEG4,
-                R.raw.video_1280x720_mp4_mpeg4_1000kbps_25fps_aac_stereo_128kbps_44100hz,
-                R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz,
-                R.raw.video_176x144_mp4_mpeg4_300kbps_25fps_aac_stereo_128kbps_44100hz);
+                "video_1280x720_mp4_mpeg4_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4",
+                "video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz.mp4",
+                "video_176x144_mp4_mpeg4_300kbps_25fps_aac_stereo_128kbps_44100hz.mp4");
     }
 
     public Iterable<Codec> VP8(CodecFactory factory) {
         return factory.createCodecList(
-                mContext,
                 MediaFormat.MIMETYPE_VIDEO_VP8,
-                R.raw.video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_48000hz,
-                R.raw.bbb_s3_1280x720_webm_vp8_8mbps_60fps_opus_6ch_384kbps_48000hz,
-                R.raw.bbb_s1_320x180_webm_vp8_800kbps_30fps_opus_5ch_320kbps_48000hz);
+                "video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_48000hz.webm",
+                "bbb_s3_1280x720_webm_vp8_8mbps_60fps_opus_6ch_384kbps_48000hz.webm",
+                "bbb_s1_320x180_webm_vp8_800kbps_30fps_opus_5ch_320kbps_48000hz.webm");
     }
 
     public Iterable<Codec> VP9(CodecFactory factory) {
         return factory.createCodecList(
-                mContext,
                 MediaFormat.MIMETYPE_VIDEO_VP9,
-                R.raw.video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_48000hz,
-                R.raw.bbb_s4_1280x720_webm_vp9_0p31_4mbps_30fps_opus_stereo_128kbps_48000hz,
-                R.raw.bbb_s1_320x180_webm_vp9_0p11_600kbps_30fps_vorbis_mono_64kbps_48000hz);
+                "video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_48000hz.webm",
+                "bbb_s4_1280x720_webm_vp9_0p31_4mbps_30fps_opus_stereo_128kbps_48000hz.webm",
+                "bbb_s1_320x180_webm_vp9_0p11_600kbps_30fps_vorbis_mono_64kbps_48000hz.webm");
     }
 
     public Iterable<Codec> AV1(CodecFactory factory) {
         return factory.createCodecList(
-                mContext,
                 MediaFormat.MIMETYPE_VIDEO_AV1,
-                R.raw.video_480x360_webm_av1_400kbps_30fps_vorbis_stereo_128kbps_48000hz,
-                R.raw.video_1280x720_webm_av1_2000kbps_30fps_vorbis_stereo_128kbps_48000hz,
-                R.raw.video_320x180_webm_av1_200kbps_30fps_vorbis_stereo_128kbps_48000hz);
+                "video_480x360_webm_av1_400kbps_30fps_vorbis_stereo_128kbps_48000hz.webm",
+                "video_1280x720_webm_av1_2000kbps_30fps_vorbis_stereo_128kbps_48000hz.webm",
+                "video_320x180_webm_av1_200kbps_30fps_vorbis_stereo_128kbps_48000hz.webm");
     }
 
     CodecFactory ALL = new CodecFactory();
@@ -195,9 +184,9 @@
     public void runSW()  { ex(SWCodecs(),  allTests); }
     public void runHW()  { ex(HWCodecs(),  allTests); }
 
-    public void sanityAll() { sanity = true; try { runAll(); } finally { sanity = false; } }
-    public void sanitySW()  { sanity = true; try { runSW();  } finally { sanity = false; } }
-    public void sanityHW()  { sanity = true; try { runHW();  } finally { sanity = false; } }
+    public void verifyAll() { verify = true; try { runAll(); } finally { verify = false; } }
+    public void verifySW()  { verify = true; try { runSW();  } finally { verify = false; } }
+    public void verifyHW()  { verify = true; try { runHW();  } finally { verify = false; } }
 
     public void runH264()  { ex(H264(),  allTests); }
     public void runHEVC()  { ex(HEVC(),  allTests); }
@@ -435,7 +424,7 @@
                             }
                         }
                     });
-                if (sanity) {
+                if (verify) {
                     i >>= 1;
                 }
             }
@@ -481,7 +470,7 @@
                             mDecoder.flush();
                         }
                     });
-                if (sanity) {
+                if (verify) {
                     i >>= 1;
                 }
             }
@@ -542,7 +531,7 @@
                             }
                         }
                     });
-                if (sanity) {
+                if (verify) {
                     i >>= 1;
                 }
             }
@@ -599,7 +588,7 @@
                         public void run() throws Throwable {
                             mQueuedFrames += segmentSize;
                             boolean lastSequence = segmentSize == MIN_FRAMES_BEFORE_DRC;
-                            if (sanity) {
+                            if (verify) {
                                 lastSequence = (segmentSize >> 1) <= MIN_FRAMES_BEFORE_DRC;
                             }
                             int frames = mDecoder.queueInputBufferRange(
@@ -621,7 +610,7 @@
                             mAdjustTimeUs += 1 + stepMedia().getTimestampRangeValue(
                                     0, segmentSize, Media.RANGE_END);
                         }});
-                if (sanity) {
+                if (verify) {
                     i >>= 1;
                 }
             }
@@ -747,7 +736,7 @@
                 final int mediaIx = ix % c.mediaList.length;
                 final int segmentSize = i;
                 final boolean lastSequence;
-                if (sanity) {
+                if (verify) {
                     lastSequence = (segmentSize << 1) + 1 > NUM_FRAMES;
                 } else {
                     lastSequence = segmentSize >= NUM_FRAMES;
@@ -778,7 +767,7 @@
                                         0, segmentSize, Media.RANGE_DURATION);
                             }
                         }});
-                if (sanity) {
+                if (verify) {
                     i <<= 1;
                 }
             }
@@ -886,7 +875,9 @@
         boolean mDoChecksum;
         boolean mQueuedEos;
         ArrayList<Long> mTimeStamps;
-        ArrayList<String> mWarnings;
+        // We might add items when iterating mWarnings.
+        // Use CopyOnWrieArrayList to avoid ConcurrentModificationException.
+        CopyOnWriteArrayList<String> mWarnings;
         Vector<Long> mRenderedTimeStamps; // using Vector as it is implicitly synchronized
         long mLastRenderNanoTime;
         int mFramesNotifiedRendered;
@@ -903,7 +894,7 @@
             mDoChecksum = false;
             mQueuedEos = false;
             mTimeStamps = new ArrayList<Long>();
-            mWarnings = new ArrayList<String>();
+            mWarnings = new CopyOnWriteArrayList<String>();
             mRenderedTimeStamps = new Vector<Long>();
             mLastRenderNanoTime = System.nanoTime();
             mFramesNotifiedRendered = 0;
@@ -1343,12 +1334,10 @@
         }
     }
 
-    public static Media read(Context context, int video, int numFrames)
+    public static Media read(final String video, int numFrames)
             throws java.io.IOException {
         MediaExtractor extractor = new MediaExtractor();
-        AssetFileDescriptor testFd = context.getResources().openRawResourceFd(video);
-        extractor.setDataSource(testFd.getFileDescriptor(), testFd.getStartOffset(),
-                testFd.getLength());
+        extractor.setDataSource(video);
 
         Media media = new Media(
                 extractor.getTrackFormat(0), extractor.getTrackFormat(0), numFrames);
@@ -1399,7 +1388,6 @@
             }
         }
         extractor.release();
-        testFd.close();
 
         /* Override MAX_INPUT_SIZE in format, as CSD is being combined
          * with one of the input buffers */
@@ -1455,16 +1443,17 @@
 class CodecFamily extends CodecList {
     private final static String TAG = "AdaptiveCodecFamily";
     private static final int NUM_FRAMES = AdaptivePlaybackTest.NUM_FRAMES;
+    static final String mInpPrefix = WorkDir.getMediaDirString();
 
-    public CodecFamily(Context context, String mime, int ... resources) {
+    public CodecFamily(String mime, final String ... resources) {
         try {
             /* read all media */
             Media[] mediaList = new Media[resources.length];
             for (int i = 0; i < resources.length; i++) {
-                Log.v(TAG, "reading media " + resources[i]);
-                Media media = Media.read(context, resources[i], NUM_FRAMES);
+                Log.v(TAG, "reading media " + mInpPrefix + resources[i]);
+                Media media = Media.read(mInpPrefix + resources[i], NUM_FRAMES);
                 assert media.getMime().equals(mime):
-                        "test stream " + resources[i] + " has " + media.getMime() +
+                        "test stream " + mInpPrefix + resources[i] + " has " + media.getMime() +
                         " mime type instead of " + mime;
 
                 /* assuming the first timestamp is the smallest */
@@ -1506,9 +1495,8 @@
 
 /* all codecs of mime, except named codec if exists */
 class CodecFamilySpecific extends CodecList {
-    public CodecFamilySpecific(
-            Context context, String mime, boolean isGoogle, int ... resources) {
-        for (Codec c: new CodecFamily(context, mime, resources)) {
+    public CodecFamilySpecific(String mime, boolean isGoogle, final String ... resources) {
+        for (Codec c: new CodecFamily(mime, resources)) {
             if (!c.vendor == isGoogle) {
                 add(c);
             }
@@ -1517,23 +1505,20 @@
 }
 
 class CodecFactory {
-    public CodecList createCodecList(
-            Context context, String mime, int ...resources) {
-        return new CodecFamily(context, mime, resources);
+    public CodecList createCodecList(String mime, final String ...resources) {
+        return new CodecFamily(mime, resources);
     }
 }
 
 class SWCodecFactory extends CodecFactory {
-    public CodecList createCodecList(
-            Context context, String mime, int ...resources) {
-        return new CodecFamilySpecific(context, mime, true, resources);
+    public CodecList createCodecList(String mime, final String ...resources) {
+        return new CodecFamilySpecific(mime, true, resources);
     }
 }
 
 class HWCodecFactory extends CodecFactory {
-    public CodecList createCodecList(
-            Context context, String mime, int ...resources) {
-        return new CodecFamilySpecific(context, mime, false, resources);
+    public CodecList createCodecList(String mime, final String ...resources) {
+        return new CodecFamilySpecific(mime, false, resources);
     }
 }
 
diff --git a/tests/tests/media/src/android/media/cts/AudioHelper.java b/tests/tests/media/src/android/media/cts/AudioHelper.java
index 695fb9d..12c6e64 100644
--- a/tests/tests/media/src/android/media/cts/AudioHelper.java
+++ b/tests/tests/media/src/android/media/cts/AudioHelper.java
@@ -256,7 +256,7 @@
     public static class TimestampVerifier {
 
         // CDD 5.6 1ms timestamp accuracy
-        private static final double TEST_MAX_JITTER_MS_ALLOWED = 6.; // a sanity check
+        private static final double TEST_MAX_JITTER_MS_ALLOWED = 6.; // a validity check
         private static final double TEST_STD_JITTER_MS_ALLOWED = 3.; // flaky tolerance 3x
         private static final double TEST_STD_JITTER_MS_WARN = 1.;    // CDD requirement warning
 
diff --git a/tests/tests/media/src/android/media/cts/AudioPlaybackConfigurationTest.java b/tests/tests/media/src/android/media/cts/AudioPlaybackConfigurationTest.java
index 21f7a1b..04023fd 100644
--- a/tests/tests/media/src/android/media/cts/AudioPlaybackConfigurationTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioPlaybackConfigurationTest.java
@@ -26,23 +26,28 @@
 import android.media.AudioManager;
 import android.media.MediaPlayer;
 import android.media.SoundPool;
+import android.net.Uri;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Parcel;
+import android.platform.test.annotations.AppModeFull;
 import android.util.Log;
 import android.media.AudioPlaybackConfiguration;
 
 import com.android.compatibility.common.util.CtsAndroidTestCase;
 import com.android.internal.annotations.GuardedBy;
 
+import java.io.File;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
+@AppModeFull(reason = "Instant apps cannot access the SD card")
 public class AudioPlaybackConfigurationTest extends CtsAndroidTestCase {
     private final static String TAG = "AudioPlaybackConfigurationTest";
 
+    static final String mInpPrefix = WorkDir.getMediaDirString();
     private final static int TEST_TIMING_TOLERANCE_MS = 150;
     private final static int TEST_TIMEOUT_SOUNDPOOL_LOAD_MS = 3000;
 
@@ -85,8 +90,9 @@
                 .setContentType(TEST_CONTENT)
                 .setAllowedCapturePolicy(ALLOW_CAPTURE_BY_NONE)
                 .build();
-        mMp = MediaPlayer.create(getContext(), R.raw.sine1khzs40dblong,
-                aa, am.generateAudioSessionId());
+        mMp = MediaPlayer.create(getContext(),
+                Uri.fromFile(new File(mInpPrefix + "sine1khzs40dblong.mp3")), null, aa,
+                am.generateAudioSessionId());
         mMp.start();
         Thread.sleep(TEST_TIMING_TOLERANCE_MS);// waiting for playback to start
         List<AudioPlaybackConfiguration> configs = am.getActivePlaybackConfigurations();
@@ -133,8 +139,9 @@
         List<AudioPlaybackConfiguration> configs = am.getActivePlaybackConfigurations();
         final int nbActivePlayersBeforeStart = configs.size();
 
-        mMp = MediaPlayer.create(getContext(), R.raw.sine1khzs40dblong,
-                aa, am.generateAudioSessionId());
+        mMp = MediaPlayer.create(getContext(),
+                Uri.fromFile(new File(mInpPrefix + "sine1khzs40dblong.mp3")), null, aa,
+                am.generateAudioSessionId());
         configs = am.getActivePlaybackConfigurations();
         assertEquals("inactive MediaPlayer, number of configs shouldn't have changed",
                 nbActivePlayersBeforeStart /*expected*/, configs.size());
@@ -194,8 +201,9 @@
                     .setContentType(TEST_CONTENT)
                     .build();
 
-            mMp = MediaPlayer.create(getContext(), R.raw.sine1khzs40dblong,
-                    aa, am.generateAudioSessionId());
+            mMp = MediaPlayer.create(getContext(),
+                    Uri.fromFile(new File(mInpPrefix + "sine1khzs40dblong.mp3")), null, aa,
+                    am.generateAudioSessionId());
 
             MyAudioPlaybackCallback callback = new MyAudioPlaybackCallback();
             am.registerAudioPlaybackCallback(callback, h /*handler*/);
@@ -258,8 +266,9 @@
                     .setContentType(TEST_CONTENT)
                     .build();
 
-            mMp = MediaPlayer.create(getContext(), R.raw.sine1khzs40dblong,
-                    aa, am.generateAudioSessionId());
+            mMp = MediaPlayer.create(getContext(),
+                    Uri.fromFile(new File(mInpPrefix + "sine1khzs40dblong.mp3")), null, aa,
+                    am.generateAudioSessionId());
 
             MyAudioPlaybackCallback callback = new MyAudioPlaybackCallback();
             am.registerAudioPlaybackCallback(callback, h /*handler*/);
@@ -336,7 +345,7 @@
                 }
             }
         });
-        final int loadId = mSp.load(getContext(), R.raw.sine1320hz5sec, 1/*priority*/);
+        final int loadId = mSp.load(mInpPrefix + "sine1320hz5sec.wav", 1/*priority*/);
         synchronized (loadLock) {
             loadLock.wait(TEST_TIMEOUT_SOUNDPOOL_LOAD_MS);
         }
diff --git a/tests/tests/media/src/android/media/cts/AudioRecordTest.java b/tests/tests/media/src/android/media/cts/AudioRecordTest.java
index 2b342c8..e14a6c5 100644
--- a/tests/tests/media/src/android/media/cts/AudioRecordTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioRecordTest.java
@@ -805,7 +805,7 @@
                     firstSampleTime = System.currentTimeMillis();
                 }
                 samplesRead += ret;
-                // sanity check: elapsed time cannot be more than a second
+                // validity check: elapsed time cannot be more than a second
                 // than what we expect.
                 assertTrue(System.currentTimeMillis() - startTime <=
                         PLAYBACK_TIME_IN_MS + RECORD_TIME_IN_MS + 1000);
diff --git a/tests/tests/media/src/android/media/cts/AudioTrackSurroundTest.java b/tests/tests/media/src/android/media/cts/AudioTrackSurroundTest.java
index 0449d65..6ae26eb 100644
--- a/tests/tests/media/src/android/media/cts/AudioTrackSurroundTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioTrackSurroundTest.java
@@ -28,12 +28,14 @@
 import android.media.AudioManager;
 import android.media.AudioTimestamp;
 import android.media.AudioTrack;
+import android.platform.test.annotations.AppModeFull;
 import android.util.Log;
 
 import com.android.compatibility.common.util.CtsAndroidTestCase;
 
 import java.io.BufferedInputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.FileInputStream;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
@@ -47,11 +49,16 @@
 // sample rate based on the AudioTimestamps.
 
 @NonMediaMainlineTest
+@AppModeFull(reason = "Instant apps cannot access the SD card")
 public class AudioTrackSurroundTest extends CtsAndroidTestCase {
     private static final String TAG = "AudioTrackSurroundTest";
 
     private static final double MAX_RATE_TOLERANCE_FRACTION = 0.01;
     private static final boolean LOG_TIMESTAMPS = false; // set true for debugging
+    // just long enough to measure the rate
+    private static final long SAMPLE_RATE_SHORT_TEST_DURATION_MILLIS = 5000;
+    // AC3 and IEC61937 tracks require more time
+    private static final long SAMPLE_RATE_LONG_TEST_DURATION_MILLIS = 12000;
 
     // Set this true to prefer the device that supports the particular encoding.
     // But note that as of 3/25/2016, a bug causes Direct tracks to fail.
@@ -66,10 +73,10 @@
     private final static int MILLIS_PER_SECOND = 1000;
     private final static long NANOS_PER_SECOND = NANOS_PER_MILLISECOND * MILLIS_PER_SECOND;
 
-    private final static int RES_AC3_SPDIF_VOICE_32000 = R.raw.voice12_32k_128kbps_15s_ac3_spdif;
-    private final static int RES_AC3_SPDIF_VOICE_44100 = R.raw.voice12_44k_128kbps_15s_ac3_spdif;
-    private final static int RES_AC3_SPDIF_VOICE_48000 = R.raw.voice12_48k_128kbps_15s_ac3_spdif;
-    private final static int RES_AC3_VOICE_48000 = R.raw.voice12_48k_128kbps_15s_ac3;
+    private final static String RES_AC3_SPDIF_VOICE_32000 = "voice12_32k_128kbps_15s_ac3_spdif.raw";
+    private final static String RES_AC3_SPDIF_VOICE_44100 = "voice12_44k_128kbps_15s_ac3_spdif.raw";
+    private final static String RES_AC3_SPDIF_VOICE_48000 = "voice12_48k_128kbps_15s_ac3_spdif.raw";
+    private final static String RES_AC3_VOICE_48000 = "voice12_48k_128kbps_15s_ac3.raw";
 
     private static int mLastPlayedEncoding = AudioFormat.ENCODING_INVALID;
 
@@ -164,8 +171,9 @@
     }
 
     // Load a resource into a byte[]
-    private byte[] loadRawResourceBytes(@RawRes int id) throws Exception {
-        InputStream is = getContext().getResources().openRawResource(id);
+    private byte[] loadRawResourceBytes(@RawRes final String res) throws Exception {
+        final String mInpPrefix = WorkDir.getMediaDirString();
+        InputStream is = new FileInputStream(mInpPrefix + res);
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
         try (BufferedInputStream bis = new BufferedInputStream(is)) {
             for (int b = bis.read(); b != -1; b = bis.read()) {
@@ -176,23 +184,23 @@
     }
 
     // Load a resource into a short[]
-    private short[] loadRawResourceShorts(@RawRes int id) throws Exception {
-        byte[] byteBuffer = loadRawResourceBytes(id);
+    private short[] loadRawResourceShorts(@RawRes final String res) throws Exception {
+        byte[] byteBuffer = loadRawResourceBytes(res);
         ShortBuffer shortBuffer =
                 ByteBuffer.wrap(byteBuffer).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer();
         // Unfortunately, ShortBuffer.array() works with allocated buffers only.
-        short[] masterBuffer = new short[byteBuffer.length / 2];
-        for (int i = 0; i < masterBuffer.length; i++) {
-            masterBuffer[i] = shortBuffer.get();
+        short[] mainBuffer = new short[byteBuffer.length / 2];
+        for (int i = 0; i < mainBuffer.length; i++) {
+            mainBuffer[i] = shortBuffer.get();
         }
-        return masterBuffer;
+        return mainBuffer;
     }
 
     public void testLoadSineSweep() throws Exception {
         final String TEST_NAME = "testLoadSineSweep";
-        short[] shortData = loadRawResourceShorts(R.raw.sinesweepraw);
+        short[] shortData = loadRawResourceShorts("sinesweepraw.raw");
         assertTrue(TEST_NAME + ": load sinesweepraw as shorts", shortData.length > 100);
-        byte[] byteData = loadRawResourceBytes(R.raw.sinesweepraw);
+        byte[] byteData = loadRawResourceBytes("sinesweepraw.raw");
         assertTrue(TEST_NAME + ": load sinesweepraw as bytes", byteData.length > shortData.length);
     }
 
@@ -226,12 +234,14 @@
             boolean gotTimestamp = track.getTimestamp(timestamp);
             if (gotTimestamp) {
                 // Only save timestamps after the data is flowing.
-                if (mPreviousTimestamp != null
-                    && timestamp.framePosition > 0
-                    && timestamp.nanoTime != mPreviousTimestamp.nanoTime
-                    && timestamp.framePosition != mPreviousTimestamp.framePosition) {
+                boolean accepted = mPreviousTimestamp != null
+                        && timestamp.framePosition > 0
+                        && timestamp.nanoTime != mPreviousTimestamp.nanoTime
+                        && timestamp.framePosition != mPreviousTimestamp.framePosition;
+                if (accepted) {
                     mTimestamps.add(timestamp);
                 }
+                Log.d(TAG, (accepted ? "" : "NOT ") + "added ts " + timestampToString(timestamp));
                 mPreviousTimestamp = timestamp;
             }
         }
@@ -290,6 +300,7 @@
 
         // Use collected timestamps to estimate a sample rate.
         double estimateSampleRate() {
+            Log.w(TAG, "timestamps collected: " + mTimestamps.size());
             assertTrue("expect many timestamps, got " + mTimestamps.size(),
                     mTimestamps.size() > 10);
             // Use first and last timestamp to get the most accurate rate.
@@ -381,9 +392,8 @@
             }
         }
 
-        public void playAndMeasureRate() throws Exception {
+        public void playAndMeasureRate(long testDurationMillis) throws Exception {
             final String TEST_NAME = "playAndMeasureRate";
-            final long TEST_DURATION_MILLIS = 5000; // just long enough to measure the rate
 
             if (mLastPlayedEncoding == AudioFormat.ENCODING_INVALID ||
                     !AudioFormat.isEncodingLinearPcm(mEncoding) ||
@@ -424,7 +434,7 @@
                         + mTrack.getNativeOutputSampleRate(mTrack.getStreamType()));
                 long elapsedMillis = 0;
                 long startTime = System.currentTimeMillis();
-                while (elapsedMillis < TEST_DURATION_MILLIS) {
+                while (elapsedMillis < testDurationMillis) {
                     writeBlock(mBlockSize);
                     elapsedMillis = System.currentTimeMillis() - startTime;
                     mTimestampAnalyzer.addTimestamp(mTrack);
@@ -466,10 +476,10 @@
             }
         }
 
-        SamplePlayerShorts(int sampleRate, int encoding, int channelConfig, @RawRes int resourceId)
-                throws Exception {
+        SamplePlayerShorts(int sampleRate, int encoding, int channelConfig,
+                @RawRes final String res) throws Exception {
             super(sampleRate, encoding, channelConfig);
-            mData = loadRawResourceShorts(resourceId);
+            mData = loadRawResourceShorts(res);
             assertTrue("SamplePlayerShorts: load resource file as shorts", mData.length > 0);
         }
 
@@ -500,10 +510,10 @@
             mData = new byte[128 * 1024];
         }
 
-        SamplePlayerBytes(int sampleRate, int encoding, int channelConfig, @RawRes int resourceId)
+        SamplePlayerBytes(int sampleRate, int encoding, int channelConfig, @RawRes final String res)
                 throws Exception {
             super(sampleRate, encoding, channelConfig);
-            mData = loadRawResourceBytes(resourceId);
+            mData = loadRawResourceBytes(res);
             assertTrue("SamplePlayerBytes: load resource file as bytes", mData.length > 0);
         }
 
@@ -530,7 +540,7 @@
             SamplePlayerBytes player = new SamplePlayerBytes(
                     48000, AudioFormat.ENCODING_AC3, AudioFormat.CHANNEL_OUT_STEREO,
                     RES_AC3_VOICE_48000);
-            player.playAndMeasureRate();
+            player.playAndMeasureRate(SAMPLE_RATE_LONG_TEST_DURATION_MILLIS);
         }
     }
 
@@ -539,7 +549,7 @@
             SamplePlayerShorts player = new SamplePlayerShorts(
                     48000, AudioFormat.ENCODING_AC3, AudioFormat.CHANNEL_OUT_STEREO,
                     RES_AC3_VOICE_48000);
-            player.playAndMeasureRate();
+            player.playAndMeasureRate(SAMPLE_RATE_LONG_TEST_DURATION_MILLIS);
         }
     }
 
@@ -548,7 +558,7 @@
             SamplePlayerShorts player = new SamplePlayerShorts(
                     32000, AudioFormat.ENCODING_IEC61937, AudioFormat.CHANNEL_OUT_STEREO,
                     RES_AC3_SPDIF_VOICE_32000);
-            player.playAndMeasureRate();
+            player.playAndMeasureRate(SAMPLE_RATE_LONG_TEST_DURATION_MILLIS);
         }
     }
 
@@ -557,7 +567,7 @@
             SamplePlayerShorts player = new SamplePlayerShorts(
                     44100, AudioFormat.ENCODING_IEC61937, AudioFormat.CHANNEL_OUT_STEREO,
                     RES_AC3_SPDIF_VOICE_44100);
-            player.playAndMeasureRate();
+            player.playAndMeasureRate(SAMPLE_RATE_LONG_TEST_DURATION_MILLIS);
         }
     }
 
@@ -566,7 +576,7 @@
             SamplePlayerShorts player = new SamplePlayerShorts(
                     48000, AudioFormat.ENCODING_IEC61937, AudioFormat.CHANNEL_OUT_STEREO,
                     RES_AC3_SPDIF_VOICE_48000);
-            player.playAndMeasureRate();
+            player.playAndMeasureRate(SAMPLE_RATE_LONG_TEST_DURATION_MILLIS);
         }
     }
 
@@ -593,7 +603,7 @@
 
     public void testPcmSupport() throws Exception {
         if (REQUIRE_PCM_DEVICE) {
-            // There should always be a dummy PCM device available.
+            // There should always be a fake PCM device available.
             assertTrue("testPcmSupport: PCM should be supported."
                     + " On ATV device please check HDMI connection.",
                     mInfoPCM16 != null);
@@ -608,8 +618,8 @@
         if (isPcmTestingEnabled()) {
             SamplePlayerShorts player = new SamplePlayerShorts(
                     44100, AudioFormat.ENCODING_PCM_16BIT, AudioFormat.CHANNEL_OUT_STEREO,
-                    R.raw.sinesweepraw);
-            player.playAndMeasureRate();
+                    "sinesweepraw.raw");
+            player.playAndMeasureRate(SAMPLE_RATE_SHORT_TEST_DURATION_MILLIS);
         }
     }
 
@@ -617,8 +627,8 @@
         if (isPcmTestingEnabled()) {
             SamplePlayerBytes player = new SamplePlayerBytes(
                     44100, AudioFormat.ENCODING_PCM_16BIT, AudioFormat.CHANNEL_OUT_STEREO,
-                    R.raw.sinesweepraw);
-            player.playAndMeasureRate();
+                    "sinesweepraw.raw");
+            player.playAndMeasureRate(SAMPLE_RATE_SHORT_TEST_DURATION_MILLIS);
         }
     }
 
@@ -626,8 +636,8 @@
         if (isPcmTestingEnabled()) {
             SamplePlayerBytes player = new SamplePlayerBytes(
                     48000, AudioFormat.ENCODING_PCM_16BIT, AudioFormat.CHANNEL_OUT_STEREO,
-                    R.raw.sinesweepraw);
-            player.playAndMeasureRate();
+                    "sinesweepraw.raw");
+            player.playAndMeasureRate(SAMPLE_RATE_SHORT_TEST_DURATION_MILLIS);
         }
     }
 
@@ -635,17 +645,17 @@
         if (isPcmTestingEnabled()) {
             SamplePlayerShorts player = new SamplePlayerShorts(44100, AudioFormat.ENCODING_PCM_16BIT,
                     AudioFormat.CHANNEL_OUT_MONO,
-                    R.raw.sinesweepraw);
-            player.playAndMeasureRate();
+                    "sinesweepraw.raw");
+            player.playAndMeasureRate(SAMPLE_RATE_SHORT_TEST_DURATION_MILLIS);
         }
     }
 
     public void testPlaySineSweepBytesMono()
             throws Exception {
         if (isPcmTestingEnabled()) {
-            SamplePlayerBytes player = new SamplePlayerBytes(44100,
-                    AudioFormat.ENCODING_PCM_16BIT, AudioFormat.CHANNEL_OUT_MONO, R.raw.sinesweepraw);
-            player.playAndMeasureRate();
+            SamplePlayerBytes player = new SamplePlayerBytes(44100, AudioFormat.ENCODING_PCM_16BIT,
+                    AudioFormat.CHANNEL_OUT_MONO, "sinesweepraw.raw");
+            player.playAndMeasureRate(SAMPLE_RATE_SHORT_TEST_DURATION_MILLIS);
         }
     }
 
diff --git a/tests/tests/media/src/android/media/cts/AudioTrackTest.java b/tests/tests/media/src/android/media/cts/AudioTrackTest.java
index 457bf4a..b8064c0 100755
--- a/tests/tests/media/src/android/media/cts/AudioTrackTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioTrackTest.java
@@ -2424,7 +2424,7 @@
                 { {1.0f, 0.5f}, {1.0f, 2.0f} },  // pitch by SR conversion (chirp)
         };
 
-        // sanity test that playback params works as expected
+        // test that playback params works as expected
         PlaybackParams params = new PlaybackParams().allowDefaults();
         assertEquals("default speed not correct", 1.0f, params.getSpeed(), 0.f /* delta */);
         assertEquals("default pitch not correct", 1.0f, params.getPitch(), 0.f /* delta */);
@@ -2589,6 +2589,38 @@
     }
 
     @Test
+    public void testAc3BuilderNoBufferSize() throws Exception {
+        AudioFormat format = new AudioFormat.Builder()
+            .setEncoding(AudioFormat.ENCODING_AC3)
+            .setChannelMask(AudioFormat.CHANNEL_OUT_STEREO)
+            .setSampleRate(48000)
+            .build();
+        try {
+            AudioTrack audioTrack = new AudioTrack.Builder()
+                .setAudioFormat(format)
+                .setBufferSizeInBytes(100)
+                .build();
+            audioTrack.release();
+            Thread.sleep(200);
+        } catch (UnsupportedOperationException e) {
+            // Do nothing. It's OK for a device to not support ac3 audio tracks.
+            return;
+        }
+        // if ac3 audio tracks with set buffer size succeed, the builder should also succeed if the
+        // buffer size isn't set, allowing the framework to report the recommended buffer size.
+        try {
+            AudioTrack audioTrack = new AudioTrack.Builder()
+                .setAudioFormat(format)
+                .build();
+            audioTrack.release();
+        } catch (UnsupportedOperationException e) {
+            // This builder should not fail as the first builder succeeded when setting buffer size
+            fail("UnsupportedOperationException should not be thrown when setBufferSizeInBytes"
+                  + " is excluded from builder");
+        }
+    }
+
+    @Test
     public void testSetPresentationDefaultTrack() throws Exception {
         final AudioTrack track = new AudioTrack.Builder().build();
         assertEquals(AudioTrack.ERROR, track.setPresentation(createAudioPresentation()));
diff --git a/tests/tests/media/src/android/media/cts/CamcorderProfileTest.java b/tests/tests/media/src/android/media/cts/CamcorderProfileTest.java
index d0cfde7..b0bedf6 100644
--- a/tests/tests/media/src/android/media/cts/CamcorderProfileTest.java
+++ b/tests/tests/media/src/android/media/cts/CamcorderProfileTest.java
@@ -16,11 +16,11 @@
 
 package android.media.cts;
 
-
 import android.content.pm.PackageManager;
 import android.hardware.Camera;
 import android.hardware.Camera.Parameters;
 import android.hardware.Camera.Size;
+import android.hardware.cts.helpers.CameraUtils;
 import android.media.CamcorderProfile;
 import android.test.AndroidTestCase;
 import android.util.Log;
@@ -42,6 +42,8 @@
         CamcorderProfile.QUALITY_720P,
         CamcorderProfile.QUALITY_1080P,
         CamcorderProfile.QUALITY_QVGA,
+        CamcorderProfile.QUALITY_2K,
+        CamcorderProfile.QUALITY_QHD,
         CamcorderProfile.QUALITY_2160P,
         CamcorderProfile.QUALITY_TIME_LAPSE_LOW,
         CamcorderProfile.QUALITY_TIME_LAPSE_HIGH,
@@ -51,6 +53,8 @@
         CamcorderProfile.QUALITY_TIME_LAPSE_720P,
         CamcorderProfile.QUALITY_TIME_LAPSE_1080P,
         CamcorderProfile.QUALITY_TIME_LAPSE_QVGA,
+        CamcorderProfile.QUALITY_TIME_LAPSE_2K,
+        CamcorderProfile.QUALITY_TIME_LAPSE_QHD,
         CamcorderProfile.QUALITY_TIME_LAPSE_2160P,
         CamcorderProfile.QUALITY_HIGH_SPEED_LOW,
         CamcorderProfile.QUALITY_HIGH_SPEED_HIGH,
@@ -161,6 +165,18 @@
                 assertTrue(1088 == profile.videoFrameHeight ||
                            1080 == profile.videoFrameHeight);
                 break;
+            case CamcorderProfile.QUALITY_2K:
+            case CamcorderProfile.QUALITY_TIME_LAPSE_2K:
+                // 2K could be either 2048x1088 or 2048x1080
+                assertEquals(2048, profile.videoFrameWidth);
+                assertTrue(1088 == profile.videoFrameHeight ||
+                           1080 == profile.videoFrameHeight);
+                break;
+            case CamcorderProfile.QUALITY_QHD:
+            case CamcorderProfile.QUALITY_TIME_LAPSE_QHD:
+                assertEquals(2560, profile.videoFrameWidth);
+                assertEquals(1440, profile.videoFrameHeight);
+                break;
             case CamcorderProfile.QUALITY_2160P:
             case CamcorderProfile.QUALITY_TIME_LAPSE_2160P:
                 assertEquals(3840, profile.videoFrameWidth);
@@ -258,7 +274,7 @@
             if (CamcorderProfile.hasProfile(cameraId, quality) || isProfileMandatory(quality)) {
                 List<Size> videoSizesToCheck = null;
                 if (quality >= CamcorderProfile.QUALITY_LOW &&
-                                quality <= CamcorderProfile.QUALITY_2160P) {
+                                quality <= CamcorderProfile.QUALITY_2K) {
                     videoSizesToCheck = videoSizes;
                 }
                 CamcorderProfile profile = getWithOptionalId(quality, cameraId);
@@ -303,6 +319,8 @@
                                           CamcorderProfile.QUALITY_480P,
                                           CamcorderProfile.QUALITY_720P,
                                           CamcorderProfile.QUALITY_1080P,
+                                          CamcorderProfile.QUALITY_2K,
+                                          CamcorderProfile.QUALITY_QHD,
                                           CamcorderProfile.QUALITY_2160P};
 
         int[] specificTimeLapseProfileQualities = {CamcorderProfile.QUALITY_TIME_LAPSE_QCIF,
@@ -311,6 +329,8 @@
                                                    CamcorderProfile.QUALITY_TIME_LAPSE_480P,
                                                    CamcorderProfile.QUALITY_TIME_LAPSE_720P,
                                                    CamcorderProfile.QUALITY_TIME_LAPSE_1080P,
+                                                   CamcorderProfile.QUALITY_TIME_LAPSE_2K,
+                                                   CamcorderProfile.QUALITY_TIME_LAPSE_QHD,
                                                    CamcorderProfile.QUALITY_TIME_LAPSE_2160P};
 
         int[] specificHighSpeedProfileQualities = {CamcorderProfile.QUALITY_HIGH_SPEED_480P,
@@ -351,7 +371,16 @@
     public void testGetWithId() {
         int nCamera = Camera.getNumberOfCameras();
         for (int cameraId = 0; cameraId < nCamera; cameraId++) {
-            checkGet(cameraId);
+            boolean isExternal = false;
+            try {
+                isExternal = CameraUtils.isExternal(mContext, cameraId);
+            } catch (Exception e) {
+                Log.e(TAG, "Unable to query external camera: " + e);
+            }
+
+            if (!isExternal) {
+                checkGet(cameraId);
+            }
         }
     }
 
diff --git a/tests/tests/media/src/android/media/cts/CodecState.java b/tests/tests/media/src/android/media/cts/CodecState.java
index 8a8f35d..a93a1f5 100644
--- a/tests/tests/media/src/android/media/cts/CodecState.java
+++ b/tests/tests/media/src/android/media/cts/CodecState.java
@@ -289,9 +289,9 @@
 
             Log.d(TAG, "CodecState::onOutputFormatChanged Audio" +
                     " sampleRate:" + sampleRate + " channels:" + channelCount);
-            // We do sanity check here after we receive data from MediaExtractor and before
+            // We do a check here after we receive data from MediaExtractor and before
             // we pass them down to AudioTrack. If MediaExtractor works properly, this
-            // sanity-check is not necessary, however, in our tests, we found that there
+            // check is not necessary, however, in our tests, we found that there
             // are a few cases where ch=0 and samplerate=0 were returned by MediaExtractor.
             if (channelCount < 1 || channelCount > 8 ||
                     sampleRate < 8000 || sampleRate > 128000) {
diff --git a/tests/tests/media/src/android/media/cts/DecodeAccuracyTestBase.java b/tests/tests/media/src/android/media/cts/DecodeAccuracyTestBase.java
index 55a0913..4579567 100644
--- a/tests/tests/media/src/android/media/cts/DecodeAccuracyTestBase.java
+++ b/tests/tests/media/src/android/media/cts/DecodeAccuracyTestBase.java
@@ -46,6 +46,7 @@
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Looper;
+import android.os.ParcelFileDescriptor;
 import android.os.SystemClock;
 import android.util.Log;
 import android.util.Pair;
@@ -70,6 +71,7 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.io.FileNotFoundException;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.nio.FloatBuffer;
@@ -362,7 +364,7 @@
         private boolean setExtractorDataSource(VideoFormat videoFormat) {
             checkNotNull(videoFormat);
             try {
-                final AssetFileDescriptor afd = videoFormat.getAssetFileDescriptor(context);
+                final AssetFileDescriptor afd = videoFormat.getAssetFileDescriptor();
                 extractor.setDataSource(
                         afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                 afd.close();
@@ -546,7 +548,7 @@
             }
 
             public PlayerResult() {
-                // Dummy PlayerResult.
+                // Fake PlayerResult.
                 this(false, false, false, UNSET);
             }
 
@@ -1663,13 +1665,11 @@
         return getParsedName().toPrettyString();
     }
 
-    public AssetFileDescriptor getAssetFileDescriptor(Context context) {
-        try {
-            return context.getAssets().openFd(filename);
-        } catch (Exception e) {
-            e.printStackTrace();
-            return null;
-        }
+    public AssetFileDescriptor getAssetFileDescriptor() throws FileNotFoundException {
+        File inpFile = new File(WorkDir.getMediaDirString() + "assets/decode_accuracy/" + filename);
+        ParcelFileDescriptor parcelFD =
+                ParcelFileDescriptor.open(inpFile, ParcelFileDescriptor.MODE_READ_ONLY);
+        return new AssetFileDescriptor(parcelFD, 0, parcelFD.getStatSize());
     }
 
 }
diff --git a/tests/tests/media/src/android/media/cts/DecoderConformanceTest.java b/tests/tests/media/src/android/media/cts/DecoderConformanceTest.java
index 58293f9..258fd7a 100644
--- a/tests/tests/media/src/android/media/cts/DecoderConformanceTest.java
+++ b/tests/tests/media/src/android/media/cts/DecoderConformanceTest.java
@@ -18,13 +18,12 @@
 
 import android.media.cts.R;
 
-import android.content.Context;
 import android.content.res.AssetFileDescriptor;
-import android.content.res.Resources;
 import android.media.MediaCodec;
 import android.media.MediaCodecInfo;
 import android.media.MediaExtractor;
 import android.media.MediaFormat;
+import android.os.ParcelFileDescriptor;
 import android.platform.test.annotations.AppModeFull;
 import android.util.Log;
 import android.util.Range;
@@ -36,6 +35,9 @@
 import com.android.compatibility.common.util.Stat;
 
 import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.util.Arrays;
@@ -62,10 +64,11 @@
 
     private static final String REPORT_LOG_NAME = "CtsMediaTestCases";
     private static final String TAG = "DecoderConformanceTest";
-    private Resources mResources;
+    private static final String CONFORMANCE_SUBDIR = "conformance_vectors/";
     private DeviceReportLog mReportLog;
     private MediaCodec mDecoder;
     private MediaExtractor mExtractor;
+    static final String mInpPrefix = WorkDir.getMediaDirString() + CONFORMANCE_SUBDIR;
 
     private static final Map<String, String> MIMETYPE_TO_TAG = new HashMap <String, String>() {{
         put(MediaFormat.MIMETYPE_VIDEO_VP9, "vp9");
@@ -74,7 +77,6 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mResources = mContext.getResources();
     }
 
     @Override
@@ -84,8 +86,7 @@
 
 
     private List<String> readResourceLines(String fileName) throws Exception {
-        int resId = mResources.getIdentifier(fileName, "raw", mContext.getPackageName());
-        InputStream is = mContext.getResources().openRawResource(resId);
+        InputStream is = new FileInputStream(mInpPrefix + fileName);
         BufferedReader in = new BufferedReader(new InputStreamReader(is, "UTF-8"));
 
         // Read the file line by line.
@@ -131,11 +132,21 @@
         mExtractor = null;
     }
 
-    private Status decodeTestVector(String mime, String decoderName, String vectorName) throws Exception {
-        int resId = mResources.getIdentifier(vectorName, "raw", mContext.getPackageName());
-        AssetFileDescriptor testFd = mResources.openRawResourceFd(resId);
+    protected static AssetFileDescriptor getAssetFileDescriptorFor(final String res, String mime)
+            throws FileNotFoundException {
+        String tag = MIMETYPE_TO_TAG.get(mime);
+        File inpFile = new File(mInpPrefix + res + "." + tag);
+        ParcelFileDescriptor parcelFD =
+                ParcelFileDescriptor.open(inpFile, ParcelFileDescriptor.MODE_READ_ONLY);
+        return new AssetFileDescriptor(parcelFD, 0, parcelFD.getStatSize());
+    }
+
+    private Status decodeTestVector(String mime, String decoderName, String vectorName)
+            throws Exception {
+        AssetFileDescriptor testFd = getAssetFileDescriptorFor(vectorName, mime);
         mExtractor = new MediaExtractor();
-        mExtractor.setDataSource(testFd.getFileDescriptor(), testFd.getStartOffset(), testFd.getLength());
+        mExtractor.setDataSource(testFd.getFileDescriptor(), testFd.getStartOffset(),
+                testFd.getLength());
         mExtractor.selectTrack(0);
 
         mDecoder = MediaCodec.createByCodecName(decoderName);
@@ -182,6 +193,7 @@
                     }
                 } catch (Exception e) {
                     Log.e(TAG, "Decode " + vectorName + " fail");
+                    fail("Received exception " + e);
                 }
 
                 String streamName = "decoder_conformance_test";
diff --git a/tests/tests/media/src/android/media/cts/DecoderTest.java b/tests/tests/media/src/android/media/cts/DecoderTest.java
index 8c90275..3c35b88 100644
--- a/tests/tests/media/src/android/media/cts/DecoderTest.java
+++ b/tests/tests/media/src/android/media/cts/DecoderTest.java
@@ -16,12 +16,9 @@
 
 package android.media.cts;
 
-import android.media.cts.R;
-
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.content.res.AssetFileDescriptor;
-import android.content.res.Resources;
 import android.graphics.ImageFormat;
 import android.hardware.display.DisplayManager;
 import android.media.cts.CodecUtils;
@@ -35,6 +32,7 @@
 import android.media.MediaCodecInfo.CodecCapabilities;
 import android.media.MediaExtractor;
 import android.media.MediaFormat;
+import android.os.ParcelFileDescriptor;
 import android.os.Build;
 import android.platform.test.annotations.AppModeFull;
 import android.util.Log;
@@ -55,6 +53,8 @@
 import androidx.test.filters.SdkSuppress;
 
 import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
@@ -86,8 +86,8 @@
     private static final int CONFIG_MODE_NONE = 0;
     private static final int CONFIG_MODE_QUEUE = 1;
 
-    private Resources mResources;
     short[] mMasterBuffer;
+    static final String mInpPrefix = WorkDir.getMediaDirString();
 
     private MediaCodecTunneledPlayer mMediaCodecPlayer;
     private static final int SLEEP_TIME_MS = 1000;
@@ -99,13 +99,20 @@
     private DynamicConfigDeviceSide dynamicConfig;
     private DisplayManager mDisplayManager;
 
+    protected static AssetFileDescriptor getAssetFileDescriptorFor(final String res)
+            throws FileNotFoundException {
+        File inpFile = new File(mInpPrefix + res);
+        ParcelFileDescriptor parcelFD =
+                ParcelFileDescriptor.open(inpFile, ParcelFileDescriptor.MODE_READ_ONLY);
+        return new AssetFileDescriptor(parcelFD, 0, parcelFD.getStatSize());
+    }
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mResources = mContext.getResources();
 
-        // read master file into memory
-        AssetFileDescriptor masterFd = mResources.openRawResourceFd(R.raw.sinesweepraw);
+        // read primary file into memory
+        AssetFileDescriptor masterFd = getAssetFileDescriptorFor("sinesweepraw.raw");
         long masterLength = masterFd.getLength();
         mMasterBuffer = new short[(int) (masterLength / 2)];
         InputStream is = masterFd.createInputStream();
@@ -155,102 +162,102 @@
     // This should allow for some variation in decoders, while still detecting
     // phase and delay errors, channel swap, etc.
     public void testDecodeMp3Lame() throws Exception {
-        decode(R.raw.sinesweepmp3lame, 804.f);
-        testTimeStampOrdering(R.raw.sinesweepmp3lame);
+        decode("sinesweepmp3lame.mp3", 804.f);
+        testTimeStampOrdering("sinesweepmp3lame.mp3");
     }
     public void testDecodeMp3Smpb() throws Exception {
-        decode(R.raw.sinesweepmp3smpb, 413.f);
-        testTimeStampOrdering(R.raw.sinesweepmp3smpb);
+        decode("sinesweepmp3smpb.mp3", 413.f);
+        testTimeStampOrdering("sinesweepmp3smpb.mp3");
     }
     public void testDecodeM4a() throws Exception {
-        decode(R.raw.sinesweepm4a, 124.f);
-        testTimeStampOrdering(R.raw.sinesweepm4a);
+        decode("sinesweepm4a.m4a", 124.f);
+        testTimeStampOrdering("sinesweepm4a.m4a");
     }
     public void testDecodeOgg() throws Exception {
-        decode(R.raw.sinesweepogg, 168.f);
-        testTimeStampOrdering(R.raw.sinesweepogg);
+        decode("sinesweepogg.ogg", 168.f);
+        testTimeStampOrdering("sinesweepogg.ogg");
     }
     public void testDecodeOggMkv() throws Exception {
-        decode(R.raw.sinesweepoggmkv, 168.f);
-        testTimeStampOrdering(R.raw.sinesweepoggmkv);
+        decode("sinesweepoggmkv.mkv", 168.f);
+        testTimeStampOrdering("sinesweepoggmkv.mkv");
     }
     public void testDecodeOggMp4() throws Exception {
-        decode(R.raw.sinesweepoggmp4, 168.f);
-        testTimeStampOrdering(R.raw.sinesweepoggmp4);
+        decode("sinesweepoggmp4.mp4", 168.f);
+        testTimeStampOrdering("sinesweepoggmp4.mp4");
     }
     public void testDecodeWav() throws Exception {
-        decode(R.raw.sinesweepwav, 0.0f);
-        testTimeStampOrdering(R.raw.sinesweepwav);
+        decode("sinesweepwav.wav", 0.0f);
+        testTimeStampOrdering("sinesweepwav.wav");
     }
     public void testDecodeWav24() throws Exception {
-        decode(R.raw.sinesweepwav24, 0.0f);
-        testTimeStampOrdering(R.raw.sinesweepwav24);
+        decode("sinesweepwav24.wav", 0.0f);
+        testTimeStampOrdering("sinesweepwav24.wav");
     }
     public void testDecodeFlacMkv() throws Exception {
-        decode(R.raw.sinesweepflacmkv, 0.0f);
-        testTimeStampOrdering(R.raw.sinesweepflacmkv);
+        decode("sinesweepflacmkv.mkv", 0.0f);
+        testTimeStampOrdering("sinesweepflacmkv.mkv");
     }
     public void testDecodeFlac() throws Exception {
-        decode(R.raw.sinesweepflac, 0.0f);
-        testTimeStampOrdering(R.raw.sinesweepflac);
+        decode("sinesweepflac.flac", 0.0f);
+        testTimeStampOrdering("sinesweepflac.flac");
     }
     public void testDecodeFlac24() throws Exception {
-        decode(R.raw.sinesweepflac24, 0.0f);
-        testTimeStampOrdering(R.raw.sinesweepflac24);
+        decode("sinesweepflac24.flac", 0.0f);
+        testTimeStampOrdering("sinesweepflac24.flac");
     }
     public void testDecodeFlacMp4() throws Exception {
-        decode(R.raw.sinesweepflacmp4, 0.0f);
-        testTimeStampOrdering(R.raw.sinesweepflacmp4);
+        decode("sinesweepflacmp4.mp4", 0.0f);
+        testTimeStampOrdering("sinesweepflacmp4.mp4");
     }
 
     public void testDecodeMonoMp3() throws Exception {
-        monoTest(R.raw.monotestmp3, 44100);
-        testTimeStampOrdering(R.raw.monotestmp3);
+        monoTest("monotestmp3.mp3", 44100);
+        testTimeStampOrdering("monotestmp3.mp3");
     }
 
     public void testDecodeMonoM4a() throws Exception {
-        monoTest(R.raw.monotestm4a, 44100);
-        testTimeStampOrdering(R.raw.monotestm4a);
+        monoTest("monotestm4a.m4a", 44100);
+        testTimeStampOrdering("monotestm4a.m4a");
     }
 
     public void testDecodeMonoOgg() throws Exception {
-        monoTest(R.raw.monotestogg, 44100);
-        testTimeStampOrdering(R.raw.monotestogg);
+        monoTest("monotestogg.ogg", 44100);
+        testTimeStampOrdering("monotestogg.ogg");
     }
     public void testDecodeMonoOggMkv() throws Exception {
-        monoTest(R.raw.monotestoggmkv, 44100);
-        testTimeStampOrdering(R.raw.monotestoggmkv);
+        monoTest("monotestoggmkv.mkv", 44100);
+        testTimeStampOrdering("monotestoggmkv.mkv");
     }
     public void testDecodeMonoOggMp4() throws Exception {
-        monoTest(R.raw.monotestoggmp4, 44100);
-        testTimeStampOrdering(R.raw.monotestoggmp4);
+        monoTest("monotestoggmp4.mp4", 44100);
+        testTimeStampOrdering("monotestoggmp4.mp4");
     }
 
     public void testDecodeMonoGsm() throws Exception {
-        if (MediaUtils.hasCodecsForResource(mContext, R.raw.monotestgsm)) {
-            monoTest(R.raw.monotestgsm, 8000);
-            testTimeStampOrdering(R.raw.monotestgsm);
+        if (MediaUtils.hasCodecsForResource(mInpPrefix + "monotestgsm.wav")) {
+            monoTest("monotestgsm.wav", 8000);
+            testTimeStampOrdering("monotestgsm.wav");
         } else {
             MediaUtils.skipTest("not mandatory");
         }
     }
 
     public void testDecodeAacTs() throws Exception {
-        testTimeStampOrdering(R.raw.sinesweeptsaac);
+        testTimeStampOrdering("sinesweeptsaac.m4a");
     }
 
     public void testDecodeVorbis() throws Exception {
-        testTimeStampOrdering(R.raw.sinesweepvorbis);
+        testTimeStampOrdering("sinesweepvorbis.mkv");
     }
     public void testDecodeVorbisMp4() throws Exception {
-        testTimeStampOrdering(R.raw.sinesweepvorbismp4);
+        testTimeStampOrdering("sinesweepvorbismp4.mp4");
     }
 
     public void testDecodeOpus() throws Exception {
-        testTimeStampOrdering(R.raw.sinesweepopus);
+        testTimeStampOrdering("sinesweepopus.mkv");
     }
     public void testDecodeOpusMp4() throws Exception {
-        testTimeStampOrdering(R.raw.sinesweepopusmp4);
+        testTimeStampOrdering("sinesweepopusmp4.mp4");
     }
 
     @CddTest(requirement="5.1.3")
@@ -356,13 +363,13 @@
     }
 
     public void testDecode51M4a() throws Exception {
-        for (String codecName : codecsFor(R.raw.sinesweep51m4a)) {
-            decodeToMemory(codecName, R.raw.sinesweep51m4a, RESET_MODE_NONE, CONFIG_MODE_NONE, -1,
-                   null);
+        for (String codecName : codecsFor("sinesweep51m4a.m4a")) {
+            decodeToMemory(codecName, "sinesweep51m4a.m4a", RESET_MODE_NONE, CONFIG_MODE_NONE, -1,
+                    null);
         }
     }
 
-    private void testTimeStampOrdering(int res) throws Exception {
+    private void testTimeStampOrdering(final String res) throws Exception {
         for (String codecName : codecsFor(res)) {
             List<Long> timestamps = new ArrayList<Long>();
             decodeToMemory(codecName, res, RESET_MODE_NONE, CONFIG_MODE_NONE, -1, timestamps);
@@ -377,44 +384,42 @@
     }
 
     public void testTrackSelection() throws Exception {
-        testTrackSelection(R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz);
+        testTrackSelection("video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz.mp4");
         testTrackSelection(
-                R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz_fragmented);
+                "video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz_fragmented.mp4");
         testTrackSelection(
-                R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz_dash);
+                "video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz_dash.mp4");
     }
 
     public void testTrackSelectionMkv() throws Exception {
         Log.d(TAG, "testTrackSelectionMkv!!!!!! ");
-        testTrackSelection(R.raw.mkv_avc_adpcm_ima);
+        testTrackSelection("mkv_avc_adpcm_ima.mkv");
         Log.d(TAG, "mkv_avc_adpcm_ima finished!!!!!! ");
-        testTrackSelection(R.raw.mkv_avc_adpcm_ms);
+        testTrackSelection("mkv_avc_adpcm_ms.mkv");
         Log.d(TAG, "mkv_avc_adpcm_ms finished!!!!!! ");
-        testTrackSelection(R.raw.mkv_avc_wma);
+        testTrackSelection("mkv_avc_wma.mkv");
         Log.d(TAG, "mkv_avc_wma finished!!!!!! ");
-        testTrackSelection(R.raw.mkv_avc_mp2);
+        testTrackSelection("mkv_avc_mp2.mkv");
         Log.d(TAG, "mkv_avc_mp2 finished!!!!!! ");
     }
 
     public void testBFrames() throws Exception {
         int testsRun =
-            testBFrames(R.raw.video_h264_main_b_frames) +
-            testBFrames(R.raw.video_h264_main_b_frames_frag);
+            testBFrames("video_h264_main_b_frames.mp4") +
+            testBFrames("video_h264_main_b_frames_frag.mp4");
         if (testsRun == 0) {
             MediaUtils.skipTest("no codec found");
         }
     }
 
-    public int testBFrames(int res) throws Exception {
-        AssetFileDescriptor fd = mResources.openRawResourceFd(res);
+    public int testBFrames(final String res) throws Exception {
         MediaExtractor ex = new MediaExtractor();
-        ex.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
+        ex.setDataSource(mInpPrefix + res);
         MediaFormat format = ex.getTrackFormat(0);
         String mime = format.getString(MediaFormat.KEY_MIME);
         assertTrue("not a video track. Wrong test file?", mime.startsWith("video/"));
         if (!MediaUtils.canDecode(format)) {
             ex.release();
-            fd.close();
             return 0; // skip
         }
         MediaCodec dec = MediaCodec.createDecoderByType(mime);
@@ -459,7 +464,6 @@
         assertTrue("extractor timestamps were ordered, wrong test file?", inputoutoforder);
         dec.release();
         ex.release();
-        fd.close();
         return 1;
       }
 
@@ -481,19 +485,19 @@
      */
     public void testH264ColorAspects() throws Exception {
         testColorAspects(
-                R.raw.color_176x144_bt709_lr_sdr_h264, 1 /* testId */,
+                "color_176x144_bt709_lr_sdr_h264.mp4", 1 /* testId */,
                 MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT709,
                 MediaFormat.COLOR_TRANSFER_SDR_VIDEO);
         testColorAspects(
-                R.raw.color_176x144_bt601_625_fr_sdr_h264, 2 /* testId */,
+                "color_176x144_bt601_625_fr_sdr_h264.mp4", 2 /* testId */,
                 MediaFormat.COLOR_RANGE_FULL, MediaFormat.COLOR_STANDARD_BT601_PAL,
                 MediaFormat.COLOR_TRANSFER_SDR_VIDEO);
         testColorAspects(
-                R.raw.color_176x144_bt601_525_lr_sdr_h264, 3 /* testId */,
+                "color_176x144_bt601_525_lr_sdr_h264.mp4", 3 /* testId */,
                 MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT601_NTSC,
                 MediaFormat.COLOR_TRANSFER_SDR_VIDEO);
         testColorAspects(
-                R.raw.color_176x144_srgb_lr_sdr_h264, 4 /* testId */,
+                "color_176x144_srgb_lr_sdr_h264.mp4", 4 /* testId */,
                 MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT709,
                 2 /* MediaFormat.COLOR_TRANSFER_SRGB */);
     }
@@ -516,30 +520,30 @@
      */
     public void testH265ColorAspects() throws Exception {
         testColorAspects(
-                R.raw.color_176x144_bt709_lr_sdr_h265, 1 /* testId */,
+                "color_176x144_bt709_lr_sdr_h265.mp4", 1 /* testId */,
                 MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT709,
                 MediaFormat.COLOR_TRANSFER_SDR_VIDEO);
         testColorAspects(
-                R.raw.color_176x144_bt601_625_fr_sdr_h265, 2 /* testId */,
+                "color_176x144_bt601_625_fr_sdr_h265.mp4", 2 /* testId */,
                 MediaFormat.COLOR_RANGE_FULL, MediaFormat.COLOR_STANDARD_BT601_PAL,
                 MediaFormat.COLOR_TRANSFER_SDR_VIDEO);
         testColorAspects(
-                R.raw.color_176x144_bt601_525_lr_sdr_h265, 3 /* testId */,
+                "color_176x144_bt601_525_lr_sdr_h265.mp4", 3 /* testId */,
                 MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT601_NTSC,
                 MediaFormat.COLOR_TRANSFER_SDR_VIDEO);
         testColorAspects(
-                R.raw.color_176x144_srgb_lr_sdr_h265, 4 /* testId */,
+                "color_176x144_srgb_lr_sdr_h265.mp4", 4 /* testId */,
                 MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT709,
                 2 /* MediaFormat.COLOR_TRANSFER_SRGB */);
         // Test the main10 streams with surface as the decoder might
         // support opaque buffers only.
         testColorAspects(
-                R.raw.color_176x144_bt2020_lr_smpte2084_h265, 5 /* testId */,
+                "color_176x144_bt2020_lr_smpte2084_h265.mp4", 5 /* testId */,
                 MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT2020,
                 MediaFormat.COLOR_TRANSFER_ST2084,
                 getActivity().getSurfaceHolder().getSurface());
         testColorAspects(
-                R.raw.color_176x144_bt2020_lr_hlg_h265, 6 /* testId */,
+                "color_176x144_bt2020_lr_hlg_h265.mp4", 6 /* testId */,
                 MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT2020,
                 MediaFormat.COLOR_TRANSFER_HLG,
                 getActivity().getSurfaceHolder().getSurface());
@@ -563,40 +567,40 @@
      */
     public void testMPEG2ColorAspectsTV() throws Exception {
         testColorAspects(
-                R.raw.color_176x144_bt709_lr_sdr_mpeg2, 1 /* testId */,
+                "color_176x144_bt709_lr_sdr_mpeg2.mp4", 1 /* testId */,
                 MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT709,
                 MediaFormat.COLOR_TRANSFER_SDR_VIDEO);
         testColorAspects(
-                R.raw.color_176x144_bt601_625_lr_sdr_mpeg2, 2 /* testId */,
+                "color_176x144_bt601_625_lr_sdr_mpeg2.mp4", 2 /* testId */,
                 MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT601_PAL,
                 MediaFormat.COLOR_TRANSFER_SDR_VIDEO);
         testColorAspects(
-                R.raw.color_176x144_bt601_525_lr_sdr_mpeg2, 3 /* testId */,
+                "color_176x144_bt601_525_lr_sdr_mpeg2.mp4", 3 /* testId */,
                 MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT601_NTSC,
                 MediaFormat.COLOR_TRANSFER_SDR_VIDEO);
         testColorAspects(
-                R.raw.color_176x144_srgb_lr_sdr_mpeg2, 4 /* testId */,
+                "color_176x144_srgb_lr_sdr_mpeg2.mp4", 4 /* testId */,
                 MediaFormat.COLOR_RANGE_LIMITED, MediaFormat.COLOR_STANDARD_BT709,
                 2 /* MediaFormat.COLOR_TRANSFER_SRGB */);
     }
 
     private void testColorAspects(
-            int res, int testId, int expectRange, int expectStandard, int expectTransfer)
+            final String res, int testId, int expectRange, int expectStandard, int expectTransfer)
             throws Exception {
         testColorAspects(
                 res, testId, expectRange, expectStandard, expectTransfer, null /*surface*/);
     }
 
     private void testColorAspects(
-            int res, int testId, int expectRange, int expectStandard, int expectTransfer,
+            final String res, int testId, int expectRange, int expectStandard, int expectTransfer,
             Surface surface) throws Exception {
-        MediaFormat format = MediaUtils.getTrackFormatForResource(mContext, res, "video");
+        MediaFormat format = MediaUtils.getTrackFormatForResource(mInpPrefix + res, "video");
         MediaFormat mimeFormat = new MediaFormat();
         mimeFormat.setString(MediaFormat.KEY_MIME, format.getString(MediaFormat.KEY_MIME));
 
         for (String decoderName: MediaUtils.getDecoderNames(mimeFormat)) {
             if (!MediaUtils.supports(decoderName, format)) {
-                MediaUtils.skipTest(decoderName + " cannot play resource " + res);
+                MediaUtils.skipTest(decoderName + " cannot play resource " + mInpPrefix + res);
             } else {
                 testColorAspects(decoderName, res, testId,
                         expectRange, expectStandard, expectTransfer, surface);
@@ -605,11 +609,10 @@
     }
 
     private void testColorAspects(
-            String decoderName, int res, int testId, int expectRange,
+            String decoderName, final String res, int testId, int expectRange,
             int expectStandard, int expectTransfer, Surface surface) throws Exception {
-        AssetFileDescriptor fd = mResources.openRawResourceFd(res);
         MediaExtractor ex = new MediaExtractor();
-        ex.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
+        ex.setDataSource(mInpPrefix + res);
         MediaFormat format = ex.getTrackFormat(0);
         MediaCodec dec = MediaCodec.createByCodecName(decoderName);
         dec.configure(format, surface, null, 0);
@@ -696,15 +699,12 @@
 
         dec.release();
         ex.release();
-        fd.close();
     }
 
-    private void testTrackSelection(int resid) throws Exception {
-        AssetFileDescriptor fd1 = null;
+    private void testTrackSelection(final String res) throws Exception {
         MediaExtractor ex1 = new MediaExtractor();
         try {
-            fd1 = mResources.openRawResourceFd(resid);
-            ex1.setDataSource(fd1.getFileDescriptor(), fd1.getStartOffset(), fd1.getLength());
+            ex1.setDataSource(mInpPrefix + res);
 
             ByteBuffer buf1 = ByteBuffer.allocate(1024*1024);
             ArrayList<Integer> vid = new ArrayList<Integer>();
@@ -733,7 +733,7 @@
             // verify we get the right samples
             ex1.release();
             ex1 = new MediaExtractor();
-            ex1.setDataSource(fd1.getFileDescriptor(), fd1.getStartOffset(), fd1.getLength());
+            ex1.setDataSource(mInpPrefix + res);
             ex1.selectTrack(0);
             for (int i = 0; i < 2; i++) {
                 ex1.seekTo(0, MediaExtractor.SEEK_TO_NEXT_SYNC);
@@ -753,7 +753,7 @@
             // verify we get the right samples
             ex1.release();
             ex1 = new MediaExtractor();
-            ex1.setDataSource(fd1.getFileDescriptor(), fd1.getStartOffset(), fd1.getLength());
+            ex1.setDataSource(mInpPrefix + res);
             ex1.selectTrack(1);
             for (int i = 0; i < 2; i++) {
                 ex1.seekTo(0, MediaExtractor.SEEK_TO_NEXT_SYNC);
@@ -773,7 +773,7 @@
             // verify we get the right samples
             ex1.release();
             ex1 = new MediaExtractor();
-            ex1.setDataSource(fd1.getFileDescriptor(), fd1.getStartOffset(), fd1.getLength());
+            ex1.setDataSource(mInpPrefix + res);
             for (int i = 0; i < 2; i++) {
                 ex1.selectTrack(i);
                 ex1.seekTo(0, MediaExtractor.SEEK_TO_NEXT_SYNC);
@@ -804,7 +804,7 @@
             // to the video track, and verify we get the right samples
             ex1.release();
             ex1 = new MediaExtractor();
-            ex1.setDataSource(fd1.getFileDescriptor(), fd1.getStartOffset(), fd1.getLength());
+            ex1.setDataSource(mInpPrefix + res);
             for (int i = 0; i < 2; i++) {
                 ex1.selectTrack(i);
                 ex1.seekTo(0, MediaExtractor.SEEK_TO_NEXT_SYNC);
@@ -836,7 +836,7 @@
             // samples both times
             ex1.release();
             ex1 = new MediaExtractor();
-            ex1.setDataSource(fd1.getFileDescriptor(), fd1.getStartOffset(), fd1.getLength());
+            ex1.setDataSource(mInpPrefix + res);
             for (int i = 0; i < 2; i++) {
                 ex1.selectTrack(0);
                 ex1.selectTrack(1);
@@ -867,9 +867,6 @@
             if (ex1 != null) {
                 ex1.release();
             }
-            if (fd1 != null) {
-                fd1.close();
-            }
         }
     }
 
@@ -877,16 +874,16 @@
         final String staticInfo =
                 "00 d0 84 80 3e c2 33 c4  86 4c 1d b8 0b 13 3d 42" +
                 "40 e8 03 64 00 e8 03 2c  01                     " ;
-        testHdrStaticMetadata(R.raw.video_1280x720_vp9_hdr_static_3mbps,
-                staticInfo, true /*metadataInContainer*/);
+        testHdrStaticMetadata("video_1280x720_vp9_hdr_static_3mbps.mkv", staticInfo,
+                true /*metadataInContainer*/);
     }
 
     public void testAV1HdrStaticMetadata() throws Exception {
         final String staticInfo =
                 "00 d0 84 80 3e c2 33 c4  86 4c 1d b8 0b 13 3d 42" +
                 "40 e8 03 64 00 e8 03 2c  01                     " ;
-        testHdrStaticMetadata(R.raw.video_1280x720_av1_hdr_static_3mbps,
-                staticInfo, false /*metadataInContainer*/);
+        testHdrStaticMetadata("video_1280x720_av1_hdr_static_3mbps.webm", staticInfo,
+                false /*metadataInContainer*/);
     }
 
     public void testH265HDR10StaticMetadata() throws Exception {
@@ -899,8 +896,8 @@
         final String staticInfo =
                 "00 d0 84 80 3e c2 33 c4  86 4c 1d b8 0b 13 3d 42" +
                 "40 e8 03 00 00 e8 03 90  01                     " ;
-        testHdrStaticMetadata(R.raw.video_1280x720_hevc_hdr10_static_3mbps,
-                staticInfo, false /*metadataInContainer*/);
+        testHdrStaticMetadata("video_1280x720_hevc_hdr10_static_3mbps.mp4", staticInfo,
+                false /*metadataInContainer*/);
     }
 
     public void testVp9Hdr10PlusMetadata() throws Exception {
@@ -933,7 +930,7 @@
                 "90 02 aa 58 05 ca d0 0c  0a f8 16 83 18 9c 18 00" +
                 "40 78 13 64 d5 7c 2e 2c  c3 59 de 79 6e c3 c2 00" ,
         };
-        testHdrMetadata(R.raw.video_bikes_hdr10plus,
+        testHdrMetadata("video_bikes_hdr10plus.webm",
                 staticInfo, dynamicInfo, true /*metadataInContainer*/);
     }
 
@@ -963,16 +960,16 @@
                 "90 03 9a 58 0b 6a d0 23  2a f8 40 8b 18 9c 18 00" +
                 "40 78 13 64 cf 78 ed cc  bf 5a de f9 8e c7 c3 00"
         };
-        testHdrMetadata(R.raw.video_h265_hdr10plus,
+        testHdrMetadata("video_h265_hdr10plus.mp4",
                 staticInfo, dynamicInfo, false /*metadataInContainer*/);
     }
 
-    private void testHdrStaticMetadata(int res, String staticInfo, boolean metadataInContainer)
-        throws Exception {
+    private void testHdrStaticMetadata(final String res, String staticInfo,
+            boolean metadataInContainer) throws Exception {
         testHdrMetadata(res, staticInfo, null /*dynamicInfo*/, metadataInContainer);
     }
 
-    private void testHdrMetadata(int res,
+    private void testHdrMetadata(final String res,
             String staticInfo, String[] dynamicInfo, boolean metadataInContainer)
             throws Exception {
         AssetFileDescriptor infd = null;
@@ -980,10 +977,8 @@
         final boolean dynamic = dynamicInfo != null;
 
         try {
-            infd = mResources.openRawResourceFd(res);
             extractor = new MediaExtractor();
-            extractor.setDataSource(infd.getFileDescriptor(),
-                    infd.getStartOffset(), infd.getLength());
+            extractor.setDataSource(mInpPrefix + res);
 
             MediaFormat format = null;
             int trackIndex = -1;
@@ -1154,9 +1149,6 @@
             if (extractor != null) {
                 extractor.release();
             }
-            if (infd != null) {
-                infd.close();
-            }
         }
     }
 
@@ -1192,23 +1184,19 @@
     }
 
     public void testDecodeFragmented() throws Exception {
-        testDecodeFragmented(R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz,
-                R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz_fragmented);
-        testDecodeFragmented(R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz,
-                R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz_dash);
+        testDecodeFragmented("video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz.mp4",
+                "video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz_fragmented.mp4");
+        testDecodeFragmented("video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz.mp4",
+                "video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz_dash.mp4");
     }
 
-    private void testDecodeFragmented(int reference, int teststream) throws Exception {
-        AssetFileDescriptor fd1 = null;
-        AssetFileDescriptor fd2 = null;
+    private void testDecodeFragmented(final String reference, final String teststream)
+            throws Exception {
         try {
-            fd1 = mResources.openRawResourceFd(reference);
             MediaExtractor ex1 = new MediaExtractor();
-            ex1.setDataSource(fd1.getFileDescriptor(), fd1.getStartOffset(), fd1.getLength());
-
-            fd2 = mResources.openRawResourceFd(teststream);
+            ex1.setDataSource(mInpPrefix + reference);
             MediaExtractor ex2 = new MediaExtractor();
-            ex2.setDataSource(fd2.getFileDescriptor(), fd2.getStartOffset(), fd2.getLength());
+            ex2.setDataSource(mInpPrefix + teststream);
 
             assertEquals("different track count", ex1.getTrackCount(), ex2.getTrackCount());
 
@@ -1250,13 +1238,8 @@
                 ex1.unselectTrack(i);
                 ex2.unselectTrack(i);
             }
-        } finally {
-            if (fd1 != null) {
-                fd1.close();
-            }
-            if (fd2 != null) {
-                fd2.close();
-            }
+        } catch (IOException e) {
+            e.printStackTrace();
         }
     }
 
@@ -1265,40 +1248,40 @@
      */
     public void testDecodeAacLcM4a() throws Exception {
         // mono
-        decodeNtest(R.raw.sinesweep1_1ch_8khz_aot2_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep1_1ch_11khz_aot2_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep1_1ch_12khz_aot2_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep1_1ch_16khz_aot2_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep1_1ch_22khz_aot2_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep1_1ch_24khz_aot2_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep1_1ch_32khz_aot2_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep1_1ch_44khz_aot2_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep1_1ch_48khz_aot2_mp4, 40.f);
+        decodeNtest("sinesweep1_1ch_8khz_aot2_mp4.m4a", 40.f);
+        decodeNtest("sinesweep1_1ch_11khz_aot2_mp4.m4a", 40.f);
+        decodeNtest("sinesweep1_1ch_12khz_aot2_mp4.m4a", 40.f);
+        decodeNtest("sinesweep1_1ch_16khz_aot2_mp4.m4a", 40.f);
+        decodeNtest("sinesweep1_1ch_22khz_aot2_mp4.m4a", 40.f);
+        decodeNtest("sinesweep1_1ch_24khz_aot2_mp4.m4a", 40.f);
+        decodeNtest("sinesweep1_1ch_32khz_aot2_mp4.m4a", 40.f);
+        decodeNtest("sinesweep1_1ch_44khz_aot2_mp4.m4a", 40.f);
+        decodeNtest("sinesweep1_1ch_48khz_aot2_mp4.m4a", 40.f);
         // stereo
-        decodeNtest(R.raw.sinesweep_2ch_8khz_aot2_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep_2ch_11khz_aot2_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep_2ch_12khz_aot2_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep_2ch_16khz_aot2_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep_2ch_22khz_aot2_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep_2ch_24khz_aot2_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep_2ch_32khz_aot2_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep_2ch_44khz_aot2_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep_2ch_48khz_aot2_mp4, 40.f);
+        decodeNtest("sinesweep_2ch_8khz_aot2_mp4.m4a", 40.f);
+        decodeNtest("sinesweep_2ch_11khz_aot2_mp4.m4a", 40.f);
+        decodeNtest("sinesweep_2ch_12khz_aot2_mp4.m4a", 40.f);
+        decodeNtest("sinesweep_2ch_16khz_aot2_mp4.m4a", 40.f);
+        decodeNtest("sinesweep_2ch_22khz_aot2_mp4.m4a", 40.f);
+        decodeNtest("sinesweep_2ch_24khz_aot2_mp4.m4a", 40.f);
+        decodeNtest("sinesweep_2ch_32khz_aot2_mp4.m4a", 40.f);
+        decodeNtest("sinesweep_2ch_44khz_aot2_mp4.m4a", 40.f);
+        decodeNtest("sinesweep_2ch_48khz_aot2_mp4.m4a", 40.f);
     }
 
     /**
      * Verify correct decoding of MPEG-4 AAC-LC 5.0 and 5.1 channel streams
      */
     public void testDecodeAacLcMcM4a() throws Exception {
-        for (String codecName : codecsFor(R.raw.noise_6ch_48khz_aot2_mp4)) {
+        for (String codecName : codecsFor("noise_6ch_48khz_aot2_mp4.m4a")) {
             AudioParameter decParams = new AudioParameter();
             short[] decSamples = decodeToMemory(codecName, decParams,
-                    R.raw.noise_6ch_48khz_aot2_mp4,
-                    RESET_MODE_NONE, CONFIG_MODE_NONE, -1, null);
+                    "noise_6ch_48khz_aot2_mp4.m4a", RESET_MODE_NONE,
+                    CONFIG_MODE_NONE, -1, null);
             checkEnergy(decSamples, decParams, 6);
             decParams.reset();
 
-            decSamples = decodeToMemory(codecName, decParams, R.raw.noise_5ch_44khz_aot2_mp4,
+            decSamples = decodeToMemory(codecName, decParams, "noise_5ch_44khz_aot2_mp4.m4a",
                     RESET_MODE_NONE, CONFIG_MODE_NONE, -1, null);
             checkEnergy(decSamples, decParams, 5);
             decParams.reset();
@@ -1309,25 +1292,26 @@
      * Verify correct decoding of MPEG-4 HE-AAC mono and stereo streams
      */
     public void testDecodeHeAacM4a() throws Exception {
-        int[][] samples = {
-                //  {resourceId, numChannels},
-                {R.raw.noise_1ch_24khz_aot5_dr_sbr_sig1_mp4, 1},
-                {R.raw.noise_1ch_24khz_aot5_ds_sbr_sig1_mp4, 1},
-                {R.raw.noise_1ch_32khz_aot5_dr_sbr_sig2_mp4, 1},
-                {R.raw.noise_1ch_44khz_aot5_dr_sbr_sig0_mp4, 1},
-                {R.raw.noise_1ch_44khz_aot5_ds_sbr_sig2_mp4, 1},
-                {R.raw.noise_2ch_24khz_aot5_dr_sbr_sig2_mp4, 2},
-                {R.raw.noise_2ch_32khz_aot5_ds_sbr_sig2_mp4, 2},
-                {R.raw.noise_2ch_48khz_aot5_dr_sbr_sig1_mp4, 2},
-                {R.raw.noise_2ch_48khz_aot5_ds_sbr_sig1_mp4, 2},
+        Object [][] samples = {
+                //  {resource, numChannels},
+                {"noise_1ch_24khz_aot5_dr_sbr_sig1_mp4.m4a", 1},
+                {"noise_1ch_24khz_aot5_ds_sbr_sig1_mp4.m4a", 1},
+                {"noise_1ch_32khz_aot5_dr_sbr_sig2_mp4.m4a", 1},
+                {"noise_1ch_44khz_aot5_dr_sbr_sig0_mp4.m4a", 1},
+                {"noise_1ch_44khz_aot5_ds_sbr_sig2_mp4.m4a", 1},
+                {"noise_2ch_24khz_aot5_dr_sbr_sig2_mp4.m4a", 2},
+                {"noise_2ch_32khz_aot5_ds_sbr_sig2_mp4.m4a", 2},
+                {"noise_2ch_48khz_aot5_dr_sbr_sig1_mp4.m4a", 2},
+                {"noise_2ch_48khz_aot5_ds_sbr_sig1_mp4.m4a", 2},
         };
 
-        for (int[] sample: samples) {
-            for (String codecName : codecsFor(sample[0])) {
+        for (Object [] sample: samples) {
+            for (String codecName : codecsFor((String)sample[0])) {
                 AudioParameter decParams = new AudioParameter();
-                short[] decSamples = decodeToMemory(codecName, decParams, sample[0] /* resource */,
-                        RESET_MODE_NONE, CONFIG_MODE_NONE, -1, null);
-                checkEnergy(decSamples, decParams, sample[1] /* number of channels */);
+                short[] decSamples = decodeToMemory(codecName, decParams,
+                        (String)sample[0] /* resource */, RESET_MODE_NONE, CONFIG_MODE_NONE,
+                        -1, null);
+                checkEnergy(decSamples, decParams, (Integer)sample[1] /* number of channels */);
                 decParams.reset();
             }
         }
@@ -1337,17 +1321,18 @@
      * Verify correct decoding of MPEG-4 HE-AAC 5.0 and 5.1 channel streams
      */
     public void testDecodeHeAacMcM4a() throws Exception {
-        int [][] samples = {
-        //  {resourceId, numChannels},
-            {R.raw.noise_5ch_48khz_aot5_dr_sbr_sig1_mp4, 5},
-            {R.raw.noise_6ch_44khz_aot5_dr_sbr_sig2_mp4, 6},
+        Object [][] samples = {
+                //  {resource, numChannels},
+                {"noise_5ch_48khz_aot5_dr_sbr_sig1_mp4.m4a", 5},
+                {"noise_6ch_44khz_aot5_dr_sbr_sig2_mp4.m4a", 6},
         };
-        for (int [] sample: samples) {
-            for (String codecName : codecsFor(sample[0] /* resource */)) {
+        for (Object [] sample: samples) {
+            for (String codecName : codecsFor((String)sample[0] /* resource */)) {
                 AudioParameter decParams = new AudioParameter();
-                short[] decSamples = decodeToMemory(codecName, decParams, sample[0] /* resource */,
-                        RESET_MODE_NONE, CONFIG_MODE_NONE, -1, null);
-                checkEnergy(decSamples, decParams, sample[1] /* number of channels */);
+                short[] decSamples = decodeToMemory(codecName, decParams,
+                        (String)sample[0] /* resource */, RESET_MODE_NONE, CONFIG_MODE_NONE,
+                        -1, null);
+                checkEnergy(decSamples, decParams, (Integer)sample[1] /* number of channels */);
                 decParams.reset();
             }
         }
@@ -1357,12 +1342,12 @@
      * Verify correct decoding of MPEG-4 HE-AAC v2 stereo streams
      */
     public void testDecodeHeAacV2M4a() throws Exception {
-        int [] samples = {
-                R.raw.noise_2ch_24khz_aot29_dr_sbr_sig0_mp4,
-                R.raw.noise_2ch_44khz_aot29_dr_sbr_sig1_mp4,
-                R.raw.noise_2ch_48khz_aot29_dr_sbr_sig2_mp4
+        String [] samples = {
+                "noise_2ch_24khz_aot29_dr_sbr_sig0_mp4.m4a",
+                "noise_2ch_44khz_aot29_dr_sbr_sig1_mp4.m4a",
+                "noise_2ch_48khz_aot29_dr_sbr_sig2_mp4.m4a"
         };
-        for (int sample: samples) {
+        for (String sample: samples) {
             for (String codecName : codecsFor(sample)) {
                 AudioParameter decParams = new AudioParameter();
                 short[] decSamples = decodeToMemory(codecName, decParams, sample,
@@ -1377,41 +1362,42 @@
      */
     public void testDecodeAacEldM4a() throws Exception {
         // mono
-        decodeNtest(R.raw.sinesweep1_1ch_16khz_aot39_fl480_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep1_1ch_22khz_aot39_fl512_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep1_1ch_24khz_aot39_fl480_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep1_1ch_32khz_aot39_fl512_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep1_1ch_44khz_aot39_fl480_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep1_1ch_48khz_aot39_fl512_mp4, 40.f);
+        decodeNtest("sinesweep1_1ch_16khz_aot39_fl480_mp4.m4a", 40.f);
+        decodeNtest("sinesweep1_1ch_22khz_aot39_fl512_mp4.m4a", 40.f);
+        decodeNtest("sinesweep1_1ch_24khz_aot39_fl480_mp4.m4a", 40.f);
+        decodeNtest("sinesweep1_1ch_32khz_aot39_fl512_mp4.m4a", 40.f);
+        decodeNtest("sinesweep1_1ch_44khz_aot39_fl480_mp4.m4a", 40.f);
+        decodeNtest("sinesweep1_1ch_48khz_aot39_fl512_mp4.m4a", 40.f);
 
         // stereo
-        decodeNtest(R.raw.sinesweep_2ch_16khz_aot39_fl512_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep_2ch_22khz_aot39_fl480_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep_2ch_24khz_aot39_fl512_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep_2ch_32khz_aot39_fl480_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep_2ch_44khz_aot39_fl512_mp4, 40.f);
-        decodeNtest(R.raw.sinesweep_2ch_48khz_aot39_fl480_mp4, 40.f);
+        decodeNtest("sinesweep_2ch_16khz_aot39_fl512_mp4.m4a", 40.f);
+        decodeNtest("sinesweep_2ch_22khz_aot39_fl480_mp4.m4a", 40.f);
+        decodeNtest("sinesweep_2ch_24khz_aot39_fl512_mp4.m4a", 40.f);
+        decodeNtest("sinesweep_2ch_32khz_aot39_fl480_mp4.m4a", 40.f);
+        decodeNtest("sinesweep_2ch_44khz_aot39_fl512_mp4.m4a", 40.f);
+        decodeNtest("sinesweep_2ch_48khz_aot39_fl480_mp4.m4a", 40.f);
 
         AudioParameter decParams = new AudioParameter();
-        int [][] samples = {
-        //  {resourceId, numChannels},
-            {R.raw.noise_1ch_16khz_aot39_ds_sbr_fl512_mp4, 1},
-            {R.raw.noise_1ch_24khz_aot39_ds_sbr_fl512_mp4, 1},
-            {R.raw.noise_1ch_32khz_aot39_dr_sbr_fl480_mp4, 1},
-            {R.raw.noise_1ch_44khz_aot39_ds_sbr_fl512_mp4, 1},
-            {R.raw.noise_1ch_44khz_aot39_ds_sbr_fl512_mp4, 1},
-            {R.raw.noise_1ch_48khz_aot39_dr_sbr_fl480_mp4, 1},
-            {R.raw.noise_2ch_22khz_aot39_ds_sbr_fl512_mp4, 2},
-            {R.raw.noise_2ch_32khz_aot39_ds_sbr_fl512_mp4, 2},
-            {R.raw.noise_2ch_44khz_aot39_dr_sbr_fl480_mp4, 2},
-            {R.raw.noise_2ch_48khz_aot39_ds_sbr_fl512_mp4, 2},
+
+        Object [][] samples = {
+                //  {resource, numChannels},
+                {"noise_1ch_16khz_aot39_ds_sbr_fl512_mp4.m4a", 1},
+                {"noise_1ch_24khz_aot39_ds_sbr_fl512_mp4.m4a", 1},
+                {"noise_1ch_32khz_aot39_dr_sbr_fl480_mp4.m4a", 1},
+                {"noise_1ch_44khz_aot39_ds_sbr_fl512_mp4.m4a", 1},
+                {"noise_1ch_44khz_aot39_ds_sbr_fl512_mp4.m4a", 1},
+                {"noise_1ch_48khz_aot39_dr_sbr_fl480_mp4.m4a", 1},
+                {"noise_2ch_22khz_aot39_ds_sbr_fl512_mp4.m4a", 2},
+                {"noise_2ch_32khz_aot39_ds_sbr_fl512_mp4.m4a", 2},
+                {"noise_2ch_44khz_aot39_dr_sbr_fl480_mp4.m4a", 2},
+                {"noise_2ch_48khz_aot39_ds_sbr_fl512_mp4.m4a", 2},
         };
-        
-        for (int [] sample: samples) {
-            for (String codecName : codecsFor(sample[0])) {
-                short[] decSamples = decodeToMemory(codecName, decParams, sample[0] /* resource */,
-                        RESET_MODE_NONE, CONFIG_MODE_NONE, -1, null);
-                checkEnergy(decSamples, decParams, sample[1] /* number of channels */);
+        for (Object [] sample: samples) {
+            for (String codecName : codecsFor((String)sample[0])) {
+                short[] decSamples = decodeToMemory(codecName, decParams,
+                        (String)sample[0] /* resource */, RESET_MODE_NONE, CONFIG_MODE_NONE,
+                        -1, null);
+                checkEnergy(decSamples, decParams, (Integer)sample[1] /* number of channels */);
                 decParams.reset();
             }
         }
@@ -1648,7 +1634,7 @@
      * @param maxerror  the maximum allowed root mean squared error
      * @throws Exception
      */
-    private void decodeNtest(int testinput, float maxerror) throws Exception {
+    private void decodeNtest(final String testinput, float maxerror) throws Exception {
         String localTag = TAG + "#decodeNtest";
 
         for (String codecName: codecsFor(testinput)) {
@@ -1662,7 +1648,7 @@
         }
     }
 
-    private void monoTest(int res, int expectedLength) throws Exception {
+    private void monoTest(final String res, int expectedLength) throws Exception {
         for (String codecName: codecsFor(res)) {
             short [] mono = decodeToMemory(codecName, res,
                     RESET_MODE_NONE, CONFIG_MODE_NONE, -1, null);
@@ -1697,13 +1683,9 @@
         }
     }
 
-    private List<String> codecsFor(int resource) throws IOException {
-        return codecsFor(resource, mResources);
-    }
-
-    protected static List<String> codecsFor(int resource, Resources resources) throws IOException {
+    protected static List<String> codecsFor(String resource) throws IOException {
         MediaExtractor ex = new MediaExtractor();
-        AssetFileDescriptor fd = resources.openRawResourceFd(resource);
+        AssetFileDescriptor fd = getAssetFileDescriptorFor(resource);
         try {
             ex.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
         } finally {
@@ -1736,7 +1718,7 @@
      * @param maxerror the maximum allowed root mean squared error
      * @throws IOException
      */
-    private void decode(int testinput, float maxerror) throws IOException {
+    private void decode(final String testinput, float maxerror) throws IOException {
 
         for (String codecName: codecsFor(testinput)) {
             short[] decoded = decodeToMemory(codecName, testinput,
@@ -1775,13 +1757,11 @@
         }
     }
 
-    private boolean hasAudioCsd(int testinput) throws IOException {
+    private boolean hasAudioCsd(final String testinput) throws IOException {
         AssetFileDescriptor fd = null;
         try {
-
-            fd = mResources.openRawResourceFd(testinput);
             MediaExtractor extractor = new MediaExtractor();
-            extractor.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
+            extractor.setDataSource(mInpPrefix + testinput);
             MediaFormat format = extractor.getTrackFormat(0);
 
             return format.containsKey(CSD_KEYS[0]);
@@ -1825,34 +1805,29 @@
         private int samplingRate;
     }
 
-    private short[] decodeToMemory(String codecName, int testinput, int resetMode, int configMode,
-            int eossample, List<Long> timestamps) throws IOException {
+    private short[] decodeToMemory(String codecName, final String testinput, int resetMode,
+            int configMode, int eossample, List<Long> timestamps) throws IOException {
 
         AudioParameter audioParams = new AudioParameter();
         return decodeToMemory(codecName, audioParams, testinput,
                 resetMode, configMode, eossample, timestamps);
     }
 
-    private short[] decodeToMemory(String codecName, AudioParameter audioParams, int testinput,
-            int resetMode, int configMode, int eossample, List<Long> timestamps)
-            throws IOException
-    {
+    private short[] decodeToMemory(String codecName, AudioParameter audioParams,
+            final String testinput, int resetMode, int configMode, int eossample,
+            List<Long> timestamps) throws IOException {
         String localTag = TAG + "#decodeToMemory";
         Log.v(localTag, String.format("reset = %d; config: %s", resetMode, configMode));
         short [] decoded = new short[0];
         int decodedIdx = 0;
 
-        AssetFileDescriptor testFd = mResources.openRawResourceFd(testinput);
-
         MediaExtractor extractor;
         MediaCodec codec;
         ByteBuffer[] codecInputBuffers;
         ByteBuffer[] codecOutputBuffers;
 
         extractor = new MediaExtractor();
-        extractor.setDataSource(testFd.getFileDescriptor(), testFd.getStartOffset(),
-                testFd.getLength());
-        testFd.close();
+        extractor.setDataSource(mInpPrefix + testinput);
 
         assertEquals("wrong number of tracks", 1, extractor.getTrackCount());
         MediaFormat format = extractor.getTrackFormat(0);
@@ -2059,23 +2034,23 @@
     }
 
     public void testDecodeWithEOSOnLastBuffer() throws Exception {
-        testDecodeWithEOSOnLastBuffer(R.raw.sinesweepm4a);
-        testDecodeWithEOSOnLastBuffer(R.raw.sinesweepmp3lame);
-        testDecodeWithEOSOnLastBuffer(R.raw.sinesweepmp3smpb);
-        testDecodeWithEOSOnLastBuffer(R.raw.sinesweepopus);
-        testDecodeWithEOSOnLastBuffer(R.raw.sinesweepopusmp4);
-        testDecodeWithEOSOnLastBuffer(R.raw.sinesweepwav);
-        testDecodeWithEOSOnLastBuffer(R.raw.sinesweepflacmkv);
-        testDecodeWithEOSOnLastBuffer(R.raw.sinesweepflac);
-        testDecodeWithEOSOnLastBuffer(R.raw.sinesweepflacmp4);
-        testDecodeWithEOSOnLastBuffer(R.raw.sinesweepogg);
-        testDecodeWithEOSOnLastBuffer(R.raw.sinesweepoggmkv);
-        testDecodeWithEOSOnLastBuffer(R.raw.sinesweepoggmp4);
+        testDecodeWithEOSOnLastBuffer("sinesweepm4a.m4a");
+        testDecodeWithEOSOnLastBuffer("sinesweepmp3lame.mp3");
+        testDecodeWithEOSOnLastBuffer("sinesweepmp3smpb.mp3");
+        testDecodeWithEOSOnLastBuffer("sinesweepopus.mkv");
+        testDecodeWithEOSOnLastBuffer("sinesweepopusmp4.mp4");
+        testDecodeWithEOSOnLastBuffer("sinesweepwav.wav");
+        testDecodeWithEOSOnLastBuffer("sinesweepflacmkv.mkv");
+        testDecodeWithEOSOnLastBuffer("sinesweepflac.flac");
+        testDecodeWithEOSOnLastBuffer("sinesweepflacmp4.mp4");
+        testDecodeWithEOSOnLastBuffer("sinesweepogg.ogg");
+        testDecodeWithEOSOnLastBuffer("sinesweepoggmkv.mkv");
+        testDecodeWithEOSOnLastBuffer("sinesweepoggmp4.mp4");
     }
 
     /* setting EOS on the last full input buffer should be equivalent to setting EOS on an empty
      * input buffer after all the full ones. */
-    private void testDecodeWithEOSOnLastBuffer(int res) throws Exception {
+    private void testDecodeWithEOSOnLastBuffer(final String res) throws Exception {
         int numsamples = countSamples(res);
         assertTrue(numsamples != 0);
 
@@ -2124,13 +2099,9 @@
         }
     }
 
-    private int countSamples(int res) throws IOException {
-        AssetFileDescriptor testFd = mResources.openRawResourceFd(res);
-
+    private int countSamples(final String res) throws IOException {
         MediaExtractor extractor = new MediaExtractor();
-        extractor.setDataSource(testFd.getFileDescriptor(), testFd.getStartOffset(),
-                testFd.getLength());
-        testFd.close();
+        extractor.setDataSource(mInpPrefix + res);
         extractor.selectTrack(0);
         int numsamples = extractor.getSampleTime() < 0 ? 0 : 1;
         while (extractor.advance()) {
@@ -2139,8 +2110,8 @@
         return numsamples;
     }
 
-    private void testDecode(int testVideo, int frameNum) throws Exception {
-        if (!MediaUtils.checkCodecForResource(mContext, testVideo, 0 /* track */)) {
+    private void testDecode(final String testVideo, int frameNum) throws Exception {
+        if (!MediaUtils.checkCodecForResource(mInpPrefix + testVideo, 0 /* track */)) {
             return; // skip
         }
 
@@ -2155,44 +2126,44 @@
     }
 
     public void testCodecBasicH264() throws Exception {
-        testDecode(R.raw.video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz, 240);
+        testDecode("video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4", 240);
     }
 
     public void testCodecBasicHEVC() throws Exception {
         testDecode(
-                R.raw.bbb_s1_720x480_mp4_hevc_mp3_1600kbps_30fps_aac_he_6ch_240kbps_48000hz, 300);
+                "bbb_s1_720x480_mp4_hevc_mp3_1600kbps_30fps_aac_he_6ch_240kbps_48000hz.mp4", 300);
     }
 
     public void testCodecBasicH263() throws Exception {
-        testDecode(R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz, 122);
+        testDecode("video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz.3gp", 122);
     }
 
     public void testCodecBasicMpeg2() throws Exception {
-        testDecode(R.raw.video_480x360_mp4_mpeg2_1500kbps_30fps_aac_stereo_128kbps_48000hz, 300);
+        testDecode("video_480x360_mp4_mpeg2_1500kbps_30fps_aac_stereo_128kbps_48000hz.mp4", 300);
     }
 
     public void testCodecBasicMpeg4() throws Exception {
-        testDecode(R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz, 249);
+        testDecode("video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz.mp4", 249);
     }
 
     public void testCodecBasicVP8() throws Exception {
-        testDecode(R.raw.video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_48000hz, 240);
+        testDecode("video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_48000hz.webm", 240);
     }
 
     public void testCodecBasicVP9() throws Exception {
-        testDecode(R.raw.video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_48000hz, 240);
+        testDecode("video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_48000hz.webm", 240);
     }
 
     public void testCodecBasicAV1() throws Exception {
-        testDecode(R.raw.video_480x360_webm_av1_400kbps_30fps_vorbis_stereo_128kbps_48000hz, 300);
+        testDecode("video_480x360_webm_av1_400kbps_30fps_vorbis_stereo_128kbps_48000hz.webm", 300);
     }
 
     public void testH264Decode320x240() throws Exception {
-        testDecode(R.raw.bbb_s1_320x240_mp4_h264_mp2_800kbps_30fps_aac_lc_5ch_240kbps_44100hz, 300);
+        testDecode("bbb_s1_320x240_mp4_h264_mp2_800kbps_30fps_aac_lc_5ch_240kbps_44100hz.mp4", 300);
     }
 
     public void testH264Decode720x480() throws Exception {
-        testDecode(R.raw.bbb_s1_720x480_mp4_h264_mp3_2mbps_30fps_aac_lc_5ch_320kbps_48000hz, 300);
+        testDecode("bbb_s1_720x480_mp4_h264_mp3_2mbps_30fps_aac_lc_5ch_320kbps_48000hz.mp4", 300);
     }
 
     public void testH264Decode30fps1280x720Tv() throws Exception {
@@ -2212,7 +2183,7 @@
     }
 
     public void testH264Decode30fps1280x720() throws Exception {
-        testDecode(R.raw.bbb_s4_1280x720_mp4_h264_mp31_8mbps_30fps_aac_he_mono_40kbps_44100hz, 300);
+        testDecode("bbb_s4_1280x720_mp4_h264_mp31_8mbps_30fps_aac_he_mono_40kbps_44100hz.mp4", 300);
     }
 
     public void testH264Decode60fps1280x720Tv() throws Exception {
@@ -2221,7 +2192,7 @@
                     MediaFormat.MIMETYPE_VIDEO_AVC, 1280, 720, 60,
                     AVCProfileHigh, AVCLevel32, 8000000));
             testDecode(
-                    R.raw.bbb_s3_1280x720_mp4_h264_hp32_8mbps_60fps_aac_he_v2_stereo_48kbps_48000hz,
+                    "bbb_s3_1280x720_mp4_h264_hp32_8mbps_60fps_aac_he_v2_stereo_48kbps_48000hz.mp4",
                     600);
         }
     }
@@ -2235,8 +2206,8 @@
     }
 
     public void testH264Decode60fps1280x720() throws Exception {
-        testDecode(
-            R.raw.bbb_s3_1280x720_mp4_h264_mp32_8mbps_60fps_aac_he_v2_6ch_144kbps_44100hz, 600);
+        testDecode("bbb_s3_1280x720_mp4_h264_mp32_8mbps_60fps_aac_he_v2_6ch_144kbps_44100hz.mp4",
+                600);
     }
 
     public void testH264Decode30fps1920x1080Tv() throws Exception {
@@ -2245,7 +2216,7 @@
                     MediaFormat.MIMETYPE_VIDEO_AVC, 1920, 1080, 30,
                     AVCProfileHigh, AVCLevel4, 20000000));
             testDecode(
-                    R.raw.bbb_s4_1920x1080_wide_mp4_h264_hp4_20mbps_30fps_aac_lc_6ch_384kbps_44100hz,
+                    "bbb_s4_1920x1080_wide_mp4_h264_hp4_20mbps_30fps_aac_lc_6ch_384kbps_44100hz.mp4",
                     150);
         }
     }
@@ -2259,8 +2230,7 @@
     }
 
     public void testH264Decode30fps1920x1080() throws Exception {
-        testDecode(
-                R.raw.bbb_s4_1920x1080_wide_mp4_h264_mp4_20mbps_30fps_aac_he_5ch_200kbps_44100hz,
+        testDecode("bbb_s4_1920x1080_wide_mp4_h264_mp4_20mbps_30fps_aac_he_5ch_200kbps_44100hz.mp4",
                 150);
     }
 
@@ -2269,8 +2239,7 @@
             assertTrue(MediaUtils.canDecodeVideo(
                     MediaFormat.MIMETYPE_VIDEO_AVC, 1920, 1080, 60,
                     AVCProfileHigh, AVCLevel42, 20000000));
-            testDecode(
-                    R.raw.bbb_s2_1920x1080_mp4_h264_hp42_20mbps_60fps_aac_lc_6ch_384kbps_48000hz,
+            testDecode("bbb_s2_1920x1080_mp4_h264_hp42_20mbps_60fps_aac_lc_6ch_384kbps_48000hz.mp4",
                     300);
         }
     }
@@ -2284,25 +2253,22 @@
     }
 
     public void testH264Decode60fps1920x1080() throws Exception {
-        testDecode(
-                R.raw.bbb_s2_1920x1080_mp4_h264_mp42_20mbps_60fps_aac_he_v2_5ch_160kbps_48000hz,
+        testDecode("bbb_s2_1920x1080_mp4_h264_mp42_20mbps_60fps_aac_he_v2_5ch_160kbps_48000hz.mp4",
                 300);
-        testDecode(
-                R.raw.bbb_s2_1920x1080_mkv_h264_mp42_20mbps_60fps_aac_he_v2_5ch_160kbps_48000hz,
+        testDecode("bbb_s2_1920x1080_mkv_h264_mp42_20mbps_60fps_aac_he_v2_5ch_160kbps_48000hz.mkv",
                 300);
     }
 
     public void testH265Decode25fps1280x720() throws Exception {
-        testDecode(
-                R.raw.video_1280x720_mkv_h265_500kbps_25fps_aac_stereo_128kbps_44100hz, 240);
+        testDecode("video_1280x720_mkv_h265_500kbps_25fps_aac_stereo_128kbps_44100hz.mkv", 240);
     }
 
     public void testVP8Decode320x180() throws Exception {
-        testDecode(R.raw.bbb_s1_320x180_webm_vp8_800kbps_30fps_opus_5ch_320kbps_48000hz, 300);
+        testDecode("bbb_s1_320x180_webm_vp8_800kbps_30fps_opus_5ch_320kbps_48000hz.webm", 300);
     }
 
     public void testVP8Decode640x360() throws Exception {
-        testDecode(R.raw.bbb_s1_640x360_webm_vp8_2mbps_30fps_vorbis_5ch_320kbps_48000hz, 300);
+        testDecode("bbb_s1_640x360_webm_vp8_2mbps_30fps_vorbis_5ch_320kbps_48000hz.webm", 300);
     }
 
     public void testVP8Decode30fps1280x720Tv() throws Exception {
@@ -2312,7 +2278,7 @@
     }
 
     public void testVP8Decode30fps1280x720() throws Exception {
-        testDecode(R.raw.bbb_s4_1280x720_webm_vp8_8mbps_30fps_opus_mono_64kbps_48000hz, 300);
+        testDecode("bbb_s4_1280x720_webm_vp8_8mbps_30fps_opus_mono_64kbps_48000hz.webm", 300);
     }
 
     public void testVP8Decode60fps1280x720Tv() throws Exception {
@@ -2322,7 +2288,7 @@
     }
 
     public void testVP8Decode60fps1280x720() throws Exception {
-        testDecode(R.raw.bbb_s3_1280x720_webm_vp8_8mbps_60fps_opus_6ch_384kbps_48000hz, 600);
+        testDecode("bbb_s3_1280x720_webm_vp8_8mbps_60fps_opus_6ch_384kbps_48000hz.webm", 600);
     }
 
     public void testVP8Decode30fps1920x1080Tv() throws Exception {
@@ -2332,8 +2298,8 @@
     }
 
     public void testVP8Decode30fps1920x1080() throws Exception {
-        testDecode(
-                R.raw.bbb_s4_1920x1080_wide_webm_vp8_20mbps_30fps_vorbis_6ch_384kbps_44100hz, 150);
+        testDecode("bbb_s4_1920x1080_wide_webm_vp8_20mbps_30fps_vorbis_6ch_384kbps_44100hz.webm",
+                150);
     }
 
     public void testVP8Decode60fps1920x1080Tv() throws Exception {
@@ -2343,16 +2309,16 @@
     }
 
     public void testVP8Decode60fps1920x1080() throws Exception {
-        testDecode(R.raw.bbb_s2_1920x1080_webm_vp8_20mbps_60fps_vorbis_6ch_384kbps_48000hz, 300);
+        testDecode("bbb_s2_1920x1080_webm_vp8_20mbps_60fps_vorbis_6ch_384kbps_48000hz.webm", 300);
     }
 
     public void testVP9Decode320x180() throws Exception {
-        testDecode(R.raw.bbb_s1_320x180_webm_vp9_0p11_600kbps_30fps_vorbis_mono_64kbps_48000hz, 300);
+        testDecode("bbb_s1_320x180_webm_vp9_0p11_600kbps_30fps_vorbis_mono_64kbps_48000hz.webm",
+                300);
     }
 
     public void testVP9Decode640x360() throws Exception {
-        testDecode(
-                R.raw.bbb_s1_640x360_webm_vp9_0p21_1600kbps_30fps_vorbis_stereo_128kbps_48000hz,
+        testDecode("bbb_s1_640x360_webm_vp9_0p21_1600kbps_30fps_vorbis_stereo_128kbps_48000hz.webm",
                 300);
     }
 
@@ -2363,63 +2329,61 @@
     }
 
     public void testVP9Decode30fps1280x720() throws Exception {
-        testDecode(
-                R.raw.bbb_s4_1280x720_webm_vp9_0p31_4mbps_30fps_opus_stereo_128kbps_48000hz, 300);
-    }
-
-    public void testVP9Decode60fps1920x1080() throws Exception {
-        testDecode(
-                R.raw.bbb_s2_1920x1080_webm_vp9_0p41_10mbps_60fps_vorbis_6ch_384kbps_22050hz, 300);
-    }
-
-    public void testVP9Decode30fps3840x2160() throws Exception {
-        testDecode(
-                R.raw.bbb_s4_3840x2160_webm_vp9_0p5_20mbps_30fps_vorbis_6ch_384kbps_24000hz, 150);
-    }
-
-    public void testVP9Decode60fps3840x2160() throws Exception {
-        testDecode(
-                R.raw.bbb_s2_3840x2160_webm_vp9_0p51_20mbps_60fps_vorbis_6ch_384kbps_32000hz, 300);
-    }
-
-    public void testAV1Decode320x180() throws Exception {
-        testDecode(R.raw.video_320x180_webm_av1_200kbps_30fps_vorbis_stereo_128kbps_48000hz, 300);
-    }
-
-    public void testAV1Decode640x360() throws Exception {
-        testDecode(
-                R.raw.video_640x360_webm_av1_470kbps_30fps_vorbis_stereo_128kbps_48000hz,
+        testDecode("bbb_s4_1280x720_webm_vp9_0p31_4mbps_30fps_opus_stereo_128kbps_48000hz.webm",
                 300);
     }
 
+    public void testVP9Decode60fps1920x1080() throws Exception {
+        testDecode("bbb_s2_1920x1080_webm_vp9_0p41_10mbps_60fps_vorbis_6ch_384kbps_22050hz.webm",
+                300);
+    }
+
+    public void testVP9Decode30fps3840x2160() throws Exception {
+        testDecode("bbb_s4_3840x2160_webm_vp9_0p5_20mbps_30fps_vorbis_6ch_384kbps_24000hz.webm",
+                150);
+    }
+
+    public void testVP9Decode60fps3840x2160() throws Exception {
+        testDecode("bbb_s2_3840x2160_webm_vp9_0p51_20mbps_60fps_vorbis_6ch_384kbps_32000hz.webm",
+                300);
+    }
+
+    public void testAV1Decode320x180() throws Exception {
+        testDecode("video_320x180_webm_av1_200kbps_30fps_vorbis_stereo_128kbps_48000hz.webm", 300);
+    }
+
+    public void testAV1Decode640x360() throws Exception {
+        testDecode("video_640x360_webm_av1_470kbps_30fps_vorbis_stereo_128kbps_48000hz.webm", 300);
+    }
+
     public void testAV1Decode30fps1280x720() throws Exception {
-        testDecode(
-                R.raw.video_1280x720_webm_av1_2000kbps_30fps_vorbis_stereo_128kbps_48000hz, 300);
+        testDecode("video_1280x720_webm_av1_2000kbps_30fps_vorbis_stereo_128kbps_48000hz.webm",
+                300);
     }
 
     public void testAV1Decode60fps1920x1080() throws Exception {
-        testDecode(
-                R.raw.video_1920x1080_webm_av1_7000kbps_60fps_vorbis_stereo_128kbps_48000hz, 300);
+        testDecode("video_1920x1080_webm_av1_7000kbps_60fps_vorbis_stereo_128kbps_48000hz.webm",
+                300);
     }
 
     public void testAV1Decode30fps3840x2160() throws Exception {
-        testDecode(
-                R.raw.video_3840x2160_webm_av1_11000kbps_30fps_vorbis_stereo_128kbps_48000hz, 150);
+        testDecode("video_3840x2160_webm_av1_11000kbps_30fps_vorbis_stereo_128kbps_48000hz.webm",
+                150);
     }
 
     public void testAV1Decode60fps3840x2160() throws Exception {
-        testDecode(
-                R.raw.video_3840x2160_webm_av1_18000kbps_60fps_vorbis_stereo_128kbps_48000hz, 300);
+        testDecode("video_3840x2160_webm_av1_18000kbps_60fps_vorbis_stereo_128kbps_48000hz.webm",
+                300);
     }
 
     public void testHEVCDecode352x288() throws Exception {
-        testDecode(
-                R.raw.bbb_s1_352x288_mp4_hevc_mp2_600kbps_30fps_aac_he_stereo_96kbps_48000hz, 300);
+        testDecode("bbb_s1_352x288_mp4_hevc_mp2_600kbps_30fps_aac_he_stereo_96kbps_48000hz.mp4",
+                300);
     }
 
     public void testHEVCDecode720x480() throws Exception {
-        testDecode(
-                R.raw.bbb_s1_720x480_mp4_hevc_mp3_1600kbps_30fps_aac_he_6ch_240kbps_48000hz, 300);
+        testDecode("bbb_s1_720x480_mp4_hevc_mp3_1600kbps_30fps_aac_he_6ch_240kbps_48000hz.mp4",
+                300);
     }
 
     public void testHEVCDecode30fps1280x720Tv() throws Exception {
@@ -2431,8 +2395,8 @@
     }
 
     public void testHEVCDecode30fps1280x720() throws Exception {
-        testDecode(
-                R.raw.bbb_s4_1280x720_mp4_hevc_mp31_4mbps_30fps_aac_he_stereo_80kbps_32000hz, 300);
+        testDecode("bbb_s4_1280x720_mp4_hevc_mp31_4mbps_30fps_aac_he_stereo_80kbps_32000hz.mp4",
+                300);
     }
 
     public void testHEVCDecode30fps1920x1080Tv() throws Exception {
@@ -2444,26 +2408,26 @@
     }
 
     public void testHEVCDecode60fps1920x1080() throws Exception {
-        testDecode(
-                R.raw.bbb_s2_1920x1080_mp4_hevc_mp41_10mbps_60fps_aac_lc_6ch_384kbps_22050hz, 300);
+        testDecode("bbb_s2_1920x1080_mp4_hevc_mp41_10mbps_60fps_aac_lc_6ch_384kbps_22050hz.mp4",
+                300);
     }
 
     public void testHEVCDecode30fps3840x2160() throws Exception {
-        testDecode(
-                R.raw.bbb_s4_3840x2160_mp4_hevc_mp5_20mbps_30fps_aac_lc_6ch_384kbps_24000hz, 150);
+        testDecode("bbb_s4_3840x2160_mp4_hevc_mp5_20mbps_30fps_aac_lc_6ch_384kbps_24000hz.mp4",
+                150);
     }
 
     public void testHEVCDecode60fps3840x2160() throws Exception {
-        testDecode(
-                R.raw.bbb_s2_3840x2160_mp4_hevc_mp51_20mbps_60fps_aac_lc_6ch_384kbps_32000hz, 300);
+        testDecode("bbb_s2_3840x2160_mp4_hevc_mp51_20mbps_60fps_aac_lc_6ch_384kbps_32000hz.mp4",
+                300);
     }
 
     public void testMpeg2Decode352x288() throws Exception {
-        testDecode(R.raw.video_352x288_mp4_mpeg2_1000kbps_30fps_aac_stereo_128kbps_48000hz, 300);
+        testDecode("video_352x288_mp4_mpeg2_1000kbps_30fps_aac_stereo_128kbps_48000hz.mp4", 300);
     }
 
     public void testMpeg2Decode720x480() throws Exception {
-        testDecode(R.raw.video_720x480_mp4_mpeg2_2000kbps_30fps_aac_stereo_128kbps_48000hz, 300);
+        testDecode("video_720x480_mp4_mpeg2_2000kbps_30fps_aac_stereo_128kbps_48000hz.mp4", 300);
     }
 
     public void testMpeg2Decode30fps1280x720Tv() throws Exception {
@@ -2473,7 +2437,7 @@
     }
 
     public void testMpeg2Decode30fps1280x720() throws Exception {
-        testDecode(R.raw.video_1280x720_mp4_mpeg2_6000kbps_30fps_aac_stereo_128kbps_48000hz, 150);
+        testDecode("video_1280x720_mp4_mpeg2_6000kbps_30fps_aac_stereo_128kbps_48000hz.mp4", 150);
     }
 
     public void testMpeg2Decode30fps1920x1080Tv() throws Exception {
@@ -2483,182 +2447,170 @@
     }
 
     public void testMpeg2Decode30fps1920x1080() throws Exception {
-        testDecode(R.raw.video_1920x1080_mp4_mpeg2_12000kbps_30fps_aac_stereo_128kbps_48000hz, 150);
+        testDecode("video_1920x1080_mp4_mpeg2_12000kbps_30fps_aac_stereo_128kbps_48000hz.mp4", 150);
     }
 
     public void testMpeg2Decode30fps3840x2160() throws Exception {
-        testDecode(R.raw.video_3840x2160_mp4_mpeg2_20000kbps_30fps_aac_stereo_128kbps_48000hz, 150);
+        testDecode("video_3840x2160_mp4_mpeg2_20000kbps_30fps_aac_stereo_128kbps_48000hz.mp4", 150);
     }
 
-    private void testCodecEarlyEOS(int resid, int eosFrame) throws Exception {
-        if (!MediaUtils.checkCodecForResource(mContext, resid, 0 /* track */)) {
+    private void testCodecEarlyEOS(final String res, int eosFrame) throws Exception {
+        if (!MediaUtils.checkCodecForResource(mInpPrefix + res, 0 /* track */)) {
             return; // skip
         }
         Surface s = getActivity().getSurfaceHolder().getSurface();
-        int frames1 = countFrames(resid, RESET_MODE_NONE, eosFrame, s);
+        int frames1 = countFrames(res, RESET_MODE_NONE, eosFrame, s);
         assertEquals("wrong number of frames decoded", eosFrame, frames1);
     }
 
     public void testCodecEarlyEOSH263() throws Exception {
-        testCodecEarlyEOS(
-                R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz,
+        testCodecEarlyEOS("video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz.mp4",
                 64 /* eosframe */);
     }
 
     public void testCodecEarlyEOSH264() throws Exception {
-        testCodecEarlyEOS(
-                R.raw.video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz,
+        testCodecEarlyEOS("video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4",
                 120 /* eosframe */);
     }
 
     public void testCodecEarlyEOSHEVC() throws Exception {
-        testCodecEarlyEOS(
-                R.raw.video_480x360_mp4_hevc_650kbps_30fps_aac_stereo_128kbps_48000hz,
+        testCodecEarlyEOS("video_480x360_mp4_hevc_650kbps_30fps_aac_stereo_128kbps_48000hz.mp4",
                 120 /* eosframe */);
     }
 
     public void testCodecEarlyEOSMpeg2() throws Exception {
-        testCodecEarlyEOS(
-                R.raw.video_480x360_mp4_mpeg2_1500kbps_30fps_aac_stereo_128kbps_48000hz,
+        testCodecEarlyEOS("vdeo_480x360_mp4_mpeg2_1500kbps_30fps_aac_stereo_128kbps_48000hz.mp4",
                 120 /* eosframe */);
     }
 
     public void testCodecEarlyEOSMpeg4() throws Exception {
-        testCodecEarlyEOS(
-                R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz,
+        testCodecEarlyEOS("video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz.mp4",
                 120 /* eosframe */);
     }
 
     public void testCodecEarlyEOSVP8() throws Exception {
-        testCodecEarlyEOS(
-                R.raw.video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_48000hz,
+        testCodecEarlyEOS("video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_48000hz.webm",
                 120 /* eosframe */);
     }
 
     public void testCodecEarlyEOSVP9() throws Exception {
         testCodecEarlyEOS(
-                R.raw.video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_48000hz,
+                "video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_48000hz.webm",
                 120 /* eosframe */);
     }
 
     public void testCodecEarlyEOSAV1() throws Exception {
-        testCodecEarlyEOS(
-                R.raw.video_480x360_webm_av1_400kbps_30fps_vorbis_stereo_128kbps_48000hz,
+        testCodecEarlyEOS("video_480x360_webm_av1_400kbps_30fps_vorbis_stereo_128kbps_48000hz.webm",
                 120 /* eosframe */);
     }
 
     public void testCodecResetsH264WithoutSurface() throws Exception {
-        testCodecResets(
-                R.raw.video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz, null);
+        testCodecResets("video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4",
+                null);
     }
 
     public void testCodecResetsH264WithSurface() throws Exception {
         Surface s = getActivity().getSurfaceHolder().getSurface();
-        testCodecResets(
-                R.raw.video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz, s);
+        testCodecResets("video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4", s);
     }
 
     public void testCodecResetsHEVCWithoutSurface() throws Exception {
-        testCodecResets(
-                R.raw.bbb_s1_720x480_mp4_hevc_mp3_1600kbps_30fps_aac_he_6ch_240kbps_48000hz, null);
+        testCodecResets("bbb_s1_720x480_mp4_hevc_mp3_1600kbps_30fps_aac_he_6ch_240kbps_48000hz.mp4",
+                null);
     }
 
     public void testCodecResetsHEVCWithSurface() throws Exception {
         Surface s = getActivity().getSurfaceHolder().getSurface();
-        testCodecResets(
-                R.raw.bbb_s1_720x480_mp4_hevc_mp3_1600kbps_30fps_aac_he_6ch_240kbps_48000hz, s);
+        testCodecResets("bbb_s1_720x480_mp4_hevc_mp3_1600kbps_30fps_aac_he_6ch_240kbps_48000hz.mp4",
+                s);
     }
 
     public void testCodecResetsMpeg2WithoutSurface() throws Exception {
-        testCodecResets(
-                R.raw.video_1280x720_mp4_mpeg2_6000kbps_30fps_aac_stereo_128kbps_48000hz, null);
+        testCodecResets("video_1280x720_mp4_mpeg2_6000kbps_30fps_aac_stereo_128kbps_48000hz.mp4",
+                null);
     }
 
     public void testCodecResetsMpeg2WithSurface() throws Exception {
         Surface s = getActivity().getSurfaceHolder().getSurface();
-        testCodecResets(
-                R.raw.video_176x144_mp4_mpeg2_105kbps_25fps_aac_stereo_128kbps_44100hz, s);
+        testCodecResets("video_176x144_mp4_mpeg2_105kbps_25fps_aac_stereo_128kbps_44100hz.mp4", s);
     }
 
     public void testCodecResetsH263WithoutSurface() throws Exception {
-        testCodecResets(
-                R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz, null);
+        testCodecResets("video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz.3gp",null);
     }
 
     public void testCodecResetsH263WithSurface() throws Exception {
         Surface s = getActivity().getSurfaceHolder().getSurface();
-        testCodecResets(
-                R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz, s);
+        testCodecResets("video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz.3gp", s);
     }
 
     public void testCodecResetsMpeg4WithoutSurface() throws Exception {
-        testCodecResets(
-                R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz, null);
+        testCodecResets("video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz.mp4",
+                null);
     }
 
     public void testCodecResetsMpeg4WithSurface() throws Exception {
         Surface s = getActivity().getSurfaceHolder().getSurface();
-        testCodecResets(
-                R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz, s);
+        testCodecResets("video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz.mp4", s);
     }
 
     public void testCodecResetsVP8WithoutSurface() throws Exception {
-        testCodecResets(
-                R.raw.video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_48000hz, null);
+        testCodecResets("video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_48000hz.webm",
+                null);
     }
 
     public void testCodecResetsVP8WithSurface() throws Exception {
         Surface s = getActivity().getSurfaceHolder().getSurface();
-        testCodecResets(
-                R.raw.video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_48000hz, s);
+        testCodecResets("video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_48000hz.webm",
+                s);
     }
 
     public void testCodecResetsVP9WithoutSurface() throws Exception {
-        testCodecResets(
-                R.raw.video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_48000hz, null);
+        testCodecResets("video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_48000hz.webm",
+                null);
     }
 
     public void testCodecResetsAV1WithoutSurface() throws Exception {
-        testCodecResets(
-                R.raw.video_480x360_webm_av1_400kbps_30fps_vorbis_stereo_128kbps_48000hz, null);
+        testCodecResets("video_480x360_webm_av1_400kbps_30fps_vorbis_stereo_128kbps_48000hz.webm",
+                null);
     }
 
     public void testCodecResetsVP9WithSurface() throws Exception {
         Surface s = getActivity().getSurfaceHolder().getSurface();
-        testCodecResets(
-                R.raw.video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_48000hz, s);
+        testCodecResets("video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_48000hz.webm",
+                s);
     }
 
     public void testCodecResetsAV1WithSurface() throws Exception {
         Surface s = getActivity().getSurfaceHolder().getSurface();
-        testCodecResets(
-                R.raw.video_480x360_webm_av1_400kbps_30fps_vorbis_stereo_128kbps_48000hz, s);
+        testCodecResets("video_480x360_webm_av1_400kbps_30fps_vorbis_stereo_128kbps_48000hz.webm",
+                s);
     }
 
 //    public void testCodecResetsOgg() throws Exception {
-//        testCodecResets(R.raw.sinesweepogg, null);
+//        testCodecResets("sinesweepogg.ogg", null);
 //    }
 
     public void testCodecResetsMp3() throws Exception {
-        testCodecReconfig(R.raw.sinesweepmp3lame);
+        testCodecReconfig("sinesweepmp3lame.mp3");
         // NOTE: replacing testCodecReconfig call soon
-//        testCodecResets(R.raw.sinesweepmp3lame, null);
+//        testCodecResets("sinesweepmp3lame.mp3, null);
     }
 
     public void testCodecResetsM4a() throws Exception {
-        testCodecReconfig(R.raw.sinesweepm4a);
+        testCodecReconfig("sinesweepm4a.m4a");
         // NOTE: replacing testCodecReconfig call soon
-//        testCodecResets(R.raw.sinesweepm4a, null);
+//        testCodecResets("sinesweepm4a.m4a", null);
     }
 
-    private void testCodecReconfig(int audio) throws Exception {
+    private void testCodecReconfig(final String audio) throws Exception {
         int size1 = countSize(audio, RESET_MODE_NONE, -1 /* eosframe */);
         int size2 = countSize(audio, RESET_MODE_RECONFIGURE, -1 /* eosframe */);
         assertEquals("different output size when using reconfigured codec", size1, size2);
     }
 
-    private void testCodecResets(int video, Surface s) throws Exception {
-        if (!MediaUtils.checkCodecForResource(mContext, video, 0 /* track */)) {
+    private void testCodecResets(final String video, Surface s) throws Exception {
+        if (!MediaUtils.checkCodecForResource(mInpPrefix + video, 0 /* track */)) {
             return; // skip
         }
 
@@ -2695,12 +2647,10 @@
     }
 
     // for video
-    private int countFrames(int video, int resetMode, int eosframe, Surface s)
+    private int countFrames(final String video, int resetMode, int eosframe, Surface s)
             throws Exception {
-        AssetFileDescriptor testFd = mResources.openRawResourceFd(video);
         MediaExtractor extractor = new MediaExtractor();
-        extractor.setDataSource(testFd.getFileDescriptor(), testFd.getStartOffset(),
-                testFd.getLength());
+        extractor.setDataSource(mInpPrefix + video);
         extractor.selectTrack(0);
 
         int numframes = decodeWithChecks(null /* decoderName */, extractor,
@@ -2708,17 +2658,15 @@
                 resetMode, s, eosframe, null, null);
 
         extractor.release();
-        testFd.close();
         return numframes;
     }
 
     // for audio
-    private int countSize(int audio, int resetMode, int eosframe)
+    private int countSize(final String audio, int resetMode, int eosframe)
             throws Exception {
-        AssetFileDescriptor testFd = mResources.openRawResourceFd(audio);
         MediaExtractor extractor = new MediaExtractor();
-        extractor.setDataSource(testFd.getFileDescriptor(), testFd.getStartOffset(),
-                testFd.getLength());
+        extractor.setDataSource(mInpPrefix + audio);
+
         extractor.selectTrack(0);
 
         // fails CHECKFLAG_COMPAREINPUTOUTPUTPTSMATCH
@@ -2727,26 +2675,23 @@
                 eosframe, null, null);
 
         extractor.release();
-        testFd.close();
         return outputSize;
     }
 
     /*
     * Test all decoders' EOS behavior.
     */
-    private void testEOSBehavior(int movie, int stopatsample) throws Exception {
+    private void testEOSBehavior(final String movie, int stopatsample) throws Exception {
         testEOSBehavior(movie, new int[] {stopatsample});
     }
 
     /*
     * Test all decoders' EOS behavior.
     */
-    private void testEOSBehavior(int movie, int[] stopAtSample) throws Exception {
+    private void testEOSBehavior(final String movie, int[] stopAtSample) throws Exception {
         Surface s = null;
-        AssetFileDescriptor testFd = mResources.openRawResourceFd(movie);
         MediaExtractor extractor = new MediaExtractor();
-        extractor.setDataSource(testFd.getFileDescriptor(), testFd.getStartOffset(),
-                testFd.getLength());
+        extractor.setDataSource(mInpPrefix + movie);
         extractor.selectTrack(0); // consider variable looping on track
         MediaFormat format = extractor.getTrackFormat(0);
 
@@ -2774,8 +2719,7 @@
                 } else { // create new extractor
                     extractor.release();
                     extractor = new MediaExtractor();
-                    extractor.setDataSource(testFd.getFileDescriptor(),
-                            testFd.getStartOffset(), testFd.getLength());
+                    extractor.setDataSource(mInpPrefix + movie);
                     extractor.selectTrack(0); // consider variable looping on track
                 }
                 decodeWithChecks(decoderName, extractor,
@@ -2789,7 +2733,6 @@
         }
 
         extractor.release();
-        testFd.close();
     }
 
     private static final int CHECKFLAG_SETCHECKSUM = 1 << 0;
@@ -3058,55 +3001,51 @@
 
     public void testEOSBehaviorH264() throws Exception {
         // this video has an I frame at 44
-        testEOSBehavior(
-                R.raw.video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz,
-                new int[] {1, 44, 45, 55});
+        testEOSBehavior("video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4",
+                new int[]{1, 44, 45, 55});
     }
     public void testEOSBehaviorHEVC() throws Exception {
-        testEOSBehavior(
-            R.raw.video_480x360_mp4_hevc_650kbps_30fps_aac_stereo_128kbps_48000hz,
-            new int[] {1, 17, 23, 49});
+        testEOSBehavior("video_480x360_mp4_hevc_650kbps_30fps_aac_stereo_128kbps_48000hz.mp4",
+                new int[]{1, 17, 23, 49});
     }
 
     public void testEOSBehaviorMpeg2() throws Exception {
-        testEOSBehavior(R.raw.video_480x360_mp4_mpeg2_1500kbps_30fps_aac_stereo_128kbps_48000hz, 17);
-        testEOSBehavior(R.raw.video_480x360_mp4_mpeg2_1500kbps_30fps_aac_stereo_128kbps_48000hz, 23);
-        testEOSBehavior(R.raw.video_480x360_mp4_mpeg2_1500kbps_30fps_aac_stereo_128kbps_48000hz, 49);
+        testEOSBehavior("video_480x360_mp4_mpeg2_1500kbps_30fps_aac_stereo_128kbps_48000hz.mp4",
+                17);
+        testEOSBehavior("video_480x360_mp4_mpeg2_1500kbps_30fps_aac_stereo_128kbps_48000hz.mp4",
+                23);
+        testEOSBehavior("video_480x360_mp4_mpeg2_1500kbps_30fps_aac_stereo_128kbps_48000hz.mp4",
+                49);
     }
 
     public void testEOSBehaviorH263() throws Exception {
         // this video has an I frame every 12 frames.
-        testEOSBehavior(
-                R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz,
-                new int[] {1, 24, 25, 48, 50});
+        testEOSBehavior("video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz.3gp",
+                new int[]{1, 24, 25, 48, 50});
     }
 
     public void testEOSBehaviorMpeg4() throws Exception {
         // this video has an I frame every 12 frames
-        testEOSBehavior(
-                R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz,
-                new int[] {1, 24, 25, 48, 50, 2});
+        testEOSBehavior("video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz.mp4",
+                new int[]{1, 24, 25, 48, 50, 2});
     }
 
     public void testEOSBehaviorVP8() throws Exception {
         // this video has an I frame at 46
-        testEOSBehavior(
-                R.raw.video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_48000hz,
-                new int[] {1, 46, 47, 57, 45});
+        testEOSBehavior("video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_48000hz.webm",
+                new int[]{1, 46, 47, 57, 45});
     }
 
     public void testEOSBehaviorVP9() throws Exception {
         // this video has an I frame at 44
-        testEOSBehavior(
-                R.raw.video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_48000hz,
-                new int[] {1, 44, 45, 55, 43});
+        testEOSBehavior("video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_48000hz.webm",
+                new int[]{1, 44, 45, 55, 43});
     }
 
     public void testEOSBehaviorAV1() throws Exception {
         // this video has an I frame at 44
-        testEOSBehavior(
-                R.raw.video_480x360_webm_av1_400kbps_30fps_vorbis_stereo_128kbps_48000hz,
-                new int[] {1, 44, 45, 55, 43});
+        testEOSBehavior("video_480x360_webm_av1_400kbps_30fps_vorbis_stereo_128kbps_48000hz.webm",
+                new int[]{1, 44, 45, 55, 43});
     }
 
     /* from EncodeDecodeTest */
@@ -3267,29 +3206,24 @@
     }
 
     public void testFlush() throws Exception {
-        testFlush(R.raw.loudsoftwav);
-        testFlush(R.raw.loudsoftogg);
-        testFlush(R.raw.loudsoftoggmkv);
-        testFlush(R.raw.loudsoftoggmp4);
-        testFlush(R.raw.loudsoftmp3);
-        testFlush(R.raw.loudsoftaac);
-        testFlush(R.raw.loudsoftfaac);
-        testFlush(R.raw.loudsoftitunes);
+        testFlush("loudsoftwav.wav");
+        testFlush("loudsoftogg.ogg");
+        testFlush("loudsoftoggmkv.mkv");
+        testFlush("loudsoftoggmp4.mp4");
+        testFlush("loudsoftmp3.mp3");
+        testFlush("loudsoftaac.aac");
+        testFlush("loudsoftfaac.m4a");
+        testFlush("loudsoftitunes.m4a");
     }
 
-    private void testFlush(int resource) throws Exception {
-
-        AssetFileDescriptor testFd = mResources.openRawResourceFd(resource);
-
+    private void testFlush(final String resource) throws Exception {
         MediaExtractor extractor;
         MediaCodec codec;
         ByteBuffer[] codecInputBuffers;
         ByteBuffer[] codecOutputBuffers;
 
         extractor = new MediaExtractor();
-        extractor.setDataSource(testFd.getFileDescriptor(), testFd.getStartOffset(),
-                testFd.getLength());
-        testFd.close();
+        extractor.setDataSource(mInpPrefix + resource);
 
         assertEquals("wrong number of tracks", 1, extractor.getTrackCount());
         MediaFormat format = extractor.getTrackFormat(0);
@@ -3589,56 +3523,56 @@
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
     public void testLowLatencyVp9At1280x720() throws Exception {
         testLowLatencyVideo(
-                R.raw.video_1280x720_webm_vp9_csd_309kbps_25fps_vorbis_stereo_128kbps_48000hz, 300,
+                "video_1280x720_webm_vp9_csd_309kbps_25fps_vorbis_stereo_128kbps_48000hz.webm", 300,
                 false /* useNdk */);
         testLowLatencyVideo(
-                R.raw.video_1280x720_webm_vp9_csd_309kbps_25fps_vorbis_stereo_128kbps_48000hz, 300,
+                "video_1280x720_webm_vp9_csd_309kbps_25fps_vorbis_stereo_128kbps_48000hz.webm", 300,
                 true /* useNdk */);
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
     public void testLowLatencyVp9At1920x1080() throws Exception {
         testLowLatencyVideo(
-                R.raw.bbb_s2_1920x1080_webm_vp9_0p41_10mbps_60fps_vorbis_6ch_384kbps_22050hz, 300,
+                "bbb_s2_1920x1080_webm_vp9_0p41_10mbps_60fps_vorbis_6ch_384kbps_22050hz.webm", 300,
                 false /* useNdk */);
         testLowLatencyVideo(
-                R.raw.bbb_s2_1920x1080_webm_vp9_0p41_10mbps_60fps_vorbis_6ch_384kbps_22050hz, 300,
+                "bbb_s2_1920x1080_webm_vp9_0p41_10mbps_60fps_vorbis_6ch_384kbps_22050hz.webm", 300,
                 true /* useNdk */);
     }
 
     @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
     public void testLowLatencyVp9At3840x2160() throws Exception {
         testLowLatencyVideo(
-                R.raw.bbb_s2_3840x2160_webm_vp9_0p51_20mbps_60fps_vorbis_6ch_384kbps_32000hz, 300,
+                "bbb_s2_3840x2160_webm_vp9_0p51_20mbps_60fps_vorbis_6ch_384kbps_32000hz.webm", 300,
                 false /* useNdk */);
         testLowLatencyVideo(
-                R.raw.bbb_s2_3840x2160_webm_vp9_0p51_20mbps_60fps_vorbis_6ch_384kbps_32000hz, 300,
+                "bbb_s2_3840x2160_webm_vp9_0p51_20mbps_60fps_vorbis_6ch_384kbps_32000hz.webm", 300,
                 true /* useNdk */);
     }
 
     @NonMediaMainlineTest
     public void testLowLatencyAVCAt1280x720() throws Exception {
         testLowLatencyVideo(
-                R.raw.video_1280x720_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz, 300,
+                "video_1280x720_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4", 300,
                 false /* useNdk */);
         testLowLatencyVideo(
-                R.raw.video_1280x720_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz, 300,
+                "video_1280x720_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4", 300,
                 true /* useNdk */);
     }
 
     @NonMediaMainlineTest
     public void testLowLatencyHEVCAt480x360() throws Exception {
         testLowLatencyVideo(
-                R.raw.video_480x360_mp4_hevc_650kbps_30fps_aac_stereo_128kbps_48000hz, 300,
+                "video_480x360_mp4_hevc_650kbps_30fps_aac_stereo_128kbps_48000hz.mp4", 300,
                 false /* useNdk */);
         testLowLatencyVideo(
-                R.raw.video_480x360_mp4_hevc_650kbps_30fps_aac_stereo_128kbps_48000hz, 300,
+                "video_480x360_mp4_hevc_650kbps_30fps_aac_stereo_128kbps_48000hz.mp4", 300,
                 true /* useNdk */);
     }
 
-    private void testLowLatencyVideo(int testVideo, int frameCount, boolean useNdk)
+    private void testLowLatencyVideo(String testVideo, int frameCount, boolean useNdk)
             throws Exception {
-        AssetFileDescriptor fd = mResources.openRawResourceFd(testVideo);
+        AssetFileDescriptor fd = getAssetFileDescriptorFor(testVideo);
         MediaExtractor extractor = new MediaExtractor();
         extractor.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
         fd.close();
diff --git a/tests/tests/media/src/android/media/cts/DecoderTestAacDrc.java b/tests/tests/media/src/android/media/cts/DecoderTestAacDrc.java
index 0263601..3af1400 100755
--- a/tests/tests/media/src/android/media/cts/DecoderTestAacDrc.java
+++ b/tests/tests/media/src/android/media/cts/DecoderTestAacDrc.java
@@ -30,6 +30,7 @@
 import android.media.cts.DecoderTest.AudioParameter;
 import android.media.cts.R;
 import android.os.Build;
+import android.platform.test.annotations.AppModeFull;
 import android.util.Log;
 import android.os.Bundle;
 
@@ -47,6 +48,7 @@
 import java.util.Arrays;
 import java.util.List;
 
+@AppModeFull(reason = "DecoderTest is non-instant")
 public class DecoderTestAacDrc {
     private static final String TAG = "DecoderTestAacDrc";
 
diff --git a/tests/tests/media/src/android/media/cts/DecoderTestAacFormat.java b/tests/tests/media/src/android/media/cts/DecoderTestAacFormat.java
index 4e9c43e..7dc3bc5 100755
--- a/tests/tests/media/src/android/media/cts/DecoderTestAacFormat.java
+++ b/tests/tests/media/src/android/media/cts/DecoderTestAacFormat.java
@@ -23,13 +23,13 @@
 
 import android.app.Instrumentation;
 import android.content.res.AssetFileDescriptor;
-import android.content.res.Resources;
 import android.media.MediaCodec;
 import android.media.MediaExtractor;
 import android.media.MediaFormat;
 import android.media.cts.DecoderTest.AudioParameter;
-import android.media.cts.R;
 import android.os.Build;
+import android.os.ParcelFileDescriptor;
+import android.platform.test.annotations.AppModeFull;
 import android.util.Log;
 
 import androidx.test.InstrumentationRegistry;
@@ -40,23 +40,23 @@
 import org.junit.Before;
 import org.junit.Test;
 
+import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 
+@AppModeFull(reason = "Instant apps cannot access the SD card")
 public class DecoderTestAacFormat {
     private static final String TAG = "DecoderTestAacFormat";
 
+    static final String mInpPrefix = WorkDir.getMediaDirString();
     private static final boolean sIsAndroidRAndAbove =
             ApiLevelUtil.isAtLeast(Build.VERSION_CODES.R);
 
-    private Resources mResources;
-
     @Before
     public void setUp() throws Exception {
         final Instrumentation inst = InstrumentationRegistry.getInstrumentation();
         assertNotNull(inst);
-        mResources = inst.getContext().getResources();
     }
 
     /**
@@ -70,22 +70,23 @@
             return;
 
         // array of multichannel resources with their expected number of channels without downmixing
-        int[][] samples = {
-                //  {resourceId, numChannels},
-                {R.raw.noise_5ch_48khz_aot5_dr_sbr_sig1_mp4, 5},
-                {R.raw.noise_6ch_44khz_aot5_dr_sbr_sig2_mp4, 6},
+        Object [][] samples = {
+                //  {resource, numChannels},
+                {"noise_5ch_48khz_aot5_dr_sbr_sig1_mp4.m4a", 5},
+                {"noise_6ch_44khz_aot5_dr_sbr_sig2_mp4.m4a", 6},
         };
-        for (int[] sample: samples) {
-            for (String codecName : DecoderTest.codecsFor(sample[0] /* resource */, mResources)) {
+        for (Object [] sample: samples) {
+            for (String codecName : DecoderTest.codecsFor((String)sample[0] /* resource */)) {
                 // verify correct number of channels is observed without downmixing
                 AudioParameter chanParams = new AudioParameter();
-                decodeUpdateFormat(codecName, sample[0] /*resource*/, chanParams, 0 /*no downmix*/);
+                decodeUpdateFormat(codecName, (String) sample[0] /*resource*/, chanParams,
+                        0 /*no downmix*/);
                 assertEquals("Number of channels differs for codec:" + codecName,
                         sample[1], chanParams.getNumChannels());
 
                 // verify correct number of channels is observed when downmixing to stereo
                 AudioParameter downmixParams = new AudioParameter();
-                decodeUpdateFormat(codecName, sample[0] /* resource */, downmixParams,
+                decodeUpdateFormat(codecName, (String) sample[0] /* resource */, downmixParams,
                         2 /*stereo downmix*/);
                 assertEquals("Number of channels differs for codec:" + codecName,
                         2, downmixParams.getNumChannels());
@@ -103,11 +104,14 @@
      *                           positive number for number of channels in requested downmix
      * @throws IOException
      */
-    private void decodeUpdateFormat(String decoderName, int testInput, AudioParameter audioParams,
-            int downmixChannelCount)
+    private void decodeUpdateFormat(String decoderName, final String testInput,
+            AudioParameter audioParams, int downmixChannelCount)
             throws IOException
     {
-        AssetFileDescriptor testFd = mResources.openRawResourceFd(testInput);
+        File inpFile = new File(mInpPrefix + testInput);
+        ParcelFileDescriptor parcelFD =
+                ParcelFileDescriptor.open(inpFile, ParcelFileDescriptor.MODE_READ_ONLY);
+        AssetFileDescriptor testFd = new AssetFileDescriptor(parcelFD, 0, parcelFD.getStatSize());
 
         MediaExtractor extractor = new MediaExtractor();
         extractor.setDataSource(testFd.getFileDescriptor(), testFd.getStartOffset(),
diff --git a/tests/tests/media/src/android/media/cts/DecoderTestXheAac.java b/tests/tests/media/src/android/media/cts/DecoderTestXheAac.java
index 8536f30..13b7928 100755
--- a/tests/tests/media/src/android/media/cts/DecoderTestXheAac.java
+++ b/tests/tests/media/src/android/media/cts/DecoderTestXheAac.java
@@ -33,6 +33,7 @@
 import android.media.cts.DecoderTestAacDrc.DrcParams;
 import android.media.cts.R;
 import android.os.Build;
+import android.platform.test.annotations.AppModeFull;
 import android.util.Log;
 import android.os.Bundle;
 
@@ -50,6 +51,7 @@
 import java.util.Arrays;
 import java.util.List;
 
+@AppModeFull(reason = "DecoderTest is non-instant")
 public class DecoderTestXheAac {
     private static final String TAG = "DecoderTestXheAac";
 
diff --git a/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayTest.java b/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayTest.java
index 421ec39..e81b263 100755
--- a/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayTest.java
+++ b/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayTest.java
@@ -224,6 +224,9 @@
             encoderFormat.setInteger(MediaFormat.KEY_BIT_RATE, sBitRate);
             encoderFormat.setInteger(MediaFormat.KEY_FRAME_RATE, sFrameRate);
             encoderFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, IFRAME_INTERVAL);
+            encoderFormat.setInteger(MediaFormat.KEY_COLOR_RANGE, MediaFormat.COLOR_RANGE_LIMITED);
+            encoderFormat.setInteger(MediaFormat.KEY_COLOR_STANDARD, MediaFormat.COLOR_STANDARD_BT601_PAL);
+            encoderFormat.setInteger(MediaFormat.KEY_COLOR_TRANSFER, MediaFormat.COLOR_TRANSFER_LINEAR);
 
             MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
             String codec = mcl.findEncoderForFormat(encoderFormat);
diff --git a/tests/tests/media/src/android/media/cts/EncoderTest.java b/tests/tests/media/src/android/media/cts/EncoderTest.java
index e777528..6f1780a 100644
--- a/tests/tests/media/src/android/media/cts/EncoderTest.java
+++ b/tests/tests/media/src/android/media/cts/EncoderTest.java
@@ -20,16 +20,19 @@
 import android.media.MediaCodec;
 import android.media.MediaFormat;
 import android.media.MediaMuxer;
-import android.media.cts.R;
+import android.platform.test.annotations.AppModeFull;
 import android.platform.test.annotations.RequiresDevice;
 import android.test.AndroidTestCase;
 import android.util.Log;
 
 import androidx.test.filters.SmallTest;
 
+import com.android.compatibility.common.util.CddTest;
 import com.android.compatibility.common.util.MediaUtils;
 
 import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.InputStream;
 import java.nio.BufferOverflowException;
 import java.nio.ByteBuffer;
@@ -43,10 +46,12 @@
 
 @SmallTest
 @RequiresDevice
+@AppModeFull(reason = "Instant apps cannot access the SD card")
 public class EncoderTest extends AndroidTestCase {
     private static final String TAG = "EncoderTest";
     private static final boolean VERBOSE = false;
 
+    static final String mInpPrefix = WorkDir.getMediaDirString();
     private static final int kNumInputBytes = 512 * 1024;
     private static final long kTimeoutUs = 100;
 
@@ -105,19 +110,22 @@
         testEncoderWithFormats(MediaFormat.MIMETYPE_AUDIO_AMR_WB, formats);
     }
 
+    @CddTest(requirement="5.1.3")
     public void testOpusEncoders() {
         LinkedList<MediaFormat> formats = new LinkedList<MediaFormat>();
 
         final int kBitRates[] =
-            { 6600, 8850, 12650, 14250, 15850, 18250, 19850, 23050, 23850 };
+            { 8000, 12000, 16000, 24000, 48000 };
 
         for (int j = 0; j < kBitRates.length; ++j) {
-            MediaFormat format  = new MediaFormat();
-            format.setString(MediaFormat.KEY_MIME, MediaFormat.MIMETYPE_AUDIO_OPUS);
-            format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 16000);
-            format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
-            format.setInteger(MediaFormat.KEY_BIT_RATE, kBitRates[j]);
-            formats.push(format);
+            for (int nChannels = 1; nChannels <= 2; ++nChannels) {
+                MediaFormat format  = new MediaFormat();
+                format.setString(MediaFormat.KEY_MIME, MediaFormat.MIMETYPE_AUDIO_OPUS);
+                format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 16000);
+                format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, nChannels);
+                format.setInteger(MediaFormat.KEY_BIT_RATE, kBitRates[j]);
+                formats.push(format);
+            }
         }
 
         testEncoderWithFormats(MediaFormat.MIMETYPE_AUDIO_OPUS, formats);
@@ -276,30 +284,36 @@
         }
         @Override
         public void run() {
-            testEncoder(mComponentName, mFormat);
+            try {
+                testEncoder(mComponentName, mFormat);
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+                fail("Received exception " + e);
+            }
         }
     }
 
-    private void testEncoder(String componentName, MediaFormat format) {
+    private void testEncoder(String componentName, MediaFormat format)
+            throws FileNotFoundException {
         Log.i(TAG, "testEncoder " + componentName + "/" + format);
         // test with all zeroes/silence
-        testEncoder(componentName, format, 0, -1, MODE_SILENT);
+        testEncoder(componentName, format, 0, null, MODE_SILENT);
 
         // test with pcm input file
-        testEncoder(componentName, format, 0, R.raw.okgoogle123_good, MODE_RESOURCE);
-        testEncoder(componentName, format, 0, R.raw.okgoogle123_good, MODE_RESOURCE | MODE_QUIET);
-        testEncoder(componentName, format, 0, R.raw.tones, MODE_RESOURCE);
-        testEncoder(componentName, format, 0, R.raw.tones, MODE_RESOURCE | MODE_QUIET);
+        testEncoder(componentName, format, 0, "okgoogle123_good.wav", MODE_RESOURCE);
+        testEncoder(componentName, format, 0, "okgoogle123_good.wav", MODE_RESOURCE | MODE_QUIET);
+        testEncoder(componentName, format, 0, "tones.wav", MODE_RESOURCE);
+        testEncoder(componentName, format, 0, "tones.wav", MODE_RESOURCE | MODE_QUIET);
 
         // test with random data, with and without a few leading zeroes
         for (int i = 0; i < mBadSeeds.length; i++) {
-            testEncoder(componentName, format, mBadSeeds[i], -1, MODE_RANDOM);
-            testEncoder(componentName, format, mBadSeeds[i], -1, MODE_RANDOM | MODE_SILENTLEAD);
+            testEncoder(componentName, format, mBadSeeds[i], null, MODE_RANDOM);
+            testEncoder(componentName, format, mBadSeeds[i], null, MODE_RANDOM | MODE_SILENTLEAD);
         }
     }
 
     private void testEncoder(String componentName, MediaFormat format,
-            long startSeed, int resid, int mode) {
+            long startSeed, final String res, int mode) throws FileNotFoundException {
 
         Log.i(TAG, "testEncoder " + componentName + "/" + mode + "/" + format);
         int sampleRate = format.getInteger(MediaFormat.KEY_SAMPLE_RATE);
@@ -313,9 +327,9 @@
             try {
                 String outFile = "/data/local/tmp/transcoded-" + componentName +
                         "-" + sampleRate + "Hz-" + channelCount + "ch-" + outBitrate +
-                        "bps-" + mode + "-" + resid + "-" + startSeed + "-" +
+                        "bps-" + mode + "-" + res + "-" + startSeed + "-" +
                         (android.os.Process.is64Bit() ? "64bit" : "32bit") + ".mp4";
-                new File("outFile").delete();
+                new File(outFile).delete();
                 muxer = new MediaMuxer(outFile, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
                 // The track can't be added until we have the codec specific data
             } catch (Exception e) {
@@ -325,7 +339,7 @@
 
         InputStream istream = null;
         if ((mode & MODE_RESOURCE) != 0) {
-            istream = mContext.getResources().openRawResource(resid);
+            istream = new FileInputStream(mInpPrefix + res);
         }
 
         Random random = new Random(startSeed);
diff --git a/tests/tests/media/src/android/media/cts/ExifInterfaceTest.java b/tests/tests/media/src/android/media/cts/ExifInterfaceTest.java
index 59dc6e7..ac825fa 100644
--- a/tests/tests/media/src/android/media/cts/ExifInterfaceTest.java
+++ b/tests/tests/media/src/android/media/cts/ExifInterfaceTest.java
@@ -20,7 +20,6 @@
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.media.ExifInterface;
-import android.os.Environment;
 import android.os.FileUtils;
 import android.os.StrictMode;
 import android.platform.test.annotations.AppModeFull;
@@ -52,28 +51,34 @@
 
     private static final double DIFFERENCE_TOLERANCE = .001;
 
-    private static final String EXTERNAL_BASE_DIRECTORY = "/test/images/";
+    static final String mInpPrefix = WorkDir.getMediaDirString() + "images/";
 
     // This base directory is needed for the files listed below.
     // These files will be available for download in Android O release.
     // Link: https://source.android.com/compatibility/cts/downloads.html#cts-media-files
-    private static final String EXIF_BYTE_ORDER_II_JPEG = "image_exif_byte_order_ii.jpg";
-    private static final String EXIF_BYTE_ORDER_MM_JPEG = "image_exif_byte_order_mm.jpg";
-    private static final String LG_G4_ISO_800_DNG = "lg_g4_iso_800.dng";
-    private static final String LG_G4_ISO_800_JPG = "lg_g4_iso_800.jpg";
-    private static final String SONY_RX_100_ARW = "sony_rx_100.arw";
-    private static final String CANON_G7X_CR2 = "canon_g7x.cr2";
-    private static final String FUJI_X20_RAF = "fuji_x20.raf";
-    private static final String NIKON_1AW1_NEF = "nikon_1aw1.nef";
-    private static final String NIKON_P330_NRW = "nikon_p330.nrw";
-    private static final String OLYMPUS_E_PL3_ORF = "olympus_e_pl3.orf";
-    private static final String PANASONIC_GM5_RW2 = "panasonic_gm5.rw2";
-    private static final String PENTAX_K5_PEF = "pentax_k5.pef";
-    private static final String SAMSUNG_NX3000_SRW = "samsung_nx3000.srw";
-    private static final String VOLANTIS_JPEG = "volantis.jpg";
+    private static final String JPEG_WITH_EXIF_BYTE_ORDER_II = "image_exif_byte_order_ii.jpg";
+    private static final String JPEG_WITH_EXIF_BYTE_ORDER_MM = "image_exif_byte_order_mm.jpg";
+    private static final String DNG_WITH_EXIF_WITH_XMP = "lg_g4_iso_800.dng";
+    private static final String JPEG_WITH_EXIF_WITH_XMP = "lg_g4_iso_800.jpg";
+    private static final String ARW_SONY_RX_100 = "sony_rx_100.arw";
+    private static final String CR2_CANON_G7X = "canon_g7x.cr2";
+    private static final String RAF_FUJI_X20 = "fuji_x20.raf";
+    private static final String NEF_NIKON_1AW1 = "nikon_1aw1.nef";
+    private static final String NRW_NIKON_P330 = "nikon_p330.nrw";
+    private static final String ORF_OLYMPUS_E_PL3 = "olympus_e_pl3.orf";
+    private static final String RW2_PANASONIC_GM5 = "panasonic_gm5.rw2";
+    private static final String PEF_PENTAX_K5 = "pentax_k5.pef";
+    private static final String SRW_SAMSUNG_NX3000 = "samsung_nx3000.srw";
+    private static final String JPEG_VOLANTIS = "volantis.jpg";
     private static final String WEBP_WITH_EXIF = "webp_with_exif.webp";
+    private static final String WEBP_WITHOUT_EXIF_WITH_ANIM_DATA =
+            "webp_with_anim_without_exif.webp";
+    private static final String WEBP_WITHOUT_EXIF = "webp_without_exif.webp";
+    private static final String WEBP_WITHOUT_EXIF_WITH_LOSSLESS_ENCODING =
+            "webp_lossless_without_exif.webp";
     private static final String PNG_WITH_EXIF_BYTE_ORDER_II = "png_with_exif_byte_order_ii.png";
     private static final String PNG_WITHOUT_EXIF = "png_without_exif.png";
+    private static final String JPEG_WITH_DATETIME_TAG = "jpeg_with_datetime_tag.jpg";
 
     private static final String[] EXIF_TAGS = {
             ExifInterface.TAG_MAKE,
@@ -385,15 +390,12 @@
         }
     }
 
-    private void testExifInterfaceForStandalone(String fileName, int typedArrayResourceId)
+    private void readFromStandaloneDataWithExif(String fileName, int typedArrayResourceId)
             throws IOException {
         ExpectedValue expectedValue = new ExpectedValue(
                 getContext().getResources().obtainTypedArray(typedArrayResourceId));
 
-        // Test for reading from external data storage.
-        fileName = EXTERNAL_BASE_DIRECTORY + fileName;
-
-        File imageFile = new File(Environment.getExternalStorageDirectory(), fileName);
+        File imageFile = new File(mInpPrefix, fileName);
         String verboseTag = imageFile.getName();
 
         FileInputStream fis = new FileInputStream(imageFile);
@@ -412,7 +414,7 @@
 
     private void testExifInterfaceCommon(String fileName, ExpectedValue expectedValue)
             throws IOException {
-        File imageFile = new File(Environment.getExternalStorageDirectory(), fileName);
+        File imageFile = new File(mInpPrefix, fileName);
         String verboseTag = imageFile.getName();
 
         // Creates via path.
@@ -449,7 +451,7 @@
 
     private void testExifInterfaceRange(String fileName, ExpectedValue expectedValue)
             throws IOException {
-        File imageFile = new File(Environment.getExternalStorageDirectory(), fileName);
+        File imageFile = new File(mInpPrefix, fileName);
         InputStream in = null;
         try {
             in = new BufferedInputStream(new FileInputStream(imageFile.getAbsolutePath()));
@@ -500,9 +502,12 @@
         }
     }
 
-    private void testSaveAttributes_withFileName(String fileName, ExpectedValue expectedValue)
+    private void writeToFilesWithExif(String fileName, int typedArrayResourceId)
             throws IOException {
-        File srcFile = new File(Environment.getExternalStorageDirectory(), fileName);
+        ExpectedValue expectedValue = new ExpectedValue(
+                getContext().getResources().obtainTypedArray(typedArrayResourceId));
+
+        File srcFile = new File(mInpPrefix, fileName);
         File imageFile = clone(srcFile);
         String verboseTag = imageFile.getName();
 
@@ -531,25 +536,18 @@
         exifInterface.saveAttributes();
         exifInterface = new ExifInterface(imageFile.getAbsolutePath());
         compareWithExpectedValue(exifInterface, expectedValue, verboseTag, false);
-    }
-
-    private void testSaveAttributes_withFileDescriptor(String fileName, ExpectedValue expectedValue)
-            throws IOException {
-        File srcFile = new File(Environment.getExternalStorageDirectory(), fileName);
-        File imageFile = clone(srcFile);
-        String verboseTag = imageFile.getName();
 
         FileDescriptor fd = null;
         try {
             fd = Os.open(imageFile.getAbsolutePath(), OsConstants.O_RDWR, 0600);
-            ExifInterface exifInterface = new ExifInterface(fd);
+            exifInterface = new ExifInterface(fd);
             exifInterface.saveAttributes();
             Os.lseek(fd, 0, OsConstants.SEEK_SET);
             exifInterface = new ExifInterface(fd);
             compareWithExpectedValue(exifInterface, expectedValue, verboseTag, false);
 
             // Test for modifying one attribute.
-            String backupValue = exifInterface.getAttribute(ExifInterface.TAG_MAKE);
+            backupValue = exifInterface.getAttribute(ExifInterface.TAG_MAKE);
             exifInterface.setAttribute(ExifInterface.TAG_MAKE, "abc");
             exifInterface.saveAttributes();
             // Check if thumbnail offset and length are properly updated without parsing the data
@@ -576,36 +574,32 @@
         } finally {
             IoUtils.closeQuietly(fd);
         }
+        imageFile.delete();
     }
 
-    private void testExifInterfaceForReadAndWrite(String fileName, int typedArrayResourceId)
+    private void readFromFilesWithExif(String fileName, int typedArrayResourceId)
             throws IOException {
         ExpectedValue expectedValue = new ExpectedValue(
                 getContext().getResources().obtainTypedArray(typedArrayResourceId));
 
-        // Test for reading from external data storage.
-        fileName = EXTERNAL_BASE_DIRECTORY + fileName;
         testExifInterfaceCommon(fileName, expectedValue);
 
         // Test for checking expected range by retrieving raw data with given offset and length.
         testExifInterfaceRange(fileName, expectedValue);
-
-        // Test for saving attributes.
-        testSaveAttributes_withFileName(fileName, expectedValue);
-        testSaveAttributes_withFileDescriptor(fileName, expectedValue);
     }
 
-    private void testExifInterfaceForRead(String fileName, int typedArrayResourceId)
-            throws IOException {
-        ExpectedValue expectedValue = new ExpectedValue(
-                getContext().getResources().obtainTypedArray(typedArrayResourceId));
-
+    private void writeToFilesWithoutExif(String fileName) throws IOException {
         // Test for reading from external data storage.
-        fileName = EXTERNAL_BASE_DIRECTORY + fileName;
-        testExifInterfaceCommon(fileName, expectedValue);
+        File imageFile = clone(new File(mInpPrefix, fileName));
 
-        // Test for checking expected range by retrieving raw data with given offset and length.
-        testExifInterfaceRange(fileName, expectedValue);
+        ExifInterface exifInterface = new ExifInterface(imageFile.getAbsolutePath());
+        exifInterface.setAttribute(ExifInterface.TAG_MAKE, "abc");
+        exifInterface.saveAttributes();
+
+        exifInterface = new ExifInterface(imageFile.getAbsolutePath());
+        String make = exifInterface.getAttribute(ExifInterface.TAG_MAKE);
+        assertEquals("abc", make);
+        imageFile.delete();
     }
 
     private void testThumbnail(ExpectedValue expectedValue, ExifInterface exifInterface) {
@@ -631,21 +625,22 @@
     }
 
     public void testReadExifDataFromExifByteOrderIIJpeg() throws Throwable {
-        testExifInterfaceForReadAndWrite(EXIF_BYTE_ORDER_II_JPEG, R.array.exifbyteorderii_jpg);
+        readFromFilesWithExif(JPEG_WITH_EXIF_BYTE_ORDER_II, R.array.jpeg_with_exif_byte_order_ii);
+        writeToFilesWithExif(JPEG_WITH_EXIF_BYTE_ORDER_II, R.array.jpeg_with_exif_byte_order_ii);
     }
 
     public void testReadExifDataFromExifByteOrderMMJpeg() throws Throwable {
-        testExifInterfaceForReadAndWrite(EXIF_BYTE_ORDER_MM_JPEG, R.array.exifbyteordermm_jpg);
+        readFromFilesWithExif(JPEG_WITH_EXIF_BYTE_ORDER_MM, R.array.jpeg_with_exif_byte_order_mm);
+        writeToFilesWithExif(JPEG_WITH_EXIF_BYTE_ORDER_MM, R.array.jpeg_with_exif_byte_order_mm);
     }
 
     public void testReadExifDataFromLgG4Iso800Dng() throws Throwable {
-        testExifInterfaceForRead(LG_G4_ISO_800_DNG, R.array.lg_g4_iso_800_dng);
+        readFromFilesWithExif(DNG_WITH_EXIF_WITH_XMP, R.array.dng_with_exif_with_xmp);
     }
 
     public void testReadExifDataFromLgG4Iso800Jpg() throws Throwable {
-        stageFile(R.raw.lg_g4_iso_800, new File(Environment.getExternalStorageDirectory(),
-                EXTERNAL_BASE_DIRECTORY + LG_G4_ISO_800_JPG));
-        testExifInterfaceForReadAndWrite(LG_G4_ISO_800_JPG, R.array.lg_g4_iso_800_jpg);
+        readFromFilesWithExif(JPEG_WITH_EXIF_WITH_XMP, R.array.jpeg_with_exif_with_xmp);
+        writeToFilesWithExif(JPEG_WITH_EXIF_WITH_XMP, R.array.jpeg_with_exif_with_xmp);
     }
 
     public void testDoNotFailOnCorruptedImage() throws Throwable {
@@ -662,87 +657,87 @@
 
     public void testReadExifDataFromVolantisJpg() throws Throwable {
         // Test if it is possible to parse the volantis generated JPEG smoothly.
-        testExifInterfaceForReadAndWrite(VOLANTIS_JPEG, R.array.volantis_jpg);
+        readFromFilesWithExif(JPEG_VOLANTIS, R.array.volantis_jpg);
+        writeToFilesWithExif(JPEG_VOLANTIS, R.array.volantis_jpg);
     }
 
     public void testReadExifDataFromSonyRX100Arw() throws Throwable {
-        testExifInterfaceForRead(SONY_RX_100_ARW, R.array.sony_rx_100_arw);
+        readFromFilesWithExif(ARW_SONY_RX_100, R.array.sony_rx_100_arw);
     }
 
     public void testReadExifDataFromCanonG7XCr2() throws Throwable {
-        testExifInterfaceForRead(CANON_G7X_CR2, R.array.canon_g7x_cr2);
+        readFromFilesWithExif(CR2_CANON_G7X, R.array.canon_g7x_cr2);
     }
 
     public void testReadExifDataFromFujiX20Raf() throws Throwable {
-        testExifInterfaceForRead(FUJI_X20_RAF, R.array.fuji_x20_raf);
+        readFromFilesWithExif(RAF_FUJI_X20, R.array.fuji_x20_raf);
     }
 
     public void testReadExifDataFromNikon1AW1Nef() throws Throwable {
-        testExifInterfaceForRead(NIKON_1AW1_NEF, R.array.nikon_1aw1_nef);
+        readFromFilesWithExif(NEF_NIKON_1AW1, R.array.nikon_1aw1_nef);
     }
 
     public void testReadExifDataFromNikonP330Nrw() throws Throwable {
-        testExifInterfaceForRead(NIKON_P330_NRW, R.array.nikon_p330_nrw);
+        readFromFilesWithExif(NRW_NIKON_P330, R.array.nikon_p330_nrw);
     }
 
     public void testReadExifDataFromOlympusEPL3Orf() throws Throwable {
-        testExifInterfaceForRead(OLYMPUS_E_PL3_ORF, R.array.olympus_e_pl3_orf);
+        readFromFilesWithExif(ORF_OLYMPUS_E_PL3, R.array.olympus_e_pl3_orf);
     }
 
     public void testReadExifDataFromPanasonicGM5Rw2() throws Throwable {
-        testExifInterfaceForRead(PANASONIC_GM5_RW2, R.array.panasonic_gm5_rw2);
+        readFromFilesWithExif(RW2_PANASONIC_GM5, R.array.panasonic_gm5_rw2);
     }
 
     public void testReadExifDataFromPentaxK5Pef() throws Throwable {
-        testExifInterfaceForRead(PENTAX_K5_PEF, R.array.pentax_k5_pef);
+        readFromFilesWithExif(PEF_PENTAX_K5, R.array.pentax_k5_pef);
     }
 
     public void testReadExifDataFromSamsungNX3000Srw() throws Throwable {
-        testExifInterfaceForRead(SAMSUNG_NX3000_SRW, R.array.samsung_nx3000_srw);
+        readFromFilesWithExif(SRW_SAMSUNG_NX3000, R.array.samsung_nx3000_srw);
     }
 
     public void testStandaloneDataForRead() throws Throwable {
-        testExifInterfaceForStandalone(EXIF_BYTE_ORDER_II_JPEG, R.array.exifbyteorderii_standalone);
-        testExifInterfaceForStandalone(EXIF_BYTE_ORDER_MM_JPEG, R.array.exifbyteordermm_standalone);
+        readFromStandaloneDataWithExif(JPEG_WITH_EXIF_BYTE_ORDER_II,
+                R.array.standalone_data_with_exif_byte_order_ii);
+        readFromStandaloneDataWithExif(JPEG_WITH_EXIF_BYTE_ORDER_MM,
+                R.array.standalone_data_with_exif_byte_order_mm);
     }
 
-    public void testExifByteOrderIIPngForReadAndWrite() throws Throwable {
-        stageFile(R.raw.png_with_exif_byte_order_ii, new File(Environment.getExternalStorageDirectory(),
-                EXTERNAL_BASE_DIRECTORY + PNG_WITH_EXIF_BYTE_ORDER_II));
-        testExifInterfaceForRead(PNG_WITH_EXIF_BYTE_ORDER_II, R.array.exifbyteorderii_png);
+    public void testPngFiles() throws Throwable {
+        readFromFilesWithExif(PNG_WITH_EXIF_BYTE_ORDER_II, R.array.png_with_exif_byte_order_ii);
+        writeToFilesWithoutExif(PNG_WITHOUT_EXIF);
     }
 
-    public void testExifByteOrderIIWebpForRead() throws Throwable {
-        stageFile(R.raw.webp_with_exif, new File(Environment.getExternalStorageDirectory(),
-                EXTERNAL_BASE_DIRECTORY + WEBP_WITH_EXIF));
-        testExifInterfaceForRead(WEBP_WITH_EXIF, R.array.exifbyteorderii_webp);
+    public void testStandaloneData() throws Throwable {
+        readFromStandaloneDataWithExif(JPEG_WITH_EXIF_BYTE_ORDER_II,
+                R.array.standalone_data_with_exif_byte_order_ii);
+        readFromStandaloneDataWithExif(JPEG_WITH_EXIF_BYTE_ORDER_MM,
+                R.array.standalone_data_with_exif_byte_order_mm);
     }
 
-    public void testPngWithoutExifForWrite() throws Throwable {
-        stageFile(R.raw.png_without_exif, new File(Environment.getExternalStorageDirectory(),
-                EXTERNAL_BASE_DIRECTORY + PNG_WITHOUT_EXIF));
-
-        // Do we need to clone this file?
-        File imageFile = new File(Environment.getExternalStorageDirectory(),
-                EXTERNAL_BASE_DIRECTORY + PNG_WITHOUT_EXIF);
-        ExifInterface exifInterface = new ExifInterface(imageFile.getAbsolutePath());
-        exifInterface.setAttribute(ExifInterface.TAG_MAKE, "abc");
-        exifInterface.saveAttributes();
-        exifInterface = new ExifInterface(imageFile.getAbsolutePath());
-        String make = exifInterface.getAttribute(ExifInterface.TAG_MAKE);
-        assertEquals("abc", make);
+    public void testWebpFiles() throws Throwable {
+        readFromFilesWithExif(WEBP_WITH_EXIF, R.array.webp_with_exif);
+        writeToFilesWithExif(WEBP_WITH_EXIF, R.array.webp_with_exif);
+        writeToFilesWithoutExif(WEBP_WITHOUT_EXIF_WITH_ANIM_DATA);
+        writeToFilesWithoutExif(WEBP_WITHOUT_EXIF);
+        writeToFilesWithoutExif(WEBP_WITHOUT_EXIF_WITH_LOSSLESS_ENCODING);
     }
 
-    public void testSetDateTime() throws IOException {
+    public void testGetSetDateTime() throws IOException {
+        final long expectedDatetimeValue = 1454059947000L;
         final String dateTimeValue = "2017:02:02 22:22:22";
         final String dateTimeOriginalValue = "2017:01:01 11:11:11";
 
-        File srcFile = new File(Environment.getExternalStorageDirectory(),
-                EXTERNAL_BASE_DIRECTORY + EXIF_BYTE_ORDER_II_JPEG);
+        File srcFile = new File(mInpPrefix, JPEG_WITH_DATETIME_TAG);
         File imageFile = clone(srcFile);
 
-        FileUtils.copyFileOrThrow(srcFile, imageFile);
         ExifInterface exif = new ExifInterface(imageFile.getAbsolutePath());
+        assertEquals(expectedDatetimeValue, exif.getDateTime());
+        assertEquals(expectedDatetimeValue, exif.getDateTimeOriginal());
+        assertEquals(expectedDatetimeValue, exif.getDateTimeDigitized());
+        assertEquals(expectedDatetimeValue, exif.getGpsDateTime());
+
         exif.setAttribute(ExifInterface.TAG_DATETIME, dateTimeValue);
         exif.setAttribute(ExifInterface.TAG_DATETIME_ORIGINAL, dateTimeOriginalValue);
         exif.saveAttributes();
@@ -762,16 +757,9 @@
         imageFile.delete();
     }
 
-    private void stageFile(int resId, File file) throws IOException {
-        try (InputStream source = getContext().getResources().openRawResource(resId);
-                OutputStream target = new FileOutputStream(file)) {
-            FileUtils.copy(source, target);
-        }
-    }
-
     private static File clone(File original) throws IOException {
-        final File cloned = new File(original.getParentFile(),
-                "cts_" + System.nanoTime() + "_" + original.getName());
+        final File cloned =
+                File.createTempFile("cts_", +System.nanoTime() + "_" + original.getName());
         FileUtils.copyFileOrThrow(original, cloned);
         return cloned;
     }
diff --git a/tests/tests/media/src/android/media/cts/ExtractDecodeEditEncodeMuxTest.java b/tests/tests/media/src/android/media/cts/ExtractDecodeEditEncodeMuxTest.java
index ac8b2c3..d840ed5 100644
--- a/tests/tests/media/src/android/media/cts/ExtractDecodeEditEncodeMuxTest.java
+++ b/tests/tests/media/src/android/media/cts/ExtractDecodeEditEncodeMuxTest.java
@@ -18,7 +18,6 @@
 
 import android.annotation.TargetApi;
 import android.content.res.AssetFileDescriptor;
-import android.content.Context;
 import android.media.MediaCodec;
 import android.media.MediaCodecInfo;
 import android.media.MediaCodecInfo.CodecCapabilities;
@@ -29,6 +28,7 @@
 import android.media.MediaMuxer;
 import android.media.MediaPlayer;
 import android.os.Environment;
+import android.os.ParcelFileDescriptor;
 import android.platform.test.annotations.AppModeFull;
 import android.test.ActivityInstrumentationTestCase2;
 import android.util.Log;
@@ -38,9 +38,8 @@
 import android.media.MediaCodecInfo.CodecCapabilities;
 import android.media.MediaCodecInfo.CodecProfileLevel;
 
-import android.media.cts.R;
-
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.concurrent.atomic.AtomicReference;
@@ -66,6 +65,7 @@
 
     private static final String TAG = ExtractDecodeEditEncodeMuxTest.class.getSimpleName();
     private static final boolean VERBOSE = false; // lots of logging
+    static final String mInpPrefix = WorkDir.getMediaDirString();
 
     /** How long to wait for the next buffer to become available. */
     private static final int TIMEOUT_USEC = 10000;
@@ -115,7 +115,7 @@
     private int mHeight = -1;
 
     /** The raw resource used as the input file. */
-    private int mSourceResId;
+    private String mSourceRes;
 
     /** The destination file for the encoded output. */
     private String mOutputFile;
@@ -128,7 +128,7 @@
 
     public void testExtractDecodeEditEncodeMuxQCIF() throws Throwable {
         if(!setSize(176, 144)) return;
-        setSource(R.raw.video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz);
+        setSource("video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz.mp4");
         setCopyVideo();
         setVideoMimeType(MediaFormat.MIMETYPE_VIDEO_AVC);
         TestWrapper.runTest(this);
@@ -136,7 +136,7 @@
 
     public void testExtractDecodeEditEncodeMuxQVGA() throws Throwable {
         if(!setSize(320, 240)) return;
-        setSource(R.raw.video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz);
+        setSource("video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz.mp4");
         setCopyVideo();
         setVideoMimeType(MediaFormat.MIMETYPE_VIDEO_AVC);
         TestWrapper.runTest(this);
@@ -144,7 +144,7 @@
 
     public void testExtractDecodeEditEncodeMux720p() throws Throwable {
         if(!setSize(1280, 720)) return;
-        setSource(R.raw.video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz);
+        setSource("video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz.mp4");
         setCopyVideo();
         setVideoMimeType(MediaFormat.MIMETYPE_VIDEO_AVC);
         TestWrapper.runTest(this);
@@ -152,7 +152,7 @@
 
     public void testExtractDecodeEditEncodeMux2160pHevc() throws Throwable {
         if(!setSize(3840, 2160)) return;
-        setSource(R.raw.video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz);
+        setSource("video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz.mp4");
         setCopyVideo();
         setVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC);
         TestWrapper.runTest(this);
@@ -160,7 +160,7 @@
 
     public void testExtractDecodeEditEncodeMuxAudio() throws Throwable {
         if(!setSize(1280, 720)) return;
-        setSource(R.raw.video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz);
+        setSource("video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz.mp4");
         setCopyAudio();
         setVerifyAudioFormat();
         TestWrapper.runTest(this);
@@ -168,7 +168,7 @@
 
     public void testExtractDecodeEditEncodeMuxAudioVideo() throws Throwable {
         if(!setSize(1280, 720)) return;
-        setSource(R.raw.video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz);
+        setSource("video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz.mp4");
         setCopyAudio();
         setCopyVideo();
         setVerifyAudioFormat();
@@ -250,23 +250,23 @@
     /**
      * Sets the raw resource used as the source video.
      */
-    private void setSource(int resId) {
-        mSourceResId = resId;
+    private void setSource(String res) {
+        mSourceRes = res;
     }
 
     /**
      * Sets the name of the output file based on the other parameters.
      *
-     * <p>Must be called after {@link #setSize(int, int)} and {@link #setSource(int)}.
+     * <p>Must be called after {@link #setSize(int, int)} and {@link #setSource(String)}.
      */
     private void setOutputFile() {
         StringBuilder sb = new StringBuilder();
         sb.append(OUTPUT_FILENAME_DIR.getAbsolutePath());
         sb.append("/cts-media-");
         sb.append(getClass().getSimpleName());
-        assertTrue("should have called setSource() first", mSourceResId != -1);
+        assertTrue("should have called setSource() first", mSourceRes != null);
         sb.append('-');
-        sb.append(mSourceResId);
+        sb.append(mSourceRes);
         if (mCopyVideo) {
             assertTrue("should have called setSize() first", mWidth != -1);
             assertTrue("should have called setSize() first", mHeight != -1);
@@ -578,13 +578,20 @@
         }
     }
 
+    protected AssetFileDescriptor getAssetFileDescriptorFor(final String res)
+            throws FileNotFoundException {
+        File inpFile = new File(mInpPrefix + res);
+        ParcelFileDescriptor parcelFD =
+                ParcelFileDescriptor.open(inpFile, ParcelFileDescriptor.MODE_READ_ONLY);
+        return new AssetFileDescriptor(parcelFD, 0, parcelFD.getStatSize());
+    }
+
     /**
-     * Creates an extractor that reads its frames from {@link #mSourceResId}.
+     * Creates an extractor that reads its frames from {@link #mSourceRes}.
      */
     private MediaExtractor createExtractor() throws IOException {
         MediaExtractor extractor;
-        Context context = getInstrumentation().getTargetContext();
-        AssetFileDescriptor srcFd = context.getResources().openRawResourceFd(mSourceResId);
+        AssetFileDescriptor srcFd = getAssetFileDescriptorFor(mSourceRes);
         extractor = new MediaExtractor();
         extractor.setDataSource(srcFd.getFileDescriptor(), srcFd.getStartOffset(),
                 srcFd.getLength());
@@ -1179,7 +1186,7 @@
             }
         }
 
-        // Basic sanity checks.
+        // Basic validation checks.
         if (mCopyVideo) {
             assertEquals("encoded and decoded video frame counts should match",
                     videoDecodedFrameCount, videoEncodedFrameCount);
diff --git a/tests/tests/media/src/android/media/cts/ImageReaderDecoderTest.java b/tests/tests/media/src/android/media/cts/ImageReaderDecoderTest.java
index e43f7b6..ff61af0 100644
--- a/tests/tests/media/src/android/media/cts/ImageReaderDecoderTest.java
+++ b/tests/tests/media/src/android/media/cts/ImageReaderDecoderTest.java
@@ -20,7 +20,6 @@
 
 import android.content.Context;
 import android.content.res.AssetFileDescriptor;
-import android.content.res.Resources;
 import android.content.res.Resources.NotFoundException;
 import android.graphics.ImageFormat;
 import android.graphics.Rect;
@@ -35,9 +34,10 @@
 import android.media.MediaExtractor;
 import android.media.MediaFormat;
 import android.media.cts.CodecUtils;
-import android.media.cts.R;
 import android.os.Handler;
 import android.os.HandlerThread;
+import android.os.ParcelFileDescriptor;
+import android.platform.test.annotations.AppModeFull;
 import android.platform.test.annotations.Presubmit;
 import android.platform.test.annotations.RequiresDevice;
 import android.test.AndroidTestCase;
@@ -49,6 +49,8 @@
 import com.android.compatibility.common.util.MediaUtils;
 
 import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -71,6 +73,7 @@
 @Presubmit
 @SmallTest
 @RequiresDevice
+@AppModeFull(reason = "Instant apps cannot access the SD card")
 public class ImageReaderDecoderTest extends AndroidTestCase {
     private static final String TAG = "ImageReaderDecoderTest";
     private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
@@ -87,7 +90,6 @@
     private final static int MODE_IMAGEREADER = 0;
     private final static int MODE_IMAGE       = 1;
 
-    private Resources mResources;
     private MediaCodec.BufferInfo mBufferInfo = new MediaCodec.BufferInfo();
     private ImageReader mReader;
     private Surface mReaderSurface;
@@ -98,7 +100,6 @@
     @Override
     public void setContext(Context context) {
         super.setContext(context);
-        mResources = mContext.getResources();
     }
 
     @Override
@@ -117,7 +118,7 @@
     }
 
     static class MediaAsset {
-        public MediaAsset(int resource, int width, int height) {
+        public MediaAsset(String resource, int width, int height) {
             mResource = resource;
             mWidth = width;
             mHeight = height;
@@ -131,11 +132,11 @@
             return mHeight;
         }
 
-        public int getResource() {
+        public String getResource() {
             return mResource;
         }
 
-        private final int mResource;
+        private final String mResource;
         private final int mWidth;
         private final int mHeight;
     }
@@ -158,51 +159,60 @@
         private final MediaAsset[] mAssets;
     }
 
+    static final String mInpPrefix = WorkDir.getMediaDirString();
+    protected AssetFileDescriptor getAssetFileDescriptorFor(final String res)
+            throws FileNotFoundException {
+        File inpFile = new File(mInpPrefix + res);
+        ParcelFileDescriptor parcelFD =
+                ParcelFileDescriptor.open(inpFile, ParcelFileDescriptor.MODE_READ_ONLY);
+        return new AssetFileDescriptor(parcelFD, 0, parcelFD.getStatSize());
+    }
+
     private static MediaAssets H263_ASSETS = new MediaAssets(
             MediaFormat.MIMETYPE_VIDEO_H263,
-            new MediaAsset(R.raw.swirl_176x144_h263, 176, 144),
-            new MediaAsset(R.raw.swirl_352x288_h263, 352, 288),
-            new MediaAsset(R.raw.swirl_128x96_h263, 128, 96));
+            new MediaAsset("swirl_176x144_h263.3gp", 176, 144),
+            new MediaAsset("swirl_352x288_h263.3gp", 352, 288),
+            new MediaAsset("swirl_128x96_h263.3gp", 128, 96));
 
     private static MediaAssets MPEG4_ASSETS = new MediaAssets(
             MediaFormat.MIMETYPE_VIDEO_MPEG4,
-            new MediaAsset(R.raw.swirl_128x128_mpeg4, 128, 128),
-            new MediaAsset(R.raw.swirl_144x136_mpeg4, 144, 136),
-            new MediaAsset(R.raw.swirl_136x144_mpeg4, 136, 144),
-            new MediaAsset(R.raw.swirl_132x130_mpeg4, 132, 130),
-            new MediaAsset(R.raw.swirl_130x132_mpeg4, 130, 132));
+            new MediaAsset("swirl_128x128_mpeg4.mp4", 128, 128),
+            new MediaAsset("swirl_144x136_mpeg4.mp4", 144, 136),
+            new MediaAsset("swirl_136x144_mpeg4.mp4", 136, 144),
+            new MediaAsset("swirl_132x130_mpeg4.mp4", 132, 130),
+            new MediaAsset("swirl_130x132_mpeg4.mp4", 130, 132));
 
     private static MediaAssets H264_ASSETS = new MediaAssets(
             MediaFormat.MIMETYPE_VIDEO_AVC,
-            new MediaAsset(R.raw.swirl_128x128_h264, 128, 128),
-            new MediaAsset(R.raw.swirl_144x136_h264, 144, 136),
-            new MediaAsset(R.raw.swirl_136x144_h264, 136, 144),
-            new MediaAsset(R.raw.swirl_132x130_h264, 132, 130),
-            new MediaAsset(R.raw.swirl_130x132_h264, 130, 132));
+            new MediaAsset("swirl_128x128_h264.mp4", 128, 128),
+            new MediaAsset("swirl_144x136_h264.mp4", 144, 136),
+            new MediaAsset("swirl_136x144_h264.mp4", 136, 144),
+            new MediaAsset("swirl_132x130_h264.mp4", 132, 130),
+            new MediaAsset("swirl_130x132_h264.mp4", 130, 132));
 
     private static MediaAssets H265_ASSETS = new MediaAssets(
             MediaFormat.MIMETYPE_VIDEO_HEVC,
-            new MediaAsset(R.raw.swirl_128x128_h265, 128, 128),
-            new MediaAsset(R.raw.swirl_144x136_h265, 144, 136),
-            new MediaAsset(R.raw.swirl_136x144_h265, 136, 144),
-            new MediaAsset(R.raw.swirl_132x130_h265, 132, 130),
-            new MediaAsset(R.raw.swirl_130x132_h265, 130, 132));
+            new MediaAsset("swirl_128x128_h265.mp4", 128, 128),
+            new MediaAsset("swirl_144x136_h265.mp4", 144, 136),
+            new MediaAsset("swirl_136x144_h265.mp4", 136, 144),
+            new MediaAsset("swirl_132x130_h265.mp4", 132, 130),
+            new MediaAsset("swirl_130x132_h265.mp4", 130, 132));
 
     private static MediaAssets VP8_ASSETS = new MediaAssets(
             MediaFormat.MIMETYPE_VIDEO_VP8,
-            new MediaAsset(R.raw.swirl_128x128_vp8, 128, 128),
-            new MediaAsset(R.raw.swirl_144x136_vp8, 144, 136),
-            new MediaAsset(R.raw.swirl_136x144_vp8, 136, 144),
-            new MediaAsset(R.raw.swirl_132x130_vp8, 132, 130),
-            new MediaAsset(R.raw.swirl_130x132_vp8, 130, 132));
+            new MediaAsset("swirl_128x128_vp8.webm", 128, 128),
+            new MediaAsset("swirl_144x136_vp8.webm", 144, 136),
+            new MediaAsset("swirl_136x144_vp8.webm", 136, 144),
+            new MediaAsset("swirl_132x130_vp8.webm", 132, 130),
+            new MediaAsset("swirl_130x132_vp8.webm", 130, 132));
 
     private static MediaAssets VP9_ASSETS = new MediaAssets(
             MediaFormat.MIMETYPE_VIDEO_VP9,
-            new MediaAsset(R.raw.swirl_128x128_vp9, 128, 128),
-            new MediaAsset(R.raw.swirl_144x136_vp9, 144, 136),
-            new MediaAsset(R.raw.swirl_136x144_vp9, 136, 144),
-            new MediaAsset(R.raw.swirl_132x130_vp9, 132, 130),
-            new MediaAsset(R.raw.swirl_130x132_vp9, 130, 132));
+            new MediaAsset("swirl_128x128_vp9.webm", 128, 128),
+            new MediaAsset("swirl_144x136_vp9.webm", 144, 136),
+            new MediaAsset("swirl_136x144_vp9.webm", 136, 144),
+            new MediaAsset("swirl_132x130_vp9.webm", 132, 130),
+            new MediaAsset("swirl_130x132_vp9.webm", 130, 132));
 
     static final float SWIRL_FPS = 12.f;
 
@@ -249,7 +259,7 @@
 
         private void videoDecode(
                 MediaAsset asset, int imageFormat, int colorFormat, int mode, boolean checkSwirl) {
-            int video = asset.getResource();
+            String video = asset.getResource();
             int width = asset.getWidth();
             int height = asset.getHeight();
 
@@ -267,14 +277,14 @@
                 extractor = new MediaExtractor();
 
                 try {
-                    vidFD = mResources.openRawResourceFd(video);
+                    vidFD = getAssetFileDescriptorFor(video);
                     extractor.setDataSource(
                             vidFD.getFileDescriptor(), vidFD.getStartOffset(), vidFD.getLength());
                 } catch (NotFoundException e) {
                     // resource is compressed, uncompress locally
                     String tmpName = "tempStream";
                     tmpFile = File.createTempFile(tmpName, null, mContext.getCacheDir());
-                    is = mResources.openRawResource(video);
+                    is = new FileInputStream(mInpPrefix + video);
                     os = new FileOutputStream(tmpFile);
                     byte[] buf = new byte[1024];
                     int len;
@@ -303,8 +313,8 @@
                     vidFD.close();
                 }
             } catch (Throwable e) {
-                throw new RuntimeException("while " + mName + " decoding "
-                        + mResources.getResourceEntryName(video) + ": " + mediaFormat, e);
+                throw new RuntimeException(
+                        "while " + mName + " decoding " + video + ": " + mediaFormat, e);
             } finally {
                 if (decoder != null) {
                     decoder.release();
@@ -397,7 +407,7 @@
         Decoder[] decoders = other(new MediaAssets(
                 MediaFormat.MIMETYPE_VIDEO_AVC,
                 new MediaAsset(
-                        R.raw.video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz,
+                        "video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4",
                         480 /* width */, 360 /* height */)));
 
         decodeTest(decoders, MODE_IMAGEREADER, false /* checkSwirl */);
@@ -410,7 +420,7 @@
         Decoder[] decoders = goog(new MediaAssets(
                 MediaFormat.MIMETYPE_VIDEO_AVC,
                 new MediaAsset(
-                        R.raw.video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz,
+                        "video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4",
                         480 /* width */, 360 /* height */)));
 
         decodeTest(decoders, MODE_IMAGEREADER, false /* checkSwirl */);
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecBlockModelTest.java b/tests/tests/media/src/android/media/cts/MediaCodecBlockModelTest.java
index f6ac4f7..23333e5 100644
--- a/tests/tests/media/src/android/media/cts/MediaCodecBlockModelTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaCodecBlockModelTest.java
@@ -28,9 +28,10 @@
 import android.media.MediaDrm;
 import android.media.MediaExtractor;
 import android.media.MediaFormat;
-import android.media.cts.R;
 import android.net.Uri;
 import android.os.Build;
+import android.os.ParcelFileDescriptor;
+import android.platform.test.annotations.AppModeFull;
 import android.platform.test.annotations.Presubmit;
 import android.platform.test.annotations.RequiresDevice;
 import android.test.AndroidTestCase;
@@ -43,6 +44,8 @@
 import com.android.compatibility.common.util.MediaUtils;
 
 import java.io.IOException;
+import java.io.File;
+import java.io.FileNotFoundException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -52,14 +55,14 @@
 import java.util.UUID;;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.BooleanSupplier;
+import java.util.function.Supplier;
 
 /**
  * MediaCodec tests with CONFIGURE_FLAG_USE_BLOCK_MODEL.
  */
 @NonMediaMainlineTest
+@AppModeFull(reason = "Instant apps cannot access the SD card")
 public class MediaCodecBlockModelTest extends AndroidTestCase {
     private static final String TAG = "MediaCodecBlockModelTest";
     private static final boolean VERBOSE = false;           // lots of logging
@@ -71,8 +74,8 @@
 
     // Input buffers from this input video are queued up to and including the video frame with
     // timestamp LAST_BUFFER_TIMESTAMP_US.
-    private static final int INPUT_RESOURCE_ID =
-            R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz;
+    private static final String INPUT_RESOURCE =
+            "video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz.mp4";
     private static final long LAST_BUFFER_TIMESTAMP_US = 166666;
 
     // The test should fail if the codec never produces output frames for the truncated input.
@@ -80,6 +83,17 @@
     private static final int TIMEOUT_MS = 60000;  // 1 minute
 
     private boolean mIsAtLeastR = ApiLevelUtil.isAtLeast(Build.VERSION_CODES.R);
+
+    static final String mInpPrefix = WorkDir.getMediaDirString();
+
+    protected static AssetFileDescriptor getAssetFileDescriptorFor(final String res)
+            throws FileNotFoundException {
+        File inpFile = new File(mInpPrefix + res);
+        ParcelFileDescriptor parcelFD =
+                ParcelFileDescriptor.open(inpFile, ParcelFileDescriptor.MODE_READ_ONLY);
+        return new AssetFileDescriptor(parcelFD, 0, parcelFD.getStatSize());
+    }
+
     /**
      * Tests whether decoding a short group-of-pictures succeeds. The test queues a few video frames
      * then signals end-of-stream. The test fails if the decoder doesn't output the queued frames.
@@ -90,11 +104,11 @@
     public void testDecodeShortVideo() throws InterruptedException {
         if (!MediaUtils.check(mIsAtLeastR, "test needs Android 11")) return;
         runThread(() -> runDecodeShortVideo(
-                INPUT_RESOURCE_ID,
+                INPUT_RESOURCE,
                 LAST_BUFFER_TIMESTAMP_US,
                 true /* obtainBlockForEachBuffer */));
         runThread(() -> runDecodeShortVideo(
-                INPUT_RESOURCE_ID,
+                INPUT_RESOURCE,
                 LAST_BUFFER_TIMESTAMP_US,
                 false /* obtainBlockForEachBuffer */));
     }
@@ -122,11 +136,11 @@
     public void testDecodeShortAudio() throws InterruptedException {
         if (!MediaUtils.check(mIsAtLeastR, "test needs Android 11")) return;
         runThread(() -> runDecodeShortAudio(
-                INPUT_RESOURCE_ID,
+                INPUT_RESOURCE,
                 LAST_BUFFER_TIMESTAMP_US,
                 true /* obtainBlockForEachBuffer */));
         runThread(() -> runDecodeShortAudio(
-                INPUT_RESOURCE_ID,
+                INPUT_RESOURCE,
                 LAST_BUFFER_TIMESTAMP_US,
                 false /* obtainBlockForEachBuffer */));
     }
@@ -164,13 +178,17 @@
     public void testFormatChange() throws InterruptedException {
         if (!MediaUtils.check(mIsAtLeastR, "test needs Android 11")) return;
         List<FormatChangeEvent> events = new ArrayList<>();
-        runThread(() -> runDecodeShortVideo(
-                getMediaExtractorForMimeType(INPUT_RESOURCE_ID, "video/"),
+        Result result = runThread(() -> runDecodeShortVideo(
+                getMediaExtractorForMimeType(INPUT_RESOURCE, "video/"),
                 LAST_BUFFER_TIMESTAMP_US,
                 true /* obtainBlockForEachBuffer */,
                 MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, 320, 240),
                 events,
                 null /* sessionId */));
+        if (result == Result.SKIP) {
+            MediaUtils.skipTest("skipped");
+            return;
+        }
         int width = 320;
         int height = 240;
         for (FormatChangeEvent event : events) {
@@ -185,11 +203,17 @@
         assertEquals("Height should have been updated", 360, height);
     }
 
-    private void runThread(BooleanSupplier supplier) throws InterruptedException {
-        final AtomicBoolean completed = new AtomicBoolean(false);
+    private enum Result {
+        SUCCESS,
+        FAIL,
+        SKIP,
+    }
+
+    private Result runThread(Supplier<Result> supplier) throws InterruptedException {
+        final AtomicReference<Result> result = new AtomicReference<>(Result.FAIL);
         Thread thread = new Thread(new Runnable() {
             public void run() {
-                completed.set(supplier.getAsBoolean());
+                result.set(supplier.get());
             }
         });
         final AtomicReference<Throwable> throwable = new AtomicReference<>();
@@ -202,7 +226,8 @@
         if (t != null) {
             throw new AssertionError("There was an error while running the thread", t);
         }
-        assertTrue("timed out decoding to end-of-stream", completed.get());
+        assertTrue("timed out decoding to end-of-stream", result.get() != Result.FAIL);
+        return result.get();
     }
 
     private static class LinearInputBlock {
@@ -437,12 +462,12 @@
         final int index;
     }
 
-    private boolean runDecodeShortVideo(
-            int inputResourceId,
+    private Result runDecodeShortVideo(
+            String inputResource,
             long lastBufferTimestampUs,
             boolean obtainBlockForEachBuffer) {
         return runDecodeShortVideo(
-                getMediaExtractorForMimeType(inputResourceId, "video/"),
+                getMediaExtractorForMimeType(inputResource, "video/"),
                 lastBufferTimestampUs, obtainBlockForEachBuffer, null, null, null);
     }
 
@@ -480,7 +505,7 @@
         return byteArray;
     }
 
-    private boolean runDecodeShortEncryptedVideo(boolean obtainBlockForEachBuffer) {
+    private Result runDecodeShortEncryptedVideo(boolean obtainBlockForEachBuffer) {
         MediaExtractor extractor = new MediaExtractor();
 
         try (final MediaDrm drm = new MediaDrm(CLEARKEY_SCHEME_UUID)) {
@@ -502,7 +527,7 @@
             MediaDrmClearkeyTest.retrieveKeys(
                     drm, "cenc", sessionId, DRM_INIT_DATA, MediaDrm.KEY_TYPE_STREAMING,
                     new byte[][] { CLEAR_KEY_CENC });
-            boolean result = runDecodeShortVideo(
+            Result result = runDecodeShortVideo(
                     extractor, ENCRYPTED_CONTENT_LAST_BUFFER_TIMESTAMP_US,
                     obtainBlockForEachBuffer, null /* format */, null /* events */, sessionId);
             drm.closeSession(sessionId);
@@ -530,7 +555,7 @@
         }
     }
 
-    private boolean runDecodeShortVideo(
+    private Result runDecodeShortVideo(
             MediaExtractor mediaExtractor,
             Long lastBufferTimestampUs,
             boolean obtainBlockForEachBuffer,
@@ -558,7 +583,7 @@
             String[] codecs = MediaUtils.getDecoderNames(true /* isGoog */, mediaFormat);
             if (codecs.length == 0) {
                 Log.i(TAG, "No decoder found for format= " + mediaFormat);
-                return true;
+                return Result.SKIP;
             }
             mediaCodec = MediaCodec.createByCodecName(codecs[0]);
 
@@ -567,7 +592,7 @@
                 crypto.setMediaDrmSession(sessionId);
             }
             List<Long> timestampList = Collections.synchronizedList(new ArrayList<>());
-            boolean result = runComponentWithLinearInput(
+            Result result = runComponentWithLinearInput(
                     mediaCodec,
                     crypto,
                     mediaFormat,
@@ -581,7 +606,7 @@
                             .setContentEncrypted(sessionId != null)
                             .build(),
                     new SurfaceOutputSlotListener(outputSurface, timestampList, events));
-            if (result) {
+            if (result == Result.SUCCESS) {
                 assertTrue("Timestamp should match between input / output: " + timestampList,
                         timestampList.isEmpty());
             }
@@ -607,26 +632,26 @@
         }
     }
 
-    private boolean runDecodeShortAudio(
-            int inputResourceId,
+    private Result runDecodeShortAudio(
+            String inputResource,
             long lastBufferTimestampUs,
             boolean obtainBlockForEachBuffer) {
         MediaExtractor mediaExtractor = null;
         MediaCodec mediaCodec = null;
         try {
-            mediaExtractor = getMediaExtractorForMimeType(inputResourceId, "audio/");
+            mediaExtractor = getMediaExtractorForMimeType(inputResource, "audio/");
             MediaFormat mediaFormat =
                     mediaExtractor.getTrackFormat(mediaExtractor.getSampleTrackIndex());
             // TODO: b/147748978
             String[] codecs = MediaUtils.getDecoderNames(true /* isGoog */, mediaFormat);
             if (codecs.length == 0) {
                 Log.i(TAG, "No decoder found for format= " + mediaFormat);
-                return true;
+                return Result.SKIP;
             }
             mediaCodec = MediaCodec.createByCodecName(codecs[0]);
 
             List<Long> timestampList = Collections.synchronizedList(new ArrayList<>());
-            boolean result = runComponentWithLinearInput(
+            Result result = runComponentWithLinearInput(
                     mediaCodec,
                     null,  // crypto
                     mediaFormat,
@@ -639,7 +664,7 @@
                             .setTimestampQueue(timestampList)
                             .build(),
                     new DummyOutputSlotListener(false /* graphic */, timestampList));
-            if (result) {
+            if (result == Result.SUCCESS) {
                 assertTrue("Timestamp should match between input / output: " + timestampList,
                         timestampList.isEmpty());
             }
@@ -659,12 +684,12 @@
         }
     }
 
-    private boolean runEncodeShortAudio() {
+    private Result runEncodeShortAudio() {
         MediaExtractor mediaExtractor = null;
         MediaCodec mediaCodec = null;
         try {
             mediaExtractor = getMediaExtractorForMimeType(
-                    R.raw.okgoogle123_good, MediaFormat.MIMETYPE_AUDIO_RAW);
+                    "okgoogle123_good.wav", MediaFormat.MIMETYPE_AUDIO_RAW);
             MediaFormat mediaFormat = new MediaFormat(
                     mediaExtractor.getTrackFormat(mediaExtractor.getSampleTrackIndex()));
             mediaFormat.setString(MediaFormat.KEY_MIME, MediaFormat.MIMETYPE_AUDIO_AAC);
@@ -673,12 +698,12 @@
             String[] codecs = MediaUtils.getEncoderNames(true /* isGoog */, mediaFormat);
             if (codecs.length == 0) {
                 Log.i(TAG, "No encoder found for format= " + mediaFormat);
-                return true;
+                return Result.SKIP;
             }
             mediaCodec = MediaCodec.createByCodecName(codecs[0]);
 
             List<Long> timestampList = Collections.synchronizedList(new ArrayList<>());
-            boolean result = runComponentWithLinearInput(
+            Result result = runComponentWithLinearInput(
                     mediaCodec,
                     null,  // crypto
                     mediaFormat,
@@ -690,7 +715,7 @@
                             .setTimestampQueue(timestampList)
                             .build(),
                     new DummyOutputSlotListener(false /* graphic */, timestampList));
-            if (result) {
+            if (result == Result.SUCCESS) {
                 assertTrue("Timestamp should match between input / output: " + timestampList,
                         timestampList.isEmpty());
             }
@@ -710,7 +735,7 @@
         }
     }
 
-    private boolean runEncodeShortVideo() {
+    private Result runEncodeShortVideo() {
         final int kWidth = 176;
         final int kHeight = 144;
         final int kFrameRate = 15;
@@ -729,7 +754,7 @@
             String[] codecs = MediaUtils.getEncoderNames(true /* isGoog */, mediaFormat);
             if (codecs.length == 0) {
                 Log.i(TAG, "No encoder found for format= " + mediaFormat);
-                return true;
+                return Result.SKIP;
             }
             mediaCodec = MediaCodec.createByCodecName(codecs[0]);
 
@@ -742,7 +767,7 @@
                         kWidth, kHeight, HardwareBuffer.YCBCR_420_888, 1 /* layer */, usage)) {
                 Log.i(TAG, "HardwareBuffer doesn't support " + kWidth + "x" + kHeight
                         + "; YCBCR_420_888; usage(" + Long.toHexString(usage) + ")");
-                return true;
+                return Result.SKIP;
             }
 
             List<Long> timestampList = Collections.synchronizedList(new ArrayList<>());
@@ -782,7 +807,7 @@
                 try {
                     event = queue.take();
                 } catch (InterruptedException e) {
-                    return false;
+                    return Result.FAIL;
                 }
 
                 if (event.input) {
@@ -850,7 +875,7 @@
                 assertTrue("Timestamp should match between input / output: " + timestampList,
                         timestampList.isEmpty());
             }
-            return eos;
+            return eos ? Result.SUCCESS : Result.FAIL;
         } catch (IOException e) {
             throw new RuntimeException("error reading input resource", e);
         } catch (Exception e) {
@@ -868,7 +893,7 @@
         }
     }
 
-    private boolean runComponentWithLinearInput(
+    private Result runComponentWithLinearInput(
             MediaCodec mediaCodec,
             MediaCrypto crypto,
             MediaFormat mediaFormat,
@@ -926,7 +951,7 @@
             try {
                 event = queue.take();
             } catch (InterruptedException e) {
-                return false;
+                return Result.FAIL;
             }
 
             if (event.input) {
@@ -937,12 +962,13 @@
         }
 
         input.block.recycle();
-        return eos;
+        return eos ? Result.SUCCESS : Result.FAIL;
     }
 
-    private MediaExtractor getMediaExtractorForMimeType(int resourceId, String mimeTypePrefix) {
+    private MediaExtractor getMediaExtractorForMimeType(final String resource,
+            String mimeTypePrefix) {
         MediaExtractor mediaExtractor = new MediaExtractor();
-        try (AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(resourceId)) {
+        try (AssetFileDescriptor afd = getAssetFileDescriptorFor(resource)) {
             mediaExtractor.setDataSource(
                     afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
         } catch (IOException e) {
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java b/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
index 7e75fb7..e6e1ce6 100644
--- a/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
@@ -51,7 +51,7 @@
 import java.util.Vector;
 
 /**
- * Basic sanity test of data returned by MediaCodeCapabilities.
+ * Basic validation test of data returned by MediaCodeCapabilities.
  */
 @AppModeFull(reason = "Dynamic config disabled.")
 public class MediaCodecCapabilitiesTest extends MediaPlayerTestBase {
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecClearKeyPlayer.java b/tests/tests/media/src/android/media/cts/MediaCodecClearKeyPlayer.java
index f06687c..de9859f 100644
--- a/tests/tests/media/src/android/media/cts/MediaCodecClearKeyPlayer.java
+++ b/tests/tests/media/src/android/media/cts/MediaCodecClearKeyPlayer.java
@@ -15,6 +15,7 @@
  */
 package android.media.cts;
 
+import android.content.Context;
 import android.content.res.Resources;
 import android.content.res.AssetFileDescriptor;
 import android.media.AudioManager;
@@ -93,6 +94,7 @@
     private Thread mThread;
     private Uri mAudioUri;
     private Uri mVideoUri;
+    private Context mContext;
     private Resources mResources;
     private Error mErrorFromThread;
 
@@ -143,11 +145,12 @@
      * Media player class to stream CENC content using MediaCodec class.
      */
     public MediaCodecClearKeyPlayer(
-            List<Surface> surfaces, byte[] sessionId, boolean scrambled, Resources resources) {
+            List<Surface> surfaces, byte[] sessionId, boolean scrambled, Context context) {
         mSessionId = sessionId;
         mScrambled = scrambled;
         mSurfaces = new ArrayDeque<>(surfaces);
-        mResources = resources;
+        mContext = context;
+        mResources = context.getResources();
         mState = STATE_IDLE;
         mThread = new Thread(new Runnable() {
             @Override
@@ -300,22 +303,6 @@
         }
     }
 
-    private void setDataSource(MediaExtractor extractor, Uri uri, Map<String, String> headers)
-            throws IOException, MediaCasException {
-        String scheme = uri.getScheme();
-        if (scheme.startsWith("http")) {
-            extractor.setDataSource(uri.toString(), headers);
-        } else if (scheme.startsWith(FILE_SCHEME)) {
-            extractor.setDataSource(uri.toString().substring(FILE_SCHEME.length()), headers);
-        } else if (scheme.equals("android.resource")) {
-            int res = Integer.parseInt(uri.getLastPathSegment());
-            AssetFileDescriptor fd = mResources.openRawResourceFd(res);
-            extractor.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
-        } else {
-            throw new IllegalArgumentException(uri.toString());
-        }
-    }
-
     private void initCasAndDescrambler(MediaExtractor extractor) throws MediaCasException {
         int trackCount = extractor.getTrackCount();
         for (int trackId = 0; trackId < trackCount; trackId++) {
@@ -370,7 +357,7 @@
                 return;
             }
         }
-        setDataSource(mAudioExtractor, mAudioUri, mAudioHeaders);
+        mAudioExtractor.setDataSource(mContext, mAudioUri, mAudioHeaders);
 
         if (mScrambled) {
             initCasAndDescrambler(mAudioExtractor);
@@ -383,7 +370,7 @@
                     return;
                 }
             }
-            setDataSource(mVideoExtractor, mVideoUri, mVideoHeaders);
+            mVideoExtractor.setDataSource(mContext, mVideoUri, mVideoHeaders);
         }
 
         if (null == mVideoCodecStates) {
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecPlayerTestBase.java b/tests/tests/media/src/android/media/cts/MediaCodecPlayerTestBase.java
index 288b173..c0aff22 100644
--- a/tests/tests/media/src/android/media/cts/MediaCodecPlayerTestBase.java
+++ b/tests/tests/media/src/android/media/cts/MediaCodecPlayerTestBase.java
@@ -93,7 +93,7 @@
         mMediaCodecPlayer = new MediaCodecClearKeyPlayer(
                 surfaces,
                 sessionId, scrambled,
-                mContext.getResources());
+                mContext);
 
         mMediaCodecPlayer.setAudioDataSource(audioUrl, null, audioEncrypted);
         mMediaCodecPlayer.setVideoDataSource(videoUrl, null, videoEncrypted);
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecTest.java b/tests/tests/media/src/android/media/cts/MediaCodecTest.java
index d41716e..4027f3d 100644
--- a/tests/tests/media/src/android/media/cts/MediaCodecTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaCodecTest.java
@@ -39,13 +39,14 @@
 import android.media.MediaDrm.MediaDrmStateException;
 import android.media.MediaExtractor;
 import android.media.MediaFormat;
-import android.media.cts.R;
 import android.opengl.GLES20;
 import android.os.Build;
 import android.os.ConditionVariable;
 import android.os.Handler;
 import android.os.HandlerThread;
+import android.os.ParcelFileDescriptor;
 import android.os.PersistableBundle;
+import android.platform.test.annotations.AppModeFull;
 import android.platform.test.annotations.Presubmit;
 import android.platform.test.annotations.RequiresDevice;
 import android.test.AndroidTestCase;
@@ -61,6 +62,7 @@
 
 import java.io.BufferedInputStream;
 import java.io.Closeable;
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
@@ -87,10 +89,12 @@
 @Presubmit
 @SmallTest
 @RequiresDevice
+@AppModeFull(reason = "Instant apps cannot access the SD card")
 public class MediaCodecTest extends AndroidTestCase {
     private static final String TAG = "MediaCodecTest";
     private static final boolean VERBOSE = false;           // lots of logging
 
+    static final String mInpPrefix = WorkDir.getMediaDirString();
     // parameters for the video encoder
                                                             // H.264 Advanced Video Coding
     private static final String MIME_TYPE = MediaFormat.MIMETYPE_VIDEO_AVC;
@@ -113,8 +117,8 @@
     private boolean mAudioEncoderHadError = false;
     private volatile boolean mVideoEncodingOngoing = false;
 
-    private static final int INPUT_RESOURCE_ID =
-            R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz;
+    private static final String INPUT_RESOURCE =
+            "video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz.mp4";
 
     // The test should fail if the decoder never produces output frames for the input.
     // Time out decoding, as we have no way to query whether the decoder will produce output.
@@ -147,6 +151,8 @@
         tested = verifyException(format, false /* isEncoder */) || tested;
 
         // video encoder (H.264/AVC may not be present on some Android devices)
+        format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
+                MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible);
         tested = verifyException(format, true /* isEncoder */) || tested;
 
         // signal test is skipped due to no device media codecs.
@@ -733,7 +739,7 @@
             throws Exception, InterruptedException {
         String mimeTypePrefix  = audio ? "audio/" : "video/";
         final MediaExtractor mediaExtractor = getMediaExtractorForMimeType(
-                INPUT_RESOURCE_ID, mimeTypePrefix);
+                INPUT_RESOURCE, mimeTypePrefix);
         MediaFormat mediaFormat = mediaExtractor.getTrackFormat(
                 mediaExtractor.getSampleTrackIndex());
         if (!MediaUtils.checkDecoderForFormat(mediaFormat)) {
@@ -1184,7 +1190,7 @@
                     if (!audio) {
                         outputSurface = new OutputSurface(1, 1);
                     }
-                    mediaExtractor = getMediaExtractorForMimeType(INPUT_RESOURCE_ID, mimeTypePrefix);
+                    mediaExtractor = getMediaExtractorForMimeType(INPUT_RESOURCE, mimeTypePrefix);
                     MediaFormat mediaFormat =
                             mediaExtractor.getTrackFormat(mediaExtractor.getSampleTrackIndex());
                     if (!MediaUtils.checkDecoderForFormat(mediaFormat)) {
@@ -1349,8 +1355,8 @@
     public void testDecodeShortInput() throws InterruptedException {
         // Input buffers from this input video are queued up to and including the video frame with
         // timestamp LAST_BUFFER_TIMESTAMP_US.
-        final int INPUT_RESOURCE_ID =
-                R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz;
+        final String INPUT_RESOURCE =
+                "video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz.mp4";
         final long LAST_BUFFER_TIMESTAMP_US = 166666;
 
         // The test should fail if the decoder never produces output frames for the truncated input.
@@ -1361,7 +1367,7 @@
         Thread videoDecodingThread = new Thread(new Runnable() {
             @Override
             public void run() {
-                completed.set(runDecodeShortInput(INPUT_RESOURCE_ID, LAST_BUFFER_TIMESTAMP_US));
+                completed.set(runDecodeShortInput(INPUT_RESOURCE, LAST_BUFFER_TIMESTAMP_US));
             }
         });
         videoDecodingThread.start();
@@ -1371,7 +1377,7 @@
         }
     }
 
-    private boolean runDecodeShortInput(int inputResourceId, long lastBufferTimestampUs) {
+    private boolean runDecodeShortInput(final String inputResource, long lastBufferTimestampUs) {
         final int NO_BUFFER_INDEX = -1;
 
         OutputSurface outputSurface = null;
@@ -1379,7 +1385,7 @@
         MediaCodec mediaCodec = null;
         try {
             outputSurface = new OutputSurface(1, 1);
-            mediaExtractor = getMediaExtractorForMimeType(inputResourceId, "video/");
+            mediaExtractor = getMediaExtractorForMimeType(inputResource, "video/");
             MediaFormat mediaFormat =
                     mediaExtractor.getTrackFormat(mediaExtractor.getSampleTrackIndex());
             String mimeType = mediaFormat.getString(MediaFormat.KEY_MIME);
@@ -1854,10 +1860,13 @@
         return 0;   // not reached
     }
 
-    private MediaExtractor getMediaExtractorForMimeType(int resourceId, String mimeTypePrefix)
-            throws IOException {
+    private MediaExtractor getMediaExtractorForMimeType(final String resource,
+            String mimeTypePrefix) throws IOException {
         MediaExtractor mediaExtractor = new MediaExtractor();
-        AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(resourceId);
+        File inpFile = new File(mInpPrefix + resource);
+        ParcelFileDescriptor parcelFD =
+                ParcelFileDescriptor.open(inpFile, ParcelFileDescriptor.MODE_READ_ONLY);
+        AssetFileDescriptor afd = new AssetFileDescriptor(parcelFD, 0, parcelFD.getStatSize());
         try {
             mediaExtractor.setDataSource(
                     afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
@@ -2503,7 +2512,7 @@
 
     public void testAsyncRelease() throws Exception {
         OutputSurface outputSurface = new OutputSurface(1, 1);
-        MediaExtractor mediaExtractor = getMediaExtractorForMimeType(INPUT_RESOURCE_ID, "video/");
+        MediaExtractor mediaExtractor = getMediaExtractorForMimeType(INPUT_RESOURCE, "video/");
         MediaFormat mediaFormat =
                 mediaExtractor.getTrackFormat(mediaExtractor.getSampleTrackIndex());
         String mimeType = mediaFormat.getString(MediaFormat.KEY_MIME);
@@ -2683,7 +2692,7 @@
         try {
             MediaFormat newFormat = null;
             extractor = getMediaExtractorForMimeType(
-                    R.raw.noise_2ch_48khz_aot29_dr_sbr_sig2_mp4, "audio/");
+                    "noise_2ch_48khz_aot29_dr_sbr_sig2_mp4.m4a", "audio/");
             int trackIndex = extractor.getSampleTrackIndex();
             MediaFormat format = extractor.getTrackFormat(trackIndex);
             codec = createCodecByType(
diff --git a/tests/tests/media/src/android/media/cts/MediaDrmClearkeyTest.java b/tests/tests/media/src/android/media/cts/MediaDrmClearkeyTest.java
index 91c3ec4..e3c7f6b 100644
--- a/tests/tests/media/src/android/media/cts/MediaDrmClearkeyTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaDrmClearkeyTest.java
@@ -456,7 +456,7 @@
         mMediaCodecPlayer = new MediaCodecClearKeyPlayer(
                 getSurfaces(),
                 mSessionId, false /*scrambled */,
-                mContext.getResources());
+                mContext);
 
         Uri audioUrl = Uri.parse(Utils.getMediaPath() + CENC_AUDIO_PATH);
         mMediaCodecPlayer.setAudioDataSource(audioUrl, null, false);
@@ -541,7 +541,7 @@
         mMediaCodecPlayer = new MediaCodecClearKeyPlayer(
                 getSurfaces(),
                 mSessionId, false,
-                mContext.getResources());
+                mContext);
         mMediaCodecPlayer.setAudioDataSource(
                 Uri.parse(Utils.getMediaPath() + CENC_AUDIO_PATH), null, false);
         mMediaCodecPlayer.setVideoDataSource(
@@ -587,7 +587,7 @@
         mMediaCodecPlayer = new MediaCodecClearKeyPlayer(
                 getSurfaces(),
                 mSessionId, false,
-                mContext.getResources());
+                mContext);
         mMediaCodecPlayer.setAudioDataSource(
                 Uri.parse(Utils.getMediaPath() + CENC_AUDIO_PATH), null, false);
         mMediaCodecPlayer.setVideoDataSource(
@@ -1051,7 +1051,7 @@
             mSessionId = openSession(drm);
 
             mMediaCodecPlayer = new MediaCodecClearKeyPlayer(
-                    getSurfaces(), mSessionId, false, mContext.getResources());
+                    getSurfaces(), mSessionId, false, mContext);
             mMediaCodecPlayer.setAudioDataSource(
                     Uri.parse(Utils.getMediaPath() + CENC_AUDIO_PATH), null, false);
             mMediaCodecPlayer.setVideoDataSource(
diff --git a/tests/tests/media/src/android/media/cts/MediaExtractorTest.java b/tests/tests/media/src/android/media/cts/MediaExtractorTest.java
index d4df722..e04bd47 100644
--- a/tests/tests/media/src/android/media/cts/MediaExtractorTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaExtractorTest.java
@@ -19,7 +19,6 @@
 import static org.junit.Assert.assertNotEquals;
 
 import android.content.res.AssetFileDescriptor;
-import android.content.res.Resources;
 import android.icu.util.ULocale;
 import android.media.AudioFormat;
 import android.media.AudioPresentation;
@@ -30,8 +29,8 @@
 import android.media.MediaExtractor;
 import android.media.MediaFormat;
 import static android.media.MediaFormat.MIMETYPE_VIDEO_DOLBY_VISION;
-import android.media.cts.R;
 import android.os.Build;
+import android.os.ParcelFileDescriptor;
 import android.os.PersistableBundle;
 import android.platform.test.annotations.AppModeFull;
 import android.test.AndroidTestCase;
@@ -45,7 +44,11 @@
 
 import java.io.BufferedReader;
 import java.io.Closeable;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.Reader;
 import java.io.StreamTokenizer;
@@ -58,20 +61,19 @@
 import java.util.TreeMap;
 import java.util.UUID;
 
-
+@AppModeFull(reason = "Instant apps cannot access the SD card")
 public class MediaExtractorTest extends AndroidTestCase {
     private static final String TAG = "MediaExtractorTest";
     private static final UUID UUID_WIDEVINE = new UUID(0xEDEF8BA979D64ACEL, 0xA3C827DCD51D21EDL);
     private static final UUID UUID_PLAYREADY = new UUID(0x9A04F07998404286L, 0xAB92E65BE0885F95L);
     private static boolean mIsAtLeastR = ApiLevelUtil.isAtLeast(Build.VERSION_CODES.R);
 
-    protected Resources mResources;
+    static final String mInpPrefix = WorkDir.getMediaDirString();
     protected MediaExtractor mExtractor;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mResources = getContext().getResources();
         mExtractor = new MediaExtractor();
     }
 
@@ -81,18 +83,28 @@
         mExtractor.release();
     }
 
-    protected TestMediaDataSource getDataSourceFor(int resid) throws Exception {
-        AssetFileDescriptor afd = mResources.openRawResourceFd(resid);
+    protected AssetFileDescriptor getAssetFileDescriptorFor(final String res)
+            throws FileNotFoundException {
+        File inpFile = new File(mInpPrefix + res);
+        ParcelFileDescriptor parcelFD =
+                ParcelFileDescriptor.open(inpFile, ParcelFileDescriptor.MODE_READ_ONLY);
+        return new AssetFileDescriptor(parcelFD, 0, parcelFD.getStatSize());
+    }
+
+    protected TestMediaDataSource getDataSourceFor(final String res) throws Exception {
+        AssetFileDescriptor afd = getAssetFileDescriptorFor(res);
         return TestMediaDataSource.fromAssetFd(afd);
     }
 
-    protected TestMediaDataSource setDataSource(int resid) throws Exception {
-        TestMediaDataSource ds = getDataSourceFor(resid);
+    protected TestMediaDataSource setDataSource(final String res) throws Exception {
+        TestMediaDataSource ds = getDataSourceFor(res);
         mExtractor.setDataSource(ds);
         return ds;
     }
 
-    public void testNullMediaDataSourceIsRejected() throws Exception {
+    public void SKIP_testNullMediaDataSourceIsRejected() throws Exception {
+        // duplicate of CtsMediaV2TestCases:ExtractorUnitTest$TestApi
+        // #testIfNullMediaDataSourceIsRejectedBySetDataSource
         try {
             mExtractor.setDataSource((MediaDataSource)null);
             fail("Expected IllegalArgumentException.");
@@ -101,14 +113,17 @@
         }
     }
 
-    public void testMediaDataSourceIsClosedOnRelease() throws Exception {
-        TestMediaDataSource dataSource = setDataSource(R.raw.testvideo);
+    public void SKIP_testMediaDataSourceIsClosedOnRelease() throws Exception {
+        // duplicate of CtsMediaV2TestCases:ExtractorTest$SetDataSourceTest#testMediaDataSource
+        TestMediaDataSource dataSource = setDataSource("testvideo.3gp");
         mExtractor.release();
         assertTrue(dataSource.isClosed());
     }
 
-    public void testExtractorFailsIfMediaDataSourceThrows() throws Exception {
-        TestMediaDataSource dataSource = getDataSourceFor(R.raw.testvideo);
+    public void SKIP_testExtractorFailsIfMediaDataSourceThrows() throws Exception {
+        // duplicate of CtsMediaV2TestCases:ExtractorUnitTest$TestApi
+        // #testIfInvalidDataSourceIsRejectedBySetDataSource
+        TestMediaDataSource dataSource = getDataSourceFor("testvideo.3gp");
         dataSource.throwFromReadAt();
         try {
             mExtractor.setDataSource(dataSource);
@@ -119,7 +134,7 @@
     }
 
     public void testExtractorFailsIfMediaDataSourceReturnsAnError() throws Exception {
-        TestMediaDataSource dataSource = getDataSourceFor(R.raw.testvideo);
+        TestMediaDataSource dataSource = getDataSourceFor("testvideo.3gp");
         dataSource.returnFromReadAt(-2);
         try {
             mExtractor.setDataSource(dataSource);
@@ -130,14 +145,18 @@
     }
 
     // Smoke test MediaExtractor reading from a DataSource.
-    public void testExtractFromAMediaDataSource() throws Exception {
-        TestMediaDataSource dataSource = setDataSource(R.raw.testvideo);
+    public void SKIP_testExtractFromAMediaDataSource() throws Exception {
+        // duplicate of CtsMediaV2TestCases:ExtractorTest$SetDataSourceTest#testMediaDataSource and
+        // duplicate of CtsMediaV2TestCases:ExtractorTest$FunctionalityTest#testMetrics
+        TestMediaDataSource dataSource = setDataSource("testvideo.3gp");
         checkExtractorSamplesAndMetrics();
     }
 
     // Smoke test MediaExtractor reading from an AssetFileDescriptor.
-    public void testExtractFromAssetFileDescriptor() throws Exception {
-        AssetFileDescriptor afd = mResources.openRawResourceFd(R.raw.testvideo);
+    public void SKIP_testExtractFromAssetFileDescriptor() throws Exception {
+        // duplicate of CtsMediaV2TestCases:ExtractorTest$SetDataSourceTest#testAssetFD and
+        // duplicate of CtsMediaV2TestCases:ExtractorTest$FunctionalityTest#testMetrics
+       AssetFileDescriptor afd = getAssetFileDescriptorFor("testvideo.3gp");
         mExtractor.setDataSource(afd);
         checkExtractorSamplesAndMetrics();
         afd.close();
@@ -145,7 +164,7 @@
 
     // DolbyVisionMediaExtractor for profile-level (DvheDtr/Fhd30).
     public void testDolbyVisionMediaExtractorProfileDvheDtr() throws Exception {
-        TestMediaDataSource dataSource = setDataSource(R.raw.video_dovi_1920x1080_30fps_dvhe_04);
+        TestMediaDataSource dataSource = setDataSource("video_dovi_1920x1080_30fps_dvhe_04.mp4");
 
         assertTrue("There should be either 1 or 2 tracks",
             0 < mExtractor.getTrackCount() && 3 > mExtractor.getTrackCount());
@@ -191,8 +210,9 @@
     }
 
     // DolbyVisionMediaExtractor for profile-level (DvheStn/Fhd60).
-    public void testDolbyVisionMediaExtractorProfileDvheStn() throws Exception {
-        TestMediaDataSource dataSource = setDataSource(R.raw.video_dovi_1920x1080_60fps_dvhe_05);
+    public void SKIP_testDolbyVisionMediaExtractorProfileDvheStn() throws Exception {
+        // duplicate of CtsMediaV2TestCases:ExtractorTest$ValidateKeyValuePairs[video/dolby-vision]
+        TestMediaDataSource dataSource = setDataSource("video_dovi_1920x1080_60fps_dvhe_05.mp4");
 
         if (MediaUtils.hasDecoder(MIMETYPE_VIDEO_DOLBY_VISION)) {
             // DvheStn exposes only a single non-backward compatible Dolby Vision HDR track.
@@ -214,7 +234,7 @@
 
     // DolbyVisionMediaExtractor for profile-level (DvheSt/Fhd60).
     public void testDolbyVisionMediaExtractorProfileDvheSt() throws Exception {
-        TestMediaDataSource dataSource = setDataSource(R.raw.video_dovi_1920x1080_60fps_dvhe_08);
+        TestMediaDataSource dataSource = setDataSource("video_dovi_1920x1080_60fps_dvhe_08.mp4");
 
         assertTrue("There should be either 1 or 2 tracks",
             0 < mExtractor.getTrackCount() && 3 > mExtractor.getTrackCount());
@@ -261,7 +281,7 @@
 
     // DolbyVisionMediaExtractor for profile-level (DvavSe/Fhd60).
     public void testDolbyVisionMediaExtractorProfileDvavSe() throws Exception {
-        TestMediaDataSource dataSource = setDataSource(R.raw.video_dovi_1920x1080_60fps_dvav_09);
+        TestMediaDataSource dataSource = setDataSource("video_dovi_1920x1080_60fps_dvav_09.mp4");
 
         assertTrue("There should be either 1 or 2 tracks",
             0 < mExtractor.getTrackCount() && 3 > mExtractor.getTrackCount());
@@ -309,7 +329,7 @@
     // DolbyVisionMediaExtractor for profile-level (Dvav1 10.0/Uhd30)
     @SmallTest
     public void testDolbyVisionMediaExtractorProfileDvav1() throws Exception {
-        TestMediaDataSource dataSource = setDataSource(R.raw.video_dovi_3840x2160_30fps_dav1_10);
+        TestMediaDataSource dataSource = setDataSource("video_dovi_3840x2160_30fps_dav1_10.mp4");
 
         if (MediaUtils.hasDecoder(MIMETYPE_VIDEO_DOLBY_VISION)) {
             assertEquals(1, mExtractor.getTrackCount());
@@ -333,7 +353,7 @@
     // DolbyVisionMediaExtractor for profile-level (Dvav1 10.1/Uhd30)
     @SmallTest
     public void testDolbyVisionMediaExtractorProfileDvav1_2() throws Exception {
-        TestMediaDataSource dataSource = setDataSource(R.raw.video_dovi_3840x2160_30fps_dav1_10_2);
+        TestMediaDataSource dataSource = setDataSource("video_dovi_3840x2160_30fps_dav1_10_2.mp4");
 
         assertTrue("There should be either 1 or 2 tracks",
             0 < mExtractor.getTrackCount() && 3 > mExtractor.getTrackCount());
@@ -380,7 +400,7 @@
 
     public void testGetDrmInitData() throws Exception {
         if (!MediaUtils.check(mIsAtLeastR, "test needs Android 11")) return;
-        setDataSource(R.raw.psshtest);
+        setDataSource("psshtest.mp4");
         DrmInitData drmInitData = mExtractor.getDrmInitData();
         assertEquals(drmInitData.getSchemeInitDataCount(), 2);
         assertEquals(drmInitData.getSchemeInitDataAt(0).uuid, UUID_WIDEVINE);
@@ -441,8 +461,7 @@
     }
 
     public void testGetAudioPresentations() throws Exception {
-        final int resid = R.raw.MultiLangPerso_1PID_PC0_Select_AC4_H265_DVB_50fps_Audio_Only;
-        TestMediaDataSource dataSource = setDataSource(resid);
+        setDataSource("MultiLangPerso_1PID_PC0_Select_AC4_H265_DVB_50fps_Audio_Only.ts");
         int ac4TrackIndex = -1;
         for (int i = 0; i < mExtractor.getTrackCount(); i++) {
             MediaFormat format = mExtractor.getTrackFormat(i);
@@ -539,7 +558,8 @@
     }
 
     @AppModeFull(reason = "Instant apps cannot bind sockets.")
-    public void testExtractorGetCachedDuration() throws Exception {
+    public void SKIP_testExtractorGetCachedDuration() throws Exception {
+        // duplicate of CtsMediaV2TestCases:ExtractorTest$SetDataSourceTest#testUrlDataSource
         CtsTestServer foo = new CtsTestServer(getContext());
         String url = foo.getAssetUrl("ringer.mp3");
         mExtractor.setDataSource(url);
@@ -548,9 +568,10 @@
         foo.shutdown();
     }
 
-    public void testExtractorHasCacheReachedEndOfStream() throws Exception {
+    public void SKIP_testExtractorHasCacheReachedEndOfStream() throws Exception {
+        // duplicate of CtsMediaV2TestCases:ExtractorTest$SetDataSourceTest#testUrlDataSource
         // Using file source to get deterministic result.
-        AssetFileDescriptor afd = mResources.openRawResourceFd(R.raw.testvideo);
+        AssetFileDescriptor afd = getAssetFileDescriptorFor("testvideo.3gp");
         mExtractor.setDataSource(afd);
         assertTrue(mExtractor.hasCacheReachedEndOfStream());
         afd.close();
@@ -560,16 +581,17 @@
      * Makes sure if PTS(order) of a video file with BFrames matches the expected values in
      * the corresponding text file with just PTS values.
      */
-    public void testVideoPresentationTimeStampsMatch() throws Exception {
-        setDataSource(R.raw.binary_counter_320x240_30fps_600frames);
+    public void SKIP_testVideoPresentationTimeStampsMatch() throws Exception {
+        // duplicate of CtsMediaV2TestCases:ExtractorTest$ExtractorTimeStampTest
+        setDataSource("binary_counter_320x240_30fps_600frames.mp4");
         // Select the only video track present in the file.
         final int trackCount = mExtractor.getTrackCount();
         for (int i = 0; i < trackCount; i++) {
             mExtractor.selectTrack(i);
         }
 
-        Reader txtRdr = new BufferedReader(new InputStreamReader(mResources.openRawResource(
-                R.raw.timestamps_binary_counter_320x240_30fps_600frames)));
+        Reader txtRdr = new BufferedReader(new InputStreamReader(new FileInputStream(
+                mInpPrefix + "timestamps_binary_counter_320x240_30fps_600frames.txt")));
         StreamTokenizer strTok = new StreamTokenizer(txtRdr);
         strTok.parseNumbers();
 
@@ -745,7 +767,9 @@
     }
 
     @SmallTest
-    public void testFlacIdentity() throws Exception {
+    public void SKIP_testFlacIdentity() throws Exception {
+        // duplicate of CtsMediaV2TestCases:CodecEncoderTest$testLosslessEncodeDecode[audio/flac]
+        // duplicate of CtsMediaV2TestCases:ExtractorTest$FusedExtractorDecoderTest[audio/flac]
         final int PCM_FRAMES = 1152 * 4; // FIXME: requires 4 flac frames to work with OMX codecs.
         final int CHANNEL_COUNT = 2;
         final int SAMPLES = PCM_FRAMES * CHANNEL_COUNT;
@@ -786,9 +810,9 @@
         }
     }
 
-    public void testFlacMovExtraction() throws Exception {
-        AssetFileDescriptor testFd = mResources.openRawResourceFd(R.raw.sinesweepalac);
-
+    public void SKIP_testFlacMovExtraction() throws Exception {
+        // duplicate of CtsMediaV2TestCases:ExtractorTest$FusedExtractorDecoderTest[audio/flac]
+        AssetFileDescriptor testFd = getAssetFileDescriptorFor("sinesweepalac.mov");
         MediaExtractor extractor = new MediaExtractor();
         extractor.setDataSource(testFd.getFileDescriptor(), testFd.getStartOffset(),
                 testFd.getLength());
@@ -811,7 +835,7 @@
     }
 
     public void testProgramStreamExtraction() throws Exception {
-        AssetFileDescriptor testFd = mResources.openRawResourceFd(R.raw.programstream);
+        AssetFileDescriptor testFd = getAssetFileDescriptorFor("programstream.mpeg");
 
         MediaExtractor extractor = new MediaExtractor();
         extractor.setDataSource(testFd.getFileDescriptor(), testFd.getStartOffset(),
@@ -879,8 +903,8 @@
         extractor.release();
     }
 
-    private void doTestAdvance(int res) throws Exception {
-        AssetFileDescriptor testFd = mResources.openRawResourceFd(res);
+    private void doTestAdvance(final String res) throws Exception {
+        AssetFileDescriptor testFd = getAssetFileDescriptorFor(res);
 
         MediaExtractor extractor = new MediaExtractor();
         extractor.setDataSource(testFd.getFileDescriptor(), testFd.getStartOffset(),
@@ -917,23 +941,25 @@
         extractor.release();
     }
 
-    public void testAdvance() throws Exception {
+    public void SKIP_testAdvance() throws Exception {
+        // duplicate of CtsMediaV2TestCases:ExtractorTest$SetDataSourceTest and
+        // duplicate of CtsMediaV2TestCases:ExtractorTest$FunctionalityTest#testExtract[*]
         // audio-only
-        doTestAdvance(R.raw.sinesweepm4a);
-        doTestAdvance(R.raw.sinesweepmp3lame);
-        doTestAdvance(R.raw.sinesweepmp3smpb);
-        doTestAdvance(R.raw.sinesweepwav);
-        doTestAdvance(R.raw.sinesweepflac);
-        doTestAdvance(R.raw.sinesweepogg);
-        doTestAdvance(R.raw.sinesweepoggmkv);
+        doTestAdvance("sinesweepm4a.m4a");
+        doTestAdvance("sinesweepmp3lame.mp3");
+        doTestAdvance("sinesweepmp3smpb.mp3");
+        doTestAdvance("sinesweepwav.wav");
+        doTestAdvance("sinesweepflac.flac");
+        doTestAdvance("sinesweepogg.ogg");
+        doTestAdvance("sinesweepoggmkv.mkv");
 
         // video-only
-        doTestAdvance(R.raw.swirl_144x136_mpeg4);
-        doTestAdvance(R.raw.video_640x360_mp4_hevc_450kbps_no_b);
+        doTestAdvance("swirl_144x136_mpeg4.mp4");
+        doTestAdvance("video_640x360_mp4_hevc_450kbps_no_b.mp4");
 
         // audio+video
-        doTestAdvance(R.raw.video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz);
-        doTestAdvance(R.raw.video_1280x720_mkv_h265_500kbps_25fps_aac_stereo_128kbps_44100hz);
+        doTestAdvance("video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz.mp4");
+        doTestAdvance("video_1280x720_mkv_h265_500kbps_25fps_aac_stereo_128kbps_44100hz.mkv");
     }
 
     private void readAllData() {
@@ -953,64 +979,67 @@
         } while (mExtractor.advance());
     }
 
-    public void testAC3inMP4() throws Exception {
-        setDataSource(R.raw.testac3mp4);
+    public void SKIP_testAC3inMP4() throws Exception {
+        // duplicate of CtsMediaV2TestCases:ExtractorTest$FunctionalityTest[audio/ac3]
+        setDataSource("testac3mp4.mp4");
         readAllData();
     }
 
-    public void testEAC3inMP4() throws Exception {
-        setDataSource(R.raw.testeac3mp4);
+    public void SKIP_testEAC3inMP4() throws Exception {
+        // duplicate of CtsMediaV2TestCases:ExtractorTest$FunctionalityTest[audio/eac3]
+        setDataSource("testeac3mp4.mp4");
         readAllData();
     }
 
-    public void testAC3inTS() throws Exception {
-        setDataSource(R.raw.testac3ts);
+    public void SKIP_testAC3inTS() throws Exception {
+        // duplicate of CtsMediaV2TestCases:ExtractorTest$FunctionalityTest[audio/ac3]
+        setDataSource("testac3ts.ts");
         readAllData();
     }
 
-    public void testEAC3inTS() throws Exception {
-        setDataSource(R.raw.testeac3ts);
+    public void SKIP_testEAC3inTS() throws Exception {
+        // duplicate of CtsMediaV2TestCases:ExtractorTest$FunctionalityTest[audio/eac3]
+        setDataSource("testeac3ts.ts");
         readAllData();
     }
 
-    public void testAC4inMP4() throws Exception {
-        setDataSource(R.raw.multi0);
+    public void SKIP_testAC4inMP4() throws Exception {
+        // duplicate of CtsMediaV2TestCases:ExtractorTest$FunctionalityTest[audio/ac4]
+        setDataSource("multi0.mp4");
         readAllData();
     }
 
     public void testAV1InMP4() throws Exception {
-        setDataSource(R.raw.video_dovi_3840x2160_30fps_dav1_10_2);
+        setDataSource("video_dovi_3840x2160_30fps_dav1_10_2.mp4");
         readAllData();
     }
 
     public void testDolbyVisionInMP4() throws Exception {
-        setDataSource(R.raw.video_dovi_3840x2160_30fps_dav1_10);
+        setDataSource("video_dovi_3840x2160_30fps_dav1_10.mp4");
         readAllData();
     }
 
     public void testPcmLeInMov() throws Exception {
-        setDataSource(R.raw.sinesweeppcmlemov);
+        setDataSource("sinesweeppcmlemov.mov");
         readAllData();
     }
 
     public void testPcmBeInMov() throws Exception {
-        setDataSource(R.raw.sinesweeppcmbemov);
+        setDataSource("sinesweeppcmbemov.mov");
         readAllData();
     }
 
     public void testFragmentedRead() throws Exception {
-        setDataSource(R.raw.psshtest);
+        setDataSource("psshtest.mp4");
         readAllData();
     }
 
     @AppModeFull(reason = "Instant apps cannot bind sockets.")
     public void testFragmentedHttpRead() throws Exception {
         CtsTestServer server = new CtsTestServer(getContext());
-        String rname = mResources.getResourceEntryName(R.raw.psshtest);
-        String url = server.getAssetUrl("raw/" + rname);
+        String url = server.getAssetUrl(mInpPrefix + "psshtest.mp4");
         mExtractor.setDataSource(url);
         readAllData();
         server.shutdown();
     }
-
 }
diff --git a/tests/tests/media/src/android/media/cts/MediaMetadataRetrieverTest.java b/tests/tests/media/src/android/media/cts/MediaMetadataRetrieverTest.java
index 48208d9..24a598a 100644
--- a/tests/tests/media/src/android/media/cts/MediaMetadataRetrieverTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaMetadataRetrieverTest.java
@@ -23,7 +23,6 @@
 
 import android.content.pm.PackageManager;
 import android.content.res.AssetFileDescriptor;
-import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.Color;
@@ -33,7 +32,7 @@
 import android.media.MediaFormat;
 import android.media.MediaMetadataRetriever;
 import android.media.MediaRecorder;
-import android.media.cts.R;
+import android.os.ParcelFileDescriptor;
 import android.net.Uri;
 import android.os.Build;
 import android.os.Environment;
@@ -70,7 +69,7 @@
     private static final boolean SAVE_BITMAP_OUTPUT = false;
     private static final String TEST_MEDIA_FILE = "retriever_test.3gp";
 
-    protected Resources mResources;
+    static final String mInpPrefix = WorkDir.getMediaDirString();
     protected MediaMetadataRetriever mRetriever;
     private PackageManager mPackageManager;
 
@@ -92,7 +91,6 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mResources = getContext().getResources();
         mRetriever = new MediaMetadataRetriever();
         mPackageManager = getContext().getPackageManager();
     }
@@ -107,9 +105,17 @@
         }
     }
 
-    protected void setDataSourceFd(int resid) {
+    protected AssetFileDescriptor getAssetFileDescriptorFor(final String res)
+            throws FileNotFoundException {
+        File inpFile = new File(mInpPrefix + res);
+        ParcelFileDescriptor parcelFD =
+                ParcelFileDescriptor.open(inpFile, ParcelFileDescriptor.MODE_READ_ONLY);
+        return new AssetFileDescriptor(parcelFD, 0, parcelFD.getStatSize());
+    }
+
+    protected void setDataSourceFd(final String res) {
         try {
-            AssetFileDescriptor afd = mResources.openRawResourceFd(resid);
+            AssetFileDescriptor afd = getAssetFileDescriptorFor(res);
             mRetriever.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
             afd.close();
         } catch (Exception e) {
@@ -117,10 +123,10 @@
         }
     }
 
-    protected TestMediaDataSource setDataSourceCallback(int resid) {
+    protected TestMediaDataSource setDataSourceCallback(final String res) {
         TestMediaDataSource ds = null;
         try {
-            AssetFileDescriptor afd = mResources.openRawResourceFd(resid);
+            AssetFileDescriptor afd = getAssetFileDescriptorFor(res);
             ds = TestMediaDataSource.fromAssetFd(afd);
             mRetriever.setDataSource(ds);
         } catch (Exception e) {
@@ -129,10 +135,10 @@
         return ds;
     }
 
-    protected TestMediaDataSource getFaultyDataSource(int resid, boolean throwing) {
+    protected TestMediaDataSource getFaultyDataSource(final String res, boolean throwing) {
         TestMediaDataSource ds = null;
         try {
-            AssetFileDescriptor afd = mResources.openRawResourceFd(resid);
+            AssetFileDescriptor afd = getAssetFileDescriptorFor(res);
             ds = TestMediaDataSource.fromAssetFd(afd);
             if (throwing) {
                 ds.throwFromReadAt();
@@ -145,8 +151,41 @@
         return ds;
     }
 
+    public void testAudioMetadata() {
+        setDataSourceCallback("audio_with_metadata.mp3");
+
+        assertEquals("Title was other than expected",
+            "Chimey Phone",
+            mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE));
+
+        assertEquals("Artist was other than expected",
+            "Some artist",
+            mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST));
+
+        assertNull("Album artist was unexpectedly present",
+            mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUMARTIST));
+
+        assertNull("Author was unexpectedly present",
+            mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_AUTHOR));
+
+        assertNull("Composer was unexpectedly present",
+            mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_COMPOSER));
+
+        assertEquals("Number of tracks was other than expected",
+            "1",
+            mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS));
+
+        assertEquals("Has audio was other than expected",
+            "yes",
+            mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_AUDIO));
+
+        assertEquals("Mime type was other than expected",
+            "audio/mpeg",
+            mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE));
+    }
+
     public void test3gppMetadata() {
-        setDataSourceCallback(R.raw.testvideo);
+        setDataSourceCallback("testvideo.3gp");
 
         assertEquals("Title was other than expected",
                 "Title", mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE));
@@ -242,7 +281,8 @@
     }
 
     public void testID3v2Metadata() {
-        setDataSourceFd(R.raw.video_480x360_mp4_h264_500kbps_25fps_aac_stereo_128kbps_44100hz_id3v2);
+        setDataSourceFd(
+                "video_480x360_mp4_h264_500kbps_25fps_aac_stereo_128kbps_44100hz_id3v2.mp4");
 
         assertEquals("Title was other than expected",
                 "Title", mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE));
@@ -338,14 +378,14 @@
     }
 
     public void testID3v2Unsynchronization() {
-        setDataSourceFd(R.raw.testmp3_4);
+        setDataSourceFd("testmp3_4.mp3");
         assertEquals("Mime type was other than expected",
                 "audio/mpeg",
                 mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE));
     }
 
     public void testID3v240ExtHeader() {
-        setDataSourceFd(R.raw.sinesweepid3v24ext);
+        setDataSourceFd("sinesweepid3v24ext.mp3");
         assertEquals("Mime type was other than expected",
                 "audio/mpeg",
                 mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE));
@@ -357,7 +397,7 @@
     }
 
     public void testID3v230ExtHeader() {
-        setDataSourceFd(R.raw.sinesweepid3v23ext);
+        setDataSourceFd("sinesweepid3v23ext.mp3");
         assertEquals("Mime type was other than expected",
                 "audio/mpeg",
                 mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE));
@@ -369,7 +409,7 @@
     }
 
     public void testID3v230ExtHeaderBigEndian() {
-        setDataSourceFd(R.raw.sinesweepid3v23extbe);
+        setDataSourceFd("sinesweepid3v23extbe.mp3");
         assertEquals("Mime type was other than expected",
                 "audio/mpeg",
                 mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE));
@@ -381,7 +421,7 @@
     }
 
     public void testMp4AlbumArt() {
-        setDataSourceFd(R.raw.swirl_128x128_h264_albumart);
+        setDataSourceFd("swirl_128x128_h264_albumart.mp4");
         assertEquals("Mime type was other than expected",
                 "video/mp4",
                 mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE));
@@ -392,21 +432,21 @@
     public void testGenreParsing() {
         if (!MediaUtils.check(mIsAtLeastR, "test needs Android 11")) return;
         Object [][] genres = {
-            { R.raw.id3test0, null },
-            { R.raw.id3test1, "Country" },
-            { R.raw.id3test2, "Classic Rock, Android" },
-            { R.raw.id3test3, null },
-            { R.raw.id3test4, "Classic Rock, (Android)" },
-            { R.raw.id3test5, null },
-            { R.raw.id3test6, "Funk, Grunge, Hip-Hop" },
-            { R.raw.id3test7, null },
-            { R.raw.id3test8, "Disco" },
-            { R.raw.id3test9, "Cover" },
-            { R.raw.id3test10, "Pop, Remix" },
-            { R.raw.id3test11, "Remix" },
+            { "id3test0.mp3", null },
+            { "id3test1.mp3", "Country" },
+            { "id3test2.mp3", "Classic Rock, Android" },
+            { "id3test3.mp3", null },
+            { "id3test4.mp3", "Classic Rock, (Android)" },
+            { "id3test5.mp3", null },
+            { "id3test6.mp3", "Funk, Grunge, Hip-Hop" },
+            { "id3test7.mp3", null },
+            { "id3test8.mp3", "Disco" },
+            { "id3test9.mp3", "Cover" },
+            { "id3test10.mp3", "Pop, Remix" },
+            { "id3test11.mp3", "Remix" },
         };
         for (Object [] genre: genres) {
-            setDataSourceFd((Integer)genre[0] /* resource id */);
+            setDataSourceFd((String)genre[0] /* resource id */);
             assertEquals("Unexpected genre: ",
                     genre[1] /* genre */,
                     mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE));
@@ -414,7 +454,7 @@
     }
 
     public void testBitsPerSampleAndSampleRate() {
-        setDataSourceFd(R.raw.testwav_16bit_44100hz);
+        setDataSourceFd("testwav_16bit_44100hz.wav");
 
         assertEquals("Bits per sample was other than expected",
                 "16",
@@ -427,18 +467,18 @@
     }
 
     public void testGetEmbeddedPicture() {
-        setDataSourceFd(R.raw.largealbumart);
+        setDataSourceFd("largealbumart.mp3");
 
         assertNotNull("couldn't retrieve album art", mRetriever.getEmbeddedPicture());
     }
 
     public void testAlbumArtInOgg() throws Exception {
-        setDataSourceFd(R.raw.sinesweepoggalbumart);
+        setDataSourceFd("sinesweepoggalbumart.ogg");
         assertNotNull("couldn't retrieve album art from ogg", mRetriever.getEmbeddedPicture());
     }
 
     public void testSetDataSourcePath() {
-        copyMeidaFile();
+        copyMediaFile();
         File file = new File(Environment.getExternalStorageDirectory(), TEST_MEDIA_FILE);
         try {
             mRetriever.setDataSource(file.getAbsolutePath());
@@ -448,7 +488,7 @@
     }
 
     public void testSetDataSourceUri() {
-        copyMeidaFile();
+        copyMediaFile();
         File file = new File(Environment.getExternalStorageDirectory(), TEST_MEDIA_FILE);
         try {
             Uri uri = Uri.parse(file.getAbsolutePath());
@@ -486,14 +526,14 @@
     }
 
     public void testMediaDataSourceIsClosedOnRelease() throws Exception {
-        TestMediaDataSource dataSource = setDataSourceCallback(R.raw.testvideo);
+        TestMediaDataSource dataSource = setDataSourceCallback("testvideo.3gp");
         mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
         mRetriever.release();
         assertTrue(dataSource.isClosed());
     }
 
     public void testRetrieveFailsIfMediaDataSourceThrows() throws Exception {
-        TestMediaDataSource ds = getFaultyDataSource(R.raw.testvideo, true /* throwing */);
+        TestMediaDataSource ds = getFaultyDataSource("testvideo.3gp", true /* throwing */);
         try {
             mRetriever.setDataSource(ds);
             fail("Failed to throw exceptions");
@@ -503,7 +543,7 @@
     }
 
     public void testRetrieveFailsIfMediaDataSourceReturnsAnError() throws Exception {
-        TestMediaDataSource ds = getFaultyDataSource(R.raw.testvideo, false /* throwing */);
+        TestMediaDataSource ds = getFaultyDataSource("testvideo.3gp", false /* throwing */);
         try {
             mRetriever.setDataSource(ds);
             fail("Failed to throw exceptions");
@@ -512,20 +552,21 @@
         }
     }
 
-    private void testThumbnail(int resId, int targetWdith, int targetHeight) {
-        testThumbnail(resId, null /*outPath*/, targetWdith, targetHeight);
+    private void testThumbnail(final String res, int targetWdith, int targetHeight) {
+        testThumbnail(res, null /*outPath*/, targetWdith, targetHeight);
     }
 
-    private void testThumbnail(int resId, String outPath, int targetWidth, int targetHeight) {
+    private void testThumbnail(final String res, String outPath, int targetWidth,
+            int targetHeight) {
         Stopwatch timer = new Stopwatch();
 
-        if (!MediaUtils.hasCodecForResourceAndDomain(getContext(), resId, "video/")) {
+        setDataSourceFd(res);
+
+        if (!MediaUtils.hasCodecForResourceAndDomain(res, "video/")) {
             MediaUtils.skipTest("no video codecs for resource");
             return;
         }
 
-        setDataSourceFd(resId);
-
         timer.start();
         Bitmap thumbnail = mRetriever.getFrameAtTime(-1 /* timeUs (any) */);
         timer.end();
@@ -561,39 +602,39 @@
 
     public void testThumbnailH264() {
         testThumbnail(
-                R.raw.bbb_s4_1280x720_mp4_h264_mp31_8mbps_30fps_aac_he_mono_40kbps_44100hz,
+                "bbb_s4_1280x720_mp4_h264_mp31_8mbps_30fps_aac_he_mono_40kbps_44100hz.mp4",
                 1280,
                 720);
     }
 
     public void testThumbnailH263() {
-        testThumbnail(R.raw.video_176x144_3gp_h263_56kbps_12fps_aac_mono_24kbps_11025hz, 176, 144);
+        testThumbnail("video_176x144_3gp_h263_56kbps_12fps_aac_mono_24kbps_11025hz.3gp", 176, 144);
     }
 
     public void testThumbnailMPEG4() {
         testThumbnail(
-                R.raw.video_1280x720_mp4_mpeg4_1000kbps_25fps_aac_stereo_128kbps_44100hz,
+                "video_1280x720_mp4_mpeg4_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4",
                 1280,
                 720);
     }
 
     public void testThumbnailVP8() {
         testThumbnail(
-                R.raw.bbb_s1_640x360_webm_vp8_2mbps_30fps_vorbis_5ch_320kbps_48000hz,
+                "bbb_s1_640x360_webm_vp8_2mbps_30fps_vorbis_5ch_320kbps_48000hz.webm",
                 640,
                 360);
     }
 
     public void testThumbnailVP9() {
         testThumbnail(
-                R.raw.bbb_s1_640x360_webm_vp9_0p21_1600kbps_30fps_vorbis_stereo_128kbps_48000hz,
+                "bbb_s1_640x360_webm_vp9_0p21_1600kbps_30fps_vorbis_stereo_128kbps_48000hz.webm",
                 640,
                 360);
     }
 
     public void testThumbnailHEVC() {
         testThumbnail(
-                R.raw.bbb_s1_720x480_mp4_hevc_mp3_1600kbps_30fps_aac_he_6ch_240kbps_48000hz,
+                "bbb_s1_720x480_mp4_hevc_mp3_1600kbps_30fps_aac_he_6ch_240kbps_48000hz.mp4",
                 720,
                 480);
     }
@@ -601,31 +642,31 @@
     public void testThumbnailVP9Hdr() {
         if (!MediaUtils.check(mIsAtLeastR, "test needs Android 11")) return;
 
-        testThumbnail(R.raw.video_1280x720_vp9_hdr_static_3mbps, 1280, 720);
+        testThumbnail("video_1280x720_vp9_hdr_static_3mbps.mkv", 1280, 720);
     }
 
     public void testThumbnailAV1Hdr() {
         if (!MediaUtils.check(mIsAtLeastR, "test needs Android 11")) return;
 
-        testThumbnail(R.raw.video_1280x720_av1_hdr_static_3mbps, 1280, 720);
+        testThumbnail("video_1280x720_av1_hdr_static_3mbps.webm", 1280, 720);
     }
 
     public void testThumbnailHDR10() {
         if (!MediaUtils.check(mIsAtLeastR, "test needs Android 11")) return;
 
-        testThumbnail(R.raw.video_1280x720_hevc_hdr10_static_3mbps, 1280, 720);
+        testThumbnail("video_1280x720_hevc_hdr10_static_3mbps.mp4", 1280, 720);
     }
 
-    private void testThumbnailWithRotation(int resId, int targetRotation) {
+    private void testThumbnailWithRotation(final String res, int targetRotation) {
         Stopwatch timer = new Stopwatch();
 
-        if (!MediaUtils.hasCodecForResourceAndDomain(getContext(), resId, "video/")) {
+        setDataSourceFd(res);
+
+        if (!MediaUtils.hasCodecForResourceAndDomain(res, "video/")) {
             MediaUtils.skipTest("no video codecs for resource");
             return;
         }
 
-        setDataSourceFd(resId);
-
         assertEquals("Video rotation was other than expected", Integer.toString(targetRotation),
             mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION));
 
@@ -638,11 +679,11 @@
     }
 
     public void testThumbnailWithRotation() {
-        int[] resIds = {R.raw.video_h264_mpeg4_rotate_0, R.raw.video_h264_mpeg4_rotate_90,
-                R.raw.video_h264_mpeg4_rotate_180, R.raw.video_h264_mpeg4_rotate_270};
+        String[] res = {"video_h264_mpeg4_rotate_0.mp4", "video_h264_mpeg4_rotate_90.mp4",
+                "video_h264_mpeg4_rotate_180.mp4", "video_h264_mpeg4_rotate_270.mp4"};
         int[] targetRotations = {0, 90, 180, 270};
-        for (int i = 0; i < resIds.length; i++) {
-            testThumbnailWithRotation(resIds[i], targetRotations[i]);
+        for (int i = 0; i < res.length; i++) {
+            testThumbnailWithRotation(res[i], targetRotations[i]);
         }
     }
 
@@ -828,32 +869,34 @@
     }
 
     private void testGetFrameAt(int[][] testCases,
-            Function<MediaMetadataRetriever, List<Bitmap> > bitmapRetriever) {
-        testGetFrameAt(R.raw.binary_counter_320x240_30fps_600frames,
+            Function<MediaMetadataRetriever, List<Bitmap>> bitmapRetriever) {
+        testGetFrameAt("binary_counter_320x240_30fps_600frames.mp4",
                 testCases, bitmapRetriever);
     }
 
     private void testGetFrameAtEditList(int[][] testCases,
-            Function<MediaMetadataRetriever, List<Bitmap> > bitmapRetriever) {
-        testGetFrameAt(R.raw.binary_counter_320x240_30fps_600frames_editlist,
+            Function<MediaMetadataRetriever, List<Bitmap>> bitmapRetriever) {
+        testGetFrameAt("binary_counter_320x240_30fps_600frames_editlist.mp4",
                 testCases, bitmapRetriever);
     }
 
     private void testGetFrameAtEmptyNormalEditList(int[][] testCases,
-            Function<MediaMetadataRetriever, List<Bitmap> > bitmapRetriever) {
-        testGetFrameAt(R.raw.binary_counter_320x240_30fps_600frames_empty_normal_editlist_entries,
+            Function<MediaMetadataRetriever, List<Bitmap>> bitmapRetriever) {
+        testGetFrameAt("binary_counter_320x240_30fps_600frames_empty_normal_editlist_entries.mp4",
                 testCases, bitmapRetriever);
     }
-    private void testGetFrameAt(int resId, int[][] testCases,
-            Function<MediaMetadataRetriever, List<Bitmap> > bitmapRetriever) {
-        if (!MediaUtils.hasCodecForResourceAndDomain(getContext(), resId, "video/")
+
+    private void testGetFrameAt(final String res, int[][] testCases,
+            Function<MediaMetadataRetriever, List<Bitmap>> bitmapRetriever) {
+
+        setDataSourceFd(res);
+
+        if (!MediaUtils.hasCodecForResourceAndDomain(res, "video/")
             && mPackageManager.hasSystemFeature(PackageManager.FEATURE_WATCH)) {
             MediaUtils.skipTest("no video codecs for resource on watch");
             return;
         }
 
-        setDataSourceFd(resId);
-
         List<Bitmap> bitmaps = bitmapRetriever.apply(mRetriever);
         for (int i = 0; i < testCases.length; i++) {
             verifyVideoFrame(bitmaps.get(i), testCases[i]);
@@ -892,30 +935,29 @@
      * The following tests verifies MediaMetadataRetriever.getScaledFrameAtTime behavior.
      */
     public void testGetScaledFrameAtTimeWithInvalidResolutions() {
-        int[] resIds = {R.raw.binary_counter_320x240_30fps_600frames,
-                R.raw.binary_counter_320x240_30fps_600frames_editlist,
-                R.raw.bbb_s4_1280x720_mp4_h264_mp31_8mbps_30fps_aac_he_mono_40kbps_44100hz,
-                R.raw.video_176x144_3gp_h263_56kbps_12fps_aac_mono_24kbps_11025hz,
-                R.raw.video_1280x720_mp4_mpeg4_1000kbps_25fps_aac_stereo_128kbps_44100hz,
-                R.raw.bbb_s1_640x360_webm_vp8_2mbps_30fps_vorbis_5ch_320kbps_48000hz,
-                R.raw.bbb_s1_640x360_webm_vp9_0p21_1600kbps_30fps_vorbis_stereo_128kbps_48000hz,
-                R.raw.bbb_s1_720x480_mp4_hevc_mp3_1600kbps_30fps_aac_he_6ch_240kbps_48000hz,
-                R.raw.video_1280x720_vp9_hdr_static_3mbps,
-                R.raw.video_1280x720_av1_hdr_static_3mbps,
-                R.raw.video_1280x720_hevc_hdr10_static_3mbps};
+        String[] resources = {"binary_counter_320x240_30fps_600frames.mp4",
+                "binary_counter_320x240_30fps_600frames_editlist.mp4",
+                "bbb_s4_1280x720_mp4_h264_mp31_8mbps_30fps_aac_he_mono_40kbps_44100hz.mp4",
+                "video_176x144_3gp_h263_56kbps_12fps_aac_mono_24kbps_11025hz.3gp",
+                "video_1280x720_mp4_mpeg4_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4",
+                "bbb_s1_640x360_webm_vp8_2mbps_30fps_vorbis_5ch_320kbps_48000hz.webm",
+                "bbb_s1_640x360_webm_vp9_0p21_1600kbps_30fps_vorbis_stereo_128kbps_48000hz.webm",
+                "bbb_s1_720x480_mp4_hevc_mp3_1600kbps_30fps_aac_he_6ch_240kbps_48000hz.mp4",
+                "video_1280x720_vp9_hdr_static_3mbps.mkv",
+                "video_1280x720_av1_hdr_static_3mbps.webm",
+                "video_1280x720_hevc_hdr10_static_3mbps.mp4"};
         int[][] resolutions = {{0, 120}, {-1, 0}, {-1, 120}, {140, -1}, {-1, -1}};
         int[] options =
                 {OPTION_CLOSEST, OPTION_CLOSEST_SYNC, OPTION_NEXT_SYNC, OPTION_PREVIOUS_SYNC};
 
-        for (int resId : resIds) {
-            if (!MediaUtils.hasCodecForResourceAndDomain(getContext(), resId, "video/")
+        for (String res : resources) {
+            setDataSourceFd(res);
+            if (!MediaUtils.hasCodecForResourceAndDomain(res, "video/")
                     && mPackageManager.hasSystemFeature(PackageManager.FEATURE_WATCH)) {
                 MediaUtils.skipTest("no video codecs for resource on watch");
                 continue;
             }
 
-            setDataSourceFd(resId);
-
             for (int i = 0; i < resolutions.length; i++) {
                 int width = resolutions[i][0];
                 int height = resolutions[i][1];
@@ -961,14 +1003,14 @@
     }
 
     public void testGetScaledFrameAtTime() {
-        int resId = R.raw.binary_counter_320x240_30fps_600frames;
-        if (!MediaUtils.hasCodecForResourceAndDomain(getContext(), resId, "video/")
+        String res = "binary_counter_320x240_30fps_600frames.mp4";
+        setDataSourceFd(res);
+        if (!MediaUtils.hasCodecForResourceAndDomain(res, "video/")
             && mPackageManager.hasSystemFeature(PackageManager.FEATURE_WATCH)) {
             MediaUtils.skipTest("no video codecs for resource on watch");
             return;
         }
 
-        setDataSourceFd(resId);
         MediaMetadataRetriever.BitmapParams params = new MediaMetadataRetriever.BitmapParams();
 
         // Test desided size of 160 x 120. Return should be 160 x 120
@@ -984,14 +1026,14 @@
         testGetScaledFrameAtTime(160, 240, 160, 120, Bitmap.Config.RGB_565);
 
         // Test scaled the video with aspect ratio
-        resId = R.raw.binary_counter_320x240_720x240_30fps_600frames;
-        setDataSourceFd(resId);
+        res = "binary_counter_320x240_720x240_30fps_600frames.mp4";
+        setDataSourceFd(res);
 
         testGetScaledFrameAtTime(330, 240, 330, 110, null);
     }
 
     public void testGetImageAtIndex() throws Exception {
-        testGetImage(R.raw.heifwriter_input, 1920, 1080, 0 /*rotation*/,
+        testGetImage("heifwriter_input.heic", 1920, 1080, 0 /*rotation*/,
                 4 /*imageCount*/, 3 /*primary*/, true /*useGrid*/, true /*checkColor*/);
     }
 
@@ -1018,7 +1060,7 @@
     }
 
     private void testGetImage(
-            int resId, int width, int height, int rotation,
+            final String res, int width, int height, int rotation,
             int imageCount, int primary, boolean useGrid, boolean checkColor)
                     throws Exception {
         Stopwatch timer = new Stopwatch();
@@ -1027,12 +1069,12 @@
         InputStream inputStream = null;
 
         try {
-            setDataSourceFd(resId);
+            setDataSourceFd(res);
 
             // Verify image related meta keys.
             String hasImage = mRetriever.extractMetadata(
                     MediaMetadataRetriever.METADATA_KEY_HAS_IMAGE);
-            assertTrue("No images found in resId " + resId, "yes".equals(hasImage));
+            assertTrue("No images found in res " + res, "yes".equals(hasImage));
             assertEquals("Wrong width", width,
                     Integer.parseInt(mRetriever.extractMetadata(
                             MediaMetadataRetriever.METADATA_KEY_IMAGE_WIDTH)));
@@ -1090,7 +1132,7 @@
 
                 // Check the color block position on the bitmap decoded by BitmapFactory.
                 // This should match the primary image as well.
-                inputStream = getContext().getResources().openRawResource(resId);
+                inputStream = new FileInputStream(mInpPrefix + res);
                 bitmap = BitmapFactory.decodeStream(inputStream);
                 assertTrue("Color block for bitmap decoding doesn't match",
                         approxEquals(COLOR_BLOCK, Color.valueOf(
@@ -1101,8 +1143,7 @@
             // Check the grid configuration related keys.
             if (useGrid) {
                 extractor = new MediaExtractor();
-                Resources resources = getContext().getResources();
-                afd = resources.openRawResourceFd(resId);
+                afd = getAssetFileDescriptorFor(res);
                 extractor.setDataSource(
                         afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                 MediaFormat format = extractor.getTrackFormat(0);
@@ -1130,13 +1171,13 @@
         }
     }
 
-    private void copyMeidaFile() {
+    private void copyMediaFile() {
         InputStream inputStream = null;
         FileOutputStream outputStream = null;
         String outputPath = new File(
             Environment.getExternalStorageDirectory(), TEST_MEDIA_FILE).getAbsolutePath();
         try {
-            inputStream = getContext().getResources().openRawResource(R.raw.testvideo);
+            inputStream = new FileInputStream(mInpPrefix + "testvideo.3gp");
             outputStream = new FileOutputStream(outputPath);
             copy(inputStream, outputStream);
         } catch (Exception e) {
diff --git a/tests/tests/media/src/android/media/cts/MediaMuxerTest.java b/tests/tests/media/src/android/media/cts/MediaMuxerTest.java
index 2aebc8d..fc4cb6f 100644
--- a/tests/tests/media/src/android/media/cts/MediaMuxerTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaMuxerTest.java
@@ -16,11 +16,8 @@
 
 package android.media.cts;
 
-import android.media.cts.R;
-
 import android.content.Context;
 import android.content.res.AssetFileDescriptor;
-import android.content.res.Resources;
 import android.media.MediaCodec.BufferInfo;
 import android.media.MediaExtractor;
 import android.media.MediaFormat;
@@ -35,6 +32,7 @@
 import com.android.compatibility.common.util.MediaUtils;
 
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.RandomAccessFile;
 import java.nio.ByteBuffer;
@@ -54,45 +52,60 @@
     private static final float BAD_LONGITUDE = -181.0f;
     private static final float TOLERANCE = 0.0002f;
     private static final long OFFSET_TIME_US = 29 * 60 * 1000000L; // 29 minutes
-    private Resources mResources;
+    static final String mInpPrefix = WorkDir.getMediaDirString();
     private boolean mAndroid11 = Build.VERSION.SDK_INT >= Build.VERSION_CODES.R;
 
     @Override
     public void setContext(Context context) {
         super.setContext(context);
-        mResources = context.getResources();
+    }
+
+    protected AssetFileDescriptor getAssetFileDescriptorFor(final String res)
+            throws FileNotFoundException {
+        File inpFile = new File(mInpPrefix + res);
+        ParcelFileDescriptor parcelFD =
+                ParcelFileDescriptor.open(inpFile, ParcelFileDescriptor.MODE_READ_ONLY);
+        return new AssetFileDescriptor(parcelFD, 0, parcelFD.getStatSize());
     }
 
     /**
      * Test: make sure the muxer handles both video and audio tracks correctly.
      */
-    public void testVideoAudio() throws Exception {
-        int source = R.raw.video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_11025hz;
+    public void SKIP_testVideoAudio() throws Exception {
+        // duplicate of CtsMediaV2TestCases:MuxerTest$TestMultiTrack#testMultiTrack[*]
+        // numTracks @ {1, 1}
+        final String source = "video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_11025hz.3gp";
         String outputFilePath = File.createTempFile("MediaMuxerTest_testAudioVideo", ".mp4")
                 .getAbsolutePath();
         cloneAndVerify(source, outputFilePath, 2, 90, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
     }
 
-    public void testDualVideoTrack() throws Exception {
-        int source = R.raw.video_176x144_h264_408kbps_30fps_352x288_h264_122kbps_30fps;
+    public void SKIP_testDualVideoTrack() throws Exception {
+        // duplicate of CtsMediaV2TestCases:MuxerTest$TestMultiTrack#testMultiTrack[*]
+        // numTracks @ {2, 0}
+        final String source = "video_176x144_h264_408kbps_30fps_352x288_h264_122kbps_30fps.mp4";
         String outputFilePath = File.createTempFile("MediaMuxerTest_testDualVideo", ".mp4")
                 .getAbsolutePath();
         cloneAndVerify(source, outputFilePath, 2, 90, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
     }
 
-    public void testDualAudioTrack() throws Exception {
+    public void SKIP_testDualAudioTrack() throws Exception {
+        // duplicate of CtsMediaV2TestCases:MuxerTest$TestMultiTrack#testMultiTrack[*]
+        // numTracks @ {0, 2}
         if (!MediaUtils.check(mAndroid11, "test needs Android 11")) return;
 
-        int source = R.raw.audio_aac_mono_70kbs_44100hz_aac_mono_70kbs_44100hz;
+        final String source = "audio_aac_mono_70kbs_44100hz_aac_mono_70kbs_44100hz.mp4";
         String outputFilePath = File.createTempFile("MediaMuxerTest_testDualAudio", ".mp4")
                 .getAbsolutePath();
         cloneAndVerify(source, outputFilePath, 2, 90, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
     }
 
-    public void testDualVideoAndAudioTrack() throws Exception {
+    public void SKIP_testDualVideoAndAudioTrack() throws Exception {
+        // duplicate of CtsMediaV2TestCases:MuxerTest$TestMultiTrack#testMultiTrack[*]
+        // numTracks @ {2, 2}
         if (!MediaUtils.check(mAndroid11, "test needs Android 11")) return;
 
-        int source = R.raw.video_h264_30fps_video_h264_30fps_aac_44100hz_aac_44100hz;
+        final String source = "video_h264_30fps_video_h264_30fps_aac_44100hz_aac_44100hz.mp4";
         String outputFilePath = File.createTempFile("MediaMuxerTest_testDualVideoAudio", ".mp4")
                 .getAbsolutePath();
         cloneAndVerify(source, outputFilePath, 4, 90, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
@@ -106,9 +119,12 @@
      * to make sure the new file's metadata track matches the source file's metadata track for the
      * mime format and data payload.
      */
-    public void testVideoAudioMedatadataWithNonCompliantMetadataTrack() throws Exception {
-        int source =
-                R.raw.video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_11025hz_metadata_gyro_non_compliant;
+    public void SKIP_testVideoAudioMedatadataWithNonCompliantMetadataTrack() throws Exception {
+        // duplicate of CtsMediaV2TestCases:MuxerTest$TestSimpleMux#testSimpleMux[application/gyro]
+        // duplicate of CtsMediaV2TestCases:MuxerTest$TestSimpleMux#testSimpleMux[video/h263]
+        // duplicate of CtsMediaV2TestCases:MuxerTest$TestSimpleMux#testSimpleMux[audio/aac]
+        final String source =
+                "video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_11025hz_metadata_gyro_non_compliant.3gp";
         String outputFilePath = File.createTempFile("MediaMuxerTest_testAudioVideoMetadata", ".mp4")
                 .getAbsolutePath();
         cloneAndVerify(source, outputFilePath, 3, 90, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
@@ -122,9 +138,12 @@
      * the new file's metadata track matches the source file's metadata track for the mime format
      * and data payload.
      */
-     public void testVideoAudioMedatadataWithCompliantMetadataTrack() throws Exception {
-        int source =
-                R.raw.video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_11025hz_metadata_gyro_compliant;
+     public void SKIP_testVideoAudioMedatadataWithCompliantMetadataTrack() throws Exception {
+         // duplicate of CtsMediaV2TestCases:MuxerTest$TestSimpleMux#testSimpleMux[application/gyro]
+         // duplicate of CtsMediaV2TestCases:MuxerTest$TestSimpleMux#testSimpleMux[video/h263]
+         // duplicate of CtsMediaV2TestCases:MuxerTest$TestSimpleMux#testSimpleMux[audio/aac]
+         final String source =
+                 "video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_11025hz_metadata_gyro_compliant.3gp";
         String outputFilePath = File.createTempFile("MediaMuxerTest_testAudioVideoMetadata", ".mp4")
                 .getAbsolutePath();
         cloneAndVerify(source, outputFilePath, 3, 90, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
@@ -133,8 +152,9 @@
     /**
      * Test: make sure the muxer handles audio track only file correctly.
      */
-    public void testAudioOnly() throws Exception {
-        int source = R.raw.sinesweepm4a;
+    public void SKIP_testAudioOnly() throws Exception {
+        // duplicate of CtsMediaV2TestCases:MuxerTest$TestSimpleMux#testSimpleMux[audio/*]
+        final String source = "sinesweepm4a.m4a";
         String outputFilePath = File.createTempFile("MediaMuxerTest_testAudioOnly", ".mp4")
                 .getAbsolutePath();
         cloneAndVerify(source, outputFilePath, 1, -1, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
@@ -143,22 +163,25 @@
     /**
      * Test: make sure the muxer handles video track only file correctly.
      */
-    public void testVideoOnly() throws Exception {
-        int source = R.raw.video_only_176x144_3gp_h263_25fps;
+        public void SKIP_testVideoOnly() throws Exception {
+        // duplicate of CtsMediaV2TestCases:MuxerTest$TestSimpleMux#testSimpleMux[video/*]
+        final String source = "video_only_176x144_3gp_h263_25fps.mp4";
         String outputFilePath = File.createTempFile("MediaMuxerTest_videoOnly", ".mp4")
                 .getAbsolutePath();
         cloneAndVerify(source, outputFilePath, 1, 180, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
     }
 
     public void testWebmOutput() throws Exception {
-        int source = R.raw.video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_48000hz;
+        final String source =
+                "video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_48000hz.webm";
         String outputFilePath = File.createTempFile("testWebmOutput", ".webm")
                 .getAbsolutePath();
         cloneAndVerify(source, outputFilePath, 2, 90, MediaMuxer.OutputFormat.MUXER_OUTPUT_WEBM);
     }
 
-    public void testThreegppOutput() throws Exception {
-        int source = R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz;
+    public void SKIP_testThreegppOutput() throws Exception {
+        // duplicate of CtsMediaV2TestCases:MuxerTest$TestSimpleMux#testSimpleMux[*]
+        final String source = "video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz.3gp";
         String outputFilePath = File.createTempFile("testThreegppOutput", ".3gp")
                 .getAbsolutePath();
         cloneAndVerify(source, outputFilePath, 2, 90, MediaMuxer.OutputFormat.MUXER_OUTPUT_3GPP);
@@ -173,7 +196,9 @@
      * <br> Throws exception b/c no tracks was added.
      * <br> Throws exception b/c a wrong format.
      */
-    public void testIllegalStateExceptions() throws IOException {
+    public void SKIP_testIllegalStateExceptions() throws IOException {
+        // duplicate of CtsMediaV2TestCases:MuxerTest$TestMultiTrack#testMultiTrack[*] and
+        // duplicate of CtsMediaV2TestCases:MuxerUnitTest$TestApi
         String outputFilePath = File.createTempFile("MediaMuxerTest_testISEs", ".mp4")
                 .getAbsolutePath();
         MediaMuxer muxer;
@@ -295,16 +320,16 @@
      * drops as in b/63590381 and b/64949961 while B Frames encoding is enabled.
      */
     public void testSimulateAudioBVideoFramesDropIssues() throws Exception {
-        int sourceId = R.raw.video_h264_main_b_frames;
+        final String source = "video_h264_main_b_frames.mp4";
         String outputFilePath = File.createTempFile(
             "MediaMuxerTest_testSimulateAudioBVideoFramesDropIssues", ".mp4").getAbsolutePath();
         try {
-            simulateVideoFramesDropIssuesAndMux(sourceId, outputFilePath, 2 /* track index */,
+            simulateVideoFramesDropIssuesAndMux(source, outputFilePath, 2 /* track index */,
                 MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
-            verifyAFewSamplesTimestamp(sourceId, outputFilePath);
-            verifySamplesMatch(sourceId, outputFilePath, 66667 /* sample around 0 sec */, 0);
+            verifyAFewSamplesTimestamp(source, outputFilePath);
+            verifySamplesMatch(source, outputFilePath, 66667 /* sample around 0 sec */, 0);
             verifySamplesMatch(
-                    sourceId, outputFilePath, 8033333 /*  sample around 8 sec */, OFFSET_TIME_US);
+                    source, outputFilePath, 8033333 /*  sample around 8 sec */, OFFSET_TIME_US);
         } finally {
             new File(outputFilePath).delete();
         }
@@ -313,17 +338,19 @@
     /**
      * Test: makes sure if video only muxing using MPEG4Writer works well when there are B Frames.
      */
-    public void testAllTimestampsBVideoOnly() throws Exception {
-        int sourceId = R.raw.video_480x360_mp4_h264_bframes_495kbps_30fps_editlist;
+    public void SKIP_testAllTimestampsBVideoOnly() throws Exception {
+        // duplicate of CtsMediaV2TestCases:MuxerTest$TestSimpleMux#testSimpleMux[video/avc] and
+        // duplicate of CtsMediaV2TestCases:MuxerTest$TestSimpleMux#testSimpleMux[video/hevc]
+        final String source = "video_480x360_mp4_h264_bframes_495kbps_30fps_editlist.mp4";
         String outputFilePath = File.createTempFile("MediaMuxerTest_testAllTimestampsBVideoOnly",
             ".mp4").getAbsolutePath();
         try {
             // No samples to drop in this case.
             // No start offsets for any track.
-            cloneMediaWithSamplesDropAndStartOffsets(sourceId, outputFilePath,
+            cloneMediaWithSamplesDropAndStartOffsets(source, outputFilePath,
                 MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4, null, null);
             verifyTSWithSamplesDropAndStartOffset(
-                    sourceId, true /* has B frames */, outputFilePath, null, null);
+                    source, true /* has B frames */, outputFilePath, null, null);
         } finally {
             new File(outputFilePath).delete();
         }
@@ -334,7 +361,7 @@
      * and a few frames drop.
      */
     public void testTimestampsBVideoOnlyFramesDropOnce() throws Exception {
-        int sourceId = R.raw.video_480x360_mp4_h264_bframes_495kbps_30fps_editlist;
+        final String source = "video_480x360_mp4_h264_bframes_495kbps_30fps_editlist.mp4";
         String outputFilePath = File.createTempFile(
             "MediaMuxerTest_testTimestampsBVideoOnlyFramesDropOnce", ".mp4").getAbsolutePath();
         try {
@@ -342,10 +369,10 @@
             // Drop frames from sample index 56 to 76, I frame at 56.
             IntStream.rangeClosed(56, 76).forEach(samplesDropSet::add);
             // No start offsets for any track.
-            cloneMediaWithSamplesDropAndStartOffsets(sourceId, outputFilePath,
+            cloneMediaWithSamplesDropAndStartOffsets(source, outputFilePath,
                 MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4, samplesDropSet, null);
             verifyTSWithSamplesDropAndStartOffset(
-                    sourceId, true /* has B frames */, outputFilePath, samplesDropSet, null);
+                    source, true /* has B frames */, outputFilePath, samplesDropSet, null);
         } finally {
             new File(outputFilePath).delete();
         }
@@ -356,7 +383,7 @@
      * works with B Frames.
      */
     public void testTimestampsBVideoOnlyFramesDropTwice() throws Exception {
-        int sourceId = R.raw.video_480x360_mp4_h264_bframes_495kbps_30fps_editlist;
+        final String source = "video_480x360_mp4_h264_bframes_495kbps_30fps_editlist.mp4";
         String outputFilePath = File.createTempFile(
             "MediaMuxerTest_testTimestampsBVideoOnlyFramesDropTwice", ".mp4").getAbsolutePath();
         try {
@@ -366,10 +393,10 @@
             // Drop frames with sample index 173 to 200, B frame at 173.
             IntStream.rangeClosed(173, 200).forEach(samplesDropSet::add);
             // No start offsets for any track.
-            cloneMediaWithSamplesDropAndStartOffsets(sourceId, outputFilePath,
+            cloneMediaWithSamplesDropAndStartOffsets(source, outputFilePath,
                 MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4, samplesDropSet, null);
             verifyTSWithSamplesDropAndStartOffset(
-                    sourceId, true /* has B frames */, outputFilePath, samplesDropSet, null);
+                    source, true /* has B frames */, outputFilePath, samplesDropSet, null);
         } finally {
             new File(outputFilePath).delete();
         }
@@ -380,7 +407,7 @@
      * works with B Frames.
      */
     public void testTimestampsAudioBVideoFramesDropOnce() throws Exception {
-        int sourceId = R.raw.video_h264_main_b_frames;
+        final String source = "video_h264_main_b_frames.mp4";
         String outputFilePath = File.createTempFile(
             "MediaMuxerTest_testTimestampsAudioBVideoFramesDropOnce", ".mp4").getAbsolutePath();
         try {
@@ -388,10 +415,10 @@
             // Drop frames from sample index 56 to 76, I frame at 56.
             IntStream.rangeClosed(56, 76).forEach(samplesDropSet::add);
             // No start offsets for any track.
-            cloneMediaWithSamplesDropAndStartOffsets(sourceId, outputFilePath,
+            cloneMediaWithSamplesDropAndStartOffsets(source, outputFilePath,
                 MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4, samplesDropSet, null);
             verifyTSWithSamplesDropAndStartOffset(
-                    sourceId, true /* has B frames */, outputFilePath, samplesDropSet, null);
+                    source, true /* has B frames */, outputFilePath, samplesDropSet, null);
         } finally {
             new File(outputFilePath).delete();
         }
@@ -402,7 +429,7 @@
      * works with B Frames.
      */
     public void testTimestampsAudioBVideoFramesDropTwice() throws Exception {
-        int sourceId = R.raw.video_h264_main_b_frames;
+        final String source = "video_h264_main_b_frames.mp4";
         String outputFilePath = File.createTempFile(
             "MediaMuxerTest_testTimestampsAudioBVideoFramesDropTwice", ".mp4").getAbsolutePath();
         try {
@@ -412,10 +439,10 @@
             // Drop frames with sample index 173 to 200, B frame at 173.
             IntStream.rangeClosed(173, 200).forEach(samplesDropSet::add);
             // No start offsets for any track.
-            cloneMediaWithSamplesDropAndStartOffsets(sourceId, outputFilePath,
+            cloneMediaWithSamplesDropAndStartOffsets(source, outputFilePath,
                 MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4, samplesDropSet, null);
             verifyTSWithSamplesDropAndStartOffset(
-                    sourceId, true /* has B frames */, outputFilePath, samplesDropSet, null);
+                    source, true /* has B frames */, outputFilePath, samplesDropSet, null);
         } finally {
             new File(outputFilePath).delete();
         }
@@ -583,14 +610,14 @@
         if (VERBOSE) {
             Log.v(TAG, "MPEG4CheckTimestampsAudioBVideoDiffStartOffsets");
         }
-        int sourceId = R.raw.video_h264_main_b_frames;
+        final String source = "video_h264_main_b_frames.mp4";
         String outputFilePath = File.createTempFile(
             "MediaMuxerTest_testTimestampsAudioBVideoDiffStartOffsets", ".mp4").getAbsolutePath();
         try {
-            cloneMediaWithSamplesDropAndStartOffsets(sourceId, outputFilePath,
+            cloneMediaWithSamplesDropAndStartOffsets(source, outputFilePath,
                 MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4, null, startOffsetUs);
             verifyTSWithSamplesDropAndStartOffset(
-                    sourceId, true /* has B frames */, outputFilePath, null, startOffsetUs);
+                    source, true /* has B frames */, outputFilePath, null, startOffsetUs);
         } finally {
             new File(outputFilePath).delete();
         }
@@ -616,15 +643,15 @@
         if (VERBOSE) {
             Log.v(TAG, "MPEG4CheckTimestampsWithStartOffsets");
         }
-        int sourceId = R.raw.video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz;
+        final String source = "video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz.mp4";
         String outputFilePath =
             File.createTempFile("MediaMuxerTest_MPEG4CheckTimestampsWithStartOffsets", ".mp4")
                 .getAbsolutePath();
         try {
-            cloneMediaWithSamplesDropAndStartOffsets(sourceId, outputFilePath,
+            cloneMediaWithSamplesDropAndStartOffsets(source, outputFilePath,
                     MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4, null, startOffsetUsVect);
             verifyTSWithSamplesDropAndStartOffset(
-                    sourceId, false /* no B frames */, outputFilePath, null, startOffsetUsVect);
+                    source, false /* no B frames */, outputFilePath, null, startOffsetUsVect);
         } finally {
             new File(outputFilePath).delete();
         }
@@ -639,15 +666,16 @@
         if (VERBOSE) {
             Log.v(TAG, "WebMCheckTimestampsWithStartOffsets");
         }
-        int sourceId = R.raw.video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_48000hz;
+        final String source =
+                "video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_48000hz.webm";
         String outputFilePath =
             File.createTempFile("MediaMuxerTest_WebMCheckTimestampsWithStartOffsets", ".webm")
                 .getAbsolutePath();
         try {
-            cloneMediaWithSamplesDropAndStartOffsets(sourceId, outputFilePath,
+            cloneMediaWithSamplesDropAndStartOffsets(source, outputFilePath,
                     MediaMuxer.OutputFormat.MUXER_OUTPUT_WEBM, null, startOffsetUsVect);
             verifyTSWithSamplesDropAndStartOffset(
-                    sourceId, false /* no B frames */, outputFilePath, null, startOffsetUsVect);
+                    source, false /* no B frames */, outputFilePath, null, startOffsetUsVect);
         } finally {
             new File(outputFilePath).delete();
         }
@@ -657,7 +685,7 @@
      * Clones a media file and then compares against the source file to make
      * sure they match.
      */
-    private void cloneAndVerify(int srcMedia, String outputMediaFile,
+    private void cloneAndVerify(final String srcMedia, String outputMediaFile,
             int expectedTrackCount, int degrees, int fmt) throws IOException {
         try {
             cloneMediaUsingMuxer(srcMedia, outputMediaFile, expectedTrackCount,
@@ -678,11 +706,11 @@
     /**
      * Using the MediaMuxer to clone a media file.
      */
-    private void cloneMediaUsingMuxer(int srcMedia, String dstMediaPath,
+    private void cloneMediaUsingMuxer(final String  srcMedia, String dstMediaPath,
             int expectedTrackCount, int degrees, int fmt)
             throws IOException {
         // Set up MediaExtractor to read from the source.
-        AssetFileDescriptor srcFd = mResources.openRawResourceFd(srcMedia);
+        AssetFileDescriptor srcFd = getAssetFileDescriptorFor(srcMedia);
         MediaExtractor extractor = new MediaExtractor();
         extractor.setDataSource(srcFd.getFileDescriptor(), srcFd.getStartOffset(),
                 srcFd.getLength());
@@ -779,9 +807,9 @@
      * Compares some attributes using MediaMetadataRetriever to make sure the
      * cloned media file matches the source file.
      */
-    private void verifyAttributesMatch(int srcMedia, String testMediaPath,
+    private void verifyAttributesMatch(final String srcMedia, String testMediaPath,
             int degrees) throws IOException {
-        AssetFileDescriptor testFd = mResources.openRawResourceFd(srcMedia);
+        AssetFileDescriptor testFd = getAssetFileDescriptorFor(srcMedia);
 
         MediaMetadataRetriever retrieverSrc = new MediaMetadataRetriever();
         retrieverSrc.setDataSource(testFd.getFileDescriptor(),
@@ -862,9 +890,9 @@
      * Uses 2 MediaExtractor, seeking to the same position, reads the sample and
      * makes sure the samples match.
      */
-    private void verifySamplesMatch(int srcMedia, String testMediaPath, int seekToUs,
+    private void verifySamplesMatch(final String srcMedia, String testMediaPath, int seekToUs,
             long offsetTimeUs) throws IOException {
-        AssetFileDescriptor testFd = mResources.openRawResourceFd(srcMedia);
+        AssetFileDescriptor testFd = getAssetFileDescriptorFor(srcMedia);
         MediaExtractor extractorSrc = new MediaExtractor();
         extractorSrc.setDataSource(testFd.getFileDescriptor(),
                 testFd.getStartOffset(), testFd.getLength());
@@ -926,10 +954,10 @@
      * Using MediaMuxer and MediaExtractor to mux a media file from another file while skipping
      * some video frames as in the issues b/63590381 and b/64949961.
      */
-    private void simulateVideoFramesDropIssuesAndMux(int srcMedia, String dstMediaPath,
+    private void simulateVideoFramesDropIssuesAndMux(final String srcMedia, String dstMediaPath,
             int expectedTrackCount, int fmt) throws IOException {
         // Set up MediaExtractor to read from the source.
-        AssetFileDescriptor srcFd = mResources.openRawResourceFd(srcMedia);
+        AssetFileDescriptor srcFd = getAssetFileDescriptorFor(srcMedia);
         MediaExtractor extractor = new MediaExtractor();
         extractor.setDataSource(srcFd.getFileDescriptor(), srcFd.getStartOffset(),
             srcFd.getLength());
@@ -1030,11 +1058,11 @@
      * Uses two MediaExtractor's and checks whether timestamps of first few and another few
      *  from last sync frame matches
      */
-    private void verifyAFewSamplesTimestamp(int srcMediaId, String testMediaPath)
+    private void verifyAFewSamplesTimestamp(final String srcMedia, String testMediaPath)
             throws IOException {
         final int numFramesTSCheck = 10; // Num frames to be checked for its timestamps
 
-        AssetFileDescriptor srcFd = mResources.openRawResourceFd(srcMediaId);
+        AssetFileDescriptor srcFd = getAssetFileDescriptorFor(srcMedia);
         MediaExtractor extractorSrc = new MediaExtractor();
         extractorSrc.setDataSource(srcFd.getFileDescriptor(),
             srcFd.getStartOffset(), srcFd.getLength());
@@ -1096,11 +1124,11 @@
      * 0 or more video frames and desired start offsets for each track.
      * startOffsetUsVect : order of tracks is the same as in the input file
      */
-    private void cloneMediaWithSamplesDropAndStartOffsets(int srcMedia, String dstMediaPath,
+    private void cloneMediaWithSamplesDropAndStartOffsets(final String srcMedia, String dstMediaPath,
             int fmt, HashSet<Integer> samplesDropSet, Vector<Integer> startOffsetUsVect)
             throws IOException {
         // Set up MediaExtractor to read from the source.
-        AssetFileDescriptor srcFd = mResources.openRawResourceFd(srcMedia);
+        AssetFileDescriptor srcFd = getAssetFileDescriptorFor(srcMedia);
         MediaExtractor extractor = new MediaExtractor();
         extractor.setDataSource(srcFd.getFileDescriptor(), srcFd.getStartOffset(),
             srcFd.getLength());
@@ -1212,10 +1240,10 @@
      * Uses MediaExtractors and checks whether timestamps of all samples except in samplesDropSet
      *  and with start offsets adjustments for each track match.
      */
-    private void verifyTSWithSamplesDropAndStartOffset(int srcMediaId, boolean hasBframes,
+    private void verifyTSWithSamplesDropAndStartOffset(final String srcMedia, boolean hasBframes,
             String testMediaPath, HashSet<Integer> samplesDropSet,
             Vector<Integer> startOffsetUsVect) throws IOException {
-        AssetFileDescriptor srcFd = mResources.openRawResourceFd(srcMediaId);
+        AssetFileDescriptor srcFd = getAssetFileDescriptorFor(srcMedia);
         MediaExtractor extractorSrc = new MediaExtractor();
         extractorSrc.setDataSource(srcFd.getFileDescriptor(),
             srcFd.getStartOffset(), srcFd.getLength());
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerDrmTestBase.java b/tests/tests/media/src/android/media/cts/MediaPlayerDrmTestBase.java
index b65c690..23ad13a 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerDrmTestBase.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerDrmTestBase.java
@@ -175,19 +175,28 @@
     // the asset such that each asset is downloaded once and played back with multiple tests.
     protected void playModularDrmVideoDownload(Uri uri, Uri path, int width, int height,
             ModularDrmTestType testType) throws Exception {
-        final long DOWNLOAD_TIMEOUT_SECONDS = 600;
-        Log.i(TAG, "Downloading file:" + path);
+        Uri file = uri;
+        long id = -1;
         MediaDownloadManager mediaDownloadManager = new MediaDownloadManager(mContext);
-        final long id = mediaDownloadManager.downloadFileWithRetries(
-                uri, path, DOWNLOAD_TIMEOUT_SECONDS, STREAM_RETRIES);
-        assertFalse("Download " + uri + " failed.", id == -1);
-        Uri file = mediaDownloadManager.getUriForDownloadedFile(id);
-        Log.i(TAG, "Downloaded file:" + path + " id:" + id + " uri:" + file);
+        if (uri.getScheme().startsWith("file")) {
+            Log.i(TAG, "Playing existing file:" + uri);
+            // file = uri;
+        } else {
+            final long DOWNLOAD_TIMEOUT_SECONDS = 600;
+            Log.i(TAG, "Downloading file:" + path);
+            id = mediaDownloadManager.downloadFileWithRetries(
+                    uri, path, DOWNLOAD_TIMEOUT_SECONDS, STREAM_RETRIES);
+            assertFalse("Download " + uri + " failed.", id == -1);
+            file = mediaDownloadManager.getUriForDownloadedFile(id);
+            Log.i(TAG, "Downloaded file:" + path + " id:" + id + " uri:" + file);
+        }
 
         try {
             playModularDrmVideo(file, width, height, testType);
         } finally {
-            mediaDownloadManager.removeFile(id);
+            if (id != -1) {
+                mediaDownloadManager.removeFile(id);
+            }
         }
     }
 
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerFlakyNetworkTest.java b/tests/tests/media/src/android/media/cts/MediaPlayerFlakyNetworkTest.java
index 8e15543..d611327 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerFlakyNetworkTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerFlakyNetworkTest.java
@@ -50,18 +50,19 @@
 @AppModeFull(reason = "TODO: evaluate and port to instant")
 public class MediaPlayerFlakyNetworkTest extends MediaPlayerTestBase {
     private static final String PKG = "android.media.cts";
+    static final String mInpPrefix = WorkDir.getMediaDirString();
 
     private static final String[] TEST_VIDEOS = {
-        "raw/video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz",
-        "raw/video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz",
-        "raw/video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz",
-        "raw/video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz",
-        "raw/video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_22050hz"
+        "video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz.mp4",
+        "video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4",
+        "video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz.mp4",
+        "video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz.mp4",
+        "video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_22050hz.3gp"
     };
 
-    // Allow operations to block for 2500ms before assuming they will ANR.
+    // Allow operations to block for 3500ms before assuming they will ANR.
     // We don't allow the full 5s because cpu load, etc, reduces the budget.
-    private static final int ANR_TIMEOUT_MILLIS = 2500;
+    private static final int ANR_TIMEOUT_MILLIS = 3500;
 
     private CtsTestServer mServer;
 
@@ -103,7 +104,7 @@
     private String[] getSupportedVideos() {
         Vector<String> supported = new Vector<String>();
         for (String video : TEST_VIDEOS) {
-            if (MediaUtils.hasCodecsForPath(mContext, "android.resource://" + PKG + "/" + video)) {
+            if (MediaUtils.hasCodecsForPath(mContext, mInpPrefix + video)) {
                 supported.add(video);
             }
         }
@@ -249,7 +250,7 @@
 
     private void localHttpStreamTest(final String name)
             throws Throwable {
-        String stream_url = mServer.getAssetUrl(name);
+        String stream_url = mServer.getAssetUrl(mInpPrefix + name);
         mMediaPlayer.setDataSource(stream_url);
 
         mMediaPlayer.setDisplay(getActivity().getSurfaceHolder());
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerSurfaceStubActivity.java b/tests/tests/media/src/android/media/cts/MediaPlayerSurfaceStubActivity.java
index 779a808..86b5ebd 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerSurfaceStubActivity.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerSurfaceStubActivity.java
@@ -15,19 +15,24 @@
  */
 package android.media.cts;
 
-import android.media.cts.R;
-
 import android.app.Activity;
 import android.content.res.AssetFileDescriptor;
 import android.content.res.Resources;
 import android.media.MediaPlayer;
 import android.os.Bundle;
+import android.os.ParcelFileDescriptor;
+import android.platform.test.annotations.AppModeFull;
 import android.util.Log;
 
+import java.io.File;
+import java.io.IOException;
+
+@AppModeFull(reason = "Instant apps cannot access the SD card")
 public class MediaPlayerSurfaceStubActivity extends Activity {
 
     private static final String TAG = "MediaPlayerSurfaceStubActivity";
 
+    static final String mInpPrefix = WorkDir.getMediaDirString();
     protected Resources mResources;
 
     private VideoSurfaceView mVideoView = null;
@@ -39,14 +44,26 @@
 
         mResources = getResources();
         mMediaPlayer = new MediaPlayer();
+        AssetFileDescriptor afd = null;
 
         try {
-            AssetFileDescriptor afd = mResources.openRawResourceFd(R.raw.testvideo);
+            File inpFile = new File(mInpPrefix + "testvideo.3gp");
+            ParcelFileDescriptor parcelFD =
+                    ParcelFileDescriptor.open(inpFile, ParcelFileDescriptor.MODE_READ_ONLY);
+            afd = new AssetFileDescriptor(parcelFD, 0, parcelFD.getStatSize());
             mMediaPlayer.setDataSource(
                     afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
             afd.close();
         } catch (Exception e) {
             Log.e(TAG, e.getMessage(), e);
+        } finally {
+            if (afd != null) {
+                try {
+                    afd.close();
+                } catch (IOException e) {
+                    Log.e(TAG, e.getMessage(), e);
+                }
+            }
         }
 
         mVideoView = new VideoSurfaceView(this, mMediaPlayer);
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerTest.java b/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
index 6aac0ed..656cd85 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
@@ -36,11 +36,11 @@
 import android.media.TimedText;
 import android.media.audiofx.AudioEffect;
 import android.media.audiofx.Visualizer;
-import android.media.cts.R;
 import android.media.cts.TestUtils.Monitor;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Environment;
+import android.os.ParcelFileDescriptor;
 import android.os.PowerManager;
 import android.os.SystemClock;
 import android.platform.test.annotations.AppModeFull;
@@ -57,6 +57,8 @@
 
 import java.io.BufferedReader;
 import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.util.ArrayList;
@@ -87,6 +89,8 @@
     private String RECORDED_FILE;
     private static final String LOG_TAG = "MediaPlayerTest";
 
+    static final String mInpPrefix = WorkDir.getMediaDirString();
+
     private static final int  RECORDED_VIDEO_WIDTH  = 176;
     private static final int  RECORDED_VIDEO_HEIGHT = 144;
     private static final long RECORDED_DURATION_MS  = 3000;
@@ -124,10 +128,18 @@
 
     @Presubmit
     public void testFlacHeapOverflow() throws Exception {
-        testIfMediaServerDied(R.raw.heap_oob_flac);
+        testIfMediaServerDied("heap_oob_flac.mp3");
     }
 
-    private void testIfMediaServerDied(int res) throws Exception {
+    protected static AssetFileDescriptor getAssetFileDescriptorFor(final String res)
+            throws FileNotFoundException {
+        File inpFile = new File(mInpPrefix + res);
+        ParcelFileDescriptor parcelFD =
+                ParcelFileDescriptor.open(inpFile, ParcelFileDescriptor.MODE_READ_ONLY);
+        return new AssetFileDescriptor(parcelFD, 0, parcelFD.getStatSize());
+    }
+
+    private void testIfMediaServerDied(final String res) throws Exception {
         mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
             @Override
             public boolean onError(MediaPlayer mp, int what, int extra) {
@@ -146,7 +158,7 @@
             }
         });
 
-        AssetFileDescriptor afd = mResources.openRawResourceFd(res);
+        AssetFileDescriptor afd = getAssetFileDescriptorFor(res);
         mMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
         afd.close();
         try {
@@ -166,7 +178,7 @@
     public void testVorbisCrash() throws Exception {
         MediaPlayer mp = mMediaPlayer;
         MediaPlayer mp2 = mMediaPlayer2;
-        AssetFileDescriptor afd2 = mResources.openRawResourceFd(R.raw.testmp3_2);
+        AssetFileDescriptor afd2 = getAssetFileDescriptorFor("testmp3_2.mp3");
         mp2.setDataSource(afd2.getFileDescriptor(), afd2.getStartOffset(), afd2.getLength());
         afd2.close();
         mp2.prepare();
@@ -175,7 +187,7 @@
 
         for (int i = 0; i < 20; i++) {
             try {
-                AssetFileDescriptor afd = mResources.openRawResourceFd(R.raw.bug13652927);
+                AssetFileDescriptor afd = getAssetFileDescriptorFor("bug13652927.ogg");
                 mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                 afd.close();
                 mp.prepare();
@@ -206,9 +218,9 @@
         final int seekDuration = 100;
 
         // This is "R.raw.testmp3_2", base64-encoded.
-        final int resid = R.raw.testmp3_3;
+        final String res = "testmp3_3.raw";
 
-        InputStream is = mContext.getResources().openRawResource(resid);
+        InputStream is = new FileInputStream(mInpPrefix + res);
         BufferedReader reader = new BufferedReader(new InputStreamReader(is));
 
         StringBuilder builder = new StringBuilder();
@@ -264,24 +276,23 @@
     }
 
     public void testPlayAudioMp3() throws Exception {
-        testPlayAudio(R.raw.testmp3_2,
+        testPlayAudio("testmp3_2.mp3",
                 34909 /* duration */, 70 /* tolerance */, 100 /* seekDuration */);
     }
 
     public void testPlayAudioOpus() throws Exception {
-        testPlayAudio(R.raw.testopus,
+        testPlayAudio("testopus.opus",
                 34909 /* duration */, 70 /* tolerance */, 100 /* seekDuration */);
     }
 
     public void testPlayAudioAmr() throws Exception {
-        testPlayAudio(R.raw.testamr,
+        testPlayAudio("testamr.amr",
                 34909 /* duration */, 70 /* tolerance */, 100 /* seekDuration */);
     }
 
-    public void testPlayAudio(int resid,
+    public void testPlayAudio(final String res,
             int mp3Duration, int tolerance, int seekDuration) throws Exception {
-
-        MediaPlayer mp = MediaPlayer.create(mContext, resid);
+        MediaPlayer mp = MediaPlayer.create(mContext, Uri.fromFile(new File(mInpPrefix + res)));
         try {
             mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
             mp.setWakeMode(mContext, PowerManager.PARTIAL_WAKE_LOCK);
@@ -312,7 +323,7 @@
             // test stop and restart
             mp.stop();
             mp.reset();
-            AssetFileDescriptor afd = mResources.openRawResourceFd(resid);
+            AssetFileDescriptor afd = getAssetFileDescriptorFor(res);
             mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
             afd.close();
             mp.prepare();
@@ -330,10 +341,11 @@
     }
 
     public void testConcurentPlayAudio() throws Exception {
-        final int resid = R.raw.test1m1s; // MP3 longer than 1m are usualy offloaded
+        final String res = "test1m1s.mp3"; // MP3 longer than 1m are usualy offloaded
         final int tolerance = 70;
 
-        List<MediaPlayer> mps = Stream.generate(() -> MediaPlayer.create(mContext, resid))
+        List<MediaPlayer> mps = Stream.generate(
+                () -> MediaPlayer.create(mContext, Uri.fromFile(new File(mInpPrefix + res))))
                                       .limit(5).collect(Collectors.toList());
 
         try {
@@ -366,9 +378,9 @@
     }
 
     public void testPlayAudioLooping() throws Exception {
-        final int resid = R.raw.testmp3;
+        final String res = "testmp3.mp3";
 
-        MediaPlayer mp = MediaPlayer.create(mContext, resid);
+        MediaPlayer mp = MediaPlayer.create(mContext, Uri.fromFile(new File(mInpPrefix + res)));
         try {
             mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
             mp.setWakeMode(mContext, PowerManager.PARTIAL_WAKE_LOCK);
@@ -403,18 +415,18 @@
     }
 
     public void testPlayMidi() throws Exception {
-        runMidiTest(R.raw.midi8sec, 8000 /* duration */);
-        runMidiTest(R.raw.testrtttl, 30000 /* duration */);
-        runMidiTest(R.raw.testimy, 5625 /* duration */);
-        runMidiTest(R.raw.testota, 5906 /* duration */);
-        runMidiTest(R.raw.testmxmf, 29095 /* duration */);
+        runMidiTest("midi8sec.mid", 8000 /* duration */);
+        runMidiTest("testrtttl.rtttl", 30000 /* duration */);
+        runMidiTest("testimy.imy", 5625 /* duration */);
+        runMidiTest("testota.ota", 5906 /* duration */);
+        runMidiTest("testmxmf.mxmf", 29095 /* duration */);
     }
 
-    private void runMidiTest(int resid, int midiDuration) throws Exception {
+    private void runMidiTest(final String res, int midiDuration) throws Exception {
         final int tolerance = 70;
         final int seekDuration = 1000;
 
-        MediaPlayer mp = MediaPlayer.create(mContext, resid);
+        MediaPlayer mp = MediaPlayer.create(mContext, Uri.fromFile(new File(mInpPrefix + res)));
         try {
             mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
             mp.setWakeMode(mContext, PowerManager.PARTIAL_WAKE_LOCK);
@@ -436,7 +448,7 @@
             // test stop and restart
             mp.stop();
             mp.reset();
-            AssetFileDescriptor afd = mResources.openRawResourceFd(resid);
+            AssetFileDescriptor afd = getAssetFileDescriptorFor(res);
             mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
             afd.close();
             mp.prepare();
@@ -576,9 +588,9 @@
 
     public void testPlayAudioTwice() throws Exception {
 
-        final int resid = R.raw.camera_click;
+        final String res = "camera_click.ogg";
 
-        MediaPlayer mp = MediaPlayer.create(mContext, resid);
+        MediaPlayer mp = MediaPlayer.create(mContext, Uri.fromFile(new File(mInpPrefix + res)));
         try {
             mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
             mp.setWakeMode(mContext, PowerManager.PARTIAL_WAKE_LOCK);
@@ -604,11 +616,11 @@
     }
 
     public void testPlayVideo() throws Exception {
-        playVideoTest(R.raw.testvideo, 352, 288);
+        playLoadedVideoTest("testvideo.3gp", 352, 288);
     }
 
     private void initMediaPlayer(MediaPlayer player) throws Exception {
-        AssetFileDescriptor afd = mResources.openRawResourceFd(R.raw.test1m1s);
+        AssetFileDescriptor afd = getAssetFileDescriptorFor("test1m1s.mp3");
         try {
             player.reset();
             player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
@@ -788,7 +800,7 @@
     // will also result in zeroes being detected.
     // Note that this test does NOT guarantee that the correct data is played
     public void testGapless1() throws Exception {
-        flakyTestWrapper(R.raw.monodcpos, R.raw.monodcneg);
+        flakyTestWrapper("monodcpos.mp3", "monodcneg.mp3");
     }
 
     // This test is similar, but uses two identical m4a files that have some noise
@@ -796,21 +808,21 @@
     // a gap in playback
     // Note that this test does NOT guarantee that the correct data is played
     public void testGapless2() throws Exception {
-        flakyTestWrapper(R.raw.stereonoisedcpos, R.raw.stereonoisedcpos);
+        flakyTestWrapper("stereonoisedcpos.m4a", "stereonoisedcpos.m4a");
     }
 
     // same as above, but with a mono file
     public void testGapless3() throws Exception {
-        flakyTestWrapper(R.raw.mononoisedcpos, R.raw.mononoisedcpos);
+        flakyTestWrapper("mononoisedcpos.m4a", "mononoisedcpos.m4a");
     }
 
-    private void flakyTestWrapper(int resid1, int resid2) throws Exception {
+    private void flakyTestWrapper(final String res1, final String res2) throws Exception {
         boolean success = false;
         // test usually succeeds within a few tries, but occasionally may fail
         // many times in a row, so be aggressive and try up to 20 times
         for (int i = 0; i < 20 && !success; i++) {
             try {
-                testGapless(resid1, resid2);
+                testGapless(res1, res2);
                 success = true;
             } catch (Throwable t) {
                 SystemClock.sleep(1000);
@@ -819,11 +831,11 @@
         // Try one more time. If this succeeds, we'll consider the test a success,
         // otherwise the exception gets thrown
         if (!success) {
-            testGapless(resid1, resid2);
+            testGapless(res1, res2);
         }
     }
 
-    private void testGapless(int resid1, int resid2) throws Exception {
+    private void testGapless(final String res1, final String res2) throws Exception {
         MediaPlayer mp1 = null;
         MediaPlayer mp2 = null;
         AudioEffect vc = null;
@@ -840,7 +852,7 @@
             mp1 = new MediaPlayer();
             mp1.setAudioStreamType(AudioManager.STREAM_MUSIC);
 
-            AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(resid1);
+            AssetFileDescriptor afd = getAssetFileDescriptorFor(res1);
             mp1.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
             afd.close();
             mp1.prepare();
@@ -851,7 +863,7 @@
             mp2.setAudioSessionId(session);
             mp2.setAudioStreamType(AudioManager.STREAM_MUSIC);
 
-            afd = mContext.getResources().openRawResourceFd(resid2);
+            afd = getAssetFileDescriptorFor(res2);
             mp2.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
             afd.close();
             mp2.prepare();
@@ -960,7 +972,7 @@
             }
         });
 
-        if (!checkLoadResource(R.raw.testvideo)) {
+        if (!checkLoadResource("testvideo.3gp")) {
             return; // skip;
         }
         playLoadedVideo(352, 288, -1);
@@ -1126,7 +1138,7 @@
     // setPlaybackParams() with non-zero speed should start playback.
     public void testSetPlaybackParamsPositiveSpeed() throws Exception {
         if (!checkLoadResource(
-                R.raw.video_480x360_mp4_h264_1000kbps_30fps_aac_stereo_128kbps_44100hz)) {
+                "video_480x360_mp4_h264_1000kbps_30fps_aac_stereo_128kbps_44100hz.mp4")) {
             return; // skip
         }
 
@@ -1182,7 +1194,7 @@
     // setPlaybackParams() with zero speed should pause playback.
     public void testSetPlaybackParamsZeroSpeed() throws Exception {
         if (!checkLoadResource(
-                R.raw.video_480x360_mp4_h264_1000kbps_30fps_aac_stereo_128kbps_44100hz)) {
+                "video_480x360_mp4_h264_1000kbps_30fps_aac_stereo_128kbps_44100hz.mp4")) {
             return; // skip
         }
 
@@ -1204,13 +1216,13 @@
         mMediaPlayer.seekTo(0);
         mOnSeekCompleteCalled.waitForSignal();
         Thread.sleep(playTime);
-        assertTrue("MediaPlayer should not be playing",
-                !mMediaPlayer.isPlaying() && mMediaPlayer.getCurrentPosition() == 0);
+        assertFalse("MediaPlayer should not be playing", mMediaPlayer.isPlaying());
+        assertTrue("MediaPlayer position should be 0", mMediaPlayer.getCurrentPosition() == 0);
 
         mMediaPlayer.start();
         Thread.sleep(playTime);
-        assertTrue("MediaPlayer should be playing",
-                mMediaPlayer.isPlaying() && mMediaPlayer.getCurrentPosition() > 0);
+        assertTrue("MediaPlayer should be playing", mMediaPlayer.isPlaying());
+        assertTrue("MediaPlayer position should be > 0", mMediaPlayer.getCurrentPosition() > 0);
 
         mMediaPlayer.setPlaybackParams(new PlaybackParams().setSpeed(0.0f));
         assertFalse("MediaPlayer should not be playing", mMediaPlayer.isPlaying());
@@ -1225,7 +1237,7 @@
     public void testPlaybackRate() throws Exception {
         final int toleranceMs = 1000;
         if (!checkLoadResource(
-                R.raw.video_480x360_mp4_h264_1000kbps_30fps_aac_stereo_128kbps_44100hz)) {
+                "video_480x360_mp4_h264_1000kbps_30fps_aac_stereo_128kbps_44100hz.mp4")) {
             return; // skip
         }
 
@@ -1266,7 +1278,7 @@
     public void testSeekModes() throws Exception {
         // This clip has 2 I frames at 66687us and 4299687us.
         if (!checkLoadResource(
-                R.raw.bbb_s1_320x240_mp4_h264_mp2_800kbps_30fps_aac_lc_5ch_240kbps_44100hz)) {
+                "bbb_s1_320x240_mp4_h264_mp2_800kbps_30fps_aac_lc_5ch_240kbps_44100hz.mp4")) {
             return; // skip
         }
 
@@ -1341,7 +1353,7 @@
         final int toleranceUs = 100000;
         final float playbackRate = 1.0f;
         if (!checkLoadResource(
-                R.raw.video_480x360_mp4_h264_1000kbps_30fps_aac_stereo_128kbps_44100hz)) {
+                "video_480x360_mp4_h264_1000kbps_30fps_aac_stereo_128kbps_44100hz.mp4")) {
             return; // skip
         }
 
@@ -1385,7 +1397,7 @@
 
     public void testMediaTimeDiscontinuity() throws Exception {
         if (!checkLoadResource(
-                R.raw.bbb_s1_320x240_mp4_h264_mp2_800kbps_30fps_aac_lc_5ch_240kbps_44100hz)) {
+                "bbb_s1_320x240_mp4_h264_mp2_800kbps_30fps_aac_lc_5ch_240kbps_44100hz.mp4")) {
             return; // skip
         }
 
@@ -1450,220 +1462,220 @@
 
     public void testLocalVideo_MKV_H265_1280x720_500kbps_25fps_AAC_Stereo_128kbps_44100Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_1280x720_mkv_h265_500kbps_25fps_aac_stereo_128kbps_44100hz, 1280, 720);
+        playLoadedVideoTest("video_1280x720_mkv_h265_500kbps_25fps_aac_stereo_128kbps_44100hz.mkv",
+                1280, 720);
     }
     public void testLocalVideo_MP4_H264_480x360_500kbps_25fps_AAC_Stereo_128kbps_44110Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_480x360_mp4_h264_500kbps_25fps_aac_stereo_128kbps_44100hz, 480, 360);
+        playLoadedVideoTest("video_480x360_mp4_h264_500kbps_25fps_aac_stereo_128kbps_44100hz.mp4",
+                480, 360);
     }
 
     public void testLocalVideo_MP4_H264_480x360_500kbps_30fps_AAC_Stereo_128kbps_44110Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz, 480, 360);
+        playLoadedVideoTest("video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz.mp4",
+                480, 360);
     }
 
     public void testLocalVideo_MP4_H264_480x360_1000kbps_25fps_AAC_Stereo_128kbps_44110Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz, 480, 360);
+        playLoadedVideoTest("video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4",
+                480, 360);
     }
 
     public void testLocalVideo_MP4_H264_480x360_1000kbps_30fps_AAC_Stereo_128kbps_44110Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_480x360_mp4_h264_1000kbps_30fps_aac_stereo_128kbps_44100hz, 480, 360);
+        playLoadedVideoTest("video_480x360_mp4_h264_1000kbps_30fps_aac_stereo_128kbps_44100hz.mp4",
+                480, 360);
     }
 
     public void testLocalVideo_MP4_H264_480x360_1350kbps_25fps_AAC_Stereo_128kbps_44110Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_480x360_mp4_h264_1350kbps_25fps_aac_stereo_128kbps_44100hz, 480, 360);
+        playLoadedVideoTest("video_480x360_mp4_h264_1350kbps_25fps_aac_stereo_128kbps_44100hz.mp4",
+                480, 360);
     }
 
     public void testLocalVideo_MP4_H264_480x360_1350kbps_30fps_AAC_Stereo_128kbps_44110Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz, 480, 360);
+        playLoadedVideoTest("video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz.mp4",
+                480, 360);
     }
 
     public void testLocalVideo_MP4_H264_480x360_1350kbps_30fps_AAC_Stereo_128kbps_44110Hz_frag()
             throws Exception {
-        playVideoTest(
-                R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz_fragmented,
+        playLoadedVideoTest(
+                "video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_128kbps_44100hz_fragmented.mp4",
                 480, 360);
     }
 
 
     public void testLocalVideo_MP4_H264_480x360_1350kbps_30fps_AAC_Stereo_192kbps_44110Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz, 480, 360);
+        playLoadedVideoTest("video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz.mp4",
+                480, 360);
     }
 
     public void testLocalVideo_3gp_H263_176x144_56kbps_12fps_AAC_Mono_24kbps_11025Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_56kbps_12fps_aac_mono_24kbps_11025hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_56kbps_12fps_aac_mono_24kbps_11025hz.3gp", 176,
+                144);
     }
 
     public void testLocalVideo_3gp_H263_176x144_56kbps_12fps_AAC_Mono_24kbps_22050Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_56kbps_12fps_aac_mono_24kbps_22050hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_56kbps_12fps_aac_mono_24kbps_22050hz.3gp", 176,
+                144);
     }
 
     public void testLocalVideo_3gp_H263_176x144_56kbps_12fps_AAC_Stereo_24kbps_11025Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_56kbps_12fps_aac_stereo_24kbps_11025hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_56kbps_12fps_aac_stereo_24kbps_11025hz.3gp",
+                176, 144);
     }
 
     public void testLocalVideo_3gp_H263_176x144_56kbps_12fps_AAC_Stereo_24kbps_22050Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_56kbps_12fps_aac_stereo_24kbps_22050hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_56kbps_12fps_aac_stereo_24kbps_22050hz.3gp",
+                176, 144);
     }
 
     public void testLocalVideo_3gp_H263_176x144_56kbps_12fps_AAC_Stereo_128kbps_11025Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_56kbps_12fps_aac_stereo_128kbps_11025hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_56kbps_12fps_aac_stereo_128kbps_11025hz.3gp",
+                176, 144);
     }
 
     public void testLocalVideo_3gp_H263_176x144_56kbps_12fps_AAC_Stereo_128kbps_22050Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_56kbps_12fps_aac_stereo_128kbps_22050hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_56kbps_12fps_aac_stereo_128kbps_22050hz.3gp",
+                176, 144);
     }
 
     public void testLocalVideo_3gp_H263_176x144_56kbps_25fps_AAC_Mono_24kbps_11025Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_56kbps_25fps_aac_mono_24kbps_11025hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_56kbps_25fps_aac_mono_24kbps_11025hz.3gp", 176,
+                144);
     }
 
     public void testLocalVideo_3gp_H263_176x144_56kbps_25fps_AAC_Mono_24kbps_22050Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_56kbps_25fps_aac_mono_24kbps_22050hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_56kbps_25fps_aac_mono_24kbps_22050hz.3gp", 176,
+                144);
     }
 
     public void testLocalVideo_3gp_H263_176x144_56kbps_25fps_AAC_Stereo_24kbps_11025Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_56kbps_25fps_aac_stereo_24kbps_11025hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_56kbps_25fps_aac_stereo_24kbps_11025hz.3gp",
+                176, 144);
     }
 
     public void testLocalVideo_3gp_H263_176x144_56kbps_25fps_AAC_Stereo_24kbps_22050Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_56kbps_25fps_aac_stereo_24kbps_22050hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_56kbps_25fps_aac_stereo_24kbps_22050hz.3gp",
+                176, 144);
     }
 
     public void testLocalVideo_3gp_H263_176x144_56kbps_25fps_AAC_Stereo_128kbps_11025Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_56kbps_25fps_aac_stereo_128kbps_11025hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_56kbps_25fps_aac_stereo_128kbps_11025hz.3gp",
+                176, 144);
     }
 
     public void testLocalVideo_3gp_H263_176x144_56kbps_25fps_AAC_Stereo_128kbps_22050Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_56kbps_25fps_aac_stereo_128kbps_22050hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_56kbps_25fps_aac_stereo_128kbps_22050hz.3gp",
+                176, 144);
     }
 
     public void testLocalVideo_3gp_H263_176x144_300kbps_12fps_AAC_Mono_24kbps_11025Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_mono_24kbps_11025hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_300kbps_12fps_aac_mono_24kbps_11025hz.3gp", 176,
+                144);
     }
 
     public void testLocalVideo_3gp_H263_176x144_300kbps_12fps_AAC_Mono_24kbps_22050Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_mono_24kbps_22050hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_300kbps_12fps_aac_mono_24kbps_22050hz.3gp", 176,
+                144);
     }
 
     public void testLocalVideo_3gp_H263_176x144_300kbps_12fps_AAC_Stereo_24kbps_11025Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_24kbps_11025hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_300kbps_12fps_aac_stereo_24kbps_11025hz.3gp",
+                176, 144);
     }
 
     public void testLocalVideo_3gp_H263_176x144_300kbps_12fps_AAC_Stereo_24kbps_22050Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_24kbps_22050hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_300kbps_12fps_aac_stereo_24kbps_22050hz.3gp",
+                176, 144);
     }
 
     public void testLocalVideo_3gp_H263_176x144_300kbps_12fps_AAC_Stereo_128kbps_11025Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_11025hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_11025hz.3gp",
+                176, 144);
     }
 
     public void testLocalVideo_3gp_H263_176x144_300kbps_12fps_AAC_Stereo_128kbps_22050Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz.3gp",
+                176, 144);
     }
 
     public void testLocalVideo_3gp_H263_176x144_300kbps_25fps_AAC_Mono_24kbps_11025Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_300kbps_25fps_aac_mono_24kbps_11025hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_300kbps_25fps_aac_mono_24kbps_11025hz.3gp", 176,
+                144);
     }
 
     public void testLocalVideo_3gp_H263_176x144_300kbps_25fps_AAC_Mono_24kbps_22050Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_300kbps_25fps_aac_mono_24kbps_22050hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_300kbps_25fps_aac_mono_24kbps_22050hz.3gp", 176,
+                144);
     }
 
     public void testLocalVideo_3gp_H263_176x144_300kbps_25fps_AAC_Stereo_24kbps_11025Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_300kbps_25fps_aac_stereo_24kbps_11025hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_300kbps_25fps_aac_stereo_24kbps_11025hz.3gp",
+                176, 144);
     }
 
     public void testLocalVideo_3gp_H263_176x144_300kbps_25fps_AAC_Stereo_24kbps_22050Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_300kbps_25fps_aac_stereo_24kbps_22050hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_300kbps_25fps_aac_stereo_24kbps_22050hz.3gp",
+                176, 144);
     }
 
     public void testLocalVideo_3gp_H263_176x144_300kbps_25fps_AAC_Stereo_128kbps_11025Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_11025hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_11025hz.3gp",
+                176, 144);
     }
 
     public void testLocalVideo_3gp_H263_176x144_300kbps_25fps_AAC_Stereo_128kbps_22050Hz()
             throws Exception {
-        playVideoTest(
-                R.raw.video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_22050hz, 176, 144);
+        playLoadedVideoTest("video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_22050hz.3gp",
+                176, 144);
     }
 
     public void testLocalVideo_cp1251_3_a_ms_acm_mp3() throws Exception {
-        playVideoTest(R.raw.cp1251_3_a_ms_acm_mp3, -1, -1);
+        playLoadedVideoTest("cp1251_3_a_ms_acm_mp3.mkv", -1, -1);
     }
 
     public void testLocalVideo_mkv_audio_pcm_be() throws Exception {
-        playVideoTest(R.raw.mkv_audio_pcms16be, -1, -1);
+        playLoadedVideoTest("mkv_audio_pcms16be.mkv", -1, -1);
     }
 
     public void testLocalVideo_mkv_audio_pcm_le() throws Exception {
-        playVideoTest(R.raw.mkv_audio_pcms16le, -1, -1);
+        playLoadedVideoTest("mkv_audio_pcms16le.mkv", -1, -1);
     }
 
     public void testLocalVideo_segment000001_m2ts()
             throws Exception {
-        if (checkLoadResource(R.raw.segment000001)) {
+        if (checkLoadResource("segment000001.ts")) {
             mMediaPlayer.stop();
-            assertTrue(checkLoadResource(R.raw.segment000001_m2ts));
+            assertTrue(checkLoadResource("segment000001_m2ts.mp4"));
             playLoadedVideo(320, 240, 0);
         } else {
             MediaUtils.skipTest("no mp2 support, skipping m2ts");
@@ -1703,7 +1715,7 @@
     }
 
     public void testDeselectTrackForSubtitleTracks() throws Throwable {
-        if (!checkLoadResource(R.raw.testvideo_with_2_subtitle_tracks)) {
+        if (!checkLoadResource("testvideo_with_2_subtitle_tracks.mp4")) {
             return; // skip;
         }
 
@@ -1769,7 +1781,7 @@
     }
 
     public void testChangeSubtitleTrack() throws Throwable {
-        if (!checkLoadResource(R.raw.testvideo_with_2_subtitle_tracks)) {
+        if (!checkLoadResource("testvideo_with_2_subtitle_tracks.mp4")) {
             return; // skip;
         }
 
@@ -1820,7 +1832,7 @@
     }
 
     public void testOnSubtitleDataListener() throws Throwable {
-        if (!checkLoadResource(R.raw.testvideo_with_2_subtitle_tracks)) {
+        if (!checkLoadResource("testvideo_with_2_subtitle_tracks.mp4")) {
             return; // skip;
         }
 
@@ -1877,7 +1889,7 @@
 
     @Presubmit
     public void testGetTrackInfoForVideoWithSubtitleTracks() throws Throwable {
-        if (!checkLoadResource(R.raw.testvideo_with_2_subtitle_tracks)) {
+        if (!checkLoadResource("testvideo_with_2_subtitle_tracks.mp4")) {
             return; // skip;
         }
 
@@ -1958,13 +1970,13 @@
     }
 
     public void testDeselectTrackForTimedTextTrack() throws Throwable {
-        if (!checkLoadResource(R.raw.testvideo_with_2_timedtext_tracks)) {
+        if (!checkLoadResource("testvideo_with_2_timedtext_tracks.3gp")) {
             return; // skip;
         }
         runTestOnUiThread(new Runnable() {
             public void run() {
                 try {
-                    loadSubtitleSource(R.raw.test_subtitle1_srt);
+                    loadSubtitleSource("test_subtitle1_srt.3gp");
                 } catch (Exception e) {
                     throw new AssertionFailedError(e.getMessage());
                 }
@@ -2039,8 +2051,8 @@
     }
 
     private void testChangeTimedTextTrackWithSpeed(float speed) throws Throwable {
-        testTimedText(R.raw.testvideo_with_2_timedtext_tracks, 2,
-                new int[] {R.raw.test_subtitle1_srt, R.raw.test_subtitle2_srt},
+        testTimedText("testvideo_with_2_timedtext_tracks.3gp", 2,
+                new String[] {"test_subtitle1_srt.3gp", "test_subtitle2_srt.3gp"},
                 new VerifyAndSignalTimedText(),
                 new Callable<Void>() {
                     @Override
@@ -2089,7 +2101,7 @@
         } catch (Exception e) {
             Log.w(LOG_TAG, "bad num/iteration arguments, using default", e);
         }
-        testTimedText(R.raw.testvideo_with_2_timedtext_tracks, 2, new int[] {},
+        testTimedText("testvideo_with_2_timedtext_tracks.3gp", 2, new String [] {},
                 new VerifyAndSignalTimedText(num.get(), true),
                 new Callable<Void>() {
                     @Override
@@ -2121,7 +2133,7 @@
     }
 
     private void testTimedText(
-            int resource, int numInternalTracks, int[] subtitleResources,
+            String resource, int numInternalTracks, String[] subtitleResources,
             OnTimedTextListener onTimedTextListener, Callable<?> testBody) throws Throwable {
         if (!checkLoadResource(resource)) {
             return; // skip;
@@ -2151,7 +2163,7 @@
             public void run() {
                 try {
                     // Adds two more external subtitle files.
-                    for (int subRes : subtitleResources) {
+                    for (String subRes : subtitleResources) {
                         loadSubtitleSource(subRes);
                     }
                     readTimedTextTracks();
@@ -2168,14 +2180,14 @@
 
     @Presubmit
     public void testGetTrackInfoForVideoWithTimedText() throws Throwable {
-        if (!checkLoadResource(R.raw.testvideo_with_2_timedtext_tracks)) {
+        if (!checkLoadResource("testvideo_with_2_timedtext_tracks.3gp")) {
             return; // skip;
         }
         runTestOnUiThread(new Runnable() {
             public void run() {
                 try {
-                    loadSubtitleSource(R.raw.test_subtitle1_srt);
-                    loadSubtitleSource(R.raw.test_subtitle2_srt);
+                    loadSubtitleSource("test_subtitle1_srt.3gp");
+                    loadSubtitleSource("test_subtitle2_srt.3gp");
                 } catch (Exception e) {
                     throw new AssertionFailedError(e.getMessage());
                 }
@@ -2213,23 +2225,21 @@
      */
     public void testResumeAtEnd() throws Throwable {
         int testsRun =
-            testResumeAtEnd(R.raw.loudsoftmp3) +
-            testResumeAtEnd(R.raw.loudsoftwav) +
-            testResumeAtEnd(R.raw.loudsoftogg) +
-            testResumeAtEnd(R.raw.loudsoftitunes) +
-            testResumeAtEnd(R.raw.loudsoftfaac) +
-            testResumeAtEnd(R.raw.loudsoftaac);
+            testResumeAtEnd("loudsoftmp3.mp3") +
+            testResumeAtEnd("loudsoftwav.wav") +
+            testResumeAtEnd("loudsoftogg.ogg") +
+            testResumeAtEnd("loudsoftitunes.m4a") +
+            testResumeAtEnd("loudsoftfaac.m4a") +
+            testResumeAtEnd("loudsoftaac.aac");
         if (testsRun == 0) {
             MediaUtils.skipTest("no decoder found");
         }
     }
 
     // returns 1 if test was run, 0 otherwise
-    private int testResumeAtEnd(int res) throws Throwable {
+    private int testResumeAtEnd(final String res) throws Throwable {
         if (!loadResource(res)) {
-            Log.i(LOG_TAG, "testResumeAtEnd: No decoder found for " +
-                mContext.getResources().getResourceEntryName(res) +
-                " --- skipping.");
+            Log.i(LOG_TAG, "testResumeAtEnd: No decoder found for " + res + " --- skipping.");
             return 0; // skip
         }
         mMediaPlayer.prepare();
@@ -2254,23 +2264,21 @@
 
     public void testPositionAtEnd() throws Throwable {
         int testsRun =
-            testPositionAtEnd(R.raw.test1m1shighstereo) +
-            testPositionAtEnd(R.raw.loudsoftmp3) +
-            testPositionAtEnd(R.raw.loudsoftwav) +
-            testPositionAtEnd(R.raw.loudsoftogg) +
-            testPositionAtEnd(R.raw.loudsoftitunes) +
-            testPositionAtEnd(R.raw.loudsoftfaac) +
-            testPositionAtEnd(R.raw.loudsoftaac);
+            testPositionAtEnd("test1m1shighstereo.mp3") +
+            testPositionAtEnd("loudsoftmp3.mp3") +
+            testPositionAtEnd("loudsoftwav.wav") +
+            testPositionAtEnd("loudsoftogg.ogg") +
+            testPositionAtEnd("loudsoftitunes.m4a") +
+            testPositionAtEnd("loudsoftfaac.m4a") +
+            testPositionAtEnd("loudsoftaac.aac");
         if (testsRun == 0) {
             MediaUtils.skipTest(LOG_TAG, "no decoder found");
         }
     }
 
-    private int testPositionAtEnd(int res) throws Throwable {
+    private int testPositionAtEnd(final String res) throws Throwable {
         if (!loadResource(res)) {
-            Log.i(LOG_TAG, "testPositionAtEnd: No decoder found for " +
-                mContext.getResources().getResourceEntryName(res) +
-                " --- skipping.");
+            Log.i(LOG_TAG, "testPositionAtEnd: No decoder found for " + res + " --- skipping.");
             return 0; // skip
         }
         mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
@@ -2299,7 +2307,7 @@
     public void testCallback() throws Throwable {
         final int mp4Duration = 8484;
 
-        if (!checkLoadResource(R.raw.testvideo)) {
+        if (!checkLoadResource("testvideo.3gp")) {
             return; // skip;
         }
 
@@ -2459,15 +2467,15 @@
 
     // Smoke test playback from a MediaDataSource.
     public void testPlaybackFromAMediaDataSource() throws Exception {
-        final int resid = R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz;
+        final String res = "video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz.mp4";
         final int duration = 10000;
 
-        if (!MediaUtils.hasCodecsForResource(mContext, resid)) {
+        if (!MediaUtils.hasCodecsForResource(mInpPrefix + res)) {
             return;
         }
 
         TestMediaDataSource dataSource =
-                TestMediaDataSource.fromAssetFd(mResources.openRawResourceFd(resid));
+                TestMediaDataSource.fromAssetFd(getAssetFileDescriptorFor(res));
         // Test returning -1 from getSize() to indicate unknown size.
         dataSource.returnFromGetSize(-1);
         mMediaPlayer.setDataSource(dataSource);
@@ -2517,14 +2525,14 @@
 
     @Presubmit
     public void testPlaybackFailsIfMediaDataSourceThrows() throws Exception {
-        final int resid = R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz;
-        if (!MediaUtils.hasCodecsForResource(mContext, resid)) {
+        final String res = "video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz.mp4";
+        if (!MediaUtils.hasCodecsForResource(mInpPrefix + res)) {
             return;
         }
 
         setOnErrorListener();
         TestMediaDataSource dataSource =
-                TestMediaDataSource.fromAssetFd(mResources.openRawResourceFd(resid));
+                TestMediaDataSource.fromAssetFd(getAssetFileDescriptorFor(res));
         mMediaPlayer.setDataSource(dataSource);
         mMediaPlayer.prepare();
 
@@ -2535,14 +2543,14 @@
 
     @Presubmit
     public void testPlaybackFailsIfMediaDataSourceReturnsAnError() throws Exception {
-        final int resid = R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz;
-        if (!MediaUtils.hasCodecsForResource(mContext, resid)) {
+        final String res = "video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz.mp4";
+        if (!MediaUtils.hasCodecsForResource(mInpPrefix + res)) {
             return;
         }
 
         setOnErrorListener();
         TestMediaDataSource dataSource =
-                TestMediaDataSource.fromAssetFd(mResources.openRawResourceFd(resid));
+                TestMediaDataSource.fromAssetFd(getAssetFileDescriptorFor(res));
         mMediaPlayer.setDataSource(dataSource);
         mMediaPlayer.prepare();
 
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java b/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java
index f01665a..fe6242f 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerTestBase.java
@@ -18,15 +18,17 @@
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.content.res.AssetFileDescriptor;
-import android.content.res.Resources;
 import android.media.MediaPlayer;
 import android.media.cts.TestUtils.Monitor;
 import android.net.Uri;
+import android.os.ParcelFileDescriptor;
 import android.os.PersistableBundle;
 import android.test.ActivityInstrumentationTestCase2;
 
 import com.android.compatibility.common.util.MediaUtils;
 
+import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.net.HttpCookie;
 import java.util.List;
@@ -40,6 +42,8 @@
 public class MediaPlayerTestBase extends ActivityInstrumentationTestCase2<MediaStubActivity> {
     private static final Logger LOG = Logger.getLogger(MediaPlayerTestBase.class.getName());
 
+    static final String mInpPrefix = WorkDir.getMediaDirString();
+
     protected static final int SLEEP_TIME = 1000;
     protected static final int LONG_SLEEP_TIME = 6000;
     protected static final int STREAM_RETRIES = 20;
@@ -55,8 +59,6 @@
     protected Monitor mOnErrorCalled = new Monitor();
 
     protected Context mContext;
-    protected Resources mResources;
-
 
     protected MediaPlayer mMediaPlayer = null;
     protected MediaPlayer mMediaPlayer2 = null;
@@ -83,7 +85,6 @@
             fail();
         }
         mContext = getInstrumentation().getTargetContext();
-        mResources = mContext.getResources();
     }
 
     @Override
@@ -100,13 +101,21 @@
         super.tearDown();
     }
 
+    protected static AssetFileDescriptor getAssetFileDescriptorFor(final String res)
+            throws FileNotFoundException {
+        File inpFile = new File(mInpPrefix + res);
+        ParcelFileDescriptor parcelFD =
+                ParcelFileDescriptor.open(inpFile, ParcelFileDescriptor.MODE_READ_ONLY);
+        return new AssetFileDescriptor(parcelFD, 0, parcelFD.getStatSize());
+    }
+
     // returns true on success
-    protected boolean loadResource(int resid) throws Exception {
-        if (!MediaUtils.hasCodecsForResource(mContext, resid)) {
+    protected boolean loadResource(final String res) throws Exception {
+        if (!MediaUtils.hasCodecsForResource(mInpPrefix + res)) {
             return false;
         }
 
-        AssetFileDescriptor afd = mResources.openRawResourceFd(resid);
+        AssetFileDescriptor afd = getAssetFileDescriptorFor(res);
         try {
             mMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(),
                     afd.getLength());
@@ -125,12 +134,12 @@
         return true;
     }
 
-    protected boolean checkLoadResource(int resid) throws Exception {
-        return MediaUtils.check(loadResource(resid), "no decoder found");
+    protected boolean checkLoadResource(String res) throws Exception {
+        return MediaUtils.check(loadResource(res), "no decoder found");
     }
 
-    protected void loadSubtitleSource(int resid) throws Exception {
-        AssetFileDescriptor afd = mResources.openRawResourceFd(resid);
+    protected void loadSubtitleSource(String res) throws Exception {
+        AssetFileDescriptor afd = getAssetFileDescriptorFor(res);
         try {
             mMediaPlayer.addTimedTextSource(afd.getFileDescriptor(), afd.getStartOffset(),
                       afd.getLength(), MediaPlayer.MEDIA_MIMETYPE_TEXT_SUBRIP);
@@ -169,8 +178,8 @@
         assertTrue("Stream did not play successfully after all attempts", playedSuccessfully);
     }
 
-    protected void playVideoTest(int resid, int width, int height) throws Exception {
-        if (!checkLoadResource(resid)) {
+    protected void playLoadedVideoTest(final String res, int width, int height) throws Exception {
+        if (!checkLoadResource(res)) {
             return; // skip
         }
 
diff --git a/tests/tests/media/src/android/media/cts/MediaRandomTest.java b/tests/tests/media/src/android/media/cts/MediaRandomTest.java
index 30fd364..300cf3f 100644
--- a/tests/tests/media/src/android/media/cts/MediaRandomTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaRandomTest.java
@@ -16,15 +16,16 @@
 package android.media.cts;
 
 import android.content.res.AssetFileDescriptor;
-import android.content.res.Resources;
 import android.media.MediaRecorder;
 import android.media.MediaPlayer;
 import android.os.Environment;
+import android.os.ParcelFileDescriptor;
 import android.platform.test.annotations.AppModeFull;
 import android.test.ActivityInstrumentationTestCase2;
 import android.util.Log;
 import android.view.SurfaceHolder;
 
+import java.io.File;
 import java.util.Random;
 
 /**
@@ -44,6 +45,7 @@
 public class MediaRandomTest extends ActivityInstrumentationTestCase2<MediaStubActivity> {
     private static final String TAG = "MediaRandomTest";
 
+    static final String mInpPrefix = WorkDir.getMediaDirString();
     private static final String OUTPUT_FILE =
                 Environment.getExternalStorageDirectory().toString() + "/record.3gp";
 
@@ -53,7 +55,6 @@
     private MediaRecorder mRecorder;
     private MediaPlayer mPlayer;
     private SurfaceHolder mSurfaceHolder;
-    private Resources mResources;
 
     // Modified across multiple threads
     private volatile boolean mMediaServerDied;
@@ -66,7 +67,6 @@
         getInstrumentation().waitForIdleSync();
         mMediaServerDied = false;
         mSurfaceHolder = getActivity().getSurfaceHolder();
-        mResources = getInstrumentation().getTargetContext().getResources();
         try {
             // Running this on UI thread make sure that
             // onError callback can be received.
@@ -162,8 +162,11 @@
         super("android.media.cts", MediaStubActivity.class);
     }
 
-    private void loadSource(int resid) throws Exception {
-        AssetFileDescriptor afd = mResources.openRawResourceFd(resid);
+    private void loadSource(final String res) throws Exception {
+        File inpFile = new File(mInpPrefix + res);
+        ParcelFileDescriptor parcelFD =
+                ParcelFileDescriptor.open(inpFile, ParcelFileDescriptor.MODE_READ_ONLY);
+        AssetFileDescriptor afd = new AssetFileDescriptor(parcelFD, 0, parcelFD.getStatSize());
         try {
             mPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(),
                     afd.getLength());
@@ -172,18 +175,22 @@
         }
     }
     public void testPlayerRandomActionAV1() throws Exception {
-        testPlayerRandomAction(R.raw.video_480x360_webm_av1_400kbps_30fps_vorbis_stereo_128kbps_48000hz);
+        testPlayerRandomAction(
+                "video_480x360_webm_av1_400kbps_30fps_vorbis_stereo_128kbps_48000hz.webm");
     }
     public void testPlayerRandomActionH264() throws Exception {
-        testPlayerRandomAction(R.raw.video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz);
+        testPlayerRandomAction(
+                "video_480x360_mp4_h264_500kbps_30fps_aac_stereo_128kbps_44100hz.mp4");
     }
     public void testPlayerRandomActionHEVC() throws Exception {
-        testPlayerRandomAction(R.raw.video_480x360_mp4_hevc_650kbps_30fps_aac_stereo_128kbps_48000hz);
+        testPlayerRandomAction(
+                "video_480x360_mp4_hevc_650kbps_30fps_aac_stereo_128kbps_48000hz.mp4");
     }
     public void testPlayerRandomActionMpeg2() throws Exception {
-        testPlayerRandomAction(R.raw.video_480x360_mp4_mpeg2_1500kbps_30fps_aac_stereo_128kbps_48000hz);
+        testPlayerRandomAction(
+                "video_480x360_mp4_mpeg2_1500kbps_30fps_aac_stereo_128kbps_48000hz.mp4");
     }
-    private void testPlayerRandomAction(int resid) throws Exception {
+    private void testPlayerRandomAction(final String res) throws Exception {
         Watchdog watchdog = new Watchdog(5000);
         try {
             mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@@ -197,7 +204,7 @@
                     return true;
                 }
             });
-            loadSource(resid);
+            loadSource(res);
             mPlayer.setDisplay(mSurfaceHolder);
             mPlayer.prepare();
             mPlayer.start();
diff --git a/tests/tests/media/src/android/media/cts/MediaRecorderTest.java b/tests/tests/media/src/android/media/cts/MediaRecorderTest.java
index cef3d82..905cb60 100644
--- a/tests/tests/media/src/android/media/cts/MediaRecorderTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaRecorderTest.java
@@ -1283,7 +1283,7 @@
         if (surface == null) {
             return false;
         }
-        Surface dummy = null;
+        Surface placeholder = null;
 
         boolean success = true;
         try {
@@ -1304,7 +1304,7 @@
             /*
              * Test: getSurface() should fail before prepare
              */
-            dummy = tryGetSurface(true /* shouldThow */);
+            placeholder = tryGetSurface(true /* shouldThow */);
 
             mMediaRecorder.prepare();
 
@@ -1316,7 +1316,7 @@
             /*
              * Test: getSurface() should fail if setInputSurface() succeeded
              */
-            dummy = tryGetSurface(!errorCase /* shouldThow */);
+            placeholder = tryGetSurface(!errorCase /* shouldThow */);
 
             mMediaRecorder.start();
 
@@ -1328,7 +1328,7 @@
             /*
              * Test: getSurface() should fail if setInputSurface() succeeded
              */
-            dummy = tryGetSurface(!errorCase /* shouldThow */);
+            placeholder = tryGetSurface(!errorCase /* shouldThow */);
 
             try {
                 mMediaRecorder.stop();
@@ -1340,7 +1340,7 @@
             /*
              * Test: getSurface() should fail after stop
              */
-            dummy = tryGetSurface(true /* shouldThow */);
+            placeholder = tryGetSurface(true /* shouldThow */);
         } catch (Exception e) {
             Log.d(TAG, e.toString());
             success = false;
@@ -1356,9 +1356,9 @@
                 surface.release();
                 surface = null;
             }
-            if (dummy != null) {
-                dummy.release();
-                dummy = null;
+            if (placeholder != null) {
+                placeholder.release();
+                placeholder = null;
             }
         }
 
diff --git a/tests/tests/media/src/android/media/cts/MediaScannerTest.java b/tests/tests/media/src/android/media/cts/MediaScannerTest.java
index 65d1644..1387493 100644
--- a/tests/tests/media/src/android/media/cts/MediaScannerTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaScannerTest.java
@@ -60,6 +60,7 @@
 @AppModeFull(reason = "TODO: evaluate and port to instant")
 public class MediaScannerTest extends AndroidTestCase {
     private static final String MEDIA_TYPE = "audio/mpeg";
+    static final String mInpPrefix = WorkDir.getMediaDirString();
     private File mMediaFile;
     private static final int TIME_OUT = 10000;
     private MockMediaScannerConnection mMediaScannerConnection;
@@ -75,12 +76,20 @@
 
         cleanup();
         String fileName = mFileDir + "/test" + System.currentTimeMillis() + ".mp3";
-        writeFile(R.raw.testmp3, fileName);
+        writeFile("testmp3.mp3", fileName);
 
         mMediaFile = new File(fileName);
         assertTrue(mMediaFile.exists());
     }
 
+    protected AssetFileDescriptor getAssetFileDescriptorFor(final String res)
+            throws FileNotFoundException {
+        File inpFile = new File(mInpPrefix + res);
+        ParcelFileDescriptor parcelFD =
+                ParcelFileDescriptor.open(inpFile, ParcelFileDescriptor.MODE_READ_ONLY);
+        return new AssetFileDescriptor(parcelFD, 0, parcelFD.getStatSize());
+    }
+
     private void writeFile(int resid, String path) throws IOException {
         File out = new File(path);
         File dir = out.getParentFile();
@@ -89,6 +98,14 @@
         copier.copyToExternalStorage(resid, out);
     }
 
+    private void writeFile(final String res, String path) throws IOException {
+        File out = new File(path);
+        File dir = out.getParentFile();
+        dir.mkdirs();
+        FileCopyHelper copier = new FileCopyHelper(mContext);
+        copier.copyToExternalStorage(mInpPrefix + res, out);
+    }
+
     @Override
     protected void tearDown() throws Exception {
         cleanup();
@@ -131,7 +148,7 @@
 
         // Write unlocalizable audio file and scan to insert into database
         final String unlocalizablePath = mFileDir + "/unlocalizable.mp3";
-        writeFile(R.raw.testmp3, unlocalizablePath);
+        writeFile("testmp3.mp3", unlocalizablePath);
         mMediaScannerConnection.scanFile(unlocalizablePath, null);
         checkMediaScannerConnection();
         final Uri media1Uri = mMediaScannerConnectionClient.mediaUri;
@@ -148,7 +165,7 @@
 
         // Write localizable audio file and scan to insert into database
         final String localizablePath = mFileDir + "/localizable.mp3";
-        writeFile(R.raw.testmp3_4, localizablePath);
+        writeFile("testmp3_4.mp3", localizablePath);
         mMediaScannerConnection.scanFile(localizablePath, null);
         checkMediaScannerConnection();
         final Uri media2Uri = mMediaScannerConnectionClient.mediaUri;
@@ -229,10 +246,10 @@
                 new String[] { mFileDir + "/ctsmediascanplaylist2.m3u"});
 
         // write some more files
-        writeFile(R.raw.testmp3, mFileDir + "/testmp3.mp3");
-        writeFile(R.raw.testmp3_2, mFileDir + "/testmp3_2.mp3");
-        writeFile(R.raw.playlist1, mFileDir + "/ctsmediascanplaylist1.pls");
-        writeFile(R.raw.playlist2, mFileDir + "/ctsmediascanplaylist2.m3u");
+        writeFile("testmp3.mp3", mFileDir + "/testmp3.mp3");
+        writeFile("testmp3_2.mp3", mFileDir + "/testmp3_2.mp3");
+        writeFile("playlist1.pls", mFileDir + "/ctsmediascanplaylist1.pls");
+        writeFile("playlist2.m3u", mFileDir + "/ctsmediascanplaylist2.m3u");
 
         startMediaScanAndWait();
 
@@ -299,13 +316,13 @@
         String dir2 = mFileDir + "/test_" + now;
         String file2 = dir2 + "/test.mp3";
         assertTrue(new File(dir1).mkdir());
-        writeFile(R.raw.testmp3, file1);
+        writeFile("testmp3.mp3", file1);
         mMediaScannerConnection.scanFile(file1, MEDIA_TYPE);
         checkMediaScannerConnection();
         Uri file1Uri = mMediaScannerConnectionClient.mediaUri;
 
         assertTrue(new File(dir2).mkdir());
-        writeFile(R.raw.testmp3, file2);
+        writeFile("testmp3.mp3", file2);
         mMediaScannerConnectionClient.reset();
         mMediaScannerConnection.scanFile(file2, MEDIA_TYPE);
         checkMediaScannerConnection();
@@ -368,19 +385,21 @@
         checkConnectionState(true);
 
         // test unlocalizable file
-        canonicalizeTest(R.raw.testmp3);
+        // testcanonicalize_mp3 has an ID3 title that is unique to this test.
+        // Do not use this clip for any other test and do not copy this to sdcard
+        // while running the test
+        canonicalizeTest(R.raw.testcanonicalize_mp3);
 
         mMediaScannerConnectionClient.reset();
 
         // test localizable file
-        canonicalizeTest(R.raw.testmp3_4);
+        // testcanonicalize_localizable_mp3 has an ID3 title that is unique to this test.
+        // Do not use this clip for any other test and do not copy this to sdcard
+        // while running the test
+        canonicalizeTest(R.raw.testcanonicalize_localizable_mp3);
     }
 
     private void canonicalizeTest(int resId) throws Exception {
-        // erase all audio files that might confuse us below
-        mContext.getContentResolver().delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
-                null, null);
-
         // write file and scan to insert into database
         String fileDir = mFileDir + "/canonicaltest-" + System.currentTimeMillis();
         String fileName = fileDir + "/test.mp3";
@@ -435,120 +454,119 @@
     }
 
     static class MediaScanEntry {
-        MediaScanEntry(int r, String[] t) {
-            this.res = r;
+        MediaScanEntry(String r, String[] t) {
+            this.fileName = r;
             this.tags = t;
         }
-        int res;
+        final String fileName;
         String[] tags;
     }
 
     MediaScanEntry encodingtestfiles[] = {
-            new MediaScanEntry(R.raw.gb18030_1,
+            new MediaScanEntry("gb18030_1.mp3",
                     new String[] {"罗志祥", "2009年11月新歌", "罗志祥", "爱不单行(TV Version)", null} ),
-            new MediaScanEntry(R.raw.gb18030_2,
+            new MediaScanEntry("gb18030_2.mp3",
                     new String[] {"张杰", "明天过后", null, "明天过后", null} ),
-            new MediaScanEntry(R.raw.gb18030_3,
+            new MediaScanEntry("gb18030_3.mp3",
                     new String[] {"电视原声带", "格斗天王(限量精装版)(预购版)", null, "11.Open Arms.( cn808.net )", null} ),
-            new MediaScanEntry(R.raw.gb18030_4,
+            new MediaScanEntry("gb18030_4.mp3",
                     new String[] {"莫扎特", "黄金古典", "柏林爱乐乐团", "第25号交响曲", "莫扎特"} ),
-            new MediaScanEntry(R.raw.gb18030_6,
+            new MediaScanEntry("gb18030_6.mp3",
                     new String[] {"张韶涵", "潘朵拉", "張韶涵", "隐形的翅膀", "王雅君"} ),
-            new MediaScanEntry(R.raw.gb18030_7, // this is actually utf-8
+            new MediaScanEntry("gb18030_7.mp3", // this is actually utf-8
                     new String[] {"五月天", "后青春期的诗", null, "突然好想你", null} ),
-            new MediaScanEntry(R.raw.gb18030_8,
+            new MediaScanEntry("gb18030_8.mp3",
                     new String[] {"周杰伦", "Jay", null, "反方向的钟", null} ),
-            new MediaScanEntry(R.raw.big5_1,
+            new MediaScanEntry("big5_1.mp3",
                     new String[] {"蘇永康", "So I Sing 08 Live", "蘇永康", "囍帖街", null} ),
-            new MediaScanEntry(R.raw.big5_2,
+            new MediaScanEntry("big5_2.mp3",
                     new String[] {"蘇永康", "So I Sing 08 Live", "蘇永康", "從不喜歡孤單一個 - 蘇永康/吳雨霏", null} ),
-            new MediaScanEntry(R.raw.cp1251_v1,
+            new MediaScanEntry("cp1251_v1.mp3",
                     new String[] {"Екатерина Железнова", "Корабль игрушек", null, "Раз, два, три", null} ),
-            new MediaScanEntry(R.raw.cp1251_v1v2,
+            new MediaScanEntry("cp1251_v1v2.mp3",
                     new String[] {"Мельница", "Перевал", null, "Королевна", null} ),
-            new MediaScanEntry(R.raw.cp1251_3,
+            new MediaScanEntry("cp1251_3.mp3",
                     new String[] {"Тату (tATu)", "200 По Встречной [Limited edi", null, "Я Сошла С Ума", null} ),
             // The following 3 use cp1251 encoding, expanded to 16 bits and stored as utf16 
-            new MediaScanEntry(R.raw.cp1251_4,
+            new MediaScanEntry("cp1251_4.mp3",
                     new String[] {"Александр Розенбаум", "Философия любви", null, "Разговор в гостинице (Как жить без веры)", "А.Розенбаум"} ),
-            new MediaScanEntry(R.raw.cp1251_5,
+            new MediaScanEntry("cp1251_5.mp3",
                     new String[] {"Александр Розенбаум", "Философия любви", null, "Четвертиночка", "А.Розенбаум"} ),
-            new MediaScanEntry(R.raw.cp1251_6,
+            new MediaScanEntry("cp1251_6.mp3",
                     new String[] {"Александр Розенбаум", "Философия ремесла", null, "Ну, вот...", "А.Розенбаум"} ),
-            new MediaScanEntry(R.raw.cp1251_7,
+            new MediaScanEntry("cp1251_7.mp3",
                     new String[] {"Вопли Видоплясова", "Хвилі Амура", null, "Або або", null} ),
-            new MediaScanEntry(R.raw.cp1251_8,
+            new MediaScanEntry("cp1251_8.mp3",
                     new String[] {"Вопли Видоплясова", "Хвилі Амура", null, "Таємнi сфери", null} ),
-            new MediaScanEntry(R.raw.shiftjis1,
+            new MediaScanEntry("shiftjis1.mp3",
                     new String[] {"", "", null, "中島敦「山月記」(第1回)", null} ),
-            new MediaScanEntry(R.raw.shiftjis2,
+            new MediaScanEntry("shiftjis2.mp3",
                     new String[] {"音人", "SoundEffects", null, "ファンファーレ", null} ),
-            new MediaScanEntry(R.raw.shiftjis3,
+            new MediaScanEntry("shiftjis3.mp3",
                     new String[] {"音人", "SoundEffects", null, "シンキングタイム", null} ),
-            new MediaScanEntry(R.raw.shiftjis4,
+            new MediaScanEntry("shiftjis4.mp3",
                     new String[] {"音人", "SoundEffects", null, "出題", null} ),
-            new MediaScanEntry(R.raw.shiftjis5,
+            new MediaScanEntry("shiftjis5.mp3",
                     new String[] {"音人", "SoundEffects", null, "時報", null} ),
-            new MediaScanEntry(R.raw.shiftjis6,
+            new MediaScanEntry("shiftjis6.mp3",
                     new String[] {"音人", "SoundEffects", null, "正解", null} ),
-            new MediaScanEntry(R.raw.shiftjis7,
+            new MediaScanEntry("shiftjis7.mp3",
                     new String[] {"音人", "SoundEffects", null, "残念", null} ),
-            new MediaScanEntry(R.raw.shiftjis8,
+            new MediaScanEntry("shiftjis8.mp3",
                     new String[] {"音人", "SoundEffects", null, "間違い", null} ),
-            new MediaScanEntry(R.raw.iso88591_1,
+            new MediaScanEntry("iso88591_1.ogg",
                     new String[] {"Mozart", "Best of Mozart", null, "Overtüre (Die Hochzeit des Figaro)", null} ),
-            new MediaScanEntry(R.raw.iso88591_2, // actually UTF16, but only uses iso8859-1 chars
+            new MediaScanEntry("iso88591_2.mp3", // actually UTF16, but only uses iso8859-1 chars
                     new String[] {"Björk", "Telegram", "Björk", "Possibly Maybe (Lucy Mix)", null} ),
-            new MediaScanEntry(R.raw.hebrew,
+            new MediaScanEntry("hebrew.mp3",
                     new String[] {"אריק סיני", "", null, "לי ולך", null } ),
-            new MediaScanEntry(R.raw.hebrew2,
+            new MediaScanEntry("hebrew2.mp3",
                     new String[] {"הפרוייקט של עידן רייכל", "Untitled - 11-11-02 (9)", null, "בואי", null } ),
-            new MediaScanEntry(R.raw.iso88591_3,
+            new MediaScanEntry("iso88591_3.mp3",
                     new String[] {"Mobilé", "Kartographie", null, "Zu Wenig", null }),
-            new MediaScanEntry(R.raw.iso88591_4,
+            new MediaScanEntry("iso88591_4.mp3",
                     new String[] {"Mobilé", "Kartographie", null, "Rotebeetesalat (Igel Stehlen)", null }),
-            new MediaScanEntry(R.raw.iso88591_5,
+            new MediaScanEntry("iso88591_5.mp3",
                     new String[] {"The Creatures", "Hai! [UK Bonus DVD] Disc 1", "The Creatures", "Imagoró", null }),
-            new MediaScanEntry(R.raw.iso88591_6,
+            new MediaScanEntry("iso88591_6.mp3",
                     new String[] {"¡Forward, Russia!", "Give Me a Wall", "Forward Russia", "Fifteen, Pt. 1", "Canning/Nicholls/Sarah Nicolls/Woodhead"}),
-            new MediaScanEntry(R.raw.iso88591_7,
+            new MediaScanEntry("iso88591_7.mp3",
                     new String[] {"Björk", "Homogenic", "Björk", "Jòga", "Björk/Sjòn"}),
             // this one has a genre of "Indé" which confused the detector
-            new MediaScanEntry(R.raw.iso88591_8,
+            new MediaScanEntry("iso88591_8.mp3",
                     new String[] {"The Black Heart Procession", "3", null, "A Heart Like Mine", null}),
-            new MediaScanEntry(R.raw.iso88591_9,
+            new MediaScanEntry("iso88591_9.mp3",
                     new String[] {"DJ Tiësto", "Just Be", "DJ Tiësto", "Adagio For Strings", "Samuel Barber"}),
-            new MediaScanEntry(R.raw.iso88591_10,
+            new MediaScanEntry("iso88591_10.mp3",
                     new String[] {"Ratatat", "LP3", null, "Bruleé", null}),
-            new MediaScanEntry(R.raw.iso88591_11,
+            new MediaScanEntry("iso88591_11.mp3",
                     new String[] {"Sempé", "Le Petit Nicolas vol. 1", null, "Les Cow-Boys", null}),
-            new MediaScanEntry(R.raw.iso88591_12,
+            new MediaScanEntry("iso88591_12.mp3",
                     new String[] {"UUVVWWZ", "UUVVWWZ", null, "Neolaño", null}),
-            new MediaScanEntry(R.raw.iso88591_13,
+            new MediaScanEntry("iso88591_13.mp3",
                     new String[] {"Michael Bublé", "Crazy Love", "Michael Bublé", "Haven't Met You Yet", null}),
-            new MediaScanEntry(R.raw.utf16_1,
+            new MediaScanEntry("utf16_1.mp3",
                     new String[] {"Shakira", "Latin Mix USA", "Shakira", "Estoy Aquí", null}),
             // Tags are encoded in different charsets.
-            new MediaScanEntry(R.raw.iso88591_utf8_mixed_1,
+            new MediaScanEntry("iso88591_utf8_mixed_1.mp3",
                     new String[] {"刘昊霖/kidult.", "鱼干铺里", "刘昊霖/kidult.", "Colin Wine's Mailbox", null}),
-            new MediaScanEntry(R.raw.iso88591_utf8_mixed_2,
+            new MediaScanEntry("iso88591_utf8_mixed_2.mp3",
                     new String[] {"冰块先生/郭美孜", "hey jude", "冰块先生/郭美孜", "Hey Jude", null}),
-            new MediaScanEntry(R.raw.iso88591_utf8_mixed_3,
+            new MediaScanEntry("iso88591_utf8_mixed_3.mp3",
                     new String[] {"Toy王奕/Tizzy T/满舒克", "1993", "Toy王奕/Tizzy T/满舒克", "Me&Ma Bros", null}),
-            new MediaScanEntry(R.raw.gb18030_utf8_mixed_1,
+            new MediaScanEntry("gb18030_utf8_mixed_1.mp3",
                     new String[] {"张国荣", "钟情张国荣", null, "左右手", null}),
-            new MediaScanEntry(R.raw.gb18030_utf8_mixed_2,
+            new MediaScanEntry("gb18030_utf8_mixed_2.mp3",
                     new String[] {"纵贯线", "Live in Taipei 出发\\/终点站", null, "皇后大道东(Live)", null}),
-            new MediaScanEntry(R.raw.gb18030_utf8_mixed_3,
+            new MediaScanEntry("gb18030_utf8_mixed_3.mp3",
                     new String[] {"谭咏麟", "二十年白金畅销金曲全记录", null, "知心当玩偶", null})
     };
 
     public void testEncodingDetection() throws Exception {
         for (int i = 0; i< encodingtestfiles.length; i++) {
             MediaScanEntry entry = encodingtestfiles[i];
-            String name = mContext.getResources().getResourceEntryName(entry.res);
-            String path =  mFileDir + "/" + name + ".mp3";
-            writeFile(entry.res, path);
+            String path =  mFileDir + "/" + entry.fileName;
+            writeFile(entry.fileName, path);
         }
 
         startMediaScanAndWait();
@@ -563,8 +581,7 @@
         ContentResolver res = mContext.getContentResolver();
         for (int i = 0; i< encodingtestfiles.length; i++) {
             MediaScanEntry entry = encodingtestfiles[i];
-            String name = mContext.getResources().getResourceEntryName(entry.res);
-            String path =  mFileDir + "/" + name + ".mp3";
+            String path =  mFileDir + "/" + entry.fileName;
             Cursor c = res.query(MediaStore.Audio.Media.getContentUri("external"), columns,
                     MediaStore.Audio.Media.DATA + "=?", new String[] {path}, null);
             assertNotNull("null cursor", c);
@@ -593,7 +610,7 @@
 
             // also test with the MediaMetadataRetriever API
             MediaMetadataRetriever woodly = new MediaMetadataRetriever();
-            AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(entry.res);
+            AssetFileDescriptor afd = getAssetFileDescriptorFor(entry.fileName);
             woodly.setDataSource(afd.getFileDescriptor(),
                     afd.getStartOffset(), afd.getDeclaredLength());
 
diff --git a/tests/tests/media/src/android/media/cts/MediaSession2ServiceTest.java b/tests/tests/media/src/android/media/cts/MediaSession2ServiceTest.java
index ea7d568..579d0a2 100644
--- a/tests/tests/media/src/android/media/cts/MediaSession2ServiceTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaSession2ServiceTest.java
@@ -170,7 +170,7 @@
             StubMediaSession2Service.setTestInjector(new StubMediaSession2Service.TestInjector() {
                 @Override
                 MediaSession2 onGetSession(ControllerInfo controllerInfo) {
-                    // Add dummy call for preventing this from being missed by CTS coverage.
+                    // Add fake call for preventing this from being missed by CTS coverage.
                     super.onGetSession(controllerInfo);
                     return testSession;
                 }
@@ -374,7 +374,7 @@
         testSession.setPlaybackActive(false);
         assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
 
-        // Add dummy call for preventing this from being missed by CTS coverage.
+        // Add fake call for preventing this from being missed by CTS coverage.
         if (StubMediaSession2Service.getInstance() != null) {
             ((MediaSession2Service) StubMediaSession2Service.getInstance())
                     .onUpdateNotification(null);
diff --git a/tests/tests/media/src/android/media/cts/MediaSyncTest.java b/tests/tests/media/src/android/media/cts/MediaSyncTest.java
index fae846e..0dfc9b1 100644
--- a/tests/tests/media/src/android/media/cts/MediaSyncTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaSyncTest.java
@@ -17,7 +17,6 @@
 
 import android.content.Context;
 import android.content.pm.PackageManager;
-import android.content.res.Resources;
 import android.media.AudioFormat;
 import android.media.AudioManager;
 import android.media.AudioTrack;
@@ -28,7 +27,6 @@
 import android.media.MediaTimestamp;
 import android.media.PlaybackParams;
 import android.media.SyncParams;
-import android.media.cts.R;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.platform.test.annotations.AppModeFull;
@@ -63,17 +61,17 @@
 public class MediaSyncTest extends ActivityInstrumentationTestCase2<MediaStubActivity> {
     private static final String LOG_TAG = "MediaSyncTest";
 
+    static final String mInpPrefix = WorkDir.getMediaDirString();
     private final long NO_TIMESTAMP = -1;
     private final float FLOAT_PLAYBACK_RATE_TOLERANCE = .02f;
     private final long TIME_MEASUREMENT_TOLERANCE_US = 20000;
-    final int INPUT_RESOURCE_ID =
-            R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz;
+    final String INPUT_RESOURCE =
+            mInpPrefix + "video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz.mp4";
     private final int APPLICATION_AUDIO_PERIOD_MS = 200;
     private final int TEST_MAX_SPEED = 2;
     private static final float FLOAT_TOLERANCE = .00001f;
 
     private Context mContext;
-    private Resources mResources;
 
     private MediaStubActivity mActivity;
 
@@ -113,7 +111,6 @@
             fail();
         }
         mContext = getInstrumentation().getTargetContext();
-        mResources = mContext.getResources();
         mDecoderVideo = new Decoder(this, mMediaSync, false);
         mDecoderAudio = new Decoder(this, mMediaSync, true);
     }
@@ -192,7 +189,7 @@
         }
 
         assertTrue("The stream in test file can not be decoded",
-                mDecoderAudio.setup(INPUT_RESOURCE_ID, null, Long.MAX_VALUE, NO_TIMESTAMP));
+                mDecoderAudio.setup(INPUT_RESOURCE, null, Long.MAX_VALUE, NO_TIMESTAMP));
 
         // get audio track.
         mMediaSync.setAudioTrack(mDecoderAudio.getAudioTrack());
@@ -225,7 +222,7 @@
      */
     public void testAudioBufferReturn() throws InterruptedException {
         final int timeOutMs = 10000;
-        boolean completed = runCheckAudioBuffer(INPUT_RESOURCE_ID, timeOutMs);
+        boolean completed = runCheckAudioBuffer(INPUT_RESOURCE, timeOutMs);
         if (!completed) {
             throw new RuntimeException("timed out waiting for audio buffer return");
         }
@@ -234,12 +231,12 @@
     private PlaybackParams PAUSED_RATE = new PlaybackParams().setSpeed(0.f);
     private PlaybackParams NORMAL_RATE = new PlaybackParams().setSpeed(1.f);
 
-    private boolean runCheckAudioBuffer(int inputResourceId, int timeOutMs) {
+    private boolean runCheckAudioBuffer(String inputResource, int timeOutMs) {
         final int NUM_LOOPS = 10;
         final Object condition = new Object();
 
         mHasAudio = true;
-        if (mDecoderAudio.setup(inputResourceId, null, Long.MAX_VALUE, NO_TIMESTAMP) == false) {
+        if (mDecoderAudio.setup(inputResource, null, Long.MAX_VALUE, NO_TIMESTAMP) == false) {
             return true;
         }
 
@@ -282,13 +279,13 @@
      */
     public void testFlush() throws InterruptedException {
         final int timeOutMs = 5000;
-        boolean completed = runFlush(INPUT_RESOURCE_ID, timeOutMs);
+        boolean completed = runFlush(INPUT_RESOURCE, timeOutMs);
         if (!completed) {
             throw new RuntimeException("timed out waiting for flush");
         }
     }
 
-    private boolean runFlush(int inputResourceId, int timeOutMs) {
+    private boolean runFlush(String inputResource, int timeOutMs) {
         final int INDEX_BEFORE_FLUSH = 1;
         final int INDEX_AFTER_FLUSH = 2;
         final int BUFFER_SIZE = 1024;
@@ -298,7 +295,7 @@
         returnedIndex[0] = -1;
 
         mHasAudio = true;
-        if (mDecoderAudio.setup(inputResourceId, null, Long.MAX_VALUE, NO_TIMESTAMP) == false) {
+        if (mDecoderAudio.setup(inputResource, null, Long.MAX_VALUE, NO_TIMESTAMP) == false) {
             return true;
         }
 
@@ -348,7 +345,7 @@
      * Tests playing back audio successfully.
      */
     public void testPlayVideo() throws Exception {
-        playAV(INPUT_RESOURCE_ID, 5000 /* lastBufferTimestampMs */,
+        playAV(INPUT_RESOURCE, 5000 /* lastBufferTimestampMs */,
                false /* audio */, true /* video */, 10000 /* timeOutMs */);
     }
 
@@ -362,7 +359,7 @@
             return;
         }
 
-        playAV(INPUT_RESOURCE_ID, 5000 /* lastBufferTimestampMs */,
+        playAV(INPUT_RESOURCE, 5000 /* lastBufferTimestampMs */,
                true /* audio */, false /* video */, 10000 /* timeOutMs */);
     }
 
@@ -370,7 +367,7 @@
      * Tests playing back audio and video successfully.
      */
     public void testPlayAudioAndVideo() throws Exception {
-        playAV(INPUT_RESOURCE_ID, 5000 /* lastBufferTimestampMs */,
+        playAV(INPUT_RESOURCE, 5000 /* lastBufferTimestampMs */,
                true /* audio */, true /* video */, 10000 /* timeOutMs */);
     }
 
@@ -378,28 +375,28 @@
      * Tests playing at specified playback rate successfully.
      */
     public void testPlaybackRateQuarter() throws Exception {
-        playAV(INPUT_RESOURCE_ID, 2000 /* lastBufferTimestampMs */,
+        playAV(INPUT_RESOURCE, 2000 /* lastBufferTimestampMs */,
                true /* audio */, true /* video */, 10000 /* timeOutMs */,
                0.25f /* playbackRate */);
     }
     public void testPlaybackRateHalf() throws Exception {
-        playAV(INPUT_RESOURCE_ID, 4000 /* lastBufferTimestampMs */,
+        playAV(INPUT_RESOURCE, 4000 /* lastBufferTimestampMs */,
                true /* audio */, true /* video */, 10000 /* timeOutMs */,
                0.5f /* playbackRate */);
     }
     public void testPlaybackRateDouble() throws Exception {
-        playAV(INPUT_RESOURCE_ID, 8000 /* lastBufferTimestampMs */,
+        playAV(INPUT_RESOURCE, 8000 /* lastBufferTimestampMs */,
                true /* audio */, true /* video */, 10000 /* timeOutMs */,
                (float)TEST_MAX_SPEED /* playbackRate */);
     }
 
     private void playAV(
-            final int inputResourceId,
+            final String inputResource,
             final long lastBufferTimestampMs,
             final boolean audio,
             final boolean video,
             int timeOutMs) throws Exception {
-        playAV(inputResourceId, lastBufferTimestampMs, audio, video, timeOutMs, 1.0f);
+        playAV(inputResource, lastBufferTimestampMs, audio, video, timeOutMs, 1.0f);
     }
 
     private class PlayAVState {
@@ -410,7 +407,7 @@
     };
 
     private void playAV(
-            final int inputResourceId,
+            final String inputResource,
             final long lastBufferTimestampMs,
             final boolean audio,
             final boolean video,
@@ -425,7 +422,7 @@
             Thread decodingThread = new Thread(new Runnable() {
                 @Override
                 public void run() {
-                    completed.set(runPlayAV(inputResourceId, lastBufferTimestampMs * 1000,
+                    completed.set(runPlayAV(inputResource, lastBufferTimestampMs * 1000,
                             audio, video, playbackRate, state));
                 }
             });
@@ -468,7 +465,7 @@
     }
 
     private boolean runPlayAV(
-            int inputResourceId,
+            String inputResource,
             long lastBufferTimestampUs,
             boolean audio,
             boolean video,
@@ -484,7 +481,7 @@
             mSurface = mMediaSync.createInputSurface();
 
             if (mDecoderVideo.setup(
-                    inputResourceId, mSurface, lastBufferTimestampUs, NO_TIMESTAMP) == false) {
+                    inputResource, mSurface, lastBufferTimestampUs, NO_TIMESTAMP) == false) {
                 return true;
             }
             mHasVideo = true;
@@ -492,7 +489,7 @@
 
         if (audio) {
             if (mDecoderAudio.setup(
-                    inputResourceId, null, lastBufferTimestampUs,
+                    inputResource, null, lastBufferTimestampUs,
                     PLAYBACK_RAMP_UP_TIME_US) == false) {
                 return true;
             }
@@ -627,7 +624,7 @@
         }
 
         public boolean setup(
-                int inputResourceId, Surface surface, long lastBufferTimestampUs,
+                String inputResource, Surface surface, long lastBufferTimestampUs,
                 long startingAudioTimestampUs) {
             if (!mIsAudio) {
                 mSurface = surface;
@@ -642,7 +639,7 @@
                 // get extrator.
                 String type = mIsAudio ? "audio/" : "video/";
                 mExtractor = MediaUtils.createMediaExtractorForMimeType(
-                        mContext, inputResourceId, type);
+                        mContext, inputResource, type);
 
                 // get decoder.
                 MediaFormat mediaFormat =
diff --git a/tests/tests/media/src/android/media/cts/NativeDecoderTest.java b/tests/tests/media/src/android/media/cts/NativeDecoderTest.java
index 6f2600e..aa65d2d 100644
--- a/tests/tests/media/src/android/media/cts/NativeDecoderTest.java
+++ b/tests/tests/media/src/android/media/cts/NativeDecoderTest.java
@@ -17,13 +17,11 @@
 package android.media.cts;
 
 import android.content.res.AssetFileDescriptor;
-import android.content.res.Resources;
 import android.media.MediaCodec;
 import android.media.MediaCodec.BufferInfo;
 import android.media.MediaExtractor;
 import android.media.MediaFormat;
 import android.media.MediaPlayer;
-import android.media.cts.R;
 import android.media.cts.TestUtils.Monitor;
 import android.net.Uri;
 import android.os.ParcelFileDescriptor;
@@ -48,6 +46,7 @@
 
 import java.io.File;
 import java.io.FileDescriptor;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.net.Socket;
 import java.nio.ByteBuffer;
@@ -77,7 +76,7 @@
     private static final int CONFIG_MODE_NONE = 0;
     private static final int CONFIG_MODE_QUEUE = 1;
 
-    private static Resources mResources;
+    static final String mInpPrefix = WorkDir.getMediaDirString();
     short[] mMasterBuffer;
 
     /** Load jni on initialization */
@@ -90,7 +89,6 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mResources = mContext.getResources();
 
     }
 
@@ -115,32 +113,35 @@
             }
     }
 
-    public void testExtractor() throws Exception {
-        testExtractor(R.raw.sinesweepogg);
-        testExtractor(R.raw.sinesweepoggmkv);
-        testExtractor(R.raw.sinesweepoggmp4);
-        testExtractor(R.raw.sinesweepmp3lame);
-        testExtractor(R.raw.sinesweepmp3smpb);
-        testExtractor(R.raw.sinesweepopus);
-        testExtractor(R.raw.sinesweepopusmp4);
-        testExtractor(R.raw.sinesweepm4a);
-        testExtractor(R.raw.sinesweepflacmkv);
-        testExtractor(R.raw.sinesweepflac);
-        testExtractor(R.raw.sinesweepflacmp4);
-        testExtractor(R.raw.sinesweepwav);
+    public void SKIP_testExtractor() throws Exception {
+        // duplicate of CtsMediaV2TestCases:ExtractorTest$FunctionalityTest#testExtract where
+        // checksum is computed over track format attributes, track buffer and buffer
+        // info in both SDK and NDK side and checked for equality
+        testExtractor("sinesweepogg.ogg");
+        testExtractor("sinesweepoggmkv.mkv");
+        testExtractor("sinesweepoggmp4.mp4");
+        testExtractor("sinesweepmp3lame.mp3");
+        testExtractor("sinesweepmp3smpb.mp3");
+        testExtractor("sinesweepopus.mkv");
+        testExtractor("sinesweepopusmp4.mp4");
+        testExtractor("sinesweepm4a.m4a");
+        testExtractor("sinesweepflacmkv.mkv");
+        testExtractor("sinesweepflac.flac");
+        testExtractor("sinesweepflacmp4.mp4");
+        testExtractor("sinesweepwav.wav");
 
-        testExtractor(R.raw.video_1280x720_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz);
-        testExtractor(R.raw.bbb_s3_1280x720_webm_vp8_8mbps_60fps_opus_6ch_384kbps_48000hz);
-        testExtractor(R.raw.bbb_s4_1280x720_webm_vp9_0p31_4mbps_30fps_opus_stereo_128kbps_48000hz);
-        testExtractor(R.raw.video_1280x720_webm_av1_2000kbps_30fps_vorbis_stereo_128kbps_48000hz);
-        testExtractor(R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_mono_24kbps_11025hz);
-        testExtractor(R.raw.video_480x360_mp4_mpeg2_1500kbps_30fps_aac_stereo_128kbps_48000hz);
-        testExtractor(R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz);
+        testExtractor("video_1280x720_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4");
+        testExtractor("bbb_s3_1280x720_webm_vp8_8mbps_60fps_opus_6ch_384kbps_48000hz.webm");
+        testExtractor("bbb_s4_1280x720_webm_vp9_0p31_4mbps_30fps_opus_stereo_128kbps_48000hz.webm");
+        testExtractor("video_1280x720_webm_av1_2000kbps_30fps_vorbis_stereo_128kbps_48000hz.webm");
+        testExtractor("video_176x144_3gp_h263_300kbps_12fps_aac_mono_24kbps_11025hz.3gp");
+        testExtractor("video_480x360_mp4_mpeg2_1500kbps_30fps_aac_stereo_128kbps_48000hz.mp4");
+        testExtractor("video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz.mp4");
 
         CtsTestServer foo = new CtsTestServer(mContext);
-        testExtractor(foo.getAssetUrl("noiseandchirps.ogg"));
-        testExtractor(foo.getAssetUrl("ringer.mp3"));
-        testExtractor(foo.getRedirectingAssetUrl("ringer.mp3"));
+        testExtractor(foo.getAssetUrl("noiseandchirps.ogg"), null, null);
+        testExtractor(foo.getAssetUrl("ringer.mp3"), null, null);
+        testExtractor(foo.getRedirectingAssetUrl("ringer.mp3"), null, null);
 
         String[] keys = new String[] {"header0", "header1"};
         String[] values = new String[] {"value0", "value1"};
@@ -158,10 +159,6 @@
         testExtractor(foo.getAssetUrl("noiseandchirps.ogg"), emptyArray, emptyArray);
     }
 
-    private void testExtractor(String path) throws Exception {
-        testExtractor(path, null, null);
-    }
-
     /**
      * |keys| and |values| should be arrays of the same length.
      *
@@ -181,8 +178,16 @@
         compareArrays("different samplesizes native source", jsizes, nsizes2);
     }
 
-    private void testExtractor(int res) throws Exception {
-        AssetFileDescriptor fd = mResources.openRawResourceFd(res);
+    protected static AssetFileDescriptor getAssetFileDescriptorFor(final String res)
+            throws FileNotFoundException {
+        File inpFile = new File(mInpPrefix + res);
+        ParcelFileDescriptor parcelFD =
+                ParcelFileDescriptor.open(inpFile, ParcelFileDescriptor.MODE_READ_ONLY);
+        return new AssetFileDescriptor(parcelFD, 0, parcelFD.getStatSize());
+    }
+
+    private void testExtractor(final String res) throws Exception {
+        AssetFileDescriptor fd = getAssetFileDescriptorFor(res);
 
         int[] jsizes = getSampleSizes(
                 fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
@@ -272,14 +277,17 @@
             String path, String[] keys, String[] values, boolean testNativeSource);
 
     @Presubmit
-    public void testExtractorFileDurationNative() throws Exception {
-        int res = R.raw.video_1280x720_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz;
-        testExtractorFileDurationNative(res);
+    public void SKIP_testExtractorFileDurationNative() throws Exception {
+        // duplicate of CtsMediaV2TestCases:ExtractorTest$FunctionalityTest#testExtract where
+        // checksum is computed over track format attributes, track buffer and buffer
+        // info in both SDK and NDK side and checked for equality. KEY_DURATION for each track is
+        // part of the checksum.
+        testExtractorFileDurationNative(
+                "video_1280x720_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4");
     }
 
-    private void testExtractorFileDurationNative(int res) throws Exception {
-
-        AssetFileDescriptor fd = mResources.openRawResourceFd(res);
+    private void testExtractorFileDurationNative(final String res) throws Exception {
+        AssetFileDescriptor fd = getAssetFileDescriptorFor(res);
         long durationUs = getExtractorFileDurationNative(
                 fd.getParcelFileDescriptor().getFd(), fd.getStartOffset(), fd.getLength());
 
@@ -306,7 +314,8 @@
     private static native long getExtractorFileDurationNative(int fd, long offset, long size);
 
     @Presubmit
-    public void testExtractorCachedDurationNative() throws Exception {
+    public void SKIP_testExtractorCachedDurationNative() throws Exception {
+        // duplicate of CtsMediaV2TestCases:ExtractorTest$SetDataSourceTest#testDataSourceNative
         CtsTestServer foo = new CtsTestServer(mContext);
         String url = foo.getAssetUrl("ringer.mp3");
         long cachedDurationUs = getExtractorCachedDurationNative(url, /* testNativeSource = */ false);
@@ -317,35 +326,37 @@
 
     private static native long getExtractorCachedDurationNative(String uri, boolean testNativeSource);
 
-    public void testDecoder() throws Exception {
+    public void SKIP_testDecoder() throws Exception {
+        // duplicate of CtsMediaV2TestCases:CodecDecoderTest#testSimpleDecode where checksum  is
+        // computed over decoded output in both SDK and NDK side and checked for equality.
         int testsRun =
-            testDecoder(R.raw.sinesweepogg) +
-            testDecoder(R.raw.sinesweepoggmkv) +
-            testDecoder(R.raw.sinesweepoggmp4) +
-            testDecoder(R.raw.sinesweepmp3lame) +
-            testDecoder(R.raw.sinesweepmp3smpb) +
-            testDecoder(R.raw.sinesweepopus) +
-            testDecoder(R.raw.sinesweepopusmp4) +
-            testDecoder(R.raw.sinesweepm4a) +
-            testDecoder(R.raw.sinesweepflacmkv) +
-            testDecoder(R.raw.sinesweepflac) +
-            testDecoder(R.raw.sinesweepflacmp4) +
-            testDecoder(R.raw.sinesweepwav) +
-
-            testDecoder(R.raw.video_1280x720_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz) +
-            testDecoder(R.raw.bbb_s1_640x360_webm_vp8_2mbps_30fps_vorbis_5ch_320kbps_48000hz) +
-            testDecoder(R.raw.bbb_s1_640x360_webm_vp9_0p21_1600kbps_30fps_vorbis_stereo_128kbps_48000hz) +
-            testDecoder(R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_mono_24kbps_11025hz) +
-            testDecoder(R.raw.video_480x360_mp4_mpeg2_1500kbps_30fps_aac_stereo_128kbps_48000hz);
-            testDecoder(R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz);
+            testDecoder("sinesweepogg.ogg") +
+            testDecoder("sinesweepoggmkv.mkv") +
+            testDecoder("sinesweepoggmp4.mp4") +
+            testDecoder("sinesweepmp3lame.mp3") +
+            testDecoder("sinesweepmp3smpb.mp3") +
+            testDecoder("sinesweepopus.mkv") +
+            testDecoder("sinesweepopusmp4.mp4") +
+            testDecoder("sinesweepm4a.m4a") +
+            testDecoder("sinesweepflacmkv.mkv") +
+            testDecoder("sinesweepflac.flac") +
+            testDecoder("sinesweepflacmp4.mp4") +
+            testDecoder("sinesweepwav.wav") +
+            testDecoder("video_1280x720_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4") +
+            testDecoder("bbb_s1_640x360_webm_vp8_2mbps_30fps_vorbis_5ch_320kbps_48000hz.webm") +
+            testDecoder("bbb_s1_640x360_webm_vp9_0p21_1600kbps_30fps_vorbis_stereo_128kbps_48000hz.webm") +
+            testDecoder("video_176x144_3gp_h263_300kbps_12fps_aac_mono_24kbps_11025hz.3gp") +
+            testDecoder("video_480x360_mp4_mpeg2_1500kbps_30fps_aac_stereo_128kbps_48000hz.mp4");
+            testDecoder("video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz.mp4");
         if (testsRun == 0) {
             MediaUtils.skipTest("no decoders found");
         }
     }
 
     public void testDataSource() throws Exception {
-        int testsRun = testDecoder(R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_mono_24kbps_11025hz,
-                /* wrapFd */ true, /* useCallback */ false);
+        int testsRun = testDecoder(
+                "video_176x144_3gp_h263_300kbps_12fps_aac_mono_24kbps_11025hz.3gp", /* wrapFd */
+                true, /* useCallback */ false);
         if (testsRun == 0) {
             MediaUtils.skipTest("no decoders found");
         }
@@ -353,10 +364,10 @@
 
     public void testDataSourceAudioOnly() throws Exception {
         int testsRun = testDecoder(
-                R.raw.loudsoftmp3,
+                "loudsoftmp3.mp3",
                 /* wrapFd */ true, /* useCallback */ false) +
                 testDecoder(
-                        R.raw.loudsoftaac,
+                        "loudsoftaac.aac",
                         /* wrapFd */ false, /* useCallback */ false);
         if (testsRun == 0) {
             MediaUtils.skipTest("no decoders found");
@@ -364,23 +375,25 @@
     }
 
     public void testDataSourceWithCallback() throws Exception {
-        int testsRun = testDecoder(R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_mono_24kbps_11025hz,
-                /* wrapFd */ true, /* useCallback */ true);
+        int testsRun = testDecoder(
+                "video_176x144_3gp_h263_300kbps_12fps_aac_mono_24kbps_11025hz.3gp",/* wrapFd */
+                true, /* useCallback */ true);
         if (testsRun == 0) {
             MediaUtils.skipTest("no decoders found");
         }
     }
 
-    private int testDecoder(int res) throws Exception {
+    private int testDecoder(final String res) throws Exception {
         return testDecoder(res, /* wrapFd */ false, /* useCallback */ false);
     }
 
-    private int testDecoder(int res, boolean wrapFd, boolean useCallback) throws Exception {
-        if (!MediaUtils.hasCodecsForResource(mContext, res)) {
+    private int testDecoder(final String res, boolean wrapFd, boolean useCallback)
+            throws Exception {
+        if (!MediaUtils.hasCodecsForResource(mInpPrefix  + res)) {
             return 0; // skip
         }
 
-        AssetFileDescriptor fd = mResources.openRawResourceFd(res);
+        AssetFileDescriptor fd = getAssetFileDescriptorFor(res);
 
         int[] jdata1 = getDecodedData(
                 fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
@@ -557,33 +570,35 @@
             boolean useCallback)
             throws IOException;
 
-    public void testVideoPlayback() throws Exception {
+    public void SKIP_testVideoPlayback() throws Exception {
+        // duplicate of
+        // CtsMediaV2TestCases:CodecDecoderSurfaceTest#testSimpleDecodeToSurfaceNative[*]
         int testsRun =
             testVideoPlayback(
-                    R.raw.video_1280x720_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz) +
+                    "video_1280x720_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4") +
             testVideoPlayback(
-                    R.raw.bbb_s1_640x360_webm_vp8_2mbps_30fps_vorbis_5ch_320kbps_48000hz) +
+                    "bbb_s1_640x360_webm_vp8_2mbps_30fps_vorbis_5ch_320kbps_48000hz.webm") +
             testVideoPlayback(
-                    R.raw.bbb_s1_640x360_webm_vp9_0p21_1600kbps_30fps_vorbis_stereo_128kbps_48000hz) +
+                    "bbb_s1_640x360_webm_vp9_0p21_1600kbps_30fps_vorbis_stereo_128kbps_48000hz.webm") +
             testVideoPlayback(
-                    R.raw.video_640x360_webm_av1_470kbps_30fps_vorbis_stereo_128kbps_48000hz) +
+                    "video_640x360_webm_av1_470kbps_30fps_vorbis_stereo_128kbps_48000hz.webm") +
             testVideoPlayback(
-                    R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_mono_24kbps_11025hz) +
+                    "video_176x144_3gp_h263_300kbps_12fps_aac_mono_24kbps_11025hz.3gp") +
             testVideoPlayback(
-                    R.raw.video_176x144_mp4_mpeg2_105kbps_25fps_aac_stereo_128kbps_44100hz) +
+                    "video_176x144_mp4_mpeg2_105kbps_25fps_aac_stereo_128kbps_44100hz.mp4") +
             testVideoPlayback(
-                    R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz);
+                    "video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz.mp4");
         if (testsRun == 0) {
             MediaUtils.skipTest("no decoders found");
         }
     }
 
-    private int testVideoPlayback(int res) throws Exception {
-        if (!MediaUtils.checkCodecsForResource(mContext, res)) {
+    private int testVideoPlayback(final String res) throws Exception {
+        if (!MediaUtils.checkCodecsForResource(mInpPrefix + res)) {
             return 0; // skip
         }
 
-        AssetFileDescriptor fd = mResources.openRawResourceFd(res);
+        AssetFileDescriptor fd = getAssetFileDescriptorFor(res);
 
         boolean ret = testPlaybackNative(mActivity.getSurfaceHolder().getSurface(),
                 fd.getParcelFileDescriptor().getFd(), fd.getStartOffset(), fd.getLength());
@@ -597,56 +612,54 @@
     @Presubmit
     public void testMuxerAvc() throws Exception {
         // IMPORTANT: this file must not have B-frames
-        testMuxer(R.raw.video_1280x720_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz, false);
+        testMuxer("video_1280x720_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4", false);
     }
 
     public void testMuxerH263() throws Exception {
         // IMPORTANT: this file must not have B-frames
-        testMuxer(R.raw.video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_11025hz, false);
+        testMuxer("video_176x144_3gp_h263_300kbps_25fps_aac_stereo_128kbps_11025hz.3gp", false);
     }
 
     public void testMuxerHevc() throws Exception {
         // IMPORTANT: this file must not have B-frames
-        testMuxer(R.raw.video_640x360_mp4_hevc_450kbps_no_b, false);
+        testMuxer("video_640x360_mp4_hevc_450kbps_no_b.mp4", false);
     }
 
     public void testMuxerVp8() throws Exception {
-        testMuxer(R.raw.bbb_s1_640x360_webm_vp8_2mbps_30fps_vorbis_5ch_320kbps_48000hz, true);
+        testMuxer("bbb_s1_640x360_webm_vp8_2mbps_30fps_vorbis_5ch_320kbps_48000hz.webm", true);
     }
 
     public void testMuxerVp9() throws Exception {
-        testMuxer(
-                R.raw.video_1280x720_webm_vp9_csd_309kbps_25fps_vorbis_stereo_128kbps_48000hz,
+        testMuxer("video_1280x720_webm_vp9_csd_309kbps_25fps_vorbis_stereo_128kbps_48000hz.webm",
                 true);
     }
 
     public void testMuxerVp9NoCsd() throws Exception {
-        testMuxer(
-                R.raw.bbb_s1_640x360_webm_vp9_0p21_1600kbps_30fps_vorbis_stereo_128kbps_48000hz,
+        testMuxer("bbb_s1_640x360_webm_vp9_0p21_1600kbps_30fps_vorbis_stereo_128kbps_48000hz.webm",
                 true);
     }
 
     public void testMuxerVp9Hdr() throws Exception {
-        testMuxer(R.raw.video_256x144_webm_vp9_hdr_83kbps_24fps, true);
+        testMuxer("video_256x144_webm_vp9_hdr_83kbps_24fps.webm", true);
     }
 
     // We do not support MPEG-2 muxing as of yet
     public void SKIP_testMuxerMpeg2() throws Exception {
         // IMPORTANT: this file must not have B-frames
-        testMuxer(R.raw.video_176x144_mp4_mpeg2_105kbps_25fps_aac_stereo_128kbps_44100hz, false);
+        testMuxer("video_176x144_mp4_mpeg2_105kbps_25fps_aac_stereo_128kbps_44100hz.mp4", false);
     }
 
     public void testMuxerMpeg4() throws Exception {
         // IMPORTANT: this file must not have B-frames
-        testMuxer(R.raw.video_176x144_mp4_mpeg4_300kbps_25fps_aac_stereo_128kbps_44100hz, false);
+        testMuxer("video_176x144_mp4_mpeg4_300kbps_25fps_aac_stereo_128kbps_44100hz.mp4", false);
     }
 
-    private void testMuxer(int res, boolean webm) throws Exception {
-        if (!MediaUtils.checkCodecsForResource(mContext, res)) {
+    private void testMuxer(final String res, boolean webm) throws Exception {
+        if (!MediaUtils.checkCodecsForResource(mInpPrefix + res)) {
             return; // skip
         }
 
-        AssetFileDescriptor infd = mResources.openRawResourceFd(res);
+        AssetFileDescriptor infd = getAssetFileDescriptorFor(res);
 
         File base = mContext.getExternalFilesDir(null);
         String tmpFile = base.getPath() + "/tmp.dat";
@@ -682,7 +695,8 @@
         org.release();
         remux.release();
 
-        MediaPlayer player1 = MediaPlayer.create(mContext, res);
+        MediaPlayer player1 =
+                MediaPlayer.create(mContext, Uri.fromFile(new File(mInpPrefix + res)));
         MediaPlayer player2 = MediaPlayer.create(mContext, Uri.parse("file://" + tmpFile));
         assertEquals("duration is different",
                      player1.getDuration(), player2.getDuration(), maxDurationDiffUs * 0.001);
@@ -766,11 +780,11 @@
 
     @Presubmit
     public void testPssh() throws Exception {
-        testPssh(R.raw.psshtest);
+        testPssh("psshtest.mp4");
     }
 
-    private void testPssh(int res) throws Exception {
-        AssetFileDescriptor fd = mResources.openRawResourceFd(res);
+    private void testPssh(final String res) throws Exception {
+        AssetFileDescriptor fd = getAssetFileDescriptorFor(res);
 
         MediaExtractor ex = new MediaExtractor();
         ex.setDataSource(fd.getParcelFileDescriptor().getFileDescriptor(),
diff --git a/tests/tests/media/src/android/media/cts/OutputSurface.java b/tests/tests/media/src/android/media/cts/OutputSurface.java
index c87326d..5417bf4 100644
--- a/tests/tests/media/src/android/media/cts/OutputSurface.java
+++ b/tests/tests/media/src/android/media/cts/OutputSurface.java
@@ -228,7 +228,7 @@
      * data is available.
      */
     public void awaitNewImage() {
-        final int TIMEOUT_MS = 500;
+        final int TIMEOUT_MS = 2000;
 
         synchronized (mFrameSyncObject) {
             while (!mFrameAvailable) {
diff --git a/tests/tests/media/src/android/media/cts/RingtoneManagerTest.java b/tests/tests/media/src/android/media/cts/RingtoneManagerTest.java
index f305a74..8fe183e 100644
--- a/tests/tests/media/src/android/media/cts/RingtoneManagerTest.java
+++ b/tests/tests/media/src/android/media/cts/RingtoneManagerTest.java
@@ -17,8 +17,6 @@
 
 import android.app.ActivityManager;
 import android.content.res.AssetFileDescriptor;
-import android.media.cts.R;
-
 
 import android.app.Activity;
 import android.app.Instrumentation;
@@ -43,6 +41,7 @@
 
     private static final String PKG = "android.media.cts";
     private static final String TAG = "RingtoneManagerTest";
+    static final String mInpPrefix = WorkDir.getMediaDirString();
 
     private RingtonePickerActivity mActivity;
     private Instrumentation mInstrumentation;
@@ -185,7 +184,7 @@
 
         mRingtoneManager.setStopPreviousRingtone(true);
         assertTrue(mRingtoneManager.getStopPreviousRingtone());
-        Uri uri = Uri.parse("android.resource://" + PKG + "/" + R.raw.john_cage);
+        Uri uri = Uri.parse(mInpPrefix + "john_cage.ogg");
         Ringtone ringtone = RingtoneManager.getRingtone(mContext, uri);
         ringtone.play();
         assertTrue(ringtone.isPlaying());
diff --git a/tests/tests/media/src/android/media/cts/RoutingTest.java b/tests/tests/media/src/android/media/cts/RoutingTest.java
index f6b3c20..72d84ba 100644
--- a/tests/tests/media/src/android/media/cts/RoutingTest.java
+++ b/tests/tests/media/src/android/media/cts/RoutingTest.java
@@ -32,6 +32,7 @@
 import android.media.MediaRecorder;
 import android.media.cts.TestUtils.Monitor;
 
+import android.net.Uri;
 import android.os.Environment;
 import android.os.Handler;
 import android.os.Looper;
@@ -73,6 +74,7 @@
     private static final int RECORD_TIME_MS = 3000;
     private static final Set<Integer> AVAILABLE_INPUT_DEVICES_TYPE = new HashSet<>(
         Arrays.asList(AudioDeviceInfo.TYPE_BUILTIN_MIC));
+    static final String mInpPrefix = WorkDir.getMediaDirString();
 
     private boolean mRoutingChanged;
     private boolean mRoutingChangedDetected;
@@ -571,8 +573,9 @@
     }
 
     private MediaPlayer allocMediaPlayer(AudioDeviceInfo device, boolean start) {
-        final int resid = R.raw.testmp3_2;
-        MediaPlayer mediaPlayer = MediaPlayer.create(mContext, resid);
+        final String res = "testmp3_2.mp3";
+        MediaPlayer mediaPlayer = MediaPlayer.create(mContext, Uri
+                .fromFile(new File(mInpPrefix + res)));
         mediaPlayer.setAudioAttributes(
                 new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).build());
         if (device != null) {
diff --git a/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java b/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java
index e215ee6..fba0dee 100644
--- a/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java
+++ b/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java
@@ -53,6 +53,7 @@
 public class StreamingMediaPlayerTest extends MediaPlayerTestBase {
 
     private static final String TAG = "StreamingMediaPlayerTest";
+    static final String mInpPrefix = WorkDir.getMediaDirString() + "assets/";
 
     private static final String HTTP_H263_AMR_VIDEO_1_KEY =
             "streaming_media_player_test_http_h263_amr_video1";
@@ -196,7 +197,7 @@
             return; // skip
         }
 
-        // TODO: dummy values for headers/cookies till we find a server that actually needs them
+        // TODO: fake values for headers/cookies till we find a server that actually needs them
         HashMap<String, String> headers = new HashMap<>();
         headers.put("header0", "value0");
         headers.put("header1", "value1");
@@ -284,9 +285,9 @@
             if (redirect) {
                 // Stagefright doesn't have a limit, but we can't test support of infinite redirects
                 // Up to 4 redirects seems reasonable though.
-                stream_url = mServer.getRedirectingAssetUrl(name, 4);
+                stream_url = mServer.getRedirectingAssetUrl(mInpPrefix + name, 4);
             } else {
-                stream_url = mServer.getAssetUrl(name);
+                stream_url = mServer.getAssetUrl(mInpPrefix + name);
             }
             if (nolength) {
                 stream_url = stream_url + "?" + CtsTestServer.NOLENGTH_POSTFIX;
@@ -342,9 +343,9 @@
             if (redirect) {
                 // Stagefright doesn't have a limit, but we can't test support of infinite redirects
                 // Up to 4 redirects seems reasonable though.
-                stream_url = mServer.getRedirectingAssetUrl(name, 4);
+                stream_url = mServer.getRedirectingAssetUrl(mInpPrefix + name, 4);
             } else {
-                stream_url = mServer.getAssetUrl(name);
+                stream_url = mServer.getAssetUrl(mInpPrefix + name);
             }
             if (nolength) {
                 stream_url = stream_url + "?" + CtsTestServer.NOLENGTH_POSTFIX;
@@ -414,7 +415,7 @@
             // counter must be final if we want to access it inside onTimedMetaData;
             // use AtomicInteger so we can have a final counter object with mutable integer value.
             final AtomicInteger counter = new AtomicInteger();
-            String stream_url = mServer.getAssetUrl("prog_index.m3u8");
+            String stream_url = mServer.getAssetUrl(mInpPrefix + "prog_index.m3u8");
             mMediaPlayer.setDataSource(stream_url);
             mMediaPlayer.setDisplay(getActivity().getSurfaceHolder());
             mMediaPlayer.setScreenOnWhilePlaying(true);
@@ -549,7 +550,7 @@
         final MediaPlayer mp = worker.getPlayer();
 
         try {
-            String path = mServer.getDelayedAssetUrl("noiseandchirps.ogg", 15000);
+            String path = mServer.getDelayedAssetUrl(mInpPrefix + "noiseandchirps.ogg", 15000);
             mp.setDataSource(path);
             mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                 @Override
@@ -609,9 +610,9 @@
         try {
             String stream_url = null;
             if (redirect) {
-                stream_url = mServer.getQueryRedirectingAssetUrl(name);
+                stream_url = mServer.getQueryRedirectingAssetUrl(mInpPrefix + name);
             } else {
-                stream_url = mServer.getAssetUrl(name);
+                stream_url = mServer.getAssetUrl(mInpPrefix + name);
             }
             if (appendQueryString) {
                 stream_url += "?foo=bar/baz";
diff --git a/tests/tests/media/src/android/media/cts/ThumbnailUtilsTest.java b/tests/tests/media/src/android/media/cts/ThumbnailUtilsTest.java
index 660dd34..03f6839 100644
--- a/tests/tests/media/src/android/media/cts/ThumbnailUtilsTest.java
+++ b/tests/tests/media/src/android/media/cts/ThumbnailUtilsTest.java
@@ -20,7 +20,6 @@
 import static org.junit.Assert.fail;
 
 import android.annotation.ColorInt;
-import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Color;
 import android.media.ThumbnailUtils;
@@ -35,6 +34,7 @@
 import org.junit.runner.RunWith;
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -56,29 +56,29 @@
 
     private Object[] getSampleWithThumbnailForCreateImageThumbnail() {
         return new Object[] {
-                R.raw.orientation_0,
-                R.raw.orientation_90,
-                R.raw.orientation_180,
-                R.raw.orientation_270,
+                "orientation_0.jpg",
+                "orientation_90.jpg",
+                "orientation_180.jpg",
+                "orientation_270.jpg",
         };
     }
 
     private Object[] getStrippedSampleForCreateImageThumbnail() {
         return new Object[] {
-                R.raw.orientation_stripped_0,
-                R.raw.orientation_stripped_90,
-                R.raw.orientation_stripped_180,
-                R.raw.orientation_stripped_270
+                "orientation_stripped_0.jpg",
+                "orientation_stripped_90.jpg",
+                "orientation_stripped_180.jpg",
+                "orientation_stripped_270.jpg"
 
         };
     }
 
     private Object[] getHEICSampleForCreateImageThumbnail() {
         return new Object[] {
-                R.raw.orientation_heic_0,
-                R.raw.orientation_heic_90,
-                R.raw.orientation_heic_180,
-                R.raw.orientation_heic_270
+                "orientation_heic_0.HEIC",
+                "orientation_heic_90.HEIC",
+                "orientation_heic_180.HEIC",
+                "orientation_heic_270.HEIC"
 
         };
     }
@@ -97,7 +97,7 @@
 
     @Test
     public void testCreateAudioThumbnail() throws Exception {
-        final File file = stageFile(R.raw.testmp3, new File(mDir, "cts.mp3"));
+        final File file = stageFile("testmp3.mp3", new File(mDir, "cts.mp3"));
         for (Size size : TEST_SIZES) {
             assertSaneThumbnail(size, ThumbnailUtils.createAudioThumbnail(file, size, null));
         }
@@ -105,8 +105,8 @@
 
     @Test
     public void testCreateAudioThumbnail_SeparateFile() throws Exception {
-        final File file = stageFile(R.raw.monotestmp3, new File(mDir, "audio.mp3"));
-        stageFile(R.raw.volantis, new File(mDir, "AlbumArt.jpg"));
+        final File file = stageFile("monotestmp3.mp3", new File(mDir, "audio.mp3"));
+        stageFile("volantis.jpg", new File(mDir, "AlbumArt.jpg"));
 
         for (Size size : TEST_SIZES) {
             assertSaneThumbnail(size, ThumbnailUtils.createAudioThumbnail(file, size, null));
@@ -115,7 +115,7 @@
 
     @Test
     public void testCreateAudioThumbnail_None() throws Exception {
-        final File file = stageFile(R.raw.monotestmp3, new File(mDir, "cts.mp3"));
+        final File file = stageFile("monotestmp3.mp3", new File(mDir, "cts.mp3"));
         try {
             ThumbnailUtils.createAudioThumbnail(file, TEST_SIZES[0], null);
             fail("Somehow made a thumbnail out of nothing?");
@@ -125,7 +125,7 @@
 
     @Test
     public void testCreateImageThumbnail() throws Exception {
-        final File file = stageFile(R.raw.volantis, new File(mDir, "cts.jpg"));
+        final File file = stageFile("volantis.jpg", new File(mDir, "cts.jpg"));
         for (Size size : TEST_SIZES) {
             assertSaneThumbnail(size, ThumbnailUtils.createImageThumbnail(file, size, null));
         }
@@ -142,8 +142,8 @@
 
     @Test
     @Parameters(method = "getSampleWithThumbnailForCreateImageThumbnail")
-    public void testCreateImageThumbnail_sampleWithThumbnail(int resId) throws Exception {
-        final File file = stageFile(resId, new File(mDir, "cts.jpg"));
+    public void testCreateImageThumbnail_sampleWithThumbnail(final String res) throws Exception {
+        final File file = stageFile(res, new File(mDir, "cts.jpg"));
         final Bitmap bitmap = ThumbnailUtils.createImageThumbnail(file, TEST_SIZES[0], null);
 
         assertOrientationForThumbnail(bitmap);
@@ -151,8 +151,8 @@
 
     @Test
     @Parameters(method = "getStrippedSampleForCreateImageThumbnail")
-    public void testCreateImageThumbnail_strippedSample(int resId) throws Exception {
-        final File file = stageFile(resId, new File(mDir, "cts.jpg"));
+    public void testCreateImageThumbnail_strippedSample(final String res) throws Exception {
+        final File file = stageFile(res, new File(mDir, "cts.jpg"));
         final Bitmap bitmap = ThumbnailUtils.createImageThumbnail(file, TEST_SIZES[0], null);
 
         assertOrientationForThumbnail(bitmap);
@@ -160,8 +160,8 @@
 
     @Test
     @Parameters(method = "getHEICSampleForCreateImageThumbnail")
-    public void testCreateImageThumbnail_HEICSample(int resId) throws Exception {
-        final File file = stageFile(resId, new File(mDir, "cts.heic"));
+    public void testCreateImageThumbnail_HEICSample(final String res) throws Exception {
+        final File file = stageFile(res, new File(mDir, "cts.heic"));
         final Bitmap bitmap = ThumbnailUtils.createImageThumbnail(file, TEST_SIZES[0], null);
 
         assertOrientationForThumbnail(bitmap);
@@ -170,16 +170,16 @@
     @Test
     public void testCreateVideoThumbnail() throws Exception {
         final File file = stageFile(
-                R.raw.bbb_s1_720x480_mp4_h264_mp3_2mbps_30fps_aac_lc_5ch_320kbps_48000hz,
+                "bbb_s1_720x480_mp4_h264_mp3_2mbps_30fps_aac_lc_5ch_320kbps_48000hz.mp4",
                 new File(mDir, "cts.mp4"));
         for (Size size : TEST_SIZES) {
             assertSaneThumbnail(size, ThumbnailUtils.createVideoThumbnail(file, size, null));
         }
     }
 
-    private static File stageFile(int resId, File file) throws IOException {
-        final Context context = InstrumentationRegistry.getTargetContext();
-        try (InputStream source = context.getResources().openRawResource(resId);
+    private static File stageFile(final String res, File file) throws IOException {
+        final String mInpPrefix = WorkDir.getMediaDirString();
+        try (InputStream source = new FileInputStream(mInpPrefix + res);
                 OutputStream target = new FileOutputStream(file)) {
             android.os.FileUtils.copy(source, target);
         }
diff --git a/tests/tests/media/src/android/media/cts/Utils.java b/tests/tests/media/src/android/media/cts/Utils.java
index 7f4d24e..bbefac7 100644
--- a/tests/tests/media/src/android/media/cts/Utils.java
+++ b/tests/tests/media/src/android/media/cts/Utils.java
@@ -29,6 +29,7 @@
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.ParcelFileDescriptor;
+import android.platform.test.annotations.AppModeFull;
 import android.util.Log;
 import androidx.test.platform.app.InstrumentationRegistry;
 import java.io.File;
@@ -148,19 +149,22 @@
      * is created once. The playback will be stopped immediately after that.
      * <p>For a media session to receive media button events, an actual playback is needed.
      */
+    @AppModeFull(reason = "Instant apps cannot access the SD card")
     static void assertMediaPlaybackStarted(Context context) {
         final AudioManager am = new AudioManager(context);
         final HandlerThread handlerThread = new HandlerThread(TAG);
         handlerThread.start();
         final TestAudioPlaybackCallback callback = new TestAudioPlaybackCallback();
         MediaPlayer mediaPlayer = null;
+        final String mInpPrefix = WorkDir.getMediaDirString();
 
         try {
             final int activeConfigSizeBeforeStart = am.getActivePlaybackConfigurations().size();
             final Handler handler = new Handler(handlerThread.getLooper());
 
             am.registerAudioPlaybackCallback(callback, handler);
-            mediaPlayer = MediaPlayer.create(context, R.raw.sine1khzs40dblong);
+            mediaPlayer = MediaPlayer.create(context, Uri.fromFile(new File(mInpPrefix +
+                    "sine1khzs40dblong.mp3")));
             mediaPlayer.start();
             if (!callback.mCountDownLatch.await(TEST_TIMING_TOLERANCE_MS, TimeUnit.MILLISECONDS)
                     || callback.mActiveConfigSize != activeConfigSizeBeforeStart + 1) {
diff --git a/tests/tests/media/src/android/media/cts/VideoCodecTest.java b/tests/tests/media/src/android/media/cts/VideoCodecTest.java
index f477881..923a557 100644
--- a/tests/tests/media/src/android/media/cts/VideoCodecTest.java
+++ b/tests/tests/media/src/android/media/cts/VideoCodecTest.java
@@ -22,7 +22,6 @@
 import android.media.MediaFormat;
 import android.platform.test.annotations.AppModeFull;
 import android.util.Log;
-import android.media.cts.R;
 
 import java.io.File;
 import java.nio.ByteBuffer;
@@ -161,7 +160,7 @@
         decode(params.outputIvfFilename, OUTPUT_YUV, codecMimeType, FPS,
                 params.forceGoogleEncoder, codecConfigs);
         VideoDecodingStatistics statisticsAsync = computeDecodingStatistics(
-                params.inputYuvFilename, R.raw.football_qvga, OUTPUT_YUV,
+                params.inputYuvFilename, "football_qvga.yuv", OUTPUT_YUV,
                 params.frameWidth, params.frameHeight);
 
 
@@ -188,7 +187,7 @@
         decode(params.outputIvfFilename, OUTPUT_YUV, codecMimeType, FPS,
                 params.forceGoogleEncoder, codecConfigs);
         VideoDecodingStatistics statisticsSync = computeDecodingStatistics(
-                params.inputYuvFilename, R.raw.football_qvga, OUTPUT_YUV,
+                params.inputYuvFilename, "football_qvga.yuv", OUTPUT_YUV,
                 params.frameWidth, params.frameHeight);
 
         // Check PSNR difference.
@@ -384,7 +383,7 @@
                      decode(inputIvfFilename, OUTPUT_YUV, codecMimeType, FPS,
                             params.forceGoogleEncoder, codecConfigs);
                      VideoDecodingStatistics statistics = computeDecodingStatistics(
-                            params.inputYuvFilename, R.raw.football_qvga, OUTPUT_YUV,
+                            params.inputYuvFilename, "football_qvga.yuv", OUTPUT_YUV,
                             params.frameWidth, params.frameHeight);
                      psnr[0] = statistics.mAveragePSNR;
                  } catch (Exception e) {
@@ -475,7 +474,7 @@
             decode(params.outputIvfFilename, OUTPUT_YUV, codecMimeType, FPS,
                     params.forceGoogleEncoder, codecConfigs);
             VideoDecodingStatistics statistics = computeDecodingStatistics(
-                    params.inputYuvFilename, R.raw.football_qvga, OUTPUT_YUV,
+                    params.inputYuvFilename, "football_qvga.yuv", OUTPUT_YUV,
                     params.frameWidth, params.frameHeight);
             psnrPlatformCodecAverage[i] = statistics.mAveragePSNR;
             psnrPlatformCodecMin[i] = statistics.mMinimumPSNR;
diff --git a/tests/tests/media/src/android/media/cts/VideoCodecTestBase.java b/tests/tests/media/src/android/media/cts/VideoCodecTestBase.java
index 7ba3541..8ca9c27 100644
--- a/tests/tests/media/src/android/media/cts/VideoCodecTestBase.java
+++ b/tests/tests/media/src/android/media/cts/VideoCodecTestBase.java
@@ -28,9 +28,9 @@
 import android.os.Environment;
 import android.os.Looper;
 import android.os.Handler;
+import android.platform.test.annotations.AppModeFull;
 import android.test.AndroidTestCase;
 import android.util.Log;
-import android.media.cts.R;
 
 import com.android.compatibility.common.util.MediaUtils;
 
@@ -52,6 +52,7 @@
  * The stream is later decoded by the decoder to verify frames are decodable and to
  * calculate PSNR values for various bitrates.
  */
+@AppModeFull(reason = "Instant apps cannot access the SD card")
 public class VideoCodecTestBase extends AndroidTestCase {
 
     protected static final String TAG = "VideoCodecTestBase";
@@ -61,6 +62,7 @@
     protected static final String HEVC_MIME = MediaFormat.MIMETYPE_VIDEO_HEVC;
     protected static final String SDCARD_DIR =
             Environment.getExternalStorageDirectory().getAbsolutePath();
+    static final String mInpPrefix = WorkDir.getMediaDirString();
 
     // Default timeout for MediaCodec buffer dequeue - 200 ms.
     protected static final long DEFAULT_DEQUEUE_TIMEOUT_US = 200000;
@@ -184,14 +186,14 @@
      */
     protected class EncoderOutputStreamParameters {
         // Name of raw YUV420 input file. When the value of this parameter
-        // is set to null input file descriptor from inputResourceId parameter
+        // is set to null input file descriptor from inputResource parameter
         // is used instead.
         public String inputYuvFilename;
         // Name of scaled YUV420 input file.
         public String scaledYuvFilename;
         // File descriptor for the raw input file (YUV420). Used only if
         // inputYuvFilename parameter is null.
-        int inputResourceId;
+        public String inputResource;
         // Name of the IVF file to write encoded bitsream
         public String outputIvfFilename;
         // Mime Type of the Encoded content.
@@ -275,7 +277,7 @@
             }
             params.scaledYuvFilename = SDCARD_DIR + File.separator +
                     outputIvfBaseName + resolutionScales[i]+ ".yuv";
-            params.inputResourceId = R.raw.football_qvga;
+            params.inputResource = "football_qvga.yuv";
             params.codecMimeType = codecMimeType;
             String codecSuffix = getCodecSuffix(codecMimeType);
             params.outputIvfFilename = SDCARD_DIR + File.separator +
@@ -489,9 +491,9 @@
     }
 
     private void cacheScaledImage(
-            String srcYuvFilename, int srcResourceId, int srcFrameWidth, int srcFrameHeight,
+            String srcYuvFilename, String srcResource, int srcFrameWidth, int srcFrameHeight,
             String dstYuvFilename, int dstFrameWidth, int dstFrameHeight) throws Exception {
-        InputStream srcStream = OpenFileOrResourceId(srcYuvFilename, srcResourceId);
+        InputStream srcStream = OpenFileOrResource(srcYuvFilename, srcResource);
         FileOutputStream dstFile = new FileOutputStream(dstYuvFilename, false);
         int srcFrameSize = srcFrameWidth * srcFrameHeight * 3 / 2;
         byte[] srcFrame = new byte[srcFrameSize];
@@ -745,11 +747,12 @@
      * Helper function to return InputStream from either filename (if set)
      * or resource id (if filename is not set).
      */
-    private InputStream OpenFileOrResourceId(String filename, int resourceId) throws Exception {
+    private InputStream OpenFileOrResource(String filename, final String resource)
+            throws Exception {
         if (filename != null) {
             return new FileInputStream(filename);
         }
-        return mResources.openRawResource(resourceId);
+        return new FileInputStream(mInpPrefix + resource);
     }
 
     /**
@@ -790,8 +793,8 @@
             int srcFrameSize = streamParams.frameWidth * streamParams.frameHeight * 3 / 2;
             mSrcFrame = new byte[srcFrameSize];
 
-            mYuvStream = OpenFileOrResourceId(
-                    streamParams.inputYuvFilename, streamParams.inputResourceId);
+            mYuvStream = OpenFileOrResource(
+                    streamParams.inputYuvFilename, streamParams.inputResource);
         }
 
         public byte[] getInputFrame() {
@@ -809,8 +812,8 @@
                 if (bytesRead == -1) {
                     // rewind to beginning of file
                     mYuvStream.close();
-                    mYuvStream = OpenFileOrResourceId(
-                            mStreamParams.inputYuvFilename, mStreamParams.inputResourceId);
+                    mYuvStream = OpenFileOrResource(
+                            mStreamParams.inputYuvFilename, mStreamParams.inputResource);
                     bytesRead = mYuvStream.read(mSrcFrame);
                 }
             } catch (Exception e) {
@@ -1368,8 +1371,8 @@
         }
 
         // Open input/output
-        InputStream yuvStream = OpenFileOrResourceId(
-                streamParams.inputYuvFilename, streamParams.inputResourceId);
+        InputStream yuvStream = OpenFileOrResource(
+                streamParams.inputYuvFilename, streamParams.inputResource);
         IvfWriter ivf = new IvfWriter(
                 streamParams.outputIvfFilename, streamParams.codecMimeType,
                 streamParams.frameWidth, streamParams.frameHeight);
@@ -1432,8 +1435,8 @@
                             Log.d(TAG, "---Sending EOS empty frame for frame # " + inputFrameIndex);
                         } else {
                             yuvStream.close();
-                            yuvStream = OpenFileOrResourceId(
-                                    streamParams.inputYuvFilename, streamParams.inputResourceId);
+                            yuvStream = OpenFileOrResource(
+                                    streamParams.inputYuvFilename, streamParams.inputResource);
                             bytesRead = yuvStream.read(srcFrame);
                         }
                     }
@@ -1665,7 +1668,7 @@
             int scale = params.frameWidth / srcFrameWidth;
             if (!mScaledImages.contains(scale)) {
                 // resize image
-                cacheScaledImage(params.inputYuvFilename, params.inputResourceId,
+                cacheScaledImage(params.inputYuvFilename, params.inputResource,
                         srcFrameWidth, srcFrameHeight,
                         params.scaledYuvFilename, params.frameWidth, params.frameHeight);
                 mScaledImages.add(scale);
@@ -2018,13 +2021,13 @@
      */
     protected VideoDecodingStatistics computeDecodingStatistics(
             String referenceYuvFilename,
-            int referenceYuvRawId,
+            String referenceYuvRaw,
             String decodedYuvFilename,
             int width,
             int height) throws Exception {
         VideoDecodingStatistics statistics = new VideoDecodingStatistics();
         InputStream referenceStream =
-                OpenFileOrResourceId(referenceYuvFilename, referenceYuvRawId);
+                OpenFileOrResource(referenceYuvFilename, referenceYuvRaw);
         InputStream decodedStream = new FileInputStream(decodedYuvFilename);
 
         int ySize = width * height;
@@ -2054,7 +2057,7 @@
                 // Reference file wrapping up
                 referenceStream.close();
                 referenceStream =
-                        OpenFileOrResourceId(referenceYuvFilename, referenceYuvRawId);
+                        OpenFileOrResource(referenceYuvFilename, referenceYuvRaw);
                 bytesReadRef = referenceStream.read(yRef);
             }
             double curYPSNR = computePSNR(yRef, yDec);
diff --git a/tests/tests/media/src/android/media/cts/VideoDecoderPerfTest.java b/tests/tests/media/src/android/media/cts/VideoDecoderPerfTest.java
index a545b09..ca0181f 100644
--- a/tests/tests/media/src/android/media/cts/VideoDecoderPerfTest.java
+++ b/tests/tests/media/src/android/media/cts/VideoDecoderPerfTest.java
@@ -16,11 +16,7 @@
 
 package android.media.cts;
 
-import android.media.cts.R;
-
 import android.content.Context;
-import android.content.res.AssetFileDescriptor;
-import android.content.res.Resources;
 import android.media.MediaCodec;
 import android.media.MediaCodecInfo.VideoCapabilities;
 import android.media.MediaExtractor;
@@ -76,13 +72,12 @@
     private MediaFormat mDecOutputFormat;
     private int mBitrate;
 
-    private Resources mResources;
     private boolean mSkipRateChecking = false;
+    static final String mInpPrefix = WorkDir.getMediaDirString();
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mResources = mContext.getResources();
         Bundle bundle = InstrumentationRegistry.getArguments();
         mSkipRateChecking = TextUtils.equals("true", bundle.getString("mts-media"));
     }
@@ -123,7 +118,7 @@
         return line;
     }
 
-    private void decode(String name, int resourceId, MediaFormat format) throws Exception {
+    private void decode(String name, final String resource, MediaFormat format) throws Exception {
         int width = format.getInteger(MediaFormat.KEY_WIDTH);
         int height = format.getInteger(MediaFormat.KEY_HEIGHT);
         String mime = format.getString(MediaFormat.KEY_MIME);
@@ -142,7 +137,7 @@
             Log.d(TAG, "round #" + i + ": " + name + " for " + maxTimeMs + " msecs to surface");
             Surface s = getActivity().getSurfaceHolder().getSurface();
             // only verify the result for decode to surface case.
-            measuredFps[i] = doDecode(name, resourceId, width, height, s, i, maxTimeMs);
+            measuredFps[i] = doDecode(name, resource, width, height, s, i, maxTimeMs);
 
             // We don't test decoding to buffer.
             // Log.d(TAG, "round #" + i + " decode to buffer");
@@ -160,13 +155,11 @@
         mSamplesInMemory.clear();
     }
 
-    private double doDecode(
-            String name, int video, int w, int h, Surface surface, int round, long maxTimeMs)
-            throws Exception {
-        AssetFileDescriptor testFd = mResources.openRawResourceFd(video);
+    private double doDecode(String name, final String filename, int w, int h, Surface surface,
+            int round, long maxTimeMs) throws Exception {
+        final String video = mInpPrefix + filename;
         MediaExtractor extractor = new MediaExtractor();
-        extractor.setDataSource(testFd.getFileDescriptor(), testFd.getStartOffset(),
-                testFd.getLength());
+        extractor.setDataSource(video);
         extractor.selectTrack(0);
         int trackIndex = extractor.getSampleTrackIndex();
         MediaFormat format = extractor.getTrackFormat(trackIndex);
@@ -220,7 +213,6 @@
         int sampleIndex = 0;
 
         extractor.release();
-        testFd.close();
 
         MediaCodec codec = MediaCodec.createByCodecName(name);
         VideoCapabilities cap = codec.getCodecInfo().getCapabilitiesForType(mime).getVideoCapabilities();
@@ -335,21 +327,21 @@
         return fps;
     }
 
-    private MediaFormat[] getVideoTrackFormats(int... resources) throws Exception {
+    private MediaFormat[] getVideoTrackFormats(String... resources) throws Exception {
         MediaFormat[] formats = new MediaFormat[resources.length];
         for (int i = 0; i < resources.length; ++i) {
-            formats[i] = MediaUtils.getTrackFormatForResource(mContext, resources[i], "video/");
+            formats[i] = MediaUtils.getTrackFormatForResource(mInpPrefix + resources[i], "video/");
         }
         return formats;
     }
 
-    private void count(int[] resources, int numGoog, int numOther) throws Exception {
+    private void count(final String[] resources, int numGoog, int numOther) throws Exception {
         MediaFormat[] formats = getVideoTrackFormats(resources);
         MediaUtils.verifyNumCodecs(numGoog,  false /* isEncoder */, true /* isGoog */,  formats);
         MediaUtils.verifyNumCodecs(numOther, false /* isEncoder */, false /* isGoog */, formats);
     }
 
-    private void perf(int[] resources, boolean isGoog, int ix)  throws Exception {
+    private void perf(final String[] resources, boolean isGoog, int ix)  throws Exception {
         MediaFormat[] formats = getVideoTrackFormats(resources);
         String[] decoders = MediaUtils.getDecoderNames(isGoog, formats);
         String kind = isGoog ? "Google" : "non-Google";
@@ -379,8 +371,8 @@
 
     // AVC tests
 
-    private static final int[] sAvcMedia0320x0240 = {
-        R.raw.bbb_s1_320x240_mp4_h264_mp2_800kbps_30fps_aac_lc_5ch_240kbps_44100hz,
+    private static final String[] sAvcMedia0320x0240 = {
+        "bbb_s1_320x240_mp4_h264_mp2_800kbps_30fps_aac_lc_5ch_240kbps_44100hz.mp4",
     };
 
     public void testAvcCount0320x0240() throws Exception { count(sAvcMedia0320x0240, 2, 4); }
@@ -391,8 +383,8 @@
     public void testAvcOther2Perf0320x0240() throws Exception { perf(sAvcMedia0320x0240, OTHER, 2); }
     public void testAvcOther3Perf0320x0240() throws Exception { perf(sAvcMedia0320x0240, OTHER, 3); }
 
-    private static final int[] sAvcMedia0720x0480 = {
-        R.raw.bbb_s1_720x480_mp4_h264_mp3_2mbps_30fps_aac_lc_5ch_320kbps_48000hz,
+    private static final String[] sAvcMedia0720x0480 = {
+        "bbb_s1_720x480_mp4_h264_mp3_2mbps_30fps_aac_lc_5ch_320kbps_48000hz.mp4",
     };
 
     public void testAvcCount0720x0480() throws Exception { count(sAvcMedia0720x0480, 2, 4); }
@@ -404,10 +396,10 @@
     public void testAvcOther3Perf0720x0480() throws Exception { perf(sAvcMedia0720x0480, OTHER, 3); }
 
     // prefer highest effective bitrate, then high profile
-    private static final int[] sAvcMedia1280x0720 = {
-        R.raw.bbb_s4_1280x720_mp4_h264_mp31_8mbps_30fps_aac_he_mono_40kbps_44100hz,
-        R.raw.bbb_s3_1280x720_mp4_h264_hp32_8mbps_60fps_aac_he_v2_stereo_48kbps_48000hz,
-        R.raw.bbb_s3_1280x720_mp4_h264_mp32_8mbps_60fps_aac_he_v2_6ch_144kbps_44100hz,
+    private static final String[] sAvcMedia1280x0720 = {
+        "bbb_s4_1280x720_mp4_h264_mp31_8mbps_30fps_aac_he_mono_40kbps_44100hz.mp4",
+        "bbb_s3_1280x720_mp4_h264_hp32_8mbps_60fps_aac_he_v2_stereo_48kbps_48000hz.mp4",
+        "bbb_s3_1280x720_mp4_h264_mp32_8mbps_60fps_aac_he_v2_6ch_144kbps_44100hz.mp4",
     };
 
     public void testAvcCount1280x0720() throws Exception { count(sAvcMedia1280x0720, 2, 4); }
@@ -419,11 +411,11 @@
     public void testAvcOther3Perf1280x0720() throws Exception { perf(sAvcMedia1280x0720, OTHER, 3); }
 
     // prefer highest effective bitrate, then high profile
-    private static final int[] sAvcMedia1920x1080 = {
-        R.raw.bbb_s4_1920x1080_wide_mp4_h264_hp4_20mbps_30fps_aac_lc_6ch_384kbps_44100hz,
-        R.raw.bbb_s4_1920x1080_wide_mp4_h264_mp4_20mbps_30fps_aac_he_5ch_200kbps_44100hz,
-        R.raw.bbb_s2_1920x1080_mp4_h264_hp42_20mbps_60fps_aac_lc_6ch_384kbps_48000hz,
-        R.raw.bbb_s2_1920x1080_mp4_h264_mp42_20mbps_60fps_aac_he_v2_5ch_160kbps_48000hz,
+    private static final String[] sAvcMedia1920x1080 = {
+        "bbb_s4_1920x1080_wide_mp4_h264_hp4_20mbps_30fps_aac_lc_6ch_384kbps_44100hz.mp4",
+        "bbb_s4_1920x1080_wide_mp4_h264_mp4_20mbps_30fps_aac_he_5ch_200kbps_44100hz.mp4",
+        "bbb_s2_1920x1080_mp4_h264_hp42_20mbps_60fps_aac_lc_6ch_384kbps_48000hz.mp4",
+        "bbb_s2_1920x1080_mp4_h264_mp42_20mbps_60fps_aac_he_v2_5ch_160kbps_48000hz.mp4",
     };
 
     public void testAvcCount1920x1080() throws Exception { count(sAvcMedia1920x1080, 2, 4); }
@@ -436,8 +428,8 @@
 
     // H263 tests
 
-    private static final int[] sH263Media0176x0144 = {
-        R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz,
+    private static final String[] sH263Media0176x0144 = {
+        "video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz.3gp",
     };
 
     public void testH263Count0176x0144() throws Exception { count(sH263Media0176x0144, 2, 2); }
@@ -446,8 +438,8 @@
     public void testH263Other0Perf0176x0144() throws Exception { perf(sH263Media0176x0144, OTHER, 0); }
     public void testH263Other1Perf0176x0144() throws Exception { perf(sH263Media0176x0144, OTHER, 1); }
 
-    private static final int[] sH263Media0352x0288 = {
-        R.raw.video_352x288_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz,
+    private static final String[] sH263Media0352x0288 = {
+        "video_352x288_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz.3gp",
     };
 
     public void testH263Count0352x0288() throws Exception { count(sH263Media0352x0288, 2, 2); }
@@ -462,8 +454,8 @@
 
     // HEVC tests
 
-    private static final int[] sHevcMedia0352x0288 = {
-        R.raw.bbb_s1_352x288_mp4_hevc_mp2_600kbps_30fps_aac_he_stereo_96kbps_48000hz,
+    private static final String[] sHevcMedia0352x0288 = {
+        "bbb_s1_352x288_mp4_hevc_mp2_600kbps_30fps_aac_he_stereo_96kbps_48000hz.mp4",
     };
 
     public void testHevcCount0352x0288() throws Exception { count(sHevcMedia0352x0288, 2, 4); }
@@ -474,8 +466,8 @@
     public void testHevcOther2Perf0352x0288() throws Exception { perf(sHevcMedia0352x0288, OTHER, 2); }
     public void testHevcOther3Perf0352x0288() throws Exception { perf(sHevcMedia0352x0288, OTHER, 3); }
 
-    private static final int[] sHevcMedia0640x0360 = {
-        R.raw.bbb_s1_640x360_mp4_hevc_mp21_1600kbps_30fps_aac_he_6ch_288kbps_44100hz,
+    private static final String[] sHevcMedia0640x0360 = {
+        "bbb_s1_640x360_mp4_hevc_mp21_1600kbps_30fps_aac_he_6ch_288kbps_44100hz.mp4",
     };
 
     public void testHevcCount0640x0360() throws Exception { count(sHevcMedia0640x0360, 2, 4); }
@@ -486,8 +478,8 @@
     public void testHevcOther2Perf0640x0360() throws Exception { perf(sHevcMedia0640x0360, OTHER, 2); }
     public void testHevcOther3Perf0640x0360() throws Exception { perf(sHevcMedia0640x0360, OTHER, 3); }
 
-    private static final int[] sHevcMedia0720x0480 = {
-        R.raw.bbb_s1_720x480_mp4_hevc_mp3_1600kbps_30fps_aac_he_6ch_240kbps_48000hz,
+    private static final String[] sHevcMedia0720x0480 = {
+        "bbb_s1_720x480_mp4_hevc_mp3_1600kbps_30fps_aac_he_6ch_240kbps_48000hz.mp4",
     };
 
     public void testHevcCount0720x0480() throws Exception { count(sHevcMedia0720x0480, 2, 4); }
@@ -498,8 +490,8 @@
     public void testHevcOther2Perf0720x0480() throws Exception { perf(sHevcMedia0720x0480, OTHER, 2); }
     public void testHevcOther3Perf0720x0480() throws Exception { perf(sHevcMedia0720x0480, OTHER, 3); }
 
-    private static final int[] sHevcMedia1280x0720 = {
-        R.raw.bbb_s4_1280x720_mp4_hevc_mp31_4mbps_30fps_aac_he_stereo_80kbps_32000hz,
+    private static final String[] sHevcMedia1280x0720 = {
+        "bbb_s4_1280x720_mp4_hevc_mp31_4mbps_30fps_aac_he_stereo_80kbps_32000hz.mp4",
     };
 
     public void testHevcCount1280x0720() throws Exception { count(sHevcMedia1280x0720, 2, 4); }
@@ -510,8 +502,8 @@
     public void testHevcOther2Perf1280x0720() throws Exception { perf(sHevcMedia1280x0720, OTHER, 2); }
     public void testHevcOther3Perf1280x0720() throws Exception { perf(sHevcMedia1280x0720, OTHER, 3); }
 
-    private static final int[] sHevcMedia1920x1080 = {
-        R.raw.bbb_s2_1920x1080_mp4_hevc_mp41_10mbps_60fps_aac_lc_6ch_384kbps_22050hz,
+    private static final String[] sHevcMedia1920x1080 = {
+        "bbb_s2_1920x1080_mp4_hevc_mp41_10mbps_60fps_aac_lc_6ch_384kbps_22050hz.mp4",
     };
 
     public void testHevcCount1920x1080() throws Exception { count(sHevcMedia1920x1080, 2, 4); }
@@ -523,9 +515,9 @@
     public void testHevcOther3Perf1920x1080() throws Exception { perf(sHevcMedia1920x1080, OTHER, 3); }
 
     // prefer highest effective bitrate
-    private static final int[] sHevcMedia3840x2160 = {
-        R.raw.bbb_s4_3840x2160_mp4_hevc_mp5_20mbps_30fps_aac_lc_6ch_384kbps_24000hz,
-        R.raw.bbb_s2_3840x2160_mp4_hevc_mp51_20mbps_60fps_aac_lc_6ch_384kbps_32000hz,
+    private static final String[] sHevcMedia3840x2160 = {
+        "bbb_s4_3840x2160_mp4_hevc_mp5_20mbps_30fps_aac_lc_6ch_384kbps_24000hz.mp4",
+        "bbb_s2_3840x2160_mp4_hevc_mp51_20mbps_60fps_aac_lc_6ch_384kbps_32000hz.mp4",
     };
 
     public void testHevcCount3840x2160() throws Exception { count(sHevcMedia3840x2160, 2, 4); }
@@ -550,8 +542,8 @@
 
     // MPEG4 tests
 
-    private static final int[] sMpeg4Media0176x0144 = {
-        R.raw.video_176x144_mp4_mpeg4_300kbps_25fps_aac_stereo_128kbps_44100hz,
+    private static final String[] sMpeg4Media0176x0144 = {
+        "video_176x144_mp4_mpeg4_300kbps_25fps_aac_stereo_128kbps_44100hz.mp4",
     };
 
     public void testMpeg4Count0176x0144() throws Exception { count(sMpeg4Media0176x0144, 2, 4); }
@@ -562,8 +554,8 @@
     public void testMpeg4Other2Perf0176x0144() throws Exception { perf(sMpeg4Media0176x0144, OTHER, 2); }
     public void testMpeg4Other3Perf0176x0144() throws Exception { perf(sMpeg4Media0176x0144, OTHER, 3); }
 
-    private static final int[] sMpeg4Media0480x0360 = {
-        R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz,
+    private static final String[] sMpeg4Media0480x0360 = {
+        "video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz.mp4",
     };
 
     public void testMpeg4Count0480x0360() throws Exception { count(sMpeg4Media0480x0360, 2, 4); }
@@ -576,8 +568,8 @@
 
    // No media for MPEG4 640x480
 
-    private static final int[] sMpeg4Media1280x0720 = {
-        R.raw.video_1280x720_mp4_mpeg4_1000kbps_25fps_aac_stereo_128kbps_44100hz,
+    private static final String[] sMpeg4Media1280x0720 = {
+        "video_1280x720_mp4_mpeg4_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4",
     };
 
     public void testMpeg4Count1280x0720() throws Exception { count(sMpeg4Media1280x0720, 2, 4); }
@@ -590,8 +582,8 @@
 
     // VP8 tests
 
-    private static final int[] sVp8Media0320x0180 = {
-        R.raw.bbb_s1_320x180_webm_vp8_800kbps_30fps_opus_5ch_320kbps_48000hz,
+    private static final String[] sVp8Media0320x0180 = {
+        "bbb_s1_320x180_webm_vp8_800kbps_30fps_opus_5ch_320kbps_48000hz.webm",
     };
 
     public void testVp8Count0320x0180() throws Exception { count(sVp8Media0320x0180, 2, 2); }
@@ -600,8 +592,8 @@
     public void testVp8Other0Perf0320x0180() throws Exception { perf(sVp8Media0320x0180, OTHER, 0); }
     public void testVp8Other1Perf0320x0180() throws Exception { perf(sVp8Media0320x0180, OTHER, 1); }
 
-    private static final int[] sVp8Media0640x0360 = {
-        R.raw.bbb_s1_640x360_webm_vp8_2mbps_30fps_vorbis_5ch_320kbps_48000hz,
+    private static final String[] sVp8Media0640x0360 = {
+        "bbb_s1_640x360_webm_vp8_2mbps_30fps_vorbis_5ch_320kbps_48000hz.webm",
     };
 
     public void testVp8Count0640x0360() throws Exception { count(sVp8Media0640x0360, 2, 2); }
@@ -611,9 +603,9 @@
     public void testVp8Other1Perf0640x0360() throws Exception { perf(sVp8Media0640x0360, OTHER, 1); }
 
     // prefer highest effective bitrate
-    private static final int[] sVp8Media1280x0720 = {
-        R.raw.bbb_s4_1280x720_webm_vp8_8mbps_30fps_opus_mono_64kbps_48000hz,
-        R.raw.bbb_s3_1280x720_webm_vp8_8mbps_60fps_opus_6ch_384kbps_48000hz,
+    private static final String[] sVp8Media1280x0720 = {
+        "bbb_s4_1280x720_webm_vp8_8mbps_30fps_opus_mono_64kbps_48000hz.webm",
+        "bbb_s3_1280x720_webm_vp8_8mbps_60fps_opus_6ch_384kbps_48000hz.webm",
     };
 
     public void testVp8Count1280x0720() throws Exception { count(sVp8Media1280x0720, 2, 2); }
@@ -623,9 +615,9 @@
     public void testVp8Other1Perf1280x0720() throws Exception { perf(sVp8Media1280x0720, OTHER, 1); }
 
     // prefer highest effective bitrate
-    private static final int[] sVp8Media1920x1080 = {
-        R.raw.bbb_s4_1920x1080_wide_webm_vp8_20mbps_30fps_vorbis_6ch_384kbps_44100hz,
-        R.raw.bbb_s2_1920x1080_webm_vp8_20mbps_60fps_vorbis_6ch_384kbps_48000hz,
+    private static final String[] sVp8Media1920x1080 = {
+        "bbb_s4_1920x1080_wide_webm_vp8_20mbps_30fps_vorbis_6ch_384kbps_44100hz.webm",
+        "bbb_s2_1920x1080_webm_vp8_20mbps_60fps_vorbis_6ch_384kbps_48000hz.webm",
     };
 
     public void testVp8Count1920x1080() throws Exception { count(sVp8Media1920x1080, 2, 2); }
@@ -636,8 +628,8 @@
 
     // VP9 tests
 
-    private static final int[] sVp9Media0320x0180 = {
-        R.raw.bbb_s1_320x180_webm_vp9_0p11_600kbps_30fps_vorbis_mono_64kbps_48000hz,
+    private static final String[] sVp9Media0320x0180 = {
+        "bbb_s1_320x180_webm_vp9_0p11_600kbps_30fps_vorbis_mono_64kbps_48000hz.webm",
     };
 
     public void testVp9Count0320x0180() throws Exception { count(sVp9Media0320x0180, 2, 4); }
@@ -648,8 +640,8 @@
     public void testVp9Other2Perf0320x0180() throws Exception { perf(sVp9Media0320x0180, OTHER, 2); }
     public void testVp9Other3Perf0320x0180() throws Exception { perf(sVp9Media0320x0180, OTHER, 3); }
 
-    private static final int[] sVp9Media0640x0360 = {
-        R.raw.bbb_s1_640x360_webm_vp9_0p21_1600kbps_30fps_vorbis_stereo_128kbps_48000hz,
+    private static final String[] sVp9Media0640x0360 = {
+        "bbb_s1_640x360_webm_vp9_0p21_1600kbps_30fps_vorbis_stereo_128kbps_48000hz.webm",
     };
 
     public void testVp9Count0640x0360() throws Exception { count(sVp9Media0640x0360, 2, 4); }
@@ -660,8 +652,8 @@
     public void testVp9Other2Perf0640x0360() throws Exception { perf(sVp9Media0640x0360, OTHER, 2); }
     public void testVp9Other3Perf0640x0360() throws Exception { perf(sVp9Media0640x0360, OTHER, 3); }
 
-    private static final int[] sVp9Media1280x0720 = {
-        R.raw.bbb_s4_1280x720_webm_vp9_0p31_4mbps_30fps_opus_stereo_128kbps_48000hz,
+    private static final String[] sVp9Media1280x0720 = {
+        "bbb_s4_1280x720_webm_vp9_0p31_4mbps_30fps_opus_stereo_128kbps_48000hz.webm",
     };
 
     public void testVp9Count1280x0720() throws Exception { count(sVp9Media1280x0720, 2, 4); }
@@ -672,8 +664,8 @@
     public void testVp9Other2Perf1280x0720() throws Exception { perf(sVp9Media1280x0720, OTHER, 2); }
     public void testVp9Other3Perf1280x0720() throws Exception { perf(sVp9Media1280x0720, OTHER, 3); }
 
-    private static final int[] sVp9Media1920x1080 = {
-        R.raw.bbb_s2_1920x1080_webm_vp9_0p41_10mbps_60fps_vorbis_6ch_384kbps_22050hz,
+    private static final String[] sVp9Media1920x1080 = {
+        "bbb_s2_1920x1080_webm_vp9_0p41_10mbps_60fps_vorbis_6ch_384kbps_22050hz.webm",
     };
 
     public void testVp9Count1920x1080() throws Exception { count(sVp9Media1920x1080, 2, 4); }
@@ -685,9 +677,9 @@
     public void testVp9Other3Perf1920x1080() throws Exception { perf(sVp9Media1920x1080, OTHER, 3); }
 
     // prefer highest effective bitrate
-    private static final int[] sVp9Media3840x2160 = {
-        R.raw.bbb_s4_3840x2160_webm_vp9_0p5_20mbps_30fps_vorbis_6ch_384kbps_24000hz,
-        R.raw.bbb_s2_3840x2160_webm_vp9_0p51_20mbps_60fps_vorbis_6ch_384kbps_32000hz,
+    private static final String[] sVp9Media3840x2160 = {
+        "bbb_s4_3840x2160_webm_vp9_0p5_20mbps_30fps_vorbis_6ch_384kbps_24000hz.webm",
+        "bbb_s2_3840x2160_webm_vp9_0p51_20mbps_60fps_vorbis_6ch_384kbps_32000hz.webm",
     };
 
     public void testVp9Count3840x2160() throws Exception { count(sVp9Media3840x2160, 2, 4); }
diff --git a/tests/tests/media/src/android/media/cts/VideoEncoderTest.java b/tests/tests/media/src/android/media/cts/VideoEncoderTest.java
index b135f89..18f5300 100644
--- a/tests/tests/media/src/android/media/cts/VideoEncoderTest.java
+++ b/tests/tests/media/src/android/media/cts/VideoEncoderTest.java
@@ -16,8 +16,6 @@
 
 package android.media.cts;
 
-import android.media.cts.R;
-
 import android.media.cts.CodecUtils;
 
 import android.graphics.ImageFormat;
@@ -69,8 +67,9 @@
     // use larger delay before we get first frame, some encoders may need more time
     private static final long INIT_TIMEOUT_MS = 2000;
 
+    static final String mInpPrefix = WorkDir.getMediaDirString();
     private static final String SOURCE_URL =
-        "android.resource://android.media.cts/raw/video_480x360_mp4_h264_871kbps_30fps";
+            mInpPrefix + "video_480x360_mp4_h264_871kbps_30fps.mp4";
 
     private final boolean DEBUG = false;
 
@@ -588,7 +587,7 @@
                     // can release empty buffers now
                     if (info.size == 0) {
                         mDecoder.releaseOutputBuffer(ix, false /* render */);
-                        ix = -1; // dummy index used by render to not render
+                        ix = -1; // fake index used by render to not render
                     }
                     synchronized(mCondition) {
                         if (ix < 0 && eos && mBuffersToRender.size() > 0) {
@@ -840,7 +839,7 @@
                     // can release empty buffers now
                     if (info.size == 0) {
                         mDecoder.releaseOutputBuffer(ix, false /* render */);
-                        ix = -1; // dummy index used by render to not render
+                        ix = -1; // fake index used by render to not render
                     }
                     if (eos || info.size > 0) {
                         synchronized(mCondition) {
diff --git a/tests/tests/media/src/android/media/cts/VisualizerTest.java b/tests/tests/media/src/android/media/cts/VisualizerTest.java
index 5645a92..94575e9 100644
--- a/tests/tests/media/src/android/media/cts/VisualizerTest.java
+++ b/tests/tests/media/src/android/media/cts/VisualizerTest.java
@@ -16,8 +16,6 @@
 
 package android.media.cts;
 
-import android.media.cts.R;
-
 import android.content.Context;
 import android.media.audiofx.AudioEffect;
 import android.media.AudioFormat;
@@ -25,9 +23,12 @@
 import android.media.MediaPlayer;
 import android.media.audiofx.Visualizer;
 import android.media.audiofx.Visualizer.MeasurementPeakRms;
+import android.net.Uri;
 import android.os.Looper;
 import android.platform.test.annotations.AppModeFull;
 import android.test.AndroidTestCase;
+
+import java.io.File;
 import java.util.UUID;
 import android.util.Log;
 
@@ -39,6 +40,7 @@
     private final static int MIN_CAPTURE_SIZE_MAX = 1024;
     private final static int MAX_CAPTURE_SIZE_MIN = 512;
     private final static int MAX_LOOPER_WAIT_COUNT = 10;
+    static final String mInpPrefix = WorkDir.getMediaDirString();
 
     private Visualizer mVisualizer = null;
     private byte[] mWaveform = null;
@@ -291,7 +293,8 @@
         AudioEffect vc = null;
         try {
             // this test will play a 1kHz sine wave with peaks at -40dB
-            MediaPlayer mp = MediaPlayer.create(getContext(), R.raw.sine1khzm40db);
+            MediaPlayer mp = MediaPlayer
+                    .create(getContext(), Uri.fromFile(new File(mInpPrefix + "sine1khzm40db.wav")));
             final int EXPECTED_PEAK_MB = -4015;
             final int EXPECTED_RMS_MB =  -4300;
             final int MAX_MEASUREMENT_ERROR_MB = 2000;
@@ -364,7 +367,8 @@
         AudioEffect vc = null;
         try {
             // this test will play a 1kHz sine wave with peaks at -40dB
-            MediaPlayer mp = MediaPlayer.create(getContext(), R.raw.sine1khzs40dblong);
+            MediaPlayer mp = MediaPlayer.create(getContext(),
+                    Uri.fromFile(new File(mInpPrefix + "sine1khzs40dblong.mp3")));
             final int EXPECTED_PEAK_MB = -4015;
             final int EXPECTED_RMS_MB =  -4300;
             final int MAX_MEASUREMENT_ERROR_MB = 2000;
diff --git a/tests/tests/media/src/android/media/cts/WorkDir.java b/tests/tests/media/src/android/media/cts/WorkDir.java
new file mode 100644
index 0000000..1742ec2
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/WorkDir.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2019 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.media.cts;
+
+
+import android.os.Environment;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import org.junit.Assert;
+
+import java.io.File;
+
+class WorkDir {
+    private static final String MEDIA_PATH_INSTR_ARG_KEY = "media-path";
+    static private final File getTopDir() {
+        Assert.assertEquals(Environment.getExternalStorageState(), Environment.MEDIA_MOUNTED);
+        return Environment.getExternalStorageDirectory();
+    }
+    static private final String getTopDirString() {
+        return (getTopDir().getAbsolutePath() + File.separator);
+    }
+    static final String getMediaDirString() {
+        android.os.Bundle bundle = InstrumentationRegistry.getArguments();
+        String mediaDirString = bundle.getString(MEDIA_PATH_INSTR_ARG_KEY);
+        if (mediaDirString == null) {
+            return (getTopDirString() + "test/CtsMediaTestCases-1.3/");
+        } else if (!mediaDirString.endsWith(File.separator)) {
+            // user has specified the mediaDirString via instrumentation-arg
+            return mediaDirString + File.separator;
+        } else {
+            // user has specified the mediaDirString via instrumentation-arg
+            return mediaDirString;
+        }
+    }
+}
diff --git a/tests/tests/mediaparser/Android.bp b/tests/tests/mediaparser/Android.bp
index 13859a77..507a9f8 100644
--- a/tests/tests/mediaparser/Android.bp
+++ b/tests/tests/mediaparser/Android.bp
@@ -39,8 +39,8 @@
         "exoplayer2-extractor-tests-assets",
     ],
     libs: [
-        "android.test.base.stubs",
-        "android.test.runner.stubs",
+        "android.test.base",
+        "android.test.runner",
     ],
     sdk_version: "test_current",
 }
diff --git a/tests/tests/mediaparser/OWNERS b/tests/tests/mediaparser/OWNERS
index 6989ca1..bebc5ed 100644
--- a/tests/tests/mediaparser/OWNERS
+++ b/tests/tests/mediaparser/OWNERS
@@ -1,4 +1,3 @@
 # Bug component: 817235
 andrewlewis@google.com
 aquilescanta@google.com
-dwkang@google.com
diff --git a/tests/tests/mediastress/Android.bp b/tests/tests/mediastress/Android.bp
index 689fec0..fbf336b 100644
--- a/tests/tests/mediastress/Android.bp
+++ b/tests/tests/mediastress/Android.bp
@@ -18,7 +18,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "mts",
     ],
@@ -29,8 +28,8 @@
         "compatibility-device-util-axt",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     jni_libs: [
         "libctsmediastress_jni",
diff --git a/tests/tests/midi/Android.bp b/tests/tests/midi/Android.bp
index b2c3e7b..fa9105e 100644
--- a/tests/tests/midi/Android.bp
+++ b/tests/tests/midi/Android.bp
@@ -23,7 +23,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
@@ -33,7 +32,7 @@
         "cts-midi-lib",
     ],
 
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
 
     srcs: ["src/**/*.java"],
 
diff --git a/tests/tests/mimemap/Android.bp b/tests/tests/mimemap/Android.bp
index 21db090..4306164 100644
--- a/tests/tests/mimemap/Android.bp
+++ b/tests/tests/mimemap/Android.bp
@@ -17,7 +17,7 @@
 android_test {
     name: "CtsMimeMapTestCases",
     defaults: ["cts_defaults"],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     platform_apis: true,
 
     srcs: ["src/**/*.java"],
@@ -28,7 +28,6 @@
     test_suites: [
         "cts",
         "mts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/multiuser/Android.bp b/tests/tests/multiuser/Android.bp
index f9dac12..99adf1c 100644
--- a/tests/tests/multiuser/Android.bp
+++ b/tests/tests/multiuser/Android.bp
@@ -18,7 +18,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src/**/*.java"],
@@ -26,6 +25,6 @@
         "ctstestrunner-axt",
         "compatibility-device-util-axt",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     sdk_version: "test_current",
 }
diff --git a/tests/tests/nativehardware/Android.bp b/tests/tests/nativehardware/Android.bp
index 8aff49f..d8f1e90 100644
--- a/tests/tests/nativehardware/Android.bp
+++ b/tests/tests/nativehardware/Android.bp
@@ -20,12 +20,11 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
         "platform-test-annotations",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     static_libs: [
         "compatibility-device-util-axt",
diff --git a/tests/tests/nativehardware/jni/AHardwareBufferGLTest.cpp b/tests/tests/nativehardware/jni/AHardwareBufferGLTest.cpp
index 4ff944f..ca7d02c 100644
--- a/tests/tests/nativehardware/jni/AHardwareBufferGLTest.cpp
+++ b/tests/tests/nativehardware/jni/AHardwareBufferGLTest.cpp
@@ -1501,6 +1501,11 @@
             // Compatibility code for ES 2.0 goes here.
             GLenum internal_format = 0, format = 0, type = 0;
             switch (desc.format) {
+                case GL_RGB565:
+                    internal_format = GL_RGB;
+                    format = GL_RGB;
+                    type = GL_UNSIGNED_SHORT_5_6_5;
+                    break;
                 case GL_RGB8:
                     internal_format = GL_RGB;
                     format = GL_RGB;
diff --git a/tests/tests/nativemedia/Android.mk b/tests/tests/nativemedia/Android.mk
deleted file mode 100644
index ba2da56..0000000
--- a/tests/tests/nativemedia/Android.mk
+++ /dev/null
@@ -1,15 +0,0 @@
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-include $(call all-subdir-makefiles)
diff --git a/tests/tests/nativemedia/aaudio/Android.mk b/tests/tests/nativemedia/aaudio/Android.mk
index 2f42de8..ed3814d 100644
--- a/tests/tests/nativemedia/aaudio/Android.mk
+++ b/tests/tests/nativemedia/aaudio/Android.mk
@@ -25,7 +25,7 @@
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner-axt nativetesthelper
 
diff --git a/tests/tests/nativemedia/aaudio/jni/test_aaudio.cpp b/tests/tests/nativemedia/aaudio/jni/test_aaudio.cpp
index 9f414b6..b8ea502 100644
--- a/tests/tests/nativemedia/aaudio/jni/test_aaudio.cpp
+++ b/tests/tests/nativemedia/aaudio/jni/test_aaudio.cpp
@@ -95,14 +95,49 @@
         EXPECT_EQ(AAUDIO_STREAM_STATE_CLOSING, state);
     }
 
+    /**
+     * @return buffer with correct size for the stream format.
+     */
+    void *getDataBuffer() {
+        aaudio_format_t format = AAudioStream_getFormat(mHelper->stream());
+        switch (format) {
+            case AAUDIO_FORMAT_PCM_I16:
+                return mShortData.get();
+            case AAUDIO_FORMAT_PCM_FLOAT:
+                return mFloatData.get();
+            default:
+                // Other code will check for this error condition.
+                return nullptr;
+        }
+    }
+
+    /**
+     * Allocate the correct data buffer based on the stream format.
+     */
+    void allocateDataBuffer(int32_t numFrames) {
+        aaudio_format_t format = AAudioStream_getFormat(mHelper->stream());
+        switch (format) {
+            case AAUDIO_FORMAT_PCM_I16:
+                mShortData.reset(new int16_t[numFrames * actual().channelCount]{});
+                break;
+            case AAUDIO_FORMAT_PCM_FLOAT:
+                mFloatData.reset(new float[numFrames * actual().channelCount]{});
+                break;
+            default:
+                // Other code will check for this error condition.
+                break;
+        }
+    }
+
     std::unique_ptr<T> mHelper;
     bool mSetupSuccessful = false;
-    std::unique_ptr<int16_t[]> mData;
+
+    std::unique_ptr<int16_t[]> mShortData;
+    std::unique_ptr<float[]> mFloatData;
 };
 
-
 class AAudioInputStreamTest : public AAudioStreamTest<InputStreamBuilderHelper> {
-  protected:
+protected:
     void SetUp() override;
 
     int32_t mFramesPerRead;
@@ -125,7 +160,7 @@
     while (mFramesPerRead < framesPerMsec) {
         mFramesPerRead *= 2;
     }
-    mData.reset(new int16_t[mFramesPerRead * actual().channelCount]);
+    allocateDataBuffer(mFramesPerRead);
 }
 
 TEST_P(AAudioInputStreamTest, testReading) {
@@ -140,7 +175,7 @@
     ASSERT_NE(AAUDIO_UNSPECIFIED, AAudioStream_getDeviceId(stream()));
     for (int32_t framesLeft = framesToRecord; framesLeft > 0; ) {
         aaudio_result_t result = AAudioStream_read(
-                stream(), &mData[0], std::min(framesToRecord, mFramesPerRead),
+                stream(), getDataBuffer(), std::min(framesToRecord, mFramesPerRead),
                 DEFAULT_READ_TIMEOUT);
         ASSERT_GT(result, 0);
         framesLeft -= result;
@@ -161,7 +196,7 @@
     for (int32_t framesLeft = framesToRecord; framesLeft > 0; ) {
         mHelper->startStream();
         aaudio_result_t result = AAudioStream_read(
-                stream(), &mData[0], std::min(framesToRecord, mFramesPerRead),
+                stream(), getDataBuffer(), std::min(framesToRecord, mFramesPerRead),
                 DEFAULT_READ_TIMEOUT);
         ASSERT_GT(result, 0);
         framesLeft -= result;
@@ -180,7 +215,7 @@
     mHelper->startStream();
     for (int32_t framesLeft = framesToRecord; framesLeft > 0; ) {
         aaudio_result_t result = AAudioStream_read(
-                stream(), &mData[0], std::min(framesToRecord, mFramesPerRead),
+                stream(), getDataBuffer(), std::min(framesToRecord, mFramesPerRead),
                 DEFAULT_READ_TIMEOUT);
         ASSERT_GT(result, 0);
         framesLeft -= result;
@@ -207,7 +242,7 @@
     mHelper->startStream();
     // Force update of states.
     aaudio_result_t result = AAudioStream_read(
-            stream(), &mData[0], mFramesPerRead,
+            stream(), getDataBuffer(), mFramesPerRead,
             DEFAULT_READ_TIMEOUT);
     ASSERT_GT(result, 0);
     mHelper->stopStream();
@@ -252,10 +287,7 @@
     mHelper->createAndVerifyStream(&mSetupSuccessful);
     if (!mSetupSuccessful) return;
 
-    // Allocate a buffer for the audio data.
-    // TODO handle possibility of other data formats
-    size_t dataSizeSamples = framesPerBurst() * actual().channelCount;
-    mData.reset(new int16_t[dataSizeSamples]{});
+    allocateDataBuffer(framesPerBurst());
 }
 
 TEST_P(AAudioOutputStreamTest, testWriting) {
@@ -267,7 +299,7 @@
     int64_t timeoutNanos = 0;
     do {
         framesWritten = AAudioStream_write(
-                stream(), &mData[0], framesPerBurst(), timeoutNanos);
+                stream(), getDataBuffer(), framesPerBurst(), timeoutNanos);
         // There should be some room for priming the buffer.
         framesTotal += framesWritten;
         ASSERT_GE(framesWritten, 0);
@@ -299,7 +331,7 @@
         int64_t beginTime = getNanoseconds(CLOCK_MONOTONIC);
         do {
             framesWritten = AAudioStream_write(
-                    stream(), &mData[0], framesPerBurst(), timeoutNanos);
+                    stream(), getDataBuffer(), framesPerBurst(), timeoutNanos);
             EXPECT_EQ(framesPerBurst(), framesWritten);
 
             framesTotal += framesWritten;
@@ -351,7 +383,7 @@
     writeLoops = 1000;
     do {
         framesWritten = AAudioStream_write(
-                stream(), &mData[0], framesPerBurst(), timeoutNanos);
+                stream(), getDataBuffer(), framesPerBurst(), timeoutNanos);
         framesTotal += framesWritten;
     } while (framesWritten > 0 && writeLoops-- > 0);
     EXPECT_EQ(0, framesWritten);
@@ -367,7 +399,7 @@
     sleep(1); // FIXME - The write returns 0 if we remove this sleep! Why?
 
     // The buffer should be empty after a flush so we should be able to write.
-    framesWritten = AAudioStream_write(stream(), &mData[0], framesPerBurst(), timeoutNanos);
+    framesWritten = AAudioStream_write(stream(), getDataBuffer(), framesPerBurst(), timeoutNanos);
     // There should be some room for priming the buffer.
     ASSERT_GT(framesWritten, 0);
     ASSERT_LE(framesWritten, framesPerBurst());
@@ -403,7 +435,7 @@
 
         do {
             framesWritten = AAudioStream_write(
-                    stream(), &mData[0], framesPerBurst(), timeoutNanos);
+                    stream(), getDataBuffer(), framesPerBurst(), timeoutNanos);
             EXPECT_EQ(framesPerBurst(), framesWritten);
             framesTotal += framesWritten;
 
@@ -430,7 +462,7 @@
     // and maybe advance the framesRead.
     for (int i = 0; i < 3; i++) {
         aaudio_result_t result = AAudioStream_write(
-                stream(), &mData[0], framesPerBurst(),
+                stream(), getDataBuffer(), framesPerBurst(),
                 DEFAULT_READ_TIMEOUT);
         ASSERT_GT(result, 0);
     }
diff --git a/tests/tests/nativemedia/mediametrics/Android.bp b/tests/tests/nativemedia/mediametrics/Android.bp
index 8ff68b6..11be644 100644
--- a/tests/tests/nativemedia/mediametrics/Android.bp
+++ b/tests/tests/nativemedia/mediametrics/Android.bp
@@ -42,7 +42,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/tests/tests/nativemedia/mediametrics/AndroidTest.xml b/tests/tests/nativemedia/mediametrics/AndroidTest.xml
index 03ebd54..dc9c00d 100644
--- a/tests/tests/nativemedia/mediametrics/AndroidTest.xml
+++ b/tests/tests/nativemedia/mediametrics/AndroidTest.xml
@@ -29,4 +29,7 @@
         <option name="module-name" value="CtsNativeMediaMetricsTestCases" />
         <option name="runtime-hint" value="1m" />
     </test>
+    <!-- Controller that will skip the module if a native bridge situation is detected -->
+    <!-- For example: module wants to run arm and device is x86 -->
+    <object type="module_controller" class="com.android.tradefed.testtype.suite.module.NativeBridgeModuleController" />
 </configuration>
diff --git a/tests/tests/nativemedia/sl/Android.mk b/tests/tests/nativemedia/sl/Android.mk
index 5b545e9..0844d0c 100644
--- a/tests/tests/nativemedia/sl/Android.mk
+++ b/tests/tests/nativemedia/sl/Android.mk
@@ -42,7 +42,7 @@
 LOCAL_CTS_TEST_PACKAGE := android.nativemedia.sl
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_CFLAGS := -Werror -Wall -Wno-deprecated-declarations
 
diff --git a/tests/tests/nativemedia/xa/Android.mk b/tests/tests/nativemedia/xa/Android.mk
index 27c9e5f..c9dec22 100644
--- a/tests/tests/nativemedia/xa/Android.mk
+++ b/tests/tests/nativemedia/xa/Android.mk
@@ -43,6 +43,6 @@
 LOCAL_CTS_TEST_PACKAGE := android.nativemedia.xa
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 include $(BUILD_CTS_EXECUTABLE)
diff --git a/tests/tests/nativemidi/Android.mk b/tests/tests/nativemidi/Android.mk
index 2b00ab9..8c628bc 100755
--- a/tests/tests/nativemidi/Android.mk
+++ b/tests/tests/nativemidi/Android.mk
@@ -26,7 +26,7 @@
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_SRC_FILES := $(call all-java-files-under, java)
 
diff --git a/tests/tests/nativemidi/java/android/nativemidi/cts/NativeMidiEchoTest.java b/tests/tests/nativemidi/java/android/nativemidi/cts/NativeMidiEchoTest.java
index 62cc8a1..960149b 100644
--- a/tests/tests/nativemidi/java/android/nativemidi/cts/NativeMidiEchoTest.java
+++ b/tests/tests/nativemidi/java/android/nativemidi/cts/NativeMidiEchoTest.java
@@ -240,9 +240,8 @@
     @Test
     public void test_A_MidiManager() throws Exception {
         if (!hasMidiSupport()) {
-            return; // Nothing to test
+            return;
         }
-
         Assert.assertNotNull("MidiManager not supported.", mMidiManager);
 
         // There should be at least one device for the Echo server.
@@ -251,7 +250,6 @@
         Assert.assertTrue("device list was empty", infos.length >= 1);
     }
 
-
     @Test
     public void test_AA_LibAMidiExists() throws Exception {
         if (!hasMidiSupport()) {
@@ -282,9 +280,8 @@
     @Test
     public void test_C_EchoSmallMessage() throws Exception {
         if (!hasMidiSupport()) {
-            return; // nothing to test
+            return;
         }
-
         final byte[] buffer = {
                 (byte) 0x93, 0x47, 0x52
         };
@@ -308,15 +305,14 @@
     @Test
     public void test_D_EchoNMessages() throws Exception {
         if (!hasMidiSupport()) {
-            return; // nothing to test
+            return;
         }
-
         int numMessages = 100;
         byte[][] buffers = new byte[numMessages][];
         long timestamps[] = new long[numMessages];
         generateRandomBufers(buffers, timestamps, numMessages);
 
-        for(int msgIndex = 0; msgIndex < numMessages; msgIndex++) {
+        for (int msgIndex = 0; msgIndex < numMessages; msgIndex++) {
             writeMidiWithTimestamp(mTestContext, buffers[msgIndex], 0, buffers[msgIndex].length,
                     timestamps[msgIndex]);
         }
@@ -330,7 +326,7 @@
                 numMessages, getNumReceivedMessages(mTestContext));
 
         // correct data & order?
-        for(int msgIndex = 0; msgIndex < numMessages; msgIndex++) {
+        for (int msgIndex = 0; msgIndex < numMessages; msgIndex++) {
             NativeMidiMessage message = getReceivedMessageAt(mTestContext, msgIndex);
             compareMessages(buffers[msgIndex], timestamps[msgIndex], message);
         }
@@ -339,17 +335,16 @@
     @Test
     public void test_E_FlushMessages() throws Exception {
         if (!hasMidiSupport()) {
-            return; // nothing to test
+            return;
         }
-
         int numMessages = 7;
         byte[][] buffers = new byte[numMessages][];
         long timestamps[] = new long[numMessages];
         generateRandomBufers(buffers, timestamps, numMessages);
 
-        for(int msgIndex = 0; msgIndex < numMessages; msgIndex++) {
+        for (int msgIndex = 0; msgIndex < numMessages; msgIndex++) {
             writeMidiWithTimestamp(mTestContext, buffers[msgIndex], 0, buffers[msgIndex].length,
-              timestamps[msgIndex]);
+                    timestamps[msgIndex]);
         }
 
         // Wait for message to pass through echo service.
@@ -364,7 +359,7 @@
                 numMessages, getNumReceivedMessages(mTestContext));
 
         // correct data & order?
-        for(int msgIndex = 0; msgIndex < numMessages; msgIndex++) {
+        for (int msgIndex = 0; msgIndex < numMessages; msgIndex++) {
             NativeMidiMessage message = getReceivedMessageAt(mTestContext, msgIndex);
             compareMessages(buffers[msgIndex], timestamps[msgIndex], message);
         }
@@ -373,9 +368,8 @@
     @Test
     public void test_F_HugeMessage() throws Exception {
         if (!hasMidiSupport()) {
-            return; // nothing to test
+            return;
         }
-
         // Arbitrarily large message.
         int hugeMessageLen = 1024 * 10;
         byte[] buffer = generateRandomMessage(hugeMessageLen);
@@ -395,12 +389,11 @@
     @Test
     public void test_G_NativeEchoTime() throws Exception {
         if (!hasMidiSupport()) {
-            return; // nothing to test
+            return;
         }
-
         final int numMessages = 10;
         final long maxLatencyNanos = 15 * NANOS_PER_MSEC; // generally < 3 msec on N6
-        byte[] buffer = { (byte) 0x93, 0, 64 };
+        byte[] buffer = {(byte) 0x93, 0, 64};
 
         // Send multiple messages in a burst.
         for (int index = 0; index < numMessages; index++) {
@@ -421,9 +414,10 @@
             // If this test fails then there may be a problem with the thread scheduler
             // or there may be kernel activity that is blocking execution at the user level.
             Assert.assertTrue("MIDI round trip latency index:" + msgIndex
-                    + " too large, " + elapsedNanos
-                    + " nanoseconds " +
-                    "timestamp:" + message.timestamp + " received:" + message.timeReceived,
+                            + " too large, " + elapsedNanos
+                            + " nanoseconds " +
+                            "timestamp:" + message.timestamp +
+                            " received:" + message.timeReceived,
                     (elapsedNanos < maxLatencyNanos));
         }
     }
@@ -431,15 +425,14 @@
     @Test
     public void test_H_EchoNMessages_PureNative() throws Exception {
         if (!hasMidiSupport()) {
-            return; // nothing to test
+            return;
         }
-
         int numMessages = 2;
         byte[][] buffers = new byte[numMessages][];
         long timestamps[] = new long[numMessages];
         generateRandomBufers(buffers, timestamps, numMessages);
 
-        for(int msgIndex = 0; msgIndex < numMessages; msgIndex++) {
+        for (int msgIndex = 0; msgIndex < numMessages; msgIndex++) {
             writeMidiWithTimestamp(mTestContext, buffers[msgIndex], 0, buffers[msgIndex].length,
                     timestamps[msgIndex]);
         }
@@ -459,12 +452,11 @@
     @Test
     public void test_I_NativeEchoTime_PureNative() throws Exception {
         if (!hasMidiSupport()) {
-            return; // nothing to test
+            return;
         }
-
         final int numMessages = 10;
         final long maxLatencyNanos = 15 * NANOS_PER_MSEC; // generally < 3 msec on N6
-        byte[] buffer = { (byte) 0x93, 0, 64 };
+        byte[] buffer = {(byte) 0x93, 0, 64};
 
         // Send multiple messages in a burst.
         for (int index = 0; index < numMessages; index++) {
diff --git a/tests/tests/nativemidi/jni/native-lib.cpp b/tests/tests/nativemidi/jni/native-lib.cpp
index f482eee..5a2f0ca 100644
--- a/tests/tests/nativemidi/jni/native-lib.cpp
+++ b/tests/tests/nativemidi/jni/native-lib.cpp
@@ -278,6 +278,8 @@
 
 JNIEXPORT jlong JNICALL Java_android_nativemidi_cts_NativeMidiEchoTest_allocTestContext(
         JNIEnv* env, jclass) {
+    __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "allocTestContext()");
+
     TestContext* context = new TestContext;
     if (!context->initN(env)) {
         delete context;
@@ -289,6 +291,7 @@
 
 JNIEXPORT void JNICALL Java_android_nativemidi_cts_NativeMidiEchoTest_freeTestContext(
         JNIEnv*, jclass, jlong context) {
+    __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "freeTestContext()");
     delete (TestContext*)context;
 }
 
@@ -469,6 +472,11 @@
 
     // __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "++++ startReadingMidi()");
     TestContext* context = (TestContext*)ctx;
+    if (context == nullptr) {
+        __android_log_print(ANDROID_LOG_INFO, LOG_TAG,
+                "Test Context is null in  startReadingMidi()");
+        return AMEDIA_ERROR_INVALID_OBJECT;
+    }
 
     AMidiOutputPort* outputPort;
     media_status_t status = AMidiOutputPort_open(context->nativeDevice, portNumber, &outputPort);
@@ -494,6 +502,11 @@
 
     // __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "++++ stopReadingMidi()");
     TestContext* context = (TestContext*)ctx;
+    if (context == nullptr) {
+        __android_log_print(ANDROID_LOG_INFO, LOG_TAG,
+                "Test Context is null in  stopReadingMidi()");
+        return AMEDIA_ERROR_INVALID_OBJECT;
+    }
     context->mReading = false;
 
     context->mReadThread->join();
diff --git a/tests/tests/ndef/Android.bp b/tests/tests/ndef/Android.bp
index c44005a..8a58309 100644
--- a/tests/tests/ndef/Android.bp
+++ b/tests/tests/ndef/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/net/Android.bp b/tests/tests/net/Android.bp
deleted file mode 100644
index 7eaf133..0000000
--- a/tests/tests/net/Android.bp
+++ /dev/null
@@ -1,90 +0,0 @@
-// 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.
-
-java_defaults {
-    name: "CtsNetTestCasesDefaults",
-    defaults: ["cts_defaults"],
-
-    // Include both the 32 and 64 bit versions
-    compile_multilib: "both",
-
-    libs: [
-        "voip-common",
-        "org.apache.http.legacy",
-        "android.test.base.stubs",
-    ],
-
-    jni_libs: [
-        "libcts_jni",
-        "libnativedns_jni",
-        "libnativemultinetwork_jni",
-        "libnativehelper_compat_libc++",
-    ],
-
-    srcs: [
-        "src/**/*.java",
-        "src/**/*.kt",
-    ],
-    jarjar_rules: "jarjar-rules-shared.txt",
-    static_libs: [
-        "FrameworksNetCommonTests",
-        "TestNetworkStackLib",
-        "compatibility-device-util-axt",
-        "core-tests-support",
-        "cts-net-utils",
-        "ctstestrunner-axt",
-        "ctstestserver",
-        "junit",
-        "junit-params",
-        "libnanohttpd",
-        "mockwebserver",
-        "net-utils-framework-common",
-        "truth-prebuilt",
-    ],
-
-    // uncomment when b/13249961 is fixed
-    // sdk_version: "current",
-    platform_apis: true,
-}
-
-// Networking CTS tests for development and release. These tests always target the platform SDK
-// version, and are subject to all the restrictions appropriate to that version. Before SDK
-// finalization, these tests have a min_sdk_version of 10000, and cannot be installed on release
-// devices.
-android_test {
-    name: "CtsNetTestCases",
-    defaults: ["CtsNetTestCasesDefaults"],
-    test_suites: [
-        "cts",
-        "vts10",
-        "general-tests",
-    ],
-    test_config_template: "AndroidTestTemplate.xml",
-}
-
-// Networking CTS tests that target the latest released SDK. These tests can be installed on release
-// devices at any point in the Android release cycle and are useful for qualifying mainline modules
-// on release devices.
-android_test {
-    name: "CtsNetTestCasesLatestSdk",
-    defaults: ["CtsNetTestCasesDefaults"],
-    jni_uses_sdk_apis: true,
-    min_sdk_version: "29",
-    target_sdk_version: "30",
-    test_suites: [
-        "general-tests",
-        "mts",
-    ],
-    test_config_template: "AndroidTestTemplate.xml",
-}
diff --git a/tests/tests/net/AndroidManifest.xml b/tests/tests/net/AndroidManifest.xml
deleted file mode 100644
index a7e2bd7..0000000
--- a/tests/tests/net/AndroidManifest.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Copyright (C) 2007 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.net.cts"
-    android:targetSandboxVersion="2">
-
-    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
-    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
-    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
-    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
-    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
-    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
-    <uses-permission android:name="android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS" />
-    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
-    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
-    <uses-permission android:name="android.permission.INTERNET" />
-    <uses-permission android:name="android.permission.RECORD_AUDIO" />
-    <uses-permission android:name="android.permission.WAKE_LOCK" />
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
-    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
-
-    <!-- This test also uses signature permissions through adopting the shell identity.
-         The permissions acquired that way include (probably not exhaustive) :
-             android.permission.MANAGE_TEST_NETWORKS
-    -->
-
-    <application android:usesCleartextTraffic="true">
-        <uses-library android:name="android.test.runner" />
-        <uses-library android:name="org.apache.http.legacy" android:required="false" />
-    </application>
-
-    <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
-                     android:targetPackage="android.net.cts"
-                     android:label="CTS tests of android.net">
-        <meta-data android:name="listener"
-            android:value="com.android.cts.runner.CtsTestRunListener" />
-    </instrumentation>
-
-</manifest>
-
diff --git a/tests/tests/net/AndroidTestTemplate.xml b/tests/tests/net/AndroidTestTemplate.xml
deleted file mode 100644
index 4e93751..0000000
--- a/tests/tests/net/AndroidTestTemplate.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<!-- Copyright (C) 2015 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.
--->
-<configuration description="Test config for {MODULE}">
-    <option name="test-suite-tag" value="cts" />
-    <option name="config-descriptor:metadata" key="component" value="networking" />
-    <option name="config-descriptor:metadata" key="token" value="SIM_CARD" />
-    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
-    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
-    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
-
-    <option name="config-descriptor:metadata" key="mainline-param" value="CaptivePortalLoginGoogle.apk+NetworkStackGoogle.apk" />
-    <option name="not-shardable" value="true" />
-    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
-        <option name="cleanup-apks" value="true" />
-        <option name="test-file-name" value="{MODULE}.apk" />
-    </target_preparer>
-    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
-        <option name="package" value="android.net.cts" />
-        <option name="runtime-hint" value="9m4s" />
-        <option name="hidden-api-checks" value="false" />
-        <option name="isolated-storage" value="false" />
-    </test>
-</configuration>
diff --git a/tests/tests/net/OWNERS b/tests/tests/net/OWNERS
deleted file mode 100644
index d558556..0000000
--- a/tests/tests/net/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-# Bug component: 31808
-lorenzo@google.com
-satk@google.com
diff --git a/tests/tests/net/TEST_MAPPING b/tests/tests/net/TEST_MAPPING
deleted file mode 100644
index 3162e22..0000000
--- a/tests/tests/net/TEST_MAPPING
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-  // TODO: move to mainline-presubmit once supported
-  "postsubmit": [
-    {
-      "name": "CtsNetTestCasesLatestSdk",
-      "options": [
-        {
-          "exclude-annotation": "com.android.testutils.SkipPresubmit"
-        }
-      ]
-    }
-  ],
-  "mainline-presubmit": [
-    {
-      "name": "CtsNetTestCasesLatestSdk[CaptivePortalLoginGoogle.apk+NetworkStackGoogle.apk]",
-      "options": [
-        {
-          "exclude-annotation": "com.android.testutils.SkipPresubmit"
-        }
-      ]
-    }
-  ]
-}
diff --git a/tests/tests/net/api23Test/Android.bp b/tests/tests/net/api23Test/Android.bp
deleted file mode 100644
index ffeef48..0000000
--- a/tests/tests/net/api23Test/Android.bp
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (C) 2019 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.
-
-android_test {
-    name: "CtsNetApi23TestCases",
-    defaults: ["cts_defaults"],
-
-    // Include both the 32 and 64 bit versions
-    compile_multilib: "both",
-
-    libs: [
-        "android.test.base.stubs",
-    ],
-
-    srcs: [
-        "src/**/*.java",
-        "src/**/*.kt",
-    ],
-
-    static_libs: [
-        "core-tests-support",
-        "compatibility-device-util-axt",
-        "cts-net-utils",
-        "ctstestrunner-axt",
-        "ctstestserver",
-        "mockwebserver",
-        "junit",
-        "junit-params",
-        "truth-prebuilt",
-    ],
-
-    platform_apis: true,
-
-    // Tag this module as a cts test artifact
-    test_suites: [
-        "cts",
-        "vts10",
-        "general-tests",
-    ],
-
-}
diff --git a/tests/tests/net/api23Test/AndroidManifest.xml b/tests/tests/net/api23Test/AndroidManifest.xml
deleted file mode 100644
index 4889660..0000000
--- a/tests/tests/net/api23Test/AndroidManifest.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Copyright (C) 2019 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.net.cts.api23test">
-
-    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
-    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
-    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
-    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
-    <uses-permission android:name="android.permission.INTERNET" />
-
-    <application android:usesCleartextTraffic="true">
-        <uses-library android:name="android.test.runner" />
-
-        <receiver android:name=".ConnectivityReceiver">
-            <intent-filter>
-                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
-            </intent-filter>
-        </receiver>
-    </application>
-
-    <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
-                     android:targetPackage="android.net.cts.api23test"
-                     android:label="CTS tests of android.net">
-        <meta-data android:name="listener"
-            android:value="com.android.cts.runner.CtsTestRunListener" />
-    </instrumentation>
-</manifest>
-
diff --git a/tests/tests/net/api23Test/AndroidTest.xml b/tests/tests/net/api23Test/AndroidTest.xml
deleted file mode 100644
index 8042d50..0000000
--- a/tests/tests/net/api23Test/AndroidTest.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<!-- Copyright (C) 2019 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.
--->
-<configuration description="Config for CTS Net API23 test cases">
-    <option name="test-suite-tag" value="cts" />
-    <option name="config-descriptor:metadata" key="component" value="networking" />
-    <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
-    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
-    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
-    <option name="not-shardable" value="true" />
-    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
-        <option name="cleanup-apks" value="true" />
-        <option name="test-file-name" value="CtsNetApi23TestCases.apk" />
-        <option name="test-file-name" value="CtsNetTestAppForApi23.apk" />
-    </target_preparer>
-    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
-        <option name="package" value="android.net.cts.api23test" />
-        <option name="hidden-api-checks" value="false" />
-    </test>
-</configuration>
diff --git a/tests/tests/net/api23Test/src/android/net/cts/api23test/ConnectivityManagerApi23Test.java b/tests/tests/net/api23Test/src/android/net/cts/api23test/ConnectivityManagerApi23Test.java
deleted file mode 100644
index cdb66e3..0000000
--- a/tests/tests/net/api23Test/src/android/net/cts/api23test/ConnectivityManagerApi23Test.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2019 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.api23test;
-
-import static android.content.pm.PackageManager.FEATURE_WIFI;
-
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.PackageManager;
-import android.net.ConnectivityManager;
-import android.net.cts.util.CtsNetUtils;
-import android.os.Looper;
-import android.test.AndroidTestCase;
-import android.util.Log;
-
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
-
-public class ConnectivityManagerApi23Test extends AndroidTestCase {
-    private static final String TAG = ConnectivityManagerApi23Test.class.getSimpleName();
-    private static final int SEND_BROADCAST_TIMEOUT = 30000;
-    // Intent string to get the number of wifi CONNECTIVITY_ACTION callbacks the test app has seen
-    public static final String GET_WIFI_CONNECTIVITY_ACTION_COUNT =
-            "android.net.cts.appForApi23.getWifiConnectivityActionCount";
-    // Action sent to ConnectivityActionReceiver when a network callback is sent via PendingIntent.
-
-    private Context mContext;
-    private PackageManager mPackageManager;
-    private CtsNetUtils mCtsNetUtils;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        Looper.prepare();
-        mContext = getContext();
-        mPackageManager = mContext.getPackageManager();
-        mCtsNetUtils = new CtsNetUtils(mContext);
-    }
-
-    /**
-     * Tests reporting of connectivity changed.
-     */
-    public void testConnectivityChanged_manifestRequestOnly_shouldNotReceiveIntent() {
-        if (!mPackageManager.hasSystemFeature(FEATURE_WIFI)) {
-            Log.i(TAG, "testConnectivityChanged_manifestRequestOnly_shouldNotReceiveIntent cannot execute unless device supports WiFi");
-            return;
-        }
-        ConnectivityReceiver.prepare();
-
-        mCtsNetUtils.toggleWifi();
-
-        // The connectivity broadcast has been sent; push through a terminal broadcast
-        // to wait for in the receive to confirm it didn't see the connectivity change.
-        Intent finalIntent = new Intent(ConnectivityReceiver.FINAL_ACTION);
-        finalIntent.setClass(mContext, ConnectivityReceiver.class);
-        mContext.sendBroadcast(finalIntent);
-        assertFalse(ConnectivityReceiver.waitForBroadcast());
-    }
-
-    public void testConnectivityChanged_manifestRequestOnlyPreN_shouldReceiveIntent()
-            throws InterruptedException {
-        if (!mPackageManager.hasSystemFeature(FEATURE_WIFI)) {
-            Log.i(TAG, "testConnectivityChanged_manifestRequestOnlyPreN_shouldReceiveIntent cannot"
-                    + "execute unless device supports WiFi");
-            return;
-        }
-        mContext.startActivity(new Intent()
-                .setComponent(new ComponentName("android.net.cts.appForApi23",
-                        "android.net.cts.appForApi23.ConnectivityListeningActivity"))
-                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
-        Thread.sleep(200);
-
-        mCtsNetUtils.toggleWifi();
-
-        Intent getConnectivityCount = new Intent(GET_WIFI_CONNECTIVITY_ACTION_COUNT);
-        assertEquals(2, sendOrderedBroadcastAndReturnResultCode(
-                getConnectivityCount, SEND_BROADCAST_TIMEOUT));
-    }
-
-    public void testConnectivityChanged_whenRegistered_shouldReceiveIntent() {
-        if (!mPackageManager.hasSystemFeature(FEATURE_WIFI)) {
-            Log.i(TAG, "testConnectivityChanged_whenRegistered_shouldReceiveIntent cannot execute unless device supports WiFi");
-            return;
-        }
-        ConnectivityReceiver.prepare();
-        ConnectivityReceiver receiver = new ConnectivityReceiver();
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
-        mContext.registerReceiver(receiver, filter);
-
-        mCtsNetUtils.toggleWifi();
-        Intent finalIntent = new Intent(ConnectivityReceiver.FINAL_ACTION);
-        finalIntent.setClass(mContext, ConnectivityReceiver.class);
-        mContext.sendBroadcast(finalIntent);
-
-        assertTrue(ConnectivityReceiver.waitForBroadcast());
-    }
-
-    private int sendOrderedBroadcastAndReturnResultCode(
-            Intent intent, int timeoutMs) throws InterruptedException {
-        final LinkedBlockingQueue<Integer> result = new LinkedBlockingQueue<>(1);
-        mContext.sendOrderedBroadcast(intent, null, new BroadcastReceiver() {
-            @Override
-            public void onReceive(Context context, Intent intent) {
-                result.offer(getResultCode());
-            }
-        }, null, 0, null, null);
-
-        Integer resultCode = result.poll(timeoutMs, TimeUnit.MILLISECONDS);
-        assertNotNull("Timed out (more than " + timeoutMs +
-                " milliseconds) waiting for result code for broadcast", resultCode);
-        return resultCode;
-    }
-
-}
\ No newline at end of file
diff --git a/tests/tests/net/api23Test/src/android/net/cts/api23test/ConnectivityReceiver.java b/tests/tests/net/api23Test/src/android/net/cts/api23test/ConnectivityReceiver.java
deleted file mode 100644
index 9d2b8ad..0000000
--- a/tests/tests/net/api23Test/src/android/net/cts/api23test/ConnectivityReceiver.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * 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.api23test;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.net.ConnectivityManager;
-import android.util.Log;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-public class ConnectivityReceiver extends BroadcastReceiver {
-    static boolean sReceivedConnectivity;
-    static boolean sReceivedFinal;
-    static CountDownLatch sLatch;
-
-    static void prepare() {
-        synchronized (ConnectivityReceiver.class) {
-            sReceivedConnectivity = sReceivedFinal = false;
-            sLatch = new CountDownLatch(1);
-        }
-    }
-
-    static boolean waitForBroadcast() {
-        try {
-            sLatch.await(30, TimeUnit.SECONDS);
-        } catch (InterruptedException e) {
-            throw new IllegalStateException(e);
-        }
-        synchronized (ConnectivityReceiver.class) {
-            sLatch = null;
-            if (!sReceivedFinal) {
-                throw new IllegalStateException("Never received final broadcast");
-            }
-            return sReceivedConnectivity;
-        }
-    }
-
-    static final String FINAL_ACTION = "android.net.cts.action.FINAL";
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        Log.i("ConnectivityReceiver", "Received: " + intent.getAction());
-        if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
-            sReceivedConnectivity = true;
-        } else if (FINAL_ACTION.equals(intent.getAction())) {
-            sReceivedFinal = true;
-            if (sLatch != null) {
-                sLatch.countDown();
-            }
-        }
-    }
-}
diff --git a/tests/tests/net/appForApi23/Android.bp b/tests/tests/net/appForApi23/Android.bp
deleted file mode 100644
index 399c199..0000000
--- a/tests/tests/net/appForApi23/Android.bp
+++ /dev/null
@@ -1,33 +0,0 @@
-// 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.
-
-android_test {
-    name: "CtsNetTestAppForApi23",
-    defaults: ["cts_defaults"],
-
-    // Include both the 32 and 64 bit versions
-    compile_multilib: "both",
-
-    srcs: ["src/**/*.java"],
-
-    sdk_version: "23",
-
-    // Tag this module as a cts test artifact
-    test_suites: [
-        "cts",
-        "vts10",
-        "general-tests",
-    ],
-
-}
diff --git a/tests/tests/net/appForApi23/AndroidManifest.xml b/tests/tests/net/appForApi23/AndroidManifest.xml
deleted file mode 100644
index ed4cedb..0000000
--- a/tests/tests/net/appForApi23/AndroidManifest.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?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.net.cts.appForApi23">
-
-    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
-    <uses-permission android:name="android.permission.INTERNET" />
-
-    <application>
-        <receiver android:name=".ConnectivityReceiver">
-            <intent-filter>
-                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
-            </intent-filter>
-            <intent-filter>
-                <action android:name="android.net.cts.appForApi23.getWifiConnectivityActionCount" />
-            </intent-filter>
-        </receiver>
-
-        <activity android:name=".ConnectivityListeningActivity"
-                  android:label="ConnectivityListeningActivity"
-                  android:exported="true">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-        </activity>
-
-    </application>
-
-</manifest>
-
diff --git a/tests/tests/net/appForApi23/src/android/net/cts/appForApi23/ConnectivityListeningActivity.java b/tests/tests/net/appForApi23/src/android/net/cts/appForApi23/ConnectivityListeningActivity.java
deleted file mode 100644
index 24fb68e..0000000
--- a/tests/tests/net/appForApi23/src/android/net/cts/appForApi23/ConnectivityListeningActivity.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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.appForApi23;
-
-import android.app.Activity;
-
-// Stub activity used to start the app
-public class ConnectivityListeningActivity extends Activity {
-}
\ No newline at end of file
diff --git a/tests/tests/net/appForApi23/src/android/net/cts/appForApi23/ConnectivityReceiver.java b/tests/tests/net/appForApi23/src/android/net/cts/appForApi23/ConnectivityReceiver.java
deleted file mode 100644
index 8039a4f..0000000
--- a/tests/tests/net/appForApi23/src/android/net/cts/appForApi23/ConnectivityReceiver.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.appForApi23;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.net.ConnectivityManager;
-
-public class ConnectivityReceiver extends BroadcastReceiver {
-    public static String GET_WIFI_CONNECTIVITY_ACTION_COUNT =
-            "android.net.cts.appForApi23.getWifiConnectivityActionCount";
-
-    private static int sWifiConnectivityActionCount = 0;
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
-            int networkType = intent.getIntExtra(ConnectivityManager.EXTRA_NETWORK_TYPE, 0);
-            if (networkType == ConnectivityManager.TYPE_WIFI) {
-                sWifiConnectivityActionCount++;
-            }
-        }
-        if (GET_WIFI_CONNECTIVITY_ACTION_COUNT.equals(intent.getAction())) {
-            setResultCode(sWifiConnectivityActionCount);
-        }
-    }
-}
diff --git a/tests/tests/net/assets/network_watchlist_config_empty_for_test.xml b/tests/tests/net/assets/network_watchlist_config_empty_for_test.xml
deleted file mode 100644
index 19628d1..0000000
--- a/tests/tests/net/assets/network_watchlist_config_empty_for_test.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright (C) 2018 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.
-*/
--->
-<!-- This test config file is for NetworkWatchlistTest tests -->
-<watchlist-config>
-    <sha256-domain>
-    </sha256-domain>
-    <sha256-ip>
-    </sha256-ip>
-    <crc32-domain>
-    </crc32-domain>
-    <crc32-ip>
-    </crc32-ip>
-</watchlist-config>
diff --git a/tests/tests/net/assets/network_watchlist_config_for_test.xml b/tests/tests/net/assets/network_watchlist_config_for_test.xml
deleted file mode 100644
index 835ae0f..0000000
--- a/tests/tests/net/assets/network_watchlist_config_for_test.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright (C) 2018 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.
-*/
--->
-<!-- This test config file just contains some random hashes for testing
-ConnectivityManager.getWatchlistConfigHash() -->
-<watchlist-config>
-    <sha256-domain>
-        <hash>F0905DA7549614957B449034C281EF7BDEFDBC2B6E050AD1E78D6DE18FBD0D5F</hash>
-    </sha256-domain>
-    <sha256-ip>
-        <hash>18DD41C9F2E8E4879A1575FB780514EF33CF6E1F66578C4AE7CCA31F49B9F2EC</hash>
-    </sha256-ip>
-    <crc32-domain>
-        <hash>AAAAAAAA</hash>
-    </crc32-domain>
-    <crc32-ip>
-        <hash>BBBBBBBB</hash>
-    </crc32-ip>
-</watchlist-config>
diff --git a/tests/tests/net/ipsec/Android.bp b/tests/tests/net/ipsec/Android.bp
deleted file mode 100644
index 124e93c..0000000
--- a/tests/tests/net/ipsec/Android.bp
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (C) 2020 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.
-
-android_test {
-    name: "CtsIkeTestCases",
-    defaults: ["cts_defaults"],
-
-    // Include both the 32 and 64 bit versions
-    compile_multilib: "both",
-
-    libs: [
-        "android.net.ipsec.ike.stubs.system",
-        "android.test.base.stubs",
-    ],
-
-    srcs: [
-        "src/**/*.java",
-        ":ike-test-utils",
-    ],
-
-    static_libs: [
-        "androidx.test.ext.junit",
-        "compatibility-device-util-axt",
-        "ctstestrunner-axt",
-        "net-tests-utils",
-    ],
-
-    platform_apis: true,
-
-    // Tag this module as a cts test artifact
-    test_suites: [
-        "cts",
-        "mts",
-        "vts",
-        "general-tests",
-    ],
-}
diff --git a/tests/tests/net/ipsec/AndroidManifest.xml b/tests/tests/net/ipsec/AndroidManifest.xml
deleted file mode 100644
index de7d23c..0000000
--- a/tests/tests/net/ipsec/AndroidManifest.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Copyright (C) 2020 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.net.ipsec.cts"
-    android:targetSandboxVersion="2">
-
-    <!--Allow tests to call ConnectivityManager#getActiveNetwork()-->
-    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
-    <!--Allow tests to create socket -->
-    <uses-permission android:name="android.permission.INTERNET"/>
-
-    <application android:label="CtsIkeTestCases">
-        <uses-library android:name="android.test.runner" />
-        <uses-library android:name="android.net.ipsec.ike" />
-    </application>
-
-    <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
-                     android:targetPackage="android.net.ipsec.cts"
-                     android:label="CTS tests of android.net.ipsec">
-        <meta-data android:name="listener"
-            android:value="com.android.cts.runner.CtsTestRunListener" />
-    </instrumentation>
-
-</manifest>
diff --git a/tests/tests/net/ipsec/AndroidTest.xml b/tests/tests/net/ipsec/AndroidTest.xml
deleted file mode 100644
index cd5c118..0000000
--- a/tests/tests/net/ipsec/AndroidTest.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<!-- Copyright (C) 2020 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.
--->
-<configuration description="Config for CTS IKE test cases">
-    <option name="test-suite-tag" value="cts" />
-    <option name="config-descriptor:metadata" key="component" value="networking" />
-    <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
-    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
-    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
-    <option name="not-shardable" value="true" />
-    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
-        <option name="cleanup-apks" value="true" />
-        <option name="test-file-name" value="CtsIkeTestCases.apk" />
-    </target_preparer>
-    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
-        <option name="package" value="android.net.ipsec.cts" />
-        <option name="hidden-api-checks" value="false" />
-    </test>
-    <object type="module_controller" class="com.android.tradefed.testtype.suite.module.MainlineTestModuleController">
-        <option name="mainline-module-package-name" value="com.google.android.ipsec" />
-    </object>
-</configuration>
diff --git a/tests/tests/net/ipsec/OWNERS b/tests/tests/net/ipsec/OWNERS
deleted file mode 100644
index 26407ff..0000000
--- a/tests/tests/net/ipsec/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-lorenzo@google.com
-nharold@google.com
-satk@google.com
diff --git a/tests/tests/net/ipsec/assets/key/client-a-private-key.key b/tests/tests/net/ipsec/assets/key/client-a-private-key.key
deleted file mode 100644
index 22736e9..0000000
--- a/tests/tests/net/ipsec/assets/key/client-a-private-key.key
+++ /dev/null
@@ -1,28 +0,0 @@
------BEGIN PRIVATE KEY-----
-MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCv3CvrCGokJSWL
-8ufg6u9LCW4EezztbktqpC0T+1m98+Ujb8/eJ0L2UaxZ9QBSBAqXxEoeZFBeoCXu
-7ezUd5qUPfIhKLAkQTAyU/KgfhHh4i+MJK5ghPbGDE8r2gKUXOkM6M5//ZCpmu0K
-Y/9uQL6D5bkxEaoWegEO+wSXm+hTTgKDtQKHvRibgdcZkcY0cA9JsLrC/nIkP+7i
-pbBT+VTuV6gAnKIV0nq8zvI3A/Z3nAb5Gt0g3qaqs59StDT0QtuXzJkuZEo3XSrS
-jon+8NjSNzqVbJj95B7+uiH+91VEbMtJYFz2MipKvJQDK7Zlxke7LxRj2xJfksJK
-a92/ncxfAgMBAAECggEAQztaMvW5lm35J8LKsWs/5qEJRX9T8LWs8W0oqq36Riub
-G2wgvR6ndAIPcSjAYZqX7iOl7m6NZ0+0kN63HxdGqovwKIskpAekBGmhpYftED1n
-zh0r6UyMB3UnQ22KdOv8UOokIDxxdNX8728BdUYdT9Ggdkj5jLRB+VcwD0IUlNvo
-zzTpURV9HEd87uiLqd4AAHXSI0lIHI5U43z24HI/J6/YbYHT3Rlh6CIa/LuwO6vL
-gFkgqg0/oy6yJtjrHtzNVA67F0UaH62hR4YFgbC0d955SJnDidWOv/0j2DMpfdCc
-9kFAcPwUSyykvUSLnGIKWSG4D+6gzIeAeUx4oO7kMQKBgQDVNRkX8AGTHyLg+NXf
-spUWWcodwVioXl30Q7h6+4bt8OI61UbhQ7wX61wvJ1cySpa2KOYa2UdagQVhGhhL
-ADu363R77uXF/jZgzVfmjjyJ2nfDqRgHWRTlSkuq/jCOQCz7VIPHRZg5WL/9D4ms
-TAqMjpzqeMfFZI+w4/+xpcJIuQKBgQDTKBy+ZuerWrVT9icWKvLU58o5EVj/2yFy
-GJvKm+wRAAX2WzjNnR4HVd4DmMREVz1BPYby0j5gqjvtDsxYYu39+NT7JvMioLLK
-QPj+7k5geYgNqVgCxB1vP89RhY2X1RLrN9sTXOodgFPeXOQWNYITkGp3eQpx4nTJ
-+K/al3oB1wKBgAjnc8nVIyuyxDEjE0OJYMKTM2a0uXAmqMPXxC+Wq5bqVXhhidlE
-i+lv0eTCPtkB1nN7F8kNQ/aaps/cWCFhvBy9P5shagUvzbOTP9WIIS0cq53HRRKh
-fMbqqGhWv05hjb9dUzeSR341n6cA7B3++v3Nwu3j52vt/DZF/1q68nc5AoGAS0SU
-ImbKE/GsizZGLoe2sZ/CHN+LKwCwhlwxRGKaHmE0vuE7eUeVSaYZEo0lAPtb8WJ+
-NRYueASWgeTxgFwbW5mUScZTirdfo+rPFwhZVdhcYApKPgosN9i2DOgfVcz1BnWN
-mPRY25U/0BaqkyQVruWeneG+kGPZn5kPDktKiVcCgYEAkzwU9vCGhm7ZVALvx/zR
-wARz2zsL9ImBc0P4DK1ld8g90FEnHrEgeI9JEwz0zFHOCMLwlk7kG0Xev7vfjZ7G
-xSqtQYOH33Qp6rtBOgdt8hSyDFvakvDl6bqhAw52gelO3MTpAB1+ZsfZ5gFx13Jf
-idNFcaIrC52PtZIH7QCzdDY=
------END PRIVATE KEY-----
\ No newline at end of file
diff --git a/tests/tests/net/ipsec/assets/pem/client-a-end-cert.pem b/tests/tests/net/ipsec/assets/pem/client-a-end-cert.pem
deleted file mode 100644
index e82da85..0000000
--- a/tests/tests/net/ipsec/assets/pem/client-a-end-cert.pem
+++ /dev/null
@@ -1,21 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDaDCCAlCgAwIBAgIIcorRI3n29E4wDQYJKoZIhvcNAQELBQAwQTELMAkGA1UE
-BhMCVVMxEDAOBgNVBAoTB0FuZHJvaWQxIDAeBgNVBAMTF3R3by5jYS50ZXN0LmFu
-ZHJvaWQubmV0MB4XDTIwMDQxNDA1MDM0OVoXDTIzMDQxNDA1MDM0OVowRTELMAkG
-A1UEBhMCVVMxEDAOBgNVBAoTB0FuZHJvaWQxJDAiBgNVBAMTG2NsaWVudC50ZXN0
-LmlrZS5hbmRyb2lkLm5ldDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-AK/cK+sIaiQlJYvy5+Dq70sJbgR7PO1uS2qkLRP7Wb3z5SNvz94nQvZRrFn1AFIE
-CpfESh5kUF6gJe7t7NR3mpQ98iEosCRBMDJT8qB+EeHiL4wkrmCE9sYMTyvaApRc
-6Qzozn/9kKma7Qpj/25AvoPluTERqhZ6AQ77BJeb6FNOAoO1Aoe9GJuB1xmRxjRw
-D0mwusL+ciQ/7uKlsFP5VO5XqACcohXSerzO8jcD9necBvka3SDepqqzn1K0NPRC
-25fMmS5kSjddKtKOif7w2NI3OpVsmP3kHv66If73VURsy0lgXPYyKkq8lAMrtmXG
-R7svFGPbEl+Swkpr3b+dzF8CAwEAAaNgMF4wHwYDVR0jBBgwFoAUcqSu1uRYT/DL
-bLoDNUz38nGvCKQwJgYDVR0RBB8wHYIbY2xpZW50LnRlc3QuaWtlLmFuZHJvaWQu
-bmV0MBMGA1UdJQQMMAoGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4IBAQCa53tK
-I9RM9/MutZ5KNG2Gfs2cqaPyv8ZRhs90HDWZhkFVu7prywJAxOd2hxxHPsvgurio
-4bKAxnT4EXevgz5YoCbj2TPIL9TdFYh59zZ97XXMxk+SRdypgF70M6ETqKPs3hDP
-ZRMMoHvvYaqaPvp4StSBX9A44gSyjHxVYJkrjDZ0uffKg5lFL5IPvqfdmSRSpGab
-SyGTP4OLTy0QiNV3pBsJGdl0h5BzuTPR9OTl4xgeqqBQy2bDjmfJBuiYyCSCkPi7
-T3ohDYCymhuSkuktHPNG1aKllUJaw0tuZuNydlgdAveXPYfM36uvK0sfd9qr9pAy
-rmkYV2MAWguFeckh
------END CERTIFICATE-----
\ No newline at end of file
diff --git a/tests/tests/net/ipsec/assets/pem/client-a-intermediate-ca-one.pem b/tests/tests/net/ipsec/assets/pem/client-a-intermediate-ca-one.pem
deleted file mode 100644
index 707e575..0000000
--- a/tests/tests/net/ipsec/assets/pem/client-a-intermediate-ca-one.pem
+++ /dev/null
@@ -1,21 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDaDCCAlCgAwIBAgIIIbjMyRn2770wDQYJKoZIhvcNAQELBQAwQjELMAkGA1UE
-BhMCVVMxEDAOBgNVBAoTB0FuZHJvaWQxITAfBgNVBAMTGHJvb3QuY2EudGVzdC5h
-bmRyb2lkLm5ldDAeFw0xOTA5MzAxODQzMThaFw0yNDA5MjgxODQzMThaMEExCzAJ
-BgNVBAYTAlVTMRAwDgYDVQQKEwdBbmRyb2lkMSAwHgYDVQQDExdvbmUuY2EudGVz
-dC5hbmRyb2lkLm5ldDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKNN
-sRr5Z30rAEw2jrAh/BIekbEy/MvOucAr1w0lxH71p+ybRBx5Bj7G07UGXbL659gm
-meMV6nabY4HjQXNMq22POiJBZj+U+rw34br6waljBttxCmmJac1VvgqNsSspXjRy
-NbiVQdFjyKSX0NOPcEkwANk15mZbOgJBaYYc8jQCY2G/p8eARVBTLJCy8LEwEU6j
-XRv/4eYST79qpBFc7gQQj2FLmh9oppDIvcIVBHwtd1tBoVuehRSud1o8vQRkl/HJ
-Mrwp24nO5YYhmVNSFRtBpmWMSu1KknFUwkOebINUNsKXXHebVa7cP4XIQUL8mRT3
-5X9rFJFSQJE01S3NjNMCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
-Af8EBAMCAQYwHQYDVR0OBBYEFHK3FIm7g8dxEIwK9zMAO8EWhRYxMB8GA1UdIwQY
-MBaAFEmfqEeF14Nj91ekIpR+sVhCEoAaMA0GCSqGSIb3DQEBCwUAA4IBAQAeMlXT
-TnxZo8oz0204gKZ63RzlgDpJ7SqA3qFG+pV+TiqGfSuVkXuIdOskjxJnA9VxUzrr
-LdMTCn5e0FK6wCYjZ2GT/CD7oD3vSMkzGbLGNcNJhhDHUq8BOLPkPzz/rwQFPBSb
-zr6hsiVXphEt/psGoN7Eu9blPeQaIwMfWnaufAwF664S/3dmCRbNMWSam1qzzz8q
-jr0cDOIMa//ZIAcM16cvoBK6pFGnUmuoJYYRtfpY5MmfCWz0sCJxENIX/lxyhd7N
-FdRALA1ZP3E//Tn2vQoeFjbKaAba527RE26HgHJ9zZDo1nn8J8J/YwYRJdBWM/3S
-LYebNiMtcyB5nIkj
------END CERTIFICATE-----
\ No newline at end of file
diff --git a/tests/tests/net/ipsec/assets/pem/client-a-intermediate-ca-two.pem b/tests/tests/net/ipsec/assets/pem/client-a-intermediate-ca-two.pem
deleted file mode 100644
index 39808f8..0000000
--- a/tests/tests/net/ipsec/assets/pem/client-a-intermediate-ca-two.pem
+++ /dev/null
@@ -1,21 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDZzCCAk+gAwIBAgIIKWCREnNCs+wwDQYJKoZIhvcNAQELBQAwQTELMAkGA1UE
-BhMCVVMxEDAOBgNVBAoTB0FuZHJvaWQxIDAeBgNVBAMTF29uZS5jYS50ZXN0LmFu
-ZHJvaWQubmV0MB4XDTE5MDkzMDE4NDQwMloXDTI0MDkyODE4NDQwMlowQTELMAkG
-A1UEBhMCVVMxEDAOBgNVBAoTB0FuZHJvaWQxIDAeBgNVBAMTF3R3by5jYS50ZXN0
-LmFuZHJvaWQubmV0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLUa
-RqkYl2m7lUmMnkooqO0DNNY1aN9r7mJc3ndYn5gjkpb3yLgOYPDNLcQerV6uWk/u
-qKudNHed2dInGonl3oxwwv7++6oUvvtrSWLDZlRg16GsdIE1Y98DSMQWkSxevYy9
-Nh6FGTdlBFQVMpiMa8qHEkrOyKsy85yCW1sgzlpGTIBwbDAqYtwe3rgbwyHwUtfy
-0EU++DBcR4ll/pDqB0OQtW5E3AOq2GH1iaGeFLKSUQ5KAbdI8y4/b8IkSDffvxcc
-kXig7S54aLrNlL/ZjQ+H4Chgjj2A5wMucd81+Fb60Udej73ICL9PpMPnXQ1+BVYd
-MJ/txjLNmrOJG9yEHQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
-/wQEAwIBBjAdBgNVHQ4EFgQUcqSu1uRYT/DLbLoDNUz38nGvCKQwHwYDVR0jBBgw
-FoAUcrcUibuDx3EQjAr3MwA7wRaFFjEwDQYJKoZIhvcNAQELBQADggEBADY461GT
-Rw0dGnD07xaGJcI0i0pV+WnGSrl1s1PAIdMYihJAqYnh10fXbFXLm2WMWVmv/pxs
-FI/xDJno+pd4mCa/sIhm63ar/Nv+lFQmcpIlvSlKnhhV4SLNBeqbVhPBGTCHfrG4
-aIyCwm1KJsnkWbf03crhSskR/2CXIjX6lcAy7K3fE2u1ELpAdH0kMJR7VXkLFLUm
-gqe9YCluR0weMpe2sCaOGzdVzQSmMMCzGP5cxeFR5U6K40kMOpiW11JNmQ06xI/m
-YVkMNwoiV/ITT0/C/g9FxJmkO0mVSLEqxaLS/hNiQNDlroVM0rbxhzviXLI3R3AO
-50VvlOQYGxWed/I=
------END CERTIFICATE-----
\ No newline at end of file
diff --git a/tests/tests/net/ipsec/assets/pem/server-a-self-signed-ca.pem b/tests/tests/net/ipsec/assets/pem/server-a-self-signed-ca.pem
deleted file mode 100644
index 972fd55..0000000
--- a/tests/tests/net/ipsec/assets/pem/server-a-self-signed-ca.pem
+++ /dev/null
@@ -1,20 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDSDCCAjCgAwIBAgIITJQJ6HC1rjwwDQYJKoZIhvcNAQELBQAwQjELMAkGA1UE
-BhMCVVMxEDAOBgNVBAoTB0FuZHJvaWQxITAfBgNVBAMTGHJvb3QuY2EudGVzdC5h
-bmRyb2lkLm5ldDAeFw0xOTA5MzAxNzU1NTJaFw0yOTA5MjcxNzU1NTJaMEIxCzAJ
-BgNVBAYTAlVTMRAwDgYDVQQKEwdBbmRyb2lkMSEwHwYDVQQDExhyb290LmNhLnRl
-c3QuYW5kcm9pZC5uZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCT
-q3hGF+JvLaB1xW7KGKmaxiQ7BxX2Sn7cbp7ggoVYXsFlBUuPPv3+Vg5PfPCPhsJ8
-/7w4HyKo3uc/vHs5HpQ7rSd9blhAkfmJci2ULLq73FB8Mix4CzPwMx29RrN1X9bU
-z4G0vJMczIBGxbZ0uw7n8bKcXBV7AIeax+J8lseEZ3k8iSuBkUJqGIpPFKTqByFZ
-A1Lvt47xkON5SZh6c/Oe+o6291wXaCOJUSAKv6PAWZkq9HeD2fqKA/ck9dBaz1M3
-YvzQ9V/7so3/dECjAfKia388h1I6XSGNUM+d5hpxMXpAFgG42eUXHpJ10OjDvSwd
-7ZSC91/kRQewUomEKBK1AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
-AQH/BAQDAgEGMB0GA1UdDgQWBBRJn6hHhdeDY/dXpCKUfrFYQhKAGjANBgkqhkiG
-9w0BAQsFAAOCAQEAig/94aGfHBhZuvbbhwAK4rUNpizmR567u0ZJ+QUEKyAlo9lT
-ZWYHSm7qTAZYvPEjzTQIptnAlxCHePXh3Cfwgo+r82lhG2rcdI03iRyvHWjM8gyk
-BXCJTi0Q08JHHpTP6GnAqpz58qEIFkk8P766zNXdhYrGPOydF+p7MFcb1Zv1gum3
-zmRLt0XUAMfjPUv1Bl8kTKFxH5lkMBLR1E0jnoJoTTfgRPrf9CuFSoh48n7YhoBT
-KV75xZY8b8+SuB0v6BvQmkpKZGoxBjuVsShyG7q1+4JTAtwhiP7BlkDvVkaBEi7t
-WIMFp2r2ZDisHgastNaeYFyzHYz9g1FCCrHQ4w==
------END CERTIFICATE-----
\ No newline at end of file
diff --git a/tests/tests/net/ipsec/src/android/net/eap/cts/EapSessionConfigTest.java b/tests/tests/net/ipsec/src/android/net/eap/cts/EapSessionConfigTest.java
deleted file mode 100644
index c24379d..0000000
--- a/tests/tests/net/ipsec/src/android/net/eap/cts/EapSessionConfigTest.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2020 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.eap.cts;
-
-import static android.telephony.TelephonyManager.APPTYPE_USIM;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import android.net.eap.EapSessionConfig;
-import android.net.eap.EapSessionConfig.EapAkaConfig;
-import android.net.eap.EapSessionConfig.EapAkaPrimeConfig;
-import android.net.eap.EapSessionConfig.EapMsChapV2Config;
-import android.net.eap.EapSessionConfig.EapSimConfig;
-import android.net.eap.EapSessionConfig.EapUiccConfig;
-
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class EapSessionConfigTest {
-    // These constants are IANA-defined values and are copies of hidden constants in
-    // frameworks/opt/net/ike/src/java/com/android/internal/net/eap/message/EapData.java.
-    private static final int EAP_TYPE_SIM = 18;
-    private static final int EAP_TYPE_AKA = 23;
-    private static final int EAP_TYPE_MSCHAP_V2 = 26;
-    private static final int EAP_TYPE_AKA_PRIME = 50;
-
-    private static final int SUB_ID = 1;
-    private static final byte[] EAP_IDENTITY = "test@android.net".getBytes();
-    private static final String NETWORK_NAME = "android.net";
-    private static final String EAP_MSCHAPV2_USERNAME = "username";
-    private static final String EAP_MSCHAPV2_PASSWORD = "password";
-
-    @Test
-    public void testBuildWithAllEapMethods() {
-        EapSessionConfig result =
-                new EapSessionConfig.Builder()
-                        .setEapIdentity(EAP_IDENTITY)
-                        .setEapSimConfig(SUB_ID, APPTYPE_USIM)
-                        .setEapAkaConfig(SUB_ID, APPTYPE_USIM)
-                        .setEapAkaPrimeConfig(
-                                SUB_ID,
-                                APPTYPE_USIM,
-                                NETWORK_NAME,
-                                true /* allowMismatchedNetworkNames */)
-                        .setEapMsChapV2Config(EAP_MSCHAPV2_USERNAME, EAP_MSCHAPV2_PASSWORD)
-                        .build();
-
-        assertArrayEquals(EAP_IDENTITY, result.getEapIdentity());
-
-        EapSimConfig eapSimConfig = result.getEapSimConfig();
-        assertNotNull(eapSimConfig);
-        assertEquals(EAP_TYPE_SIM, eapSimConfig.getMethodType());
-        verifyEapUiccConfigCommon(eapSimConfig);
-
-        EapAkaConfig eapAkaConfig = result.getEapAkaConfig();
-        assertNotNull(eapAkaConfig);
-        assertEquals(EAP_TYPE_AKA, eapAkaConfig.getMethodType());
-        verifyEapUiccConfigCommon(eapAkaConfig);
-
-        EapAkaPrimeConfig eapAkaPrimeConfig = result.getEapAkaPrimeConfig();
-        assertNotNull(eapAkaPrimeConfig);
-        assertEquals(EAP_TYPE_AKA_PRIME, eapAkaPrimeConfig.getMethodType());
-        assertEquals(NETWORK_NAME, eapAkaPrimeConfig.getNetworkName());
-        assertTrue(NETWORK_NAME, eapAkaPrimeConfig.allowsMismatchedNetworkNames());
-        verifyEapUiccConfigCommon(eapAkaPrimeConfig);
-
-        EapMsChapV2Config eapMsChapV2Config = result.getEapMsChapV2onfig();
-        assertNotNull(eapMsChapV2Config);
-        assertEquals(EAP_TYPE_MSCHAP_V2, eapMsChapV2Config.getMethodType());
-        assertEquals(EAP_MSCHAPV2_USERNAME, eapMsChapV2Config.getUsername());
-        assertEquals(EAP_MSCHAPV2_PASSWORD, eapMsChapV2Config.getPassword());
-    }
-
-    private void verifyEapUiccConfigCommon(EapUiccConfig config) {
-        assertEquals(SUB_ID, config.getSubId());
-        assertEquals(APPTYPE_USIM, config.getAppType());
-    }
-}
diff --git a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/ChildSessionParamsTest.java b/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/ChildSessionParamsTest.java
deleted file mode 100644
index 7fb1b6d..0000000
--- a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/ChildSessionParamsTest.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Copyright (C) 2020 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.ipsec.ike.cts;
-
-import static android.system.OsConstants.AF_INET;
-import static android.system.OsConstants.AF_INET6;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import android.net.LinkAddress;
-import android.net.ipsec.ike.ChildSaProposal;
-import android.net.ipsec.ike.ChildSessionParams;
-import android.net.ipsec.ike.TransportModeChildSessionParams;
-import android.net.ipsec.ike.TunnelModeChildSessionParams;
-import android.net.ipsec.ike.TunnelModeChildSessionParams.ConfigRequestIpv4Address;
-import android.net.ipsec.ike.TunnelModeChildSessionParams.ConfigRequestIpv4DhcpServer;
-import android.net.ipsec.ike.TunnelModeChildSessionParams.ConfigRequestIpv4DnsServer;
-import android.net.ipsec.ike.TunnelModeChildSessionParams.ConfigRequestIpv4Netmask;
-import android.net.ipsec.ike.TunnelModeChildSessionParams.ConfigRequestIpv6Address;
-import android.net.ipsec.ike.TunnelModeChildSessionParams.ConfigRequestIpv6DnsServer;
-import android.net.ipsec.ike.TunnelModeChildSessionParams.TunnelModeChildConfigRequest;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.net.Inet4Address;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-
-@RunWith(AndroidJUnit4.class)
-public class ChildSessionParamsTest extends IkeTestBase {
-    private static final int HARD_LIFETIME_SECONDS = (int) TimeUnit.HOURS.toSeconds(3L);
-    private static final int SOFT_LIFETIME_SECONDS = (int) TimeUnit.HOURS.toSeconds(1L);
-
-    // Random proposal. Content doesn't matter
-    private final ChildSaProposal mSaProposal =
-            SaProposalTest.buildChildSaProposalWithCombinedModeCipher();
-
-    private void verifyTunnelModeChildParamsWithDefaultValues(ChildSessionParams childParams) {
-        assertTrue(childParams instanceof TunnelModeChildSessionParams);
-        verifyChildParamsWithDefaultValues(childParams);
-    }
-
-    private void verifyTunnelModeChildParamsWithCustomizedValues(ChildSessionParams childParams) {
-        assertTrue(childParams instanceof TunnelModeChildSessionParams);
-        verifyChildParamsWithCustomizedValues(childParams);
-    }
-
-    private void verifyTransportModeChildParamsWithDefaultValues(ChildSessionParams childParams) {
-        assertTrue(childParams instanceof TransportModeChildSessionParams);
-        verifyChildParamsWithDefaultValues(childParams);
-    }
-
-    private void verifyTransportModeChildParamsWithCustomizedValues(
-            ChildSessionParams childParams) {
-        assertTrue(childParams instanceof TransportModeChildSessionParams);
-        verifyChildParamsWithCustomizedValues(childParams);
-    }
-
-    private void verifyChildParamsWithDefaultValues(ChildSessionParams childParams) {
-        assertEquals(Arrays.asList(mSaProposal), childParams.getSaProposals());
-
-        // Do not do assertEquals to the default values to be avoid being a change-detector test
-        assertTrue(childParams.getHardLifetimeSeconds() > childParams.getSoftLifetimeSeconds());
-        assertTrue(childParams.getSoftLifetimeSeconds() > 0);
-
-        assertEquals(
-                Arrays.asList(DEFAULT_V4_TS, DEFAULT_V6_TS),
-                childParams.getInboundTrafficSelectors());
-        assertEquals(
-                Arrays.asList(DEFAULT_V4_TS, DEFAULT_V6_TS),
-                childParams.getOutboundTrafficSelectors());
-    }
-
-    private void verifyChildParamsWithCustomizedValues(ChildSessionParams childParams) {
-        assertEquals(Arrays.asList(mSaProposal), childParams.getSaProposals());
-
-        assertEquals(HARD_LIFETIME_SECONDS, childParams.getHardLifetimeSeconds());
-        assertEquals(SOFT_LIFETIME_SECONDS, childParams.getSoftLifetimeSeconds());
-
-        assertEquals(
-                Arrays.asList(INBOUND_V4_TS, INBOUND_V6_TS),
-                childParams.getInboundTrafficSelectors());
-        assertEquals(
-                Arrays.asList(OUTBOUND_V4_TS, OUTBOUND_V6_TS),
-                childParams.getOutboundTrafficSelectors());
-    }
-
-    @Test
-    public void testBuildTransportModeParamsWithDefaultValues() {
-        TransportModeChildSessionParams childParams =
-                new TransportModeChildSessionParams.Builder().addSaProposal(mSaProposal).build();
-
-        verifyTransportModeChildParamsWithDefaultValues(childParams);
-    }
-
-    @Test
-    public void testBuildTunnelModeParamsWithDefaultValues() {
-        TunnelModeChildSessionParams childParams =
-                new TunnelModeChildSessionParams.Builder().addSaProposal(mSaProposal).build();
-
-        verifyTunnelModeChildParamsWithDefaultValues(childParams);
-        assertTrue(childParams.getConfigurationRequests().isEmpty());
-    }
-
-    @Test
-    public void testBuildTransportModeParamsWithCustomizedValues() {
-        TransportModeChildSessionParams childParams =
-                new TransportModeChildSessionParams.Builder()
-                        .addSaProposal(mSaProposal)
-                        .setLifetimeSeconds(HARD_LIFETIME_SECONDS, SOFT_LIFETIME_SECONDS)
-                        .addInboundTrafficSelectors(INBOUND_V4_TS)
-                        .addInboundTrafficSelectors(INBOUND_V6_TS)
-                        .addOutboundTrafficSelectors(OUTBOUND_V4_TS)
-                        .addOutboundTrafficSelectors(OUTBOUND_V6_TS)
-                        .build();
-
-        verifyTransportModeChildParamsWithCustomizedValues(childParams);
-    }
-
-    @Test
-    public void testBuildTunnelModeParamsWithCustomizedValues() {
-        TunnelModeChildSessionParams childParams =
-                new TunnelModeChildSessionParams.Builder()
-                        .addSaProposal(mSaProposal)
-                        .setLifetimeSeconds(HARD_LIFETIME_SECONDS, SOFT_LIFETIME_SECONDS)
-                        .addInboundTrafficSelectors(INBOUND_V4_TS)
-                        .addInboundTrafficSelectors(INBOUND_V6_TS)
-                        .addOutboundTrafficSelectors(OUTBOUND_V4_TS)
-                        .addOutboundTrafficSelectors(OUTBOUND_V6_TS)
-                        .build();
-
-        verifyTunnelModeChildParamsWithCustomizedValues(childParams);
-    }
-
-    @Test
-    public void testBuildChildSessionParamsWithConfigReq() {
-        TunnelModeChildSessionParams childParams =
-                new TunnelModeChildSessionParams.Builder()
-                        .addSaProposal(mSaProposal)
-                        .addInternalAddressRequest(AF_INET)
-                        .addInternalAddressRequest(AF_INET6)
-                        .addInternalAddressRequest(AF_INET6)
-                        .addInternalAddressRequest(IPV4_ADDRESS_REMOTE)
-                        .addInternalAddressRequest(IPV6_ADDRESS_REMOTE, IP6_PREFIX_LEN)
-                        .addInternalDnsServerRequest(AF_INET)
-                        .addInternalDnsServerRequest(AF_INET6)
-                        .addInternalDhcpServerRequest(AF_INET)
-                        .addInternalDhcpServerRequest(AF_INET)
-                        .build();
-
-        verifyTunnelModeChildParamsWithDefaultValues(childParams);
-
-        // Verify config request types and number of requests for each type
-        Map<Class<? extends TunnelModeChildConfigRequest>, Integer> expectedAttributeCounts =
-                new HashMap<>();
-        expectedAttributeCounts.put(ConfigRequestIpv4Address.class, 2);
-        expectedAttributeCounts.put(ConfigRequestIpv6Address.class, 3);
-        expectedAttributeCounts.put(ConfigRequestIpv4Netmask.class, 1);
-        expectedAttributeCounts.put(ConfigRequestIpv4DnsServer.class, 1);
-        expectedAttributeCounts.put(ConfigRequestIpv6DnsServer.class, 1);
-        expectedAttributeCounts.put(ConfigRequestIpv4DhcpServer.class, 2);
-        verifyConfigRequestTypes(expectedAttributeCounts, childParams.getConfigurationRequests());
-
-        // Verify specific IPv4 address request
-        Set<Inet4Address> expectedV4Addresses = new HashSet<>();
-        expectedV4Addresses.add(IPV4_ADDRESS_REMOTE);
-        verifySpecificV4AddrConfigReq(expectedV4Addresses, childParams);
-
-        // Verify specific IPv6 address request
-        Set<LinkAddress> expectedV6Addresses = new HashSet<>();
-        expectedV6Addresses.add(new LinkAddress(IPV6_ADDRESS_REMOTE, IP6_PREFIX_LEN));
-        verifySpecificV6AddrConfigReq(expectedV6Addresses, childParams);
-    }
-
-    protected void verifySpecificV4AddrConfigReq(
-            Set<Inet4Address> expectedAddresses, TunnelModeChildSessionParams childParams) {
-        for (TunnelModeChildConfigRequest req : childParams.getConfigurationRequests()) {
-            if (req instanceof ConfigRequestIpv4Address
-                    && ((ConfigRequestIpv4Address) req).getAddress() != null) {
-                Inet4Address address = ((ConfigRequestIpv4Address) req).getAddress();
-
-                // Fail if expectedAddresses does not contain this address
-                assertTrue(expectedAddresses.remove(address));
-            }
-        }
-
-        // Fail if any expected address is not found in result
-        assertTrue(expectedAddresses.isEmpty());
-    }
-
-    protected void verifySpecificV6AddrConfigReq(
-            Set<LinkAddress> expectedAddresses, TunnelModeChildSessionParams childParams) {
-        for (TunnelModeChildConfigRequest req : childParams.getConfigurationRequests()) {
-            if (req instanceof ConfigRequestIpv6Address
-                    && ((ConfigRequestIpv6Address) req).getAddress() != null) {
-                ConfigRequestIpv6Address ipv6AddrReq = (ConfigRequestIpv6Address) req;
-
-                // Fail if expectedAddresses does not contain this address
-                LinkAddress address =
-                        new LinkAddress(ipv6AddrReq.getAddress(), ipv6AddrReq.getPrefixLength());
-                assertTrue(expectedAddresses.remove(address));
-            }
-        }
-
-        // Fail if any expected address is not found in result
-        assertTrue(expectedAddresses.isEmpty());
-    }
-}
diff --git a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeIdentificationTest.java b/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeIdentificationTest.java
deleted file mode 100644
index 0317def..0000000
--- a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeIdentificationTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2020 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.ipsec.ike.cts;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-
-import android.net.ipsec.ike.IkeDerAsn1DnIdentification;
-import android.net.ipsec.ike.IkeFqdnIdentification;
-import android.net.ipsec.ike.IkeIpv4AddrIdentification;
-import android.net.ipsec.ike.IkeIpv6AddrIdentification;
-import android.net.ipsec.ike.IkeKeyIdIdentification;
-import android.net.ipsec.ike.IkeRfc822AddrIdentification;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import javax.security.auth.x500.X500Principal;
-
-@RunWith(AndroidJUnit4.class)
-public final class IkeIdentificationTest extends IkeTestBase {
-    @Test
-    public void testIkeDerAsn1DnIdentification() throws Exception {
-        X500Principal asn1Dn = new X500Principal(LOCAL_ASN1_DN_STRING);
-
-        IkeDerAsn1DnIdentification ikeId = new IkeDerAsn1DnIdentification(asn1Dn);
-        assertEquals(asn1Dn, ikeId.derAsn1Dn);
-    }
-
-    @Test
-    public void testIkeFqdnIdentification() throws Exception {
-        IkeFqdnIdentification ikeId = new IkeFqdnIdentification(LOCAL_HOSTNAME);
-        assertEquals(LOCAL_HOSTNAME, ikeId.fqdn);
-    }
-
-    @Test
-    public void testIkeIpv4AddrIdentification() throws Exception {
-        IkeIpv4AddrIdentification ikeId = new IkeIpv4AddrIdentification(IPV4_ADDRESS_LOCAL);
-        assertEquals(IPV4_ADDRESS_LOCAL, ikeId.ipv4Address);
-    }
-
-    @Test
-    public void testIkeIpv6AddrIdentification() throws Exception {
-        IkeIpv6AddrIdentification ikeId = new IkeIpv6AddrIdentification(IPV6_ADDRESS_LOCAL);
-        assertEquals(IPV6_ADDRESS_LOCAL, ikeId.ipv6Address);
-    }
-
-    @Test
-    public void testIkeKeyIdIdentification() throws Exception {
-        IkeKeyIdIdentification ikeId = new IkeKeyIdIdentification(LOCAL_KEY_ID);
-        assertArrayEquals(LOCAL_KEY_ID, ikeId.keyId);
-    }
-
-    @Test
-    public void testIkeRfc822AddrIdentification() throws Exception {
-        IkeRfc822AddrIdentification ikeId = new IkeRfc822AddrIdentification(LOCAL_RFC822_NAME);
-        assertEquals(LOCAL_RFC822_NAME, ikeId.rfc822Name);
-    }
-}
diff --git a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeSessionDigitalSignatureTest.java b/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeSessionDigitalSignatureTest.java
deleted file mode 100644
index 9be1dc7..0000000
--- a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeSessionDigitalSignatureTest.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright (C) 2020 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.ipsec.ike.cts;
-
-import android.net.InetAddresses;
-import android.net.LinkAddress;
-import android.net.ipsec.ike.IkeDerAsn1DnIdentification;
-import android.net.ipsec.ike.IkeSession;
-import android.net.ipsec.ike.IkeSessionParams;
-import android.net.ipsec.ike.IkeTrafficSelector;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.internal.net.ipsec.ike.testutils.CertUtils;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.net.InetAddress;
-import java.security.cert.X509Certificate;
-import java.security.interfaces.RSAPrivateKey;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import javax.security.auth.x500.X500Principal;
-
-/**
- * Explicitly test setting up transport mode Child SA so that devices do not have
- * FEATURE_IPSEC_TUNNELS will be test covered. Tunnel mode Child SA setup has been tested in
- * IkeSessionPskTest and authentication method is orthogonal to Child mode.
- */
-@RunWith(AndroidJUnit4.class)
-public class IkeSessionDigitalSignatureTest extends IkeSessionTestBase {
-    private static final int EXPECTED_AUTH_REQ_FRAG_COUNT = 3;
-
-    private static final String IKE_INIT_RESP =
-            "46B8ECA1E0D72A18BF3FA1C2CB1EE86F21202220000000000000015022000030"
-                    + "0000002C010100040300000C0100000C800E0100030000080300000503000008"
-                    + "0200000400000008040000022800008800020000328451C8A976CE69E407966A"
-                    + "50D7320C4197A15A07267CE1B16BAFF9BDBBDEC1FDCDAAF7175ADF9AA8DB55DB"
-                    + "2D70C012D01D914C4EDEF6E8B226868EA1D01B2ED0C4C5C86E6BFE566010EC0C"
-                    + "33BA1C93666430B88BDA0470D82CC4F4416F49E3E361E3017C9F27811A66718B"
-                    + "389E1800915D776D59AA528A7E1D1B7815D35144290000249FE8FABE7F43D917"
-                    + "CE370DE2FD9C22BBC082951AC26C1BA26DE795470F2C25BC2900001C00004004"
-                    + "AE388EC86D6D1A470D44142D01AB2E85A7AC14182900001C0000400544A235A4"
-                    + "171C884286B170F48FFC181DB428D87D290000080000402E290000100000402F"
-                    + "00020003000400050000000800004014";
-    private static final String IKE_AUTH_RESP_FRAG_1 =
-            "46B8ECA1E0D72A18BF3FA1C2CB1EE86F3520232000000001000004E0240004C4"
-                    + "00010002DF6750A2D1D5675006F9F6230BB886FFD20CFB973FD04963CFD7A528"
-                    + "560598C58CC44178B2FCBBBBB271387AC81A664B7E7F1055B912F8C686E287C9"
-                    + "D31684C66339151AB86DA3CF1DA664052FA97687634558A1E9E6B37E16A86BD1"
-                    + "68D76DA5E2E1E0B7E98EB662D80D542307015D2BF134EBBBE425D6954FE8C2C4"
-                    + "D31D16C16AA0521C3C481F873ECF25BB8B05AC6083775C1821CAAB1E35A3955D"
-                    + "85ACC599574142E1DD5B262D6E5365CBF6EBE92FFCC16BC29EC3239456F3B202"
-                    + "492551C0F6D752ADCCA56D506D50CC8809EF6BC56EAD005586F7168F76445FD3"
-                    + "1366CC62D32C0C19B28210B8F813F97CD6A447C3857EFD6EC483DDA8ACD9870E"
-                    + "5A21B9C66F0FA44496C0C3D05E8859A1A4CFC88155D0C411BABC13033DD41FA4"
-                    + "AF08CE7734A146687F374F95634D1F26843203CA1FFD05CA3EB150CEA02FBF14"
-                    + "712B7A1C9BC7616A086E7FCA059E7D64EFF98DB895B32F8F7002762AF7D12F23"
-                    + "31E9DD25174C4CE273E5392BBB48F50B7A3E0187181216265F6A4FC7B91BE0AB"
-                    + "C601A580149D4B07411AE99DDB1944B977E86ADC9746605C60A92B569EEFAFFC"
-                    + "3A888D187B75D8F13249689FC28EBCD62B5E03AF171F3A561F0DEA3B1A75F531"
-                    + "971157DCE1E7BC6E7789FF3E8156015BC9C521EFE48996B41471D33BF09864E4"
-                    + "2436E8D7EB6218CDE7716DA754A924B123A63E25585BF27F4AC043A0C4AECE38"
-                    + "BB59DD62F5C0EC657206A76CED1BD26262237DA1CA6815435992A825758DEBEC"
-                    + "DDF598A22B8242AC4E34E70704DBA7B7B73DC3E067C1C98764F8791F84C99156"
-                    + "947D1FFC875F36FCE24B89369C1B5BF1D4C999DCA28E72A528D0E0163C66C067"
-                    + "E71B5E0025C13DA93313942F9EDA230B3ADC254821A4CB1A5DC9D0C5F4DC4E8E"
-                    + "CE46B7B8C72D3C5923C9B30DF1EF7B4EDEDA8BD05C86CA0162AE1BF8F277878E"
-                    + "607401BAA8F06E3EA873FA4C137324C4E0699277CDF649FE7F0F01945EE25FA7"
-                    + "0E4A89737E58185B11B4CB52FD5B0497D3E3CD1CEE7B1FBB3E969DB6F4C324A1"
-                    + "32DC6A0EA21F41332435FD99140C286F8ABBBA926953ADBEED17D30AAD953909"
-                    + "1347EF6D87163D6B1FF32D8B11FFB2E69FAEE7FE913D3826FBA7F9D11E0E3C57"
-                    + "27625B37D213710B5DD8965DAEFD3F491E8C029E2BF361039949BADEC31D60AC"
-                    + "355F26EE41339C03CC9D9B01C3C7F288F0E9D6DFEE78231BDA9AC10FED135913"
-                    + "2836B1A17CE060742B7E5B738A7177CCD59F70337BA251409C377A0FA5333204"
-                    + "D8622BA8C06DE0BEF4F32B6D4D77BE9DE977445D8A2A08C5C38341CB7974FBFB"
-                    + "22C8F983A7D6CEF068DDB2281E6673453521C831C1826861005AE5F37649BC64"
-                    + "0A6360B23284861441A440F1C5AADE1AB53CA63DB17F4C314D493C4C44DE5F20"
-                    + "75E084D080F92791F30BDD88373D50AB5A07BC72B0E7FFFA593103964E55603E"
-                    + "F7FEB7CA0762A1A7B86B6CCAD88CD6CBC7C6935D21F5F06B2700588A2530E619"
-                    + "DA1648AC809F3DDF56ACE5951737568FFEC7E2AB1AA0AE01B03A7F5A29CE73C0"
-                    + "5D2801B17CAAD0121082E9952FAB16BA1C386336C62D4CF3A5019CF61609433E"
-                    + "1C083237D47C4CF575097F7BF9000EF6B6C497A44E6480154A35669AD276BF05"
-                    + "6CC730B4E5962B6AF96CC6D236AE85CEFDA6877173F72D2F614F6696D1F9DF07"
-                    + "E107758B0978F69BC9DBE0CCBF252C40A3FDF7CE9104D3344F7B73593CCD73E0";
-    private static final String IKE_AUTH_RESP_FRAG_2 =
-            "46B8ECA1E0D72A18BF3FA1C2CB1EE86F3520232000000001000000F0000000D4"
-                    + "00020002155211EA41B37BC5F20568A6AE57038EEE208F94F9B444004F1EF391"
-                    + "2CABFCF857B9CD95FAAA9489ED10A3F5C93510820E22E23FC55ED8049E067D72"
-                    + "3645C00E1E08611916CE72D7F0A84123B63A8F3B9E78DBBE39967B7BB074AF4D"
-                    + "BF2178D991EDBDD01908A14A266D09236DB963B14AC33D894F0F83A580209EFD"
-                    + "61875BB56273AA336C22D6A4D890B93E0D42435667830CC32E4F608500E18569"
-                    + "3E6C1D88C0B5AE427333C86468E3474DAA4D1506AAB2A4021309A33DD759D0D0"
-                    + "A8C98BF7FBEA8109361A9F194D0FD756";
-    private static final String DELETE_IKE_RESP =
-            "46B8ECA1E0D72A18BF3FA1C2CB1EE86F2E202520000000020000004C00000030"
-                    + "342842D8DA37C8EFB92ED37C4FBB23CBDC90445137D6A0AF489F9F03641DBA9D"
-                    + "02F6F59FD8A7A78C7261CEB8";
-
-    // Using IPv4 for transport mode Child SA. IPv6 is currently infeasible because the IKE server
-    // that generates the test vectors is running in an IPv4 only network.
-    private static final IkeTrafficSelector TRANSPORT_MODE_INBOUND_TS =
-            new IkeTrafficSelector(
-                    MIN_PORT,
-                    MAX_PORT,
-                    InetAddresses.parseNumericAddress("172.58.35.103"),
-                    InetAddresses.parseNumericAddress("172.58.35.103"));
-
-    // TODO(b/157510502): Add test for IKE Session setup with transport mode Child in IPv6 network
-
-    private static final String LOCAL_ID_ASN1_DN =
-            "CN=client.test.ike.android.net, O=Android, C=US";
-    private static final String REMOTE_ID_ASN1_DN =
-            "CN=server.test.ike.android.net, O=Android, C=US";
-
-    private static X509Certificate sServerCaCert;
-    private static X509Certificate sClientEndCert;
-    private static X509Certificate sClientIntermediateCaCertOne;
-    private static X509Certificate sClientIntermediateCaCertTwo;
-    private static RSAPrivateKey sClientPrivateKey;
-
-    @BeforeClass
-    public static void setUpCertsBeforeClass() throws Exception {
-        sServerCaCert = CertUtils.createCertFromPemFile("server-a-self-signed-ca.pem");
-        sClientEndCert = CertUtils.createCertFromPemFile("client-a-end-cert.pem");
-        sClientIntermediateCaCertOne =
-                CertUtils.createCertFromPemFile("client-a-intermediate-ca-one.pem");
-        sClientIntermediateCaCertTwo =
-                CertUtils.createCertFromPemFile("client-a-intermediate-ca-two.pem");
-        sClientPrivateKey = CertUtils.createRsaPrivateKeyFromKeyFile("client-a-private-key.key");
-    }
-
-    private IkeSession openIkeSessionWithRemoteAddress(InetAddress remoteAddress) {
-        IkeSessionParams ikeParams =
-                new IkeSessionParams.Builder(sContext)
-                        .setNetwork(mTunNetwork)
-                        .setServerHostname(remoteAddress.getHostAddress())
-                        .addSaProposal(SaProposalTest.buildIkeSaProposalWithNormalModeCipher())
-                        .addSaProposal(SaProposalTest.buildIkeSaProposalWithCombinedModeCipher())
-                        .setLocalIdentification(
-                                new IkeDerAsn1DnIdentification(new X500Principal(LOCAL_ID_ASN1_DN)))
-                        .setRemoteIdentification(
-                                new IkeDerAsn1DnIdentification(
-                                        new X500Principal(REMOTE_ID_ASN1_DN)))
-                        .setAuthDigitalSignature(
-                                sServerCaCert,
-                                sClientEndCert,
-                                Arrays.asList(
-                                        sClientIntermediateCaCertOne, sClientIntermediateCaCertTwo),
-                                sClientPrivateKey)
-                        .build();
-
-        return new IkeSession(
-                sContext,
-                ikeParams,
-                buildTransportModeChildParamsWithTs(
-                        TRANSPORT_MODE_INBOUND_TS, TRANSPORT_MODE_OUTBOUND_TS),
-                mUserCbExecutor,
-                mIkeSessionCallback,
-                mFirstChildSessionCallback);
-    }
-
-    @Test
-    public void testIkeSessionSetupAndChildSessionSetupWithTransportMode() throws Exception {
-        // Open IKE Session
-        IkeSession ikeSession = openIkeSessionWithRemoteAddress(mRemoteAddress);
-        performSetupIkeAndFirstChildBlocking(
-                IKE_INIT_RESP,
-                EXPECTED_AUTH_REQ_FRAG_COUNT /* expectedReqPktCnt */,
-                true /* expectedAuthUseEncap */,
-                IKE_AUTH_RESP_FRAG_1,
-                IKE_AUTH_RESP_FRAG_2);
-
-        // IKE INIT and IKE AUTH takes two exchanges. Message ID starts from 2
-        int expectedMsgId = 2;
-
-        verifyIkeSessionSetupBlocking();
-        verifyChildSessionSetupBlocking(
-                mFirstChildSessionCallback,
-                Arrays.asList(TRANSPORT_MODE_INBOUND_TS),
-                Arrays.asList(TRANSPORT_MODE_OUTBOUND_TS),
-                new ArrayList<LinkAddress>());
-        IpSecTransformCallRecord firstTransformRecordA =
-                mFirstChildSessionCallback.awaitNextCreatedIpSecTransform();
-        IpSecTransformCallRecord firstTransformRecordB =
-                mFirstChildSessionCallback.awaitNextCreatedIpSecTransform();
-        verifyCreateIpSecTransformPair(firstTransformRecordA, firstTransformRecordB);
-
-        // Close IKE Session
-        ikeSession.close();
-        performCloseIkeBlocking(expectedMsgId++, DELETE_IKE_RESP);
-        verifyCloseIkeAndChildBlocking(firstTransformRecordA, firstTransformRecordB);
-    }
-}
diff --git a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeSessionMschapV2Test.java b/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeSessionMschapV2Test.java
deleted file mode 100644
index cb77127..0000000
--- a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeSessionMschapV2Test.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright (C) 2020 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.ipsec.ike.cts;
-
-import android.net.InetAddresses;
-import android.net.LinkAddress;
-import android.net.eap.EapSessionConfig;
-import android.net.ipsec.ike.IkeFqdnIdentification;
-import android.net.ipsec.ike.IkeSession;
-import android.net.ipsec.ike.IkeSessionParams;
-import android.net.ipsec.ike.IkeTrafficSelector;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.internal.net.ipsec.ike.testutils.CertUtils;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.net.InetAddress;
-import java.security.cert.X509Certificate;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-/**
- * Explicitly test setting up transport mode Child SA so that devices do not have
- * FEATURE_IPSEC_TUNNELS will be test covered. Tunnel mode Child SA setup has been tested in
- * IkeSessionPskTest and authentication method is orthogonal to Child mode.
- */
-@RunWith(AndroidJUnit4.class)
-public class IkeSessionMschapV2Test extends IkeSessionTestBase {
-    private static final String IKE_INIT_RESP =
-            "46B8ECA1E0D72A1873F643FF94D249A921202220000000000000015022000030"
-                    + "0000002C010100040300000C0100000C800E0080030000080300000203000008"
-                    + "0200000200000008040000022800008800020000CC6E71E67E32CED6BCE33FBD"
-                    + "A74113867E3FA3AE21C7C9AB44A7F8835DF602BFD6F6528B67FEE39821232380"
-                    + "C99E8FFC0A5D767F8F38906DA41946C2299DF18C15FA69BAC08D3EDB32E8C8CA"
-                    + "28431831561C04CB0CDE393F817151CD8DAF7A311838411F1C39BFDB5EBCF6A6"
-                    + "1DF66DEB067362649D64607D599B56C4227819D0290000241197004CF31AD00F"
-                    + "5E0C92E198488D8A2B6F6A25C82762AA49F565BCE9D857D72900001C00004004"
-                    + "A0D98FEABBFB92A6C0976EE83D2AACFCCF969A6B2900001C0000400575EBF73F"
-                    + "8EE5CC73917DE9D3F91FCD4A16A0444D290000080000402E290000100000402F"
-                    + "00020003000400050000000800004014";
-    private static final String IKE_AUTH_RESP_1_FRAG_1 =
-            "46B8ECA1E0D72A1873F643FF94D249A93520232000000001000004E0240004C4"
-                    + "00010002C4159CB756773B3F1911F4595107BC505D7A28C72F05182966076679"
-                    + "CA68ED92E4BC5CD441C9CB315F2F449A8A521CAFED3C5F285E295FC3791D3415"
-                    + "E3BACF66A08410DF4E35F7D88FE40DA28851C91C77A6549E186AC1B7846DF3FA"
-                    + "0A347A5ABBCAEE19E70F0EE5966DC6242A115F29523709302EDAD2E36C8F0395"
-                    + "CF5C42EC2D2898ECDD8A6AEDD686A70B589A981558667647F32F41E0D8913E94"
-                    + "A6693F53E59EA8938037F562CF1DC5E6E2CDC630B5FFB08949E3172249422F7D"
-                    + "EA069F9BAD5F96E48BADC7164A9269669AD0DF295A80C54D1D23CEA3F28AC485"
-                    + "86D2A9850DA23823037AB7D1577B7B2364C92C36B84238357129EB4A64D33310"
-                    + "B95DCD50CD53E78C32EFE7DC1627D9432E9BFDEE130045DE967B19F92A9D1270"
-                    + "F1E2C6BFBAA56802F3E63510578EF1ECB6872852F286EEC790AA1FE0CAF391CB"
-                    + "E276554922713BA4770CFE71E23F043DC620E22CC02A74F60725D18331B7F2C9"
-                    + "276EB6FBB7CBDAA040046D7ECBE1A5D7064E04E542807C5101B941D1C81B9D5E"
-                    + "90347B22BD4E638E2EDC98E369B51AA29BDB2CF8AA610D4B893EB83A4650717C"
-                    + "38B4D145EE939C18DCEDF6C79933CEB3D7C116B1F188DF9DDD560951B54E4A7D"
-                    + "80C999A32AB02BF39D7B498DAD36F1A5CBE2F64557D6401AE9DD6E0CEADA3F90"
-                    + "540FE9114BB6B8719C9064796354F4A180A6600CAD092F8302564E409B71ACB7"
-                    + "590F19B3AC88E7A606C718D0B97F7E4B4830F11D851C59F2255846DA22E2C805"
-                    + "0CA2AF2ACF3B6C769D11B75B5AC9AB82ED3D90014994B1BF6FED58FBEF2D72EF"
-                    + "8BDFE51F9A101393A7CA1ACF78FAEBF3E3CC25E09407D1E14AF351A159A13EE3"
-                    + "9B919BA8B49942792E7527C2FB6D418C4DF427669A4BF5A1AFBBB973BAF17918"
-                    + "9C9D520CAC2283B89A539ECE785EBE48FBB77D880A17D55C84A51F46068A4B87"
-                    + "FF48FEEE50E1E034CC8AFF5DA92105F55EC4823E67BDFE942CA8BE0DAECBBD52"
-                    + "E8AAF306049DC6C4CF87D987B0AC54FCE92E6AE8507965AAAC6AB8BD3405712F"
-                    + "EE170B70BC64BDCBD86D80C7AAAF341131F9A1210D7430B17218413AE1363183"
-                    + "5C98FA2428B1E9E987ADC9070E232310A28F4C3163E18366FFB112BADD7C5E0F"
-                    + "D13093A7C1428F87856BA0A7E46955589ACA267CE7A04320C4BCDBB60C672404"
-                    + "778F8D511AAB09349DAB482445D7F606F28E7FBBB18FC0F4EC0AF04F44C282F9"
-                    + "39C6E3B955C84DADEA350667236583069B74F492D600127636FA31F63E560851"
-                    + "2FC28B8EA5B4D01D110990B6EA46B9C2E7C7C856C240EF7A8147BA2C4344B85A"
-                    + "453C862024B5B6814D13CDEAEF7683D539BB50CAFFC0416F269F2F9EDEC5FA30"
-                    + "022FD7B4B186CD2020E7ED8D81ED90822EDD8B76F840DD68F09694CFF9B4F33E"
-                    + "11DF4E601A4212881A6D4E9259001705C41E9E23D18A7F3D4A3463649A38211A"
-                    + "5A90D0F17739A677C74E23F31C01D60B5A0F1E6A4D44FED9D25BF1E63418E1FC"
-                    + "0B19F6F4B71DE53C62B14B82279538A82DD4BE19AB6E00AFC20F124AAB7DF21A"
-                    + "42259BE4F40EC69B16917256F23E2C37376311D62E0A3A0EF8C2AD0C090221D5"
-                    + "C5ECA08F08178A4D31FFDB150C609827D18AD83C7B0A43AEE0406BD3FB494B53"
-                    + "A279FDD6447E234C926AD8CE47FFF779BB45B1FC8457C6E7D257D1359959D977"
-                    + "CEF6906A3367DC4D454993EFDC6F1EA94E17EB3DCB00A289346B4CFD7F19B16E";
-    private static final String IKE_AUTH_RESP_1_FRAG_2 =
-            "46B8ECA1E0D72A1873F643FF94D249A935202320000000010000008000000064"
-                    + "00020002C61F66025E821A5E69A4DE1F591A2C32C983C3154A5003660137D685"
-                    + "A5262B9FDF5EDC699DE4D8BD38F549E3CBD12024B45B4C86561C36C3EED839DA"
-                    + "9860C6AA0B764C662D08F1B6A98F68CF6E3038F737C0B415AD8A8B7D702BD92A";
-    private static final String IKE_AUTH_RESP_2 =
-            "46B8ECA1E0D72A1873F643FF94D249A92E202320000000020000008C30000070"
-                    + "62B90C2229FD23025BC2FD7FE6341E9EE04B17264CD619BCE18975A5F88BE438"
-                    + "D4AD4A5310057255AF568C293A29B10107E3EE3675C10AA2B26404D90C0528CC"
-                    + "F7605A86C96A1F2635CCC6CFC90EE65E5C2A2262EB33FE520EB708423A83CB63"
-                    + "274ECCBB102AF5DF35742657";
-    private static final String IKE_AUTH_RESP_3 =
-            "46B8ECA1E0D72A1873F643FF94D249A92E202320000000030000004C30000030"
-                    + "AB52C3C80123D3432C05AF457CE93C352395F73E861CD49561BA528CFE68D17D"
-                    + "78BBF6FC41E81C2B9EA051A2";
-    private static final String IKE_AUTH_RESP_4 =
-            "46B8ECA1E0D72A1873F643FF94D249A92E20232000000004000000CC270000B0"
-                    + "8D3342A7AB2666AC754F4B55C5C6B1A61255E62FBCA53D5CDEEDE60DADB7915C"
-                    + "7F962076A58BF7D39A05ED1B60FF349B6DE311AF7CEBC72B4BB9723A728A5D3E"
-                    + "9E508B2D7A11843D279B56ADA07E608D61F5CA7638F10372A440AD1DCE44E190"
-                    + "7B7B7A68B126EBBB86638D667D5B528D233BA8D32D7E0FAC4E1448E87396EEE6"
-                    + "0985B79841E1229D7962AACFD8F872722EC8D5B19D4C82D6C4ADCB276127A1A7"
-                    + "3FC84CDF85B2299BC96B64AC";
-    private static final String DELETE_IKE_RESP =
-            "46B8ECA1E0D72A1873F643FF94D249A92E202520000000050000004C00000030"
-                    + "622CE06C8CB132AA00567E9BC83F58B32BD7DB5130C76E385B306434DA227361"
-                    + "D50CC19D408A8D4F36F9697F";
-
-    // This value is align with the test vectors hex that are generated in an IPv4 environment
-    private static final IkeTrafficSelector TRANSPORT_MODE_INBOUND_TS =
-            new IkeTrafficSelector(
-                    MIN_PORT,
-                    MAX_PORT,
-                    InetAddresses.parseNumericAddress("172.58.35.67"),
-                    InetAddresses.parseNumericAddress("172.58.35.67"));
-
-    private static final EapSessionConfig EAP_CONFIG =
-            new EapSessionConfig.Builder()
-                    .setEapIdentity(EAP_IDENTITY)
-                    .setEapMsChapV2Config(EAP_MSCHAPV2_USERNAME, EAP_MSCHAPV2_PASSWORD)
-                    .build();
-
-    private static X509Certificate sServerCaCert;
-
-    @BeforeClass
-    public static void setUpCertBeforeClass() throws Exception {
-        sServerCaCert = CertUtils.createCertFromPemFile("server-a-self-signed-ca.pem");
-    }
-
-    private IkeSession openIkeSessionWithRemoteAddress(InetAddress remoteAddress) {
-        IkeSessionParams ikeParams =
-                new IkeSessionParams.Builder(sContext)
-                        .setNetwork(mTunNetwork)
-                        .setServerHostname(remoteAddress.getHostAddress())
-                        .addSaProposal(SaProposalTest.buildIkeSaProposalWithNormalModeCipher())
-                        .addSaProposal(SaProposalTest.buildIkeSaProposalWithCombinedModeCipher())
-                        .setLocalIdentification(new IkeFqdnIdentification(LOCAL_HOSTNAME))
-                        .setRemoteIdentification(new IkeFqdnIdentification(REMOTE_HOSTNAME))
-                        .setAuthEap(sServerCaCert, EAP_CONFIG)
-                        .build();
-        return new IkeSession(
-                sContext,
-                ikeParams,
-                buildTransportModeChildParamsWithTs(
-                        TRANSPORT_MODE_INBOUND_TS, TRANSPORT_MODE_OUTBOUND_TS),
-                mUserCbExecutor,
-                mIkeSessionCallback,
-                mFirstChildSessionCallback);
-    }
-
-    @Test
-    public void testIkeSessionSetupAndChildSessionSetupWithTransportMode() throws Exception {
-        // Open IKE Session
-        IkeSession ikeSession = openIkeSessionWithRemoteAddress(mRemoteAddress);
-        int expectedMsgId = 0;
-        mTunUtils.awaitReqAndInjectResp(
-                IKE_DETERMINISTIC_INITIATOR_SPI,
-                expectedMsgId++,
-                false /* expectedUseEncap */,
-                IKE_INIT_RESP);
-
-        mTunUtils.awaitReqAndInjectResp(
-                IKE_DETERMINISTIC_INITIATOR_SPI,
-                expectedMsgId++,
-                true /* expectedUseEncap */,
-                IKE_AUTH_RESP_1_FRAG_1,
-                IKE_AUTH_RESP_1_FRAG_2);
-
-        mTunUtils.awaitReqAndInjectResp(
-                IKE_DETERMINISTIC_INITIATOR_SPI,
-                expectedMsgId++,
-                true /* expectedUseEncap */,
-                IKE_AUTH_RESP_2);
-        mTunUtils.awaitReqAndInjectResp(
-                IKE_DETERMINISTIC_INITIATOR_SPI,
-                expectedMsgId++,
-                true /* expectedUseEncap */,
-                IKE_AUTH_RESP_3);
-        mTunUtils.awaitReqAndInjectResp(
-                IKE_DETERMINISTIC_INITIATOR_SPI,
-                expectedMsgId++,
-                true /* expectedUseEncap */,
-                IKE_AUTH_RESP_4);
-
-        verifyIkeSessionSetupBlocking();
-        verifyChildSessionSetupBlocking(
-                mFirstChildSessionCallback,
-                Arrays.asList(TRANSPORT_MODE_INBOUND_TS),
-                Arrays.asList(TRANSPORT_MODE_OUTBOUND_TS),
-                new ArrayList<LinkAddress>());
-        IpSecTransformCallRecord firstTransformRecordA =
-                mFirstChildSessionCallback.awaitNextCreatedIpSecTransform();
-        IpSecTransformCallRecord firstTransformRecordB =
-                mFirstChildSessionCallback.awaitNextCreatedIpSecTransform();
-        verifyCreateIpSecTransformPair(firstTransformRecordA, firstTransformRecordB);
-
-        // Close IKE Session
-        ikeSession.close();
-        performCloseIkeBlocking(expectedMsgId++, DELETE_IKE_RESP);
-        verifyCloseIkeAndChildBlocking(firstTransformRecordA, firstTransformRecordB);
-    }
-}
diff --git a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeSessionParamsTest.java b/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeSessionParamsTest.java
deleted file mode 100644
index c767b78..0000000
--- a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeSessionParamsTest.java
+++ /dev/null
@@ -1,414 +0,0 @@
-/*
- * Copyright (C) 2020 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.ipsec.ike.cts;
-
-import static android.net.ipsec.ike.IkeSessionParams.IKE_OPTION_ACCEPT_ANY_REMOTE_ID;
-import static android.net.ipsec.ike.IkeSessionParams.IKE_OPTION_EAP_ONLY_AUTH;
-import static android.net.ipsec.ike.IkeSessionParams.IkeAuthConfig;
-import static android.net.ipsec.ike.IkeSessionParams.IkeAuthDigitalSignLocalConfig;
-import static android.net.ipsec.ike.IkeSessionParams.IkeAuthDigitalSignRemoteConfig;
-import static android.net.ipsec.ike.IkeSessionParams.IkeAuthEapConfig;
-import static android.net.ipsec.ike.IkeSessionParams.IkeAuthPskConfig;
-import static android.system.OsConstants.AF_INET;
-import static android.system.OsConstants.AF_INET6;
-import static android.telephony.TelephonyManager.APPTYPE_USIM;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import android.net.eap.EapSessionConfig;
-import android.net.ipsec.ike.IkeFqdnIdentification;
-import android.net.ipsec.ike.IkeIdentification;
-import android.net.ipsec.ike.IkeSaProposal;
-import android.net.ipsec.ike.IkeSessionParams;
-import android.net.ipsec.ike.IkeSessionParams.ConfigRequestIpv4PcscfServer;
-import android.net.ipsec.ike.IkeSessionParams.ConfigRequestIpv6PcscfServer;
-import android.net.ipsec.ike.IkeSessionParams.IkeConfigRequest;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.internal.net.ipsec.ike.testutils.CertUtils;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.net.InetAddress;
-import java.security.cert.X509Certificate;
-import java.security.interfaces.RSAPrivateKey;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-
-@RunWith(AndroidJUnit4.class)
-public final class IkeSessionParamsTest extends IkeSessionTestBase {
-    private static final int HARD_LIFETIME_SECONDS = (int) TimeUnit.HOURS.toSeconds(20L);
-    private static final int SOFT_LIFETIME_SECONDS = (int) TimeUnit.HOURS.toSeconds(10L);
-    private static final int DPD_DELAY_SECONDS = (int) TimeUnit.MINUTES.toSeconds(10L);
-    private static final int[] RETRANS_TIMEOUT_MS_LIST = new int[] {500, 500, 500, 500, 500, 500};
-
-    private static final Map<Class<? extends IkeConfigRequest>, Integer> EXPECTED_REQ_COUNT =
-            new HashMap<>();
-    private static final HashSet<InetAddress> EXPECTED_PCSCF_SERVERS = new HashSet<>();
-
-    static {
-        EXPECTED_REQ_COUNT.put(ConfigRequestIpv4PcscfServer.class, 3);
-        EXPECTED_REQ_COUNT.put(ConfigRequestIpv6PcscfServer.class, 3);
-
-        EXPECTED_PCSCF_SERVERS.add(PCSCF_IPV4_ADDRESS_1);
-        EXPECTED_PCSCF_SERVERS.add(PCSCF_IPV4_ADDRESS_2);
-        EXPECTED_PCSCF_SERVERS.add(PCSCF_IPV6_ADDRESS_1);
-        EXPECTED_PCSCF_SERVERS.add(PCSCF_IPV6_ADDRESS_2);
-    }
-
-    // Arbitrary proposal and remote ID. Local ID is chosen to match the client end cert in the
-    // following CL
-    private static final IkeSaProposal SA_PROPOSAL =
-            SaProposalTest.buildIkeSaProposalWithNormalModeCipher();
-    private static final IkeIdentification LOCAL_ID = new IkeFqdnIdentification(LOCAL_HOSTNAME);
-    private static final IkeIdentification REMOTE_ID = new IkeFqdnIdentification(REMOTE_HOSTNAME);
-
-    private static final EapSessionConfig EAP_ALL_METHODS_CONFIG =
-            createEapOnlySafeMethodsBuilder()
-                    .setEapMsChapV2Config(EAP_MSCHAPV2_USERNAME, EAP_MSCHAPV2_PASSWORD)
-                    .build();
-    private static final EapSessionConfig EAP_ONLY_SAFE_METHODS_CONFIG =
-            createEapOnlySafeMethodsBuilder().build();
-
-    private X509Certificate mServerCaCert;
-    private X509Certificate mClientEndCert;
-    private X509Certificate mClientIntermediateCaCertOne;
-    private X509Certificate mClientIntermediateCaCertTwo;
-    private RSAPrivateKey mClientPrivateKey;
-
-    @Before
-    public void setUp() throws Exception {
-        // This address is never used except for setting up the test network
-        setUpTestNetwork(IPV4_ADDRESS_LOCAL);
-
-        mServerCaCert = CertUtils.createCertFromPemFile("server-a-self-signed-ca.pem");
-        mClientEndCert = CertUtils.createCertFromPemFile("client-a-end-cert.pem");
-        mClientIntermediateCaCertOne =
-                CertUtils.createCertFromPemFile("client-a-intermediate-ca-one.pem");
-        mClientIntermediateCaCertTwo =
-                CertUtils.createCertFromPemFile("client-a-intermediate-ca-two.pem");
-        mClientPrivateKey = CertUtils.createRsaPrivateKeyFromKeyFile("client-a-private-key.key");
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        tearDownTestNetwork();
-    }
-
-    private static EapSessionConfig.Builder createEapOnlySafeMethodsBuilder() {
-        return new EapSessionConfig.Builder()
-                .setEapIdentity(EAP_IDENTITY)
-                .setEapSimConfig(SUB_ID, APPTYPE_USIM)
-                .setEapAkaConfig(SUB_ID, APPTYPE_USIM)
-                .setEapAkaPrimeConfig(
-                        SUB_ID, APPTYPE_USIM, NETWORK_NAME, true /* allowMismatchedNetworkNames */);
-    }
-
-    /**
-     * Create a Builder that has minimum configurations to build an IkeSessionParams.
-     *
-     * <p>Authentication method is arbitrarily selected. Using other method (e.g. setAuthEap) also
-     * works.
-     */
-    private IkeSessionParams.Builder createIkeParamsBuilderMinimum() {
-        return new IkeSessionParams.Builder(sContext)
-                .setNetwork(mTunNetwork)
-                .setServerHostname(IPV4_ADDRESS_REMOTE.getHostAddress())
-                .addSaProposal(SA_PROPOSAL)
-                .setLocalIdentification(LOCAL_ID)
-                .setRemoteIdentification(REMOTE_ID)
-                .setAuthPsk(IKE_PSK);
-    }
-
-    /**
-     * Verify the minimum configurations to build an IkeSessionParams.
-     *
-     * @see #createIkeParamsBuilderMinimum
-     */
-    private void verifyIkeParamsMinimum(IkeSessionParams sessionParams) {
-        assertEquals(mTunNetwork, sessionParams.getNetwork());
-        assertEquals(IPV4_ADDRESS_REMOTE.getHostAddress(), sessionParams.getServerHostname());
-        assertEquals(Arrays.asList(SA_PROPOSAL), sessionParams.getSaProposals());
-        assertEquals(LOCAL_ID, sessionParams.getLocalIdentification());
-        assertEquals(REMOTE_ID, sessionParams.getRemoteIdentification());
-
-        IkeAuthConfig localConfig = sessionParams.getLocalAuthConfig();
-        assertTrue(localConfig instanceof IkeAuthPskConfig);
-        assertArrayEquals(IKE_PSK, ((IkeAuthPskConfig) localConfig).getPsk());
-        IkeAuthConfig remoteConfig = sessionParams.getRemoteAuthConfig();
-        assertTrue(remoteConfig instanceof IkeAuthPskConfig);
-        assertArrayEquals(IKE_PSK, ((IkeAuthPskConfig) remoteConfig).getPsk());
-    }
-
-    @Test
-    public void testBuildWithMinimumSet() throws Exception {
-        IkeSessionParams sessionParams = createIkeParamsBuilderMinimum().build();
-
-        verifyIkeParamsMinimum(sessionParams);
-
-        // Verify default values that do not need explicit configuration. Do not do assertEquals
-        // to be avoid being a change-detector test
-        assertTrue(sessionParams.getHardLifetimeSeconds() > sessionParams.getSoftLifetimeSeconds());
-        assertTrue(sessionParams.getSoftLifetimeSeconds() > 0);
-        assertTrue(sessionParams.getDpdDelaySeconds() > 0);
-        assertTrue(sessionParams.getRetransmissionTimeoutsMillis().length > 0);
-        for (int timeout : sessionParams.getRetransmissionTimeoutsMillis()) {
-            assertTrue(timeout > 0);
-        }
-        assertTrue(sessionParams.getConfigurationRequests().isEmpty());
-        assertFalse(sessionParams.hasIkeOption(IKE_OPTION_ACCEPT_ANY_REMOTE_ID));
-    }
-
-    @Test
-    public void testSetLifetimes() throws Exception {
-        IkeSessionParams sessionParams =
-                createIkeParamsBuilderMinimum()
-                        .setLifetimeSeconds(HARD_LIFETIME_SECONDS, SOFT_LIFETIME_SECONDS)
-                        .build();
-
-        verifyIkeParamsMinimum(sessionParams);
-        assertEquals(HARD_LIFETIME_SECONDS, sessionParams.getHardLifetimeSeconds());
-        assertEquals(SOFT_LIFETIME_SECONDS, sessionParams.getSoftLifetimeSeconds());
-    }
-
-    @Test
-    public void testSetDpdDelay() throws Exception {
-        IkeSessionParams sessionParams =
-                createIkeParamsBuilderMinimum().setDpdDelaySeconds(DPD_DELAY_SECONDS).build();
-
-        verifyIkeParamsMinimum(sessionParams);
-        assertEquals(DPD_DELAY_SECONDS, sessionParams.getDpdDelaySeconds());
-    }
-
-    @Test
-    public void testSetRetransmissionTimeouts() throws Exception {
-        IkeSessionParams sessionParams =
-                createIkeParamsBuilderMinimum()
-                        .setRetransmissionTimeoutsMillis(RETRANS_TIMEOUT_MS_LIST)
-                        .build();
-
-        verifyIkeParamsMinimum(sessionParams);
-        assertArrayEquals(RETRANS_TIMEOUT_MS_LIST, sessionParams.getRetransmissionTimeoutsMillis());
-    }
-
-    @Test
-    public void testSetPcscfConfigRequests() throws Exception {
-        IkeSessionParams sessionParams =
-                createIkeParamsBuilderMinimum()
-                        .setRetransmissionTimeoutsMillis(RETRANS_TIMEOUT_MS_LIST)
-                        .addPcscfServerRequest(AF_INET)
-                        .addPcscfServerRequest(PCSCF_IPV4_ADDRESS_1)
-                        .addPcscfServerRequest(PCSCF_IPV6_ADDRESS_1)
-                        .addPcscfServerRequest(AF_INET6)
-                        .addPcscfServerRequest(PCSCF_IPV4_ADDRESS_2)
-                        .addPcscfServerRequest(PCSCF_IPV6_ADDRESS_2)
-                        .build();
-
-        verifyIkeParamsMinimum(sessionParams);
-        verifyConfigRequestTypes(EXPECTED_REQ_COUNT, sessionParams.getConfigurationRequests());
-
-        Set<InetAddress> resultAddresses = new HashSet<>();
-        for (IkeConfigRequest req : sessionParams.getConfigurationRequests()) {
-            if (req instanceof ConfigRequestIpv4PcscfServer
-                    && ((ConfigRequestIpv4PcscfServer) req).getAddress() != null) {
-                resultAddresses.add(((ConfigRequestIpv4PcscfServer) req).getAddress());
-            } else if (req instanceof ConfigRequestIpv6PcscfServer
-                    && ((ConfigRequestIpv6PcscfServer) req).getAddress() != null) {
-                resultAddresses.add(((ConfigRequestIpv6PcscfServer) req).getAddress());
-            }
-        }
-        assertEquals(EXPECTED_PCSCF_SERVERS, resultAddresses);
-    }
-
-    @Test
-    public void testAddIkeOption() throws Exception {
-        IkeSessionParams sessionParams =
-                createIkeParamsBuilderMinimum()
-                        .addIkeOption(IKE_OPTION_ACCEPT_ANY_REMOTE_ID)
-                        .build();
-
-        verifyIkeParamsMinimum(sessionParams);
-        assertTrue(sessionParams.hasIkeOption(IKE_OPTION_ACCEPT_ANY_REMOTE_ID));
-    }
-
-    @Test
-    public void testRemoveIkeOption() throws Exception {
-        IkeSessionParams sessionParams =
-                createIkeParamsBuilderMinimum()
-                        .addIkeOption(IKE_OPTION_ACCEPT_ANY_REMOTE_ID)
-                        .removeIkeOption(IKE_OPTION_ACCEPT_ANY_REMOTE_ID)
-                        .build();
-
-        verifyIkeParamsMinimum(sessionParams);
-        assertFalse(sessionParams.hasIkeOption(IKE_OPTION_ACCEPT_ANY_REMOTE_ID));
-    }
-
-    /**
-     * Create a Builder that has minimum configurations to build an IkeSessionParams, except for
-     * authentication method.
-     */
-    private IkeSessionParams.Builder createIkeParamsBuilderMinimumWithoutAuth() {
-        return new IkeSessionParams.Builder(sContext)
-                .setNetwork(mTunNetwork)
-                .setServerHostname(IPV4_ADDRESS_REMOTE.getHostAddress())
-                .addSaProposal(SA_PROPOSAL)
-                .setLocalIdentification(LOCAL_ID)
-                .setRemoteIdentification(REMOTE_ID);
-    }
-
-    /**
-     * Verify the minimum configurations to build an IkeSessionParams, except for authentication
-     * method.
-     *
-     * @see #createIkeParamsBuilderMinimumWithoutAuth
-     */
-    private void verifyIkeParamsMinimumWithoutAuth(IkeSessionParams sessionParams) {
-        assertEquals(mTunNetwork, sessionParams.getNetwork());
-        assertEquals(IPV4_ADDRESS_REMOTE.getHostAddress(), sessionParams.getServerHostname());
-        assertEquals(Arrays.asList(SA_PROPOSAL), sessionParams.getSaProposals());
-        assertEquals(LOCAL_ID, sessionParams.getLocalIdentification());
-        assertEquals(REMOTE_ID, sessionParams.getRemoteIdentification());
-    }
-
-    @Test
-    public void testBuildWithPsk() throws Exception {
-        IkeSessionParams sessionParams =
-                createIkeParamsBuilderMinimumWithoutAuth().setAuthPsk(IKE_PSK).build();
-
-        verifyIkeParamsMinimumWithoutAuth(sessionParams);
-
-        IkeAuthConfig localConfig = sessionParams.getLocalAuthConfig();
-        assertTrue(localConfig instanceof IkeAuthPskConfig);
-        assertArrayEquals(IKE_PSK, ((IkeAuthPskConfig) localConfig).getPsk());
-        IkeAuthConfig remoteConfig = sessionParams.getRemoteAuthConfig();
-        assertTrue(remoteConfig instanceof IkeAuthPskConfig);
-        assertArrayEquals(IKE_PSK, ((IkeAuthPskConfig) remoteConfig).getPsk());
-    }
-
-    @Test
-    public void testBuildWithEap() throws Exception {
-        IkeSessionParams sessionParams =
-                createIkeParamsBuilderMinimumWithoutAuth()
-                        .setAuthEap(mServerCaCert, EAP_ALL_METHODS_CONFIG)
-                        .build();
-
-        verifyIkeParamsMinimumWithoutAuth(sessionParams);
-
-        IkeAuthConfig localConfig = sessionParams.getLocalAuthConfig();
-        assertTrue(localConfig instanceof IkeAuthEapConfig);
-        assertEquals(EAP_ALL_METHODS_CONFIG, ((IkeAuthEapConfig) localConfig).getEapConfig());
-        IkeAuthConfig remoteConfig = sessionParams.getRemoteAuthConfig();
-        assertTrue(remoteConfig instanceof IkeAuthDigitalSignRemoteConfig);
-        assertEquals(
-                mServerCaCert, ((IkeAuthDigitalSignRemoteConfig) remoteConfig).getRemoteCaCert());
-    }
-
-    @Test
-    public void testBuildWithEapOnlyAuth() throws Exception {
-        IkeSessionParams sessionParams =
-                createIkeParamsBuilderMinimumWithoutAuth()
-                        .setAuthEap(mServerCaCert, EAP_ONLY_SAFE_METHODS_CONFIG)
-                        .addIkeOption(IKE_OPTION_EAP_ONLY_AUTH)
-                        .build();
-
-        assertTrue(sessionParams.hasIkeOption(IKE_OPTION_EAP_ONLY_AUTH));
-        verifyIkeParamsMinimumWithoutAuth(sessionParams);
-
-        IkeAuthConfig localConfig = sessionParams.getLocalAuthConfig();
-        assertTrue(localConfig instanceof IkeAuthEapConfig);
-        assertEquals(EAP_ONLY_SAFE_METHODS_CONFIG, ((IkeAuthEapConfig) localConfig).getEapConfig());
-        IkeAuthConfig remoteConfig = sessionParams.getRemoteAuthConfig();
-        assertTrue(remoteConfig instanceof IkeAuthDigitalSignRemoteConfig);
-        assertEquals(
-                mServerCaCert, ((IkeAuthDigitalSignRemoteConfig) remoteConfig).getRemoteCaCert());
-    }
-
-    @Test
-    public void testThrowBuildEapOnlyAuthWithUnsafeMethod() throws Exception {
-        try {
-            IkeSessionParams sessionParams =
-                    createIkeParamsBuilderMinimumWithoutAuth()
-                            .setAuthEap(mServerCaCert, EAP_ALL_METHODS_CONFIG)
-                            .addIkeOption(IKE_OPTION_EAP_ONLY_AUTH)
-                            .build();
-            fail("Expected to fail because EAP only unsafe method is proposed");
-        } catch (IllegalArgumentException expected) {
-        }
-    }
-
-    @Test
-    public void testBuildWithDigitalSignature() throws Exception {
-        IkeSessionParams sessionParams =
-                createIkeParamsBuilderMinimumWithoutAuth()
-                        .setAuthDigitalSignature(mServerCaCert, mClientEndCert, mClientPrivateKey)
-                        .build();
-
-        verifyIkeParamsMinimumWithoutAuth(sessionParams);
-
-        IkeAuthConfig localConfig = sessionParams.getLocalAuthConfig();
-        assertTrue(localConfig instanceof IkeAuthDigitalSignLocalConfig);
-        IkeAuthDigitalSignLocalConfig localSignConfig = (IkeAuthDigitalSignLocalConfig) localConfig;
-        assertEquals(mClientEndCert, localSignConfig.getClientEndCertificate());
-        assertEquals(Collections.EMPTY_LIST, localSignConfig.getIntermediateCertificates());
-        assertEquals(mClientPrivateKey, localSignConfig.getPrivateKey());
-
-        IkeAuthConfig remoteConfig = sessionParams.getRemoteAuthConfig();
-        assertTrue(remoteConfig instanceof IkeAuthDigitalSignRemoteConfig);
-        assertEquals(
-                mServerCaCert, ((IkeAuthDigitalSignRemoteConfig) remoteConfig).getRemoteCaCert());
-    }
-
-    @Test
-    public void testBuildWithDigitalSignatureAndIntermediateCerts() throws Exception {
-        List<X509Certificate> intermediateCerts =
-                Arrays.asList(mClientIntermediateCaCertOne, mClientIntermediateCaCertTwo);
-
-        IkeSessionParams sessionParams =
-                createIkeParamsBuilderMinimumWithoutAuth()
-                        .setAuthDigitalSignature(
-                                mServerCaCert, mClientEndCert, intermediateCerts, mClientPrivateKey)
-                        .build();
-
-        verifyIkeParamsMinimumWithoutAuth(sessionParams);
-
-        IkeAuthConfig localConfig = sessionParams.getLocalAuthConfig();
-        assertTrue(localConfig instanceof IkeAuthDigitalSignLocalConfig);
-        IkeAuthDigitalSignLocalConfig localSignConfig = (IkeAuthDigitalSignLocalConfig) localConfig;
-        assertEquals(mClientEndCert, localSignConfig.getClientEndCertificate());
-        assertEquals(intermediateCerts, localSignConfig.getIntermediateCertificates());
-        assertEquals(mClientPrivateKey, localSignConfig.getPrivateKey());
-
-        IkeAuthConfig remoteConfig = sessionParams.getRemoteAuthConfig();
-        assertTrue(remoteConfig instanceof IkeAuthDigitalSignRemoteConfig);
-        assertEquals(
-                mServerCaCert, ((IkeAuthDigitalSignRemoteConfig) remoteConfig).getRemoteCaCert());
-    }
-}
diff --git a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeSessionPskTest.java b/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeSessionPskTest.java
deleted file mode 100644
index 13f953a..0000000
--- a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeSessionPskTest.java
+++ /dev/null
@@ -1,371 +0,0 @@
-/*
- * Copyright (C) 2020 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.ipsec.ike.cts;
-
-import static android.app.AppOpsManager.OP_MANAGE_IPSEC_TUNNELS;
-import static android.net.ipsec.ike.exceptions.IkeProtocolException.ERROR_TYPE_AUTHENTICATION_FAILED;
-import static android.net.ipsec.ike.exceptions.IkeProtocolException.ERROR_TYPE_NO_PROPOSAL_CHOSEN;
-import static android.net.ipsec.ike.exceptions.IkeProtocolException.ERROR_TYPE_TS_UNACCEPTABLE;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-
-import android.net.LinkAddress;
-import android.net.ipsec.ike.ChildSessionParams;
-import android.net.ipsec.ike.IkeFqdnIdentification;
-import android.net.ipsec.ike.IkeSession;
-import android.net.ipsec.ike.IkeSessionParams;
-import android.net.ipsec.ike.exceptions.IkeProtocolException;
-import android.platform.test.annotations.AppModeFull;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.net.InetAddress;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-@RunWith(AndroidJUnit4.class)
-@AppModeFull(reason = "MANAGE_IPSEC_TUNNELS permission can't be granted to instant apps")
-public class IkeSessionPskTest extends IkeSessionTestBase {
-    // Test vectors for success workflow
-    private static final String SUCCESS_IKE_INIT_RESP =
-            "46B8ECA1E0D72A18B45427679F9245D421202220000000000000015022000030"
-                    + "0000002C010100040300000C0100000C800E0080030000080300000203000008"
-                    + "0200000200000008040000022800008800020000A7AA3435D088EC1A2B7C2A47"
-                    + "1FA1B85F1066C9B2006E7C353FB5B5FDBC2A88347ED2C6F5B7A265D03AE34039"
-                    + "6AAC0145CFCC93F8BDB219DDFF22A603B8856A5DC59B6FAB7F17C5660CF38670"
-                    + "8794FC72F273ADEB7A4F316519794AED6F8AB61F95DFB360FAF18C6C8CABE471"
-                    + "6E18FE215348C2E582171A57FC41146B16C4AFE429000024A634B61C0E5C90C6"
-                    + "8D8818B0955B125A9B1DF47BBD18775710792E651083105C2900001C00004004"
-                    + "406FA3C5685A16B9B72C7F2EEE9993462C619ABE2900001C00004005AF905A87"
-                    + "0A32222AA284A7070585601208A282F0290000080000402E290000100000402F"
-                    + "00020003000400050000000800004014";
-    private static final String SUCCESS_IKE_AUTH_RESP =
-            "46B8ECA1E0D72A18B45427679F9245D42E20232000000001000000EC240000D0"
-                    + "0D06D37198F3F0962DE8170D66F1A9008267F98CDD956D984BDCED2FC7FAF84A"
-                    + "A6664EF25049B46B93C9ED420488E0C172AA6635BF4011C49792EF2B88FE7190"
-                    + "E8859FEEF51724FD20C46E7B9A9C3DC4708EF7005707A18AB747C903ABCEAC5C"
-                    + "6ECF5A5FC13633DCE3844A920ED10EF202F115DBFBB5D6D2D7AB1F34EB08DE7C"
-                    + "A54DCE0A3A582753345CA2D05A0EFDB9DC61E81B2483B7D13EEE0A815D37252C"
-                    + "23D2F29E9C30658227D2BB0C9E1A481EAA80BC6BE9006BEDC13E925A755A0290"
-                    + "AEC4164D29997F52ED7DCC2E";
-    private static final String SUCCESS_CREATE_CHILD_RESP =
-            "46B8ECA1E0D72A18B45427679F9245D42E20242000000002000000CC210000B0"
-                    + "484565D4AF6546274674A8DE339E9C9584EE2326AB9260F41C4D0B6C5B02D1D"
-                    + "2E8394E3CDE3094895F2ACCABCDCA8E82960E5196E9622BD13745FC8D6A2BED"
-                    + "E561FF5D9975421BC463C959A3CBA3478256B6D278159D99B512DDF56AC1658"
-                    + "63C65A986F395FE8B1476124B91F83FD7865304EB95B22CA4DD9601DA7A2533"
-                    + "ABF4B36EB1B8CD09522F6A600032316C74E562E6756D9D49D945854E2ABDC4C"
-                    + "3AF36305353D60D40B58BE44ABF82";
-    private static final String SUCCESS_DELETE_CHILD_RESP =
-            "46B8ECA1E0D72A18B45427679F9245D42E202520000000030000004C2A000030"
-                    + "0C5CEB882DBCA65CE32F4C53909335F1365C91C555316C5E9D9FB553F7AA916"
-                    + "EF3A1D93460B7FABAF0B4B854";
-    private static final String SUCCESS_DELETE_IKE_RESP =
-            "46B8ECA1E0D72A18B45427679F9245D42E202520000000040000004C00000030"
-                    + "9352D71100777B00ABCC6BD7DBEA697827FFAAA48DF9A54D1D68161939F5DC8"
-                    + "6743A7CEB2BE34AC00095A5B8";
-
-    private IkeSession openIkeSessionWithTunnelModeChild(InetAddress remoteAddress) {
-        return openIkeSession(remoteAddress, buildTunnelModeChildSessionParams());
-    }
-
-    private IkeSession openIkeSessionWithTransportModeChild(InetAddress remoteAddress) {
-        return openIkeSession(remoteAddress, buildTransportModeChildParamsWithDefaultTs());
-    }
-
-    private IkeSession openIkeSession(InetAddress remoteAddress, ChildSessionParams childParams) {
-        IkeSessionParams ikeParams =
-                new IkeSessionParams.Builder(sContext)
-                        .setNetwork(mTunNetwork)
-                        .setServerHostname(remoteAddress.getHostAddress())
-                        .addSaProposal(SaProposalTest.buildIkeSaProposalWithNormalModeCipher())
-                        .addSaProposal(SaProposalTest.buildIkeSaProposalWithCombinedModeCipher())
-                        .setLocalIdentification(new IkeFqdnIdentification(LOCAL_HOSTNAME))
-                        .setRemoteIdentification(new IkeFqdnIdentification(REMOTE_HOSTNAME))
-                        .setAuthPsk(IKE_PSK)
-                        .build();
-        return new IkeSession(
-                sContext,
-                ikeParams,
-                childParams,
-                mUserCbExecutor,
-                mIkeSessionCallback,
-                mFirstChildSessionCallback);
-    }
-
-    @BeforeClass
-    public static void setUpTunnelPermissionBeforeClass() throws Exception {
-        // Under normal circumstances, the MANAGE_IPSEC_TUNNELS appop would be auto-granted, and
-        // a standard permission is insufficient. So we shell out the appop, to give us the
-        // right appop permissions.
-        setAppOp(OP_MANAGE_IPSEC_TUNNELS, true);
-    }
-
-    // This method is guaranteed to run in subclasses and will run after subclasses' @AfterClass
-    // methods.
-    @AfterClass
-    public static void tearDownTunnelPermissionAfterClass() throws Exception {
-        setAppOp(OP_MANAGE_IPSEC_TUNNELS, false);
-    }
-
-    @Test
-    public void testIkeSessionSetupAndChildSessionSetupWithTunnelMode() throws Exception {
-        if (!hasTunnelsFeature()) return;
-
-        // Open IKE Session
-        IkeSession ikeSession = openIkeSessionWithTunnelModeChild(mRemoteAddress);
-        performSetupIkeAndFirstChildBlocking(SUCCESS_IKE_INIT_RESP, SUCCESS_IKE_AUTH_RESP);
-
-        // IKE INIT and IKE AUTH takes two exchanges. Message ID starts from 2
-        int expectedMsgId = 2;
-
-        verifyIkeSessionSetupBlocking();
-        verifyChildSessionSetupBlocking(
-                mFirstChildSessionCallback,
-                Arrays.asList(TUNNEL_MODE_INBOUND_TS),
-                Arrays.asList(TUNNEL_MODE_OUTBOUND_TS),
-                Arrays.asList(EXPECTED_INTERNAL_LINK_ADDR));
-
-        IpSecTransformCallRecord firstTransformRecordA =
-                mFirstChildSessionCallback.awaitNextCreatedIpSecTransform();
-        IpSecTransformCallRecord firstTransformRecordB =
-                mFirstChildSessionCallback.awaitNextCreatedIpSecTransform();
-        verifyCreateIpSecTransformPair(firstTransformRecordA, firstTransformRecordB);
-
-        // Open additional Child Session
-        TestChildSessionCallback additionalChildCb = new TestChildSessionCallback();
-        ikeSession.openChildSession(buildTunnelModeChildSessionParams(), additionalChildCb);
-        mTunUtils.awaitReqAndInjectResp(
-                IKE_DETERMINISTIC_INITIATOR_SPI,
-                expectedMsgId++,
-                true /* expectedUseEncap */,
-                SUCCESS_CREATE_CHILD_RESP);
-
-        // Verify opening additional Child Session
-        verifyChildSessionSetupBlocking(
-                additionalChildCb,
-                Arrays.asList(TUNNEL_MODE_INBOUND_TS),
-                Arrays.asList(TUNNEL_MODE_OUTBOUND_TS),
-                new ArrayList<LinkAddress>());
-        IpSecTransformCallRecord additionalTransformRecordA =
-                additionalChildCb.awaitNextCreatedIpSecTransform();
-        IpSecTransformCallRecord additionalTransformRecordB =
-                additionalChildCb.awaitNextCreatedIpSecTransform();
-        verifyCreateIpSecTransformPair(additionalTransformRecordA, additionalTransformRecordB);
-
-        // Close additional Child Session
-        ikeSession.closeChildSession(additionalChildCb);
-        mTunUtils.awaitReqAndInjectResp(
-                IKE_DETERMINISTIC_INITIATOR_SPI,
-                expectedMsgId++,
-                true /* expectedUseEncap */,
-                SUCCESS_DELETE_CHILD_RESP);
-
-        verifyDeleteIpSecTransformPair(
-                additionalChildCb, additionalTransformRecordA, additionalTransformRecordB);
-        additionalChildCb.awaitOnClosed();
-
-        // Close IKE Session
-        ikeSession.close();
-        performCloseIkeBlocking(expectedMsgId++, SUCCESS_DELETE_IKE_RESP);
-        verifyCloseIkeAndChildBlocking(firstTransformRecordA, firstTransformRecordB);
-    }
-
-    @Test
-    public void testIkeSessionSetupAndChildSessionSetupWithTunnelModeV6() throws Exception {
-        if (!hasTunnelsFeature()) return;
-
-        final String ikeInitResp =
-                "46B8ECA1E0D72A186F7B6C2CEB77EB9021202220000000000000011822000030"
-                        + "0000002C010100040300000C0100000C800E0100030000080300000C03000008"
-                        + "0200000500000008040000022800008800020000DABAA04B38B491E2403F2125"
-                        + "96ECF1C8EF7B1DC19A422FDD46E1756C826BB3A16404361B775D9950577B5CDF"
-                        + "6AAA1642BD1427BDA8BC55354A97C1025E19C1E2EE2DF8A0C9406E545D829F52"
-                        + "75695008E3B742984B8DD1770F3514213B0DF3EE8B199416DF200D248115C057"
-                        + "1C193E4F96802E5EF48DD99CAC251882A8F7CCC329000024BC6F0F1D3653C2C7"
-                        + "679E02CDB6A3B32B2FEE9AF52F0326D4D9AE073D56CE8922290000080000402E"
-                        + "290000100000402F00020003000400050000000800004014";
-        final String ikeAuthResp =
-                "46B8ECA1E0D72A186F7B6C2CEB77EB902E202320000000010000015024000134"
-                        + "4D115AFDCDAD0310760BB664EB7D405A340869AD6EDF0AAEAD0663A9253DADCB"
-                        + "73EBE5CD29D4FA1CDEADE0B94391B5C4CF77BCC1596ACE3CE6A7891E44888FA5"
-                        + "46632C0EF4E6193C023C9DC59142C37D1C49D6EF5CD324EC6FC35C89E1721C78"
-                        + "91FDCDB723D8062709950F4AA9273D26A54C9C7E86862DBC15F7B6641D2B9BAD"
-                        + "E55069008201D12968D97B537B1518FE87B0FFA03C3EE6012C06721B1E2A3F68"
-                        + "92108BC4A4F7063F7F94562D8B60F291A1377A836CF12BCDA7E15C1A8F3C77BB"
-                        + "6DB7F2C833CCE4CDDED7506536621A3356CE2BC1874E7B1A1A9B447D7DF6AB09"
-                        + "638B8AD94A781B28BB91B514B611B24DF8E8A047A10AE27BBF15C754D3D2F792"
-                        + "D3E1CCADDAE934C98AE53A8FC3419C88AFF0355564F82A629C998012DA7BB704"
-                        + "5307270DF326377E3E1994476902035B";
-        final String deleteIkeResp =
-                "46B8ECA1E0D72A186F7B6C2CEB77EB902E202520000000020000005000000034"
-                        + "CF15C299F35688E5140A48B61C95F004121BF8236201415E5CD45BA41AAB16D4"
-                        + "90B44B9E6D5D92B5B97D24196A58C73F";
-
-        mLocalAddress = IPV6_ADDRESS_LOCAL;
-        mRemoteAddress = IPV6_ADDRESS_REMOTE;
-
-        // Teardown current test network that uses IPv4 address and set up new network with IPv6
-        // address.
-        tearDownTestNetwork();
-        setUpTestNetwork(mLocalAddress);
-
-        // Open IKE Session
-        IkeSession ikeSession = openIkeSessionWithTunnelModeChild(mRemoteAddress);
-        performSetupIkeAndFirstChildBlocking(
-                ikeInitResp,
-                1 /* expectedAuthReqPktCnt */,
-                false /* expectedAuthUseEncap */,
-                ikeAuthResp);
-
-        // Local request message ID starts from 2 because there is one IKE_INIT message and a single
-        // IKE_AUTH message.
-        int expectedMsgId = 2;
-
-        verifyIkeSessionSetupBlocking();
-        verifyChildSessionSetupBlocking(
-                mFirstChildSessionCallback,
-                Arrays.asList(TUNNEL_MODE_INBOUND_TS_V6),
-                Arrays.asList(TUNNEL_MODE_OUTBOUND_TS_V6),
-                Arrays.asList(EXPECTED_INTERNAL_LINK_ADDR_V6),
-                Arrays.asList(EXPECTED_DNS_SERVERS_ONE, EXPECTED_DNS_SERVERS_TWO));
-
-        IpSecTransformCallRecord firstTransformRecordA =
-                mFirstChildSessionCallback.awaitNextCreatedIpSecTransform();
-        IpSecTransformCallRecord firstTransformRecordB =
-                mFirstChildSessionCallback.awaitNextCreatedIpSecTransform();
-        verifyCreateIpSecTransformPair(firstTransformRecordA, firstTransformRecordB);
-
-        // Close IKE Session
-        ikeSession.close();
-        performCloseIkeBlocking(expectedMsgId++, false /* expectedUseEncap */, deleteIkeResp);
-        verifyCloseIkeAndChildBlocking(firstTransformRecordA, firstTransformRecordB);
-    }
-
-    @Test
-    public void testIkeSessionKillWithTunnelMode() throws Exception {
-        if (!hasTunnelsFeature()) return;
-
-        // Open IKE Session
-        IkeSession ikeSession = openIkeSessionWithTunnelModeChild(mRemoteAddress);
-        performSetupIkeAndFirstChildBlocking(SUCCESS_IKE_INIT_RESP, SUCCESS_IKE_AUTH_RESP);
-
-        ikeSession.kill();
-        mFirstChildSessionCallback.awaitOnClosed();
-        mIkeSessionCallback.awaitOnClosed();
-    }
-
-    @Test
-    public void testIkeInitFail() throws Exception {
-        final String ikeInitFailRespHex =
-                "46B8ECA1E0D72A180000000000000000292022200000000000000024000000080000000E";
-
-        // Open IKE Session
-        IkeSession ikeSession = openIkeSessionWithTransportModeChild(mRemoteAddress);
-        int expectedMsgId = 0;
-        mTunUtils.awaitReqAndInjectResp(
-                IKE_DETERMINISTIC_INITIATOR_SPI,
-                expectedMsgId++,
-                false /* expectedUseEncap */,
-                ikeInitFailRespHex);
-
-        mFirstChildSessionCallback.awaitOnClosed();
-
-        IkeProtocolException protocolException =
-                (IkeProtocolException) mIkeSessionCallback.awaitOnClosedException();
-        assertEquals(ERROR_TYPE_NO_PROPOSAL_CHOSEN, protocolException.getErrorType());
-        assertArrayEquals(EXPECTED_PROTOCOL_ERROR_DATA_NONE, protocolException.getErrorData());
-    }
-
-    @Test
-    public void testIkeAuthHandlesAuthFailNotification() throws Exception {
-        final String ikeInitRespHex =
-                "46B8ECA1E0D72A18CF94CE3159486F002120222000000000000001502200"
-                        + "00300000002C010100040300000C0100000C800E01000300000803000005"
-                        + "0300000802000004000000080400000228000088000200001821AA854691"
-                        + "FA3292DF710F0AC149ACBD0CB421608B8796C1912AF04C5B4B23936FDEC4"
-                        + "7CB640E3EAFB56BBB562825E87AF68B40E4BAB80A49BAD44407450A4195A"
-                        + "1DD54BD99F48D28C9F0FBA315A3401C1C3C4AD55911F514A8DF2D2467C46"
-                        + "A73DDC1452AE81336E0F0D5EC896D2E7A77628AF2F9089F48943399DF216"
-                        + "EFCD2900002418D2B7E4E6AF0FEFF5962CF8D68F7793B1293FEDE13331D4"
-                        + "AB0CE9436C2EE1EC2900001C0000400457BD9AEF5B362A83DD7F3DDAA4A9"
-                        + "9B6B4041DAF32900001C000040055A81893582701E44D4B6729A22FE06DE"
-                        + "82A03A36290000080000402E290000100000402F00020003000400050000"
-                        + "000800004014";
-        final String ikeAuthFailRespHex =
-                "46B8ECA1E0D72A18CF94CE3159486F002E202320000000010000004C2900"
-                        + "00301B9E4C8242D3BE62E7F0A537FE8B92C6EAB7153105DA421DCE43A06D"
-                        + "AB6E4808BAC0CA1DAD6ADD0A126A41BD";
-
-        // Open IKE Session
-        IkeSession ikeSession = openIkeSessionWithTransportModeChild(mRemoteAddress);
-        performSetupIkeAndFirstChildBlocking(ikeInitRespHex, ikeAuthFailRespHex);
-
-        mFirstChildSessionCallback.awaitOnClosed();
-        IkeProtocolException protocolException =
-                (IkeProtocolException) mIkeSessionCallback.awaitOnClosedException();
-        assertEquals(ERROR_TYPE_AUTHENTICATION_FAILED, protocolException.getErrorType());
-        assertArrayEquals(EXPECTED_PROTOCOL_ERROR_DATA_NONE, protocolException.getErrorData());
-    }
-
-    @Test
-    public void testIkeAuthHandlesFirstChildCreationFail() throws Exception {
-        final String ikeInitRespHex =
-                "46B8ECA1E0D72A18F5ABBF896A1240BE2120222000000000000001502200"
-                        + "00300000002C010100040300000C0100000C800E0100030000080300000C"
-                        + "03000008020000050000000804000002280000880002000074950F016B85"
-                        + "605E57E24651843AB70E41B552EDEE227DFE51E6CBEC00E75FFEFC7D5453"
-                        + "109B15F721FCD811FC9F113BE06050882F2FC5F5FF25857E555CCFB5AB64"
-                        + "8B0D1D7A819A3B05DE1FE89A4A627C60D5AA06CD0F66ACD3748722F9CD4F"
-                        + "F30AE7477CBC12049821F07AD6C9F0ED732321A6A36FA817722E025AC34B"
-                        + "ABE62900002432E3807F595070E95EDA341A787599B24B1151B535B0222B"
-                        + "65C003401B9B38F82900001C000040043BB760DB3037B51768DFFAB4B21D"
-                        + "B1716EA1C1382900001C0000400531098EB04DF1BE3F304606BD59B454A8"
-                        + "CC7E7311290000080000402E290000100000402F00020003000400050000"
-                        + "000800004014";
-        final String ikeAuthCreateChildFailHex =
-                "46B8ECA1E0D72A18F5ABBF896A1240BE2E20232000000001000000B02400"
-                        + "009400B0861242E0C88ECB3848D772B560CAD65B6AC9DFFDC8622A394B8E"
-                        + "64E550BDD69FCD7E768129787ED9062992C1D6DB0F0631C2E05765B403CF"
-                        + "EF1D0A055B32F6698FF7DB5B8FB1B6A83A81634D00E22C86E35B3BFBEC73"
-                        + "EAC6806678926945BC7A57003DC1A3528A1EC423EE56C1075B36C0B57A6B"
-                        + "C6DD990182F6FABFFA167D199C7D629E5B830AAD2AFBD31CEBA6";
-
-        // Open IKE Session
-        IkeSession ikeSession = openIkeSessionWithTransportModeChild(mRemoteAddress);
-        performSetupIkeAndFirstChildBlocking(ikeInitRespHex, ikeAuthCreateChildFailHex);
-
-        // Even though the child creation failed, the authentication succeeded, so the IKE Session's
-        // onOpened() callback is still expected
-        verifyIkeSessionSetupBlocking();
-
-        // Verify Child Creation failed
-        IkeProtocolException protocolException =
-                (IkeProtocolException) mFirstChildSessionCallback.awaitOnClosedException();
-        assertEquals(ERROR_TYPE_TS_UNACCEPTABLE, protocolException.getErrorType());
-        assertArrayEquals(EXPECTED_PROTOCOL_ERROR_DATA_NONE, protocolException.getErrorData());
-
-        ikeSession.kill();
-        mIkeSessionCallback.awaitOnClosed();
-    }
-}
diff --git a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeSessionRekeyTest.java b/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeSessionRekeyTest.java
deleted file mode 100644
index f954fcd..0000000
--- a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeSessionRekeyTest.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright (C) 2020 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.ipsec.ike.cts;
-
-import static com.android.internal.util.HexDump.hexStringToByteArray;
-
-import android.net.InetAddresses;
-import android.net.LinkAddress;
-import android.net.ipsec.ike.IkeFqdnIdentification;
-import android.net.ipsec.ike.IkeSession;
-import android.net.ipsec.ike.IkeSessionParams;
-import android.net.ipsec.ike.IkeTrafficSelector;
-import android.net.ipsec.ike.cts.IkeTunUtils.PortPair;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.net.InetAddress;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-/**
- * Explicitly test transport mode Child SA so that devices without FEATURE_IPSEC_TUNNELS can be test
- * covered. Tunnel mode Child SA setup has been tested in IkeSessionPskTest. Rekeying process is
- * independent from Child SA mode.
- */
-@RunWith(AndroidJUnit4.class)
-public class IkeSessionRekeyTest extends IkeSessionTestBase {
-    // This value is align with the test vectors hex that are generated in an IPv4 environment
-    private static final IkeTrafficSelector TRANSPORT_MODE_INBOUND_TS =
-            new IkeTrafficSelector(
-                    MIN_PORT,
-                    MAX_PORT,
-                    InetAddresses.parseNumericAddress("172.58.35.40"),
-                    InetAddresses.parseNumericAddress("172.58.35.40"));
-
-    private IkeSession openIkeSessionWithRemoteAddress(InetAddress remoteAddress) {
-        IkeSessionParams ikeParams =
-                new IkeSessionParams.Builder(sContext)
-                        .setNetwork(mTunNetwork)
-                        .setServerHostname(remoteAddress.getHostAddress())
-                        .addSaProposal(SaProposalTest.buildIkeSaProposalWithNormalModeCipher())
-                        .addSaProposal(SaProposalTest.buildIkeSaProposalWithCombinedModeCipher())
-                        .setLocalIdentification(new IkeFqdnIdentification(LOCAL_HOSTNAME))
-                        .setRemoteIdentification(new IkeFqdnIdentification(REMOTE_HOSTNAME))
-                        .setAuthPsk(IKE_PSK)
-                        .build();
-        return new IkeSession(
-                sContext,
-                ikeParams,
-                buildTransportModeChildParamsWithTs(
-                        TRANSPORT_MODE_INBOUND_TS, TRANSPORT_MODE_OUTBOUND_TS),
-                mUserCbExecutor,
-                mIkeSessionCallback,
-                mFirstChildSessionCallback);
-    }
-
-    private byte[] buildInboundPkt(PortPair outPktSrcDestPortPair, String inboundDataHex)
-            throws Exception {
-        // Build inbound packet by flipping the outbound packet addresses and ports
-        return IkeTunUtils.buildIkePacket(
-                mRemoteAddress,
-                mLocalAddress,
-                outPktSrcDestPortPair.dstPort,
-                outPktSrcDestPortPair.srcPort,
-                true /* useEncap */,
-                hexStringToByteArray(inboundDataHex));
-    }
-
-    @Test
-    public void testRekeyIke() throws Exception {
-        final String ikeInitResp =
-                "46B8ECA1E0D72A1866B5248CF6C7472D21202220000000000000015022000030"
-                        + "0000002C010100040300000C0100000C800E0100030000080300000C03000008"
-                        + "0200000500000008040000022800008800020000920D3E830E7276908209212D"
-                        + "E5A7F2A48706CFEF1BE8CB6E3B173B8B4E0D8C2DC626271FF1B13A88619E569E"
-                        + "7B03C3ED2C127390749CDC7CDC711D0A8611E4457FFCBC4F0981B3288FBF58EA"
-                        + "3E8B70E27E76AE70117FBBCB753660ADDA37EB5EB3A81BED6A374CCB7E132C2A"
-                        + "94BFCE402DC76B19C158B533F6B1F2ABF01ACCC329000024B302CA2FB85B6CF4"
-                        + "02313381246E3C53828D787F6DFEA6BD62D6405254AEE6242900001C00004004"
-                        + "7A1682B06B58596533D00324886EF1F20EF276032900001C00004005BF633E31"
-                        + "F9984B29A62E370BB2770FC09BAEA665290000080000402E290000100000402F"
-                        + "00020003000400050000000800004014";
-        final String ikeAuthResp =
-                "46B8ECA1E0D72A1866B5248CF6C7472D2E20232000000001000000F0240000D4"
-                        + "10166CA8647F56123DE74C17FA5E256043ABF73216C812EE32EE1BB01EAF4A82"
-                        + "DC107AB3ADBFEE0DEA5EEE10BDD5D43178F4C975C7C775D252273BB037283C7F"
-                        + "236FE34A6BCE4833816897075DB2055B9FFD66DFA45A0A89A8F70AFB59431EED"
-                        + "A20602FB614369D12906D3355CF7298A5D25364ABBCC75A9D88E0E6581449FCD"
-                        + "4E361A39E00EFD1FD0A69651F63DB46C12470226AA21BA5EFF48FAF0B6DDF61C"
-                        + "B0A69392CE559495EEDB4D1C1D80688434D225D57210A424C213F7C993D8A456"
-                        + "38153FBD194C5E247B592D1D048DB4C8";
-        final String rekeyIkeCreateReq =
-                "46B8ECA1E0D72A1866B5248CF6C7472D2E202400000000000000013021000114"
-                        + "13743670039E308A8409BA5FD47B67F956B36FEE88AC3B70BB5D789B8218A135"
-                        + "1B3D83E260E87B3EDB1BF064F09D4DC2611AEDBC99951B4B2DE767BD4AA2ACC3"
-                        + "3653549CFC66B75869DF003CDC9A137A9CC27776AD5732B34203E74BE8CA4858"
-                        + "1D5C0D9C9CA52D680EB299B4B21C7FA25FFEE174D57015E0FF2EAED653AAD95C"
-                        + "071ABE269A8C2C9FBC1188E07550EB992F910D4CA9689E44BA66DE0FABB2BDF9"
-                        + "8DD377186DBB25EF9B68B027BB2A27981779D8303D88D7CE860010A42862D50B"
-                        + "1E0DBFD3D27C36F14809D7F493B2B96A65534CF98B0C32AD5219AD77F681AC04"
-                        + "9D5CB89A0230A91A243FA7F16251B0D9B4B65E7330BEEAC9663EF4578991EAC8"
-                        + "46C19EBB726E7D113F1D0D601102C05E";
-        final String rekeyIkeDeleteReq =
-                "46B8ECA1E0D72A1866B5248CF6C7472D2E20250000000001000000502A000034"
-                        + "02E40C0C7B1ED977729F705BB9B643FAC513A1070A6EB28ECD2AEA8A441ADC05"
-                        + "7841382A7967BBF116AE52496590B2AD";
-        final String deleteIkeReq =
-                "7D3DEDC65407D1FC9361C8CF8C47162A2E20250800000000000000502A000034"
-                        + "201915C9E4E9173AA9EE79F3E02FE2D4954B22085C66D164762C34D347C16E9F"
-                        + "FC5F7F114428C54D8D915860C57B1BC1";
-        final long newIkeDeterministicInitSpi = Long.parseLong("7D3DEDC65407D1FC", 16);
-
-        // Open IKE Session
-        IkeSession ikeSession = openIkeSessionWithRemoteAddress(mRemoteAddress);
-        PortPair localRemotePorts = performSetupIkeAndFirstChildBlocking(ikeInitResp, ikeAuthResp);
-
-        // Local request message ID starts from 2 because there is one IKE_INIT message and a single
-        // IKE_AUTH message.
-        int expectedReqMsgId = 2;
-        int expectedRespMsgId = 0;
-
-        verifyIkeSessionSetupBlocking();
-        verifyChildSessionSetupBlocking(
-                mFirstChildSessionCallback,
-                Arrays.asList(TRANSPORT_MODE_INBOUND_TS),
-                Arrays.asList(TRANSPORT_MODE_OUTBOUND_TS),
-                new ArrayList<LinkAddress>());
-        IpSecTransformCallRecord firstTransformRecordA =
-                mFirstChildSessionCallback.awaitNextCreatedIpSecTransform();
-        IpSecTransformCallRecord firstTransformRecordB =
-                mFirstChildSessionCallback.awaitNextCreatedIpSecTransform();
-        verifyCreateIpSecTransformPair(firstTransformRecordA, firstTransformRecordB);
-
-        // Inject rekey IKE requests
-        mTunUtils.injectPacket(buildInboundPkt(localRemotePorts, rekeyIkeCreateReq));
-        mTunUtils.awaitResp(
-                IKE_DETERMINISTIC_INITIATOR_SPI, expectedRespMsgId++, true /* expectedUseEncap */);
-        mTunUtils.injectPacket(buildInboundPkt(localRemotePorts, rekeyIkeDeleteReq));
-        mTunUtils.awaitResp(
-                IKE_DETERMINISTIC_INITIATOR_SPI, expectedRespMsgId++, true /* expectedUseEncap */);
-
-        // IKE has been rekeyed, reset message IDs
-        expectedReqMsgId = 0;
-        expectedRespMsgId = 0;
-
-        // Inject delete IKE request
-        mTunUtils.injectPacket(buildInboundPkt(localRemotePorts, deleteIkeReq));
-        mTunUtils.awaitResp(
-                newIkeDeterministicInitSpi, expectedRespMsgId++, true /* expectedUseEncap */);
-
-        verifyDeleteIpSecTransformPair(
-                mFirstChildSessionCallback, firstTransformRecordA, firstTransformRecordB);
-        mFirstChildSessionCallback.awaitOnClosed();
-        mIkeSessionCallback.awaitOnClosed();
-    }
-
-    @Test
-    public void testRekeyTransportModeChildSa() throws Exception {
-        final String ikeInitResp =
-                "46B8ECA1E0D72A18CECD871146CF83A121202220000000000000015022000030"
-                        + "0000002C010100040300000C0100000C800E0100030000080300000C03000008"
-                        + "0200000500000008040000022800008800020000C4904458957746BCF1C12972"
-                        + "1D4E19EB8A584F78DE673053396D167CE0F34552DBC69BA63FE7C673B4CF4A99"
-                        + "62481518EE985357876E8C47BAAA0DBE9C40AE47B12E52165874703586E8F786"
-                        + "045F72EEEB238C5D1823352BED44B71B3214609276ADC0B3D42DAC820168C4E2"
-                        + "660730DAAC92492403288805EBB9053F1AB060DA290000242D9364ACB93519FF"
-                        + "8F8B019BAA43A40D699F59714B327B8382216EF427ED52282900001C00004004"
-                        + "06D91438A0D6B734E152F76F5CC55A72A2E38A0A2900001C000040052EFF78B3"
-                        + "55B37F3CE75AFF26C721B050F892C0D6290000080000402E290000100000402F"
-                        + "00020003000400050000000800004014";
-        final String ikeAuthResp =
-                "46B8ECA1E0D72A18CECD871146CF83A12E20232000000001000000F0240000D4"
-                        + "A17BC258BA2714CF536663639DD5F665A60C75E93557CD5141990A8CEEDD2017"
-                        + "93F5B181C8569FBCD6C2A00198EC2B62D42BEFAC016B8B6BF6A7BC9CEDE3413A"
-                        + "6C495A6B8EC941864DC3E08F57D015EA6520C4B05884960B85478FCA53DA5F17"
-                        + "9628BB1097DA77461C71837207A9EB80720B3E6E661816EE4E14AC995B5E8441"
-                        + "A4C3F9097CC148142BA300076C94A23EC4ADE82B1DD2B121F7E9102860A8C3BF"
-                        + "58DDC207285A3176E924C44DE820322524E1AA438EFDFBA781B36084AED80846"
-                        + "3B77FCED9682B6E4E476408EF3F1037E";
-        final String rekeyChildCreateReq =
-                "46B8ECA1E0D72A18CECD871146CF83A12E202400000000000000015029000134"
-                        + "319D74B6B155B86942143CEC1D29D21F073F24B7BEDC9BFE0F0FDD8BDB5458C0"
-                        + "8DB93506E1A43DD0640FE7370C97F9B34FF4EC9B2DB7257A87B75632301FB68A"
-                        + "86B54871249534CA3D01C9BEB127B669F46470E1C8AAF72574C3CEEC15B901CF"
-                        + "5A0D6ADAE59C3CA64AC8C86689C860FAF9500E608DFE63F2DCD30510FD6FFCD5"
-                        + "A50838574132FD1D069BCACD4C7BAF45C9B1A7689FAD132E3F56DBCFAF905A8C"
-                        + "4145D4BA1B74A54762F8F43308D94DE05649C49D885121CE30681D51AC1E3E68"
-                        + "AB82F9A19B99579AFE257F32DBD1037814DA577379E4F42DEDAC84502E49C933"
-                        + "9EA83F6F5DB4401B660CB1681B023B8603D205DFDD1DE86AD8DE22B6B754F30D"
-                        + "05EAE81A709C2CEE81386133DC3DC7B5EF8F166E48E54A0722DD0C64F4D00638"
-                        + "40F272144C47F6ECED72A248180645DB";
-        final String rekeyChildDeleteReq =
-                "46B8ECA1E0D72A18CECD871146CF83A12E20250000000001000000502A000034"
-                        + "02D98DAF0432EBD991CA4F2D89C1E0EFABC6E91A3327A85D8914FB2F1485BE1B"
-                        + "8D3415D548F7CE0DC4224E7E9D0D3355";
-        final String deleteIkeReq =
-                "46B8ECA1E0D72A18CECD871146CF83A12E20250000000002000000502A000034"
-                        + "095041F4026B4634F04B0AB4F9349484F7BE9AEF03E3733EEE293330043B75D2"
-                        + "ABF5F965ED51127629585E1B1BBA787F";
-
-        // Open IKE Session
-        IkeSession ikeSession = openIkeSessionWithRemoteAddress(mRemoteAddress);
-        PortPair localRemotePorts = performSetupIkeAndFirstChildBlocking(ikeInitResp, ikeAuthResp);
-
-        // IKE INIT and IKE AUTH takes two exchanges. Local request message ID starts from 2
-        int expectedReqMsgId = 2;
-        int expectedRespMsgId = 0;
-
-        verifyIkeSessionSetupBlocking();
-        verifyChildSessionSetupBlocking(
-                mFirstChildSessionCallback,
-                Arrays.asList(TRANSPORT_MODE_INBOUND_TS),
-                Arrays.asList(TRANSPORT_MODE_OUTBOUND_TS),
-                new ArrayList<LinkAddress>());
-        IpSecTransformCallRecord oldTransformRecordA =
-                mFirstChildSessionCallback.awaitNextCreatedIpSecTransform();
-        IpSecTransformCallRecord oldTransformRecordB =
-                mFirstChildSessionCallback.awaitNextCreatedIpSecTransform();
-        verifyCreateIpSecTransformPair(oldTransformRecordA, oldTransformRecordB);
-
-        // Inject rekey Child requests
-        mTunUtils.injectPacket(buildInboundPkt(localRemotePorts, rekeyChildCreateReq));
-        mTunUtils.awaitResp(
-                IKE_DETERMINISTIC_INITIATOR_SPI, expectedRespMsgId++, true /* expectedUseEncap */);
-        mTunUtils.injectPacket(buildInboundPkt(localRemotePorts, rekeyChildDeleteReq));
-        mTunUtils.awaitResp(
-                IKE_DETERMINISTIC_INITIATOR_SPI, expectedRespMsgId++, true /* expectedUseEncap */);
-
-        // Verify IpSecTransforms are renewed
-        IpSecTransformCallRecord newTransformRecordA =
-                mFirstChildSessionCallback.awaitNextCreatedIpSecTransform();
-        IpSecTransformCallRecord newTransformRecordB =
-                mFirstChildSessionCallback.awaitNextCreatedIpSecTransform();
-        verifyCreateIpSecTransformPair(newTransformRecordA, newTransformRecordB);
-        verifyDeleteIpSecTransformPair(
-                mFirstChildSessionCallback, oldTransformRecordA, oldTransformRecordB);
-
-        // Inject delete IKE request
-        mTunUtils.injectPacket(buildInboundPkt(localRemotePorts, deleteIkeReq));
-        mTunUtils.awaitResp(
-                IKE_DETERMINISTIC_INITIATOR_SPI, expectedRespMsgId++, true /* expectedUseEncap */);
-
-        verifyDeleteIpSecTransformPair(
-                mFirstChildSessionCallback, newTransformRecordA, newTransformRecordB);
-        mFirstChildSessionCallback.awaitOnClosed();
-        mIkeSessionCallback.awaitOnClosed();
-    }
-}
diff --git a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeSessionTestBase.java b/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeSessionTestBase.java
deleted file mode 100644
index a81063b..0000000
--- a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeSessionTestBase.java
+++ /dev/null
@@ -1,598 +0,0 @@
-/*
- * Copyright (C) 2020 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
- *
- * 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.ipsec.ike.cts;
-
-import static android.net.ipsec.ike.IkeSessionConfiguration.EXTENSION_TYPE_FRAGMENTATION;
-import static android.system.OsConstants.AF_INET;
-import static android.system.OsConstants.AF_INET6;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import android.annotation.NonNull;
-import android.app.AppOpsManager;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.net.ConnectivityManager;
-import android.net.InetAddresses;
-import android.net.IpSecManager;
-import android.net.IpSecTransform;
-import android.net.LinkAddress;
-import android.net.Network;
-import android.net.TestNetworkInterface;
-import android.net.TestNetworkManager;
-import android.net.annotations.PolicyDirection;
-import android.net.ipsec.ike.ChildSessionCallback;
-import android.net.ipsec.ike.ChildSessionConfiguration;
-import android.net.ipsec.ike.IkeSessionCallback;
-import android.net.ipsec.ike.IkeSessionConfiguration;
-import android.net.ipsec.ike.IkeSessionConnectionInfo;
-import android.net.ipsec.ike.IkeTrafficSelector;
-import android.net.ipsec.ike.TransportModeChildSessionParams;
-import android.net.ipsec.ike.TunnelModeChildSessionParams;
-import android.net.ipsec.ike.cts.IkeTunUtils.PortPair;
-import android.net.ipsec.ike.cts.TestNetworkUtils.TestNetworkCallback;
-import android.net.ipsec.ike.exceptions.IkeException;
-import android.net.ipsec.ike.exceptions.IkeProtocolException;
-import android.os.Binder;
-import android.os.ParcelFileDescriptor;
-import android.platform.test.annotations.AppModeFull;
-
-import androidx.test.InstrumentationRegistry;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.compatibility.common.util.SystemUtil;
-import com.android.testutils.ArrayTrackRecord;
-
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.runner.RunWith;
-
-import java.net.Inet4Address;
-import java.net.InetAddress;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Package private base class for testing IkeSessionParams and IKE exchanges.
- *
- * <p>Subclasses MUST explicitly call #setUpTestNetwork and #tearDownTestNetwork to be able to use
- * the test network
- *
- * <p>All IKE Sessions running in test mode will generate SPIs deterministically. That is to say
- * each IKE Session will always generate the same IKE INIT SPI and test vectors are generated based
- * on this deterministic IKE SPI. Each test will use different local and remote addresses to avoid
- * the case that the next test try to allocate the same SPI before the previous test has released
- * it, since SPI resources are not released in testing thread. Similarly, each test MUST use
- * different Network instances to avoid sharing the same IkeSocket and hitting IKE SPI collision.
- */
-@RunWith(AndroidJUnit4.class)
-@AppModeFull(reason = "MANAGE_TEST_NETWORKS permission can't be granted to instant apps")
-abstract class IkeSessionTestBase extends IkeTestBase {
-    // Package-wide common expected results that will be shared by all IKE/Child SA creation tests
-    static final String EXPECTED_REMOTE_APP_VERSION_EMPTY = "";
-    static final byte[] EXPECTED_PROTOCOL_ERROR_DATA_NONE = new byte[0];
-
-    static final InetAddress EXPECTED_DNS_SERVERS_ONE =
-            InetAddresses.parseNumericAddress("8.8.8.8");
-    static final InetAddress EXPECTED_DNS_SERVERS_TWO =
-            InetAddresses.parseNumericAddress("8.8.4.4");
-
-    static final InetAddress EXPECTED_INTERNAL_ADDR =
-            InetAddresses.parseNumericAddress("198.51.100.10");
-    static final LinkAddress EXPECTED_INTERNAL_LINK_ADDR =
-            new LinkAddress(EXPECTED_INTERNAL_ADDR, IP4_PREFIX_LEN);
-    static final InetAddress EXPECTED_INTERNAL_ADDR_V6 =
-            InetAddresses.parseNumericAddress("2001:db8::2");
-    static final LinkAddress EXPECTED_INTERNAL_LINK_ADDR_V6 =
-            new LinkAddress(EXPECTED_INTERNAL_ADDR_V6, IP6_PREFIX_LEN);
-
-    static final IkeTrafficSelector TUNNEL_MODE_INBOUND_TS =
-            new IkeTrafficSelector(
-                    MIN_PORT, MAX_PORT, EXPECTED_INTERNAL_ADDR, EXPECTED_INTERNAL_ADDR);
-    static final IkeTrafficSelector TUNNEL_MODE_OUTBOUND_TS = DEFAULT_V4_TS;
-    static final IkeTrafficSelector TUNNEL_MODE_INBOUND_TS_V6 =
-            new IkeTrafficSelector(
-                    MIN_PORT, MAX_PORT, EXPECTED_INTERNAL_ADDR_V6, EXPECTED_INTERNAL_ADDR_V6);
-    static final IkeTrafficSelector TUNNEL_MODE_OUTBOUND_TS_V6 = DEFAULT_V6_TS;
-
-    // This value is align with the test vectors hex that are generated in an IPv4 environment
-    static final IkeTrafficSelector TRANSPORT_MODE_OUTBOUND_TS =
-            new IkeTrafficSelector(
-                    MIN_PORT,
-                    MAX_PORT,
-                    InetAddresses.parseNumericAddress("10.138.0.2"),
-                    InetAddresses.parseNumericAddress("10.138.0.2"));
-
-    static final long IKE_DETERMINISTIC_INITIATOR_SPI = Long.parseLong("46B8ECA1E0D72A18", 16);
-
-    // Static state to reduce setup/teardown
-    static Context sContext = InstrumentationRegistry.getContext();
-    static ConnectivityManager sCM =
-            (ConnectivityManager) sContext.getSystemService(Context.CONNECTIVITY_SERVICE);
-    static TestNetworkManager sTNM;
-
-    private static final int TIMEOUT_MS = 500;
-
-    // Constants to be used for providing different IP addresses for each tests
-    private static final byte IP_ADDR_LAST_BYTE_MAX = (byte) 100;
-    private static final byte[] INITIAL_AVAILABLE_IP4_ADDR_LOCAL =
-            InetAddresses.parseNumericAddress("192.0.2.1").getAddress();
-    private static final byte[] INITIAL_AVAILABLE_IP4_ADDR_REMOTE =
-            InetAddresses.parseNumericAddress("198.51.100.1").getAddress();
-    private static final byte[] NEXT_AVAILABLE_IP4_ADDR_LOCAL = INITIAL_AVAILABLE_IP4_ADDR_LOCAL;
-    private static final byte[] NEXT_AVAILABLE_IP4_ADDR_REMOTE = INITIAL_AVAILABLE_IP4_ADDR_REMOTE;
-
-    ParcelFileDescriptor mTunFd;
-    TestNetworkCallback mTunNetworkCallback;
-    Network mTunNetwork;
-    IkeTunUtils mTunUtils;
-
-    InetAddress mLocalAddress;
-    InetAddress mRemoteAddress;
-
-    Executor mUserCbExecutor;
-    TestIkeSessionCallback mIkeSessionCallback;
-    TestChildSessionCallback mFirstChildSessionCallback;
-
-    // This method is guaranteed to run in subclasses and will run before subclasses' @BeforeClass
-    // methods.
-    @BeforeClass
-    public static void setUpPermissionBeforeClass() throws Exception {
-        InstrumentationRegistry.getInstrumentation()
-                .getUiAutomation()
-                .adoptShellPermissionIdentity();
-        sTNM = sContext.getSystemService(TestNetworkManager.class);
-    }
-
-    // This method is guaranteed to run in subclasses and will run after subclasses' @AfterClass
-    // methods.
-    @AfterClass
-    public static void tearDownPermissionAfterClass() throws Exception {
-        InstrumentationRegistry.getInstrumentation()
-                .getUiAutomation()
-                .dropShellPermissionIdentity();
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        mLocalAddress = getNextAvailableIpv4AddressLocal();
-        mRemoteAddress = getNextAvailableIpv4AddressRemote();
-        setUpTestNetwork(mLocalAddress);
-
-        mUserCbExecutor = Executors.newSingleThreadExecutor();
-        mIkeSessionCallback = new TestIkeSessionCallback();
-        mFirstChildSessionCallback = new TestChildSessionCallback();
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        tearDownTestNetwork();
-    }
-
-    void setUpTestNetwork(InetAddress localAddr) throws Exception {
-        int prefixLen = localAddr instanceof Inet4Address ? IP4_PREFIX_LEN : IP6_PREFIX_LEN;
-
-        TestNetworkInterface testIface =
-                sTNM.createTunInterface(new LinkAddress[] {new LinkAddress(localAddr, prefixLen)});
-
-        mTunFd = testIface.getFileDescriptor();
-        mTunNetworkCallback =
-                TestNetworkUtils.setupAndGetTestNetwork(
-                        sCM, sTNM, testIface.getInterfaceName(), new Binder());
-        mTunNetwork = mTunNetworkCallback.getNetworkBlocking();
-        mTunUtils = new IkeTunUtils(mTunFd);
-    }
-
-    void tearDownTestNetwork() throws Exception {
-        sCM.unregisterNetworkCallback(mTunNetworkCallback);
-
-        sTNM.teardownTestNetwork(mTunNetwork);
-        mTunFd.close();
-    }
-
-    static void setAppOp(int appop, boolean allow) {
-        String opName = AppOpsManager.opToName(appop);
-        for (String pkg : new String[] {"com.android.shell", sContext.getPackageName()}) {
-            String cmd =
-                    String.format(
-                            "appops set %s %s %s",
-                            pkg, // Package name
-                            opName, // Appop
-                            (allow ? "allow" : "deny")); // Action
-
-            SystemUtil.runShellCommand(cmd);
-        }
-    }
-
-    Inet4Address getNextAvailableIpv4AddressLocal() throws Exception {
-        return (Inet4Address)
-                getNextAvailableAddress(
-                        NEXT_AVAILABLE_IP4_ADDR_LOCAL,
-                        INITIAL_AVAILABLE_IP4_ADDR_LOCAL,
-                        false /* isIp6 */);
-    }
-
-    Inet4Address getNextAvailableIpv4AddressRemote() throws Exception {
-        return (Inet4Address)
-                getNextAvailableAddress(
-                        NEXT_AVAILABLE_IP4_ADDR_REMOTE,
-                        INITIAL_AVAILABLE_IP4_ADDR_REMOTE,
-                        false /* isIp6 */);
-    }
-
-    InetAddress getNextAvailableAddress(
-            byte[] nextAddressBytes, byte[] initialAddressBytes, boolean isIp6) throws Exception {
-        int addressLen = isIp6 ? IP6_ADDRESS_LEN : IP4_ADDRESS_LEN;
-
-        synchronized (nextAddressBytes) {
-            if (nextAddressBytes[addressLen - 1] == IP_ADDR_LAST_BYTE_MAX) {
-                resetNextAvailableAddress(nextAddressBytes, initialAddressBytes);
-            }
-
-            InetAddress address = InetAddress.getByAddress(nextAddressBytes);
-            nextAddressBytes[addressLen - 1]++;
-            return address;
-        }
-    }
-
-    private void resetNextAvailableAddress(byte[] nextAddressBytes, byte[] initialAddressBytes) {
-        synchronized (nextAddressBytes) {
-            System.arraycopy(
-                    nextAddressBytes, 0, initialAddressBytes, 0, initialAddressBytes.length);
-        }
-    }
-
-    TransportModeChildSessionParams buildTransportModeChildParamsWithTs(
-            IkeTrafficSelector inboundTs, IkeTrafficSelector outboundTs) {
-        return new TransportModeChildSessionParams.Builder()
-                .addSaProposal(SaProposalTest.buildChildSaProposalWithCombinedModeCipher())
-                .addSaProposal(SaProposalTest.buildChildSaProposalWithNormalModeCipher())
-                .addInboundTrafficSelectors(inboundTs)
-                .addOutboundTrafficSelectors(outboundTs)
-                .build();
-    }
-
-    TransportModeChildSessionParams buildTransportModeChildParamsWithDefaultTs() {
-        return new TransportModeChildSessionParams.Builder()
-                .addSaProposal(SaProposalTest.buildChildSaProposalWithCombinedModeCipher())
-                .addSaProposal(SaProposalTest.buildChildSaProposalWithNormalModeCipher())
-                .build();
-    }
-
-    TunnelModeChildSessionParams buildTunnelModeChildSessionParams() {
-        return new TunnelModeChildSessionParams.Builder()
-                .addSaProposal(SaProposalTest.buildChildSaProposalWithNormalModeCipher())
-                .addSaProposal(SaProposalTest.buildChildSaProposalWithCombinedModeCipher())
-                .addInternalAddressRequest(AF_INET)
-                .addInternalAddressRequest(AF_INET6)
-                .build();
-    }
-
-    PortPair performSetupIkeAndFirstChildBlocking(String ikeInitRespHex, String... ikeAuthRespHexes)
-            throws Exception {
-        return performSetupIkeAndFirstChildBlocking(
-                ikeInitRespHex,
-                1 /* expectedAuthReqPktCnt */,
-                true /*expectedAuthUseEncap*/,
-                ikeAuthRespHexes);
-    }
-
-    PortPair performSetupIkeAndFirstChildBlocking(
-            String ikeInitRespHex, boolean expectedAuthUseEncap, String... ikeAuthRespHexes)
-            throws Exception {
-        return performSetupIkeAndFirstChildBlocking(
-                ikeInitRespHex,
-                1 /* expectedAuthReqPktCnt */,
-                expectedAuthUseEncap,
-                ikeAuthRespHexes);
-    }
-
-    PortPair performSetupIkeAndFirstChildBlocking(
-            String ikeInitRespHex,
-            int expectedAuthReqPktCnt,
-            boolean expectedAuthUseEncap,
-            String... ikeAuthRespHexes)
-            throws Exception {
-        mTunUtils.awaitReqAndInjectResp(
-                IKE_DETERMINISTIC_INITIATOR_SPI,
-                0 /* expectedMsgId */,
-                false /* expectedUseEncap */,
-                ikeInitRespHex);
-
-        byte[] ikeAuthReqPkt =
-                mTunUtils
-                        .awaitReqAndInjectResp(
-                                IKE_DETERMINISTIC_INITIATOR_SPI,
-                                1 /* expectedMsgId */,
-                                expectedAuthUseEncap,
-                                expectedAuthReqPktCnt,
-                                ikeAuthRespHexes)
-                        .get(0);
-        return IkeTunUtils.getSrcDestPortPair(ikeAuthReqPkt);
-    }
-
-    void performCloseIkeBlocking(int expectedMsgId, String deleteIkeRespHex) throws Exception {
-        performCloseIkeBlocking(expectedMsgId, true /* expectedUseEncap*/, deleteIkeRespHex);
-    }
-
-    void performCloseIkeBlocking(
-            int expectedMsgId, boolean expectedUseEncap, String deleteIkeRespHex) throws Exception {
-        mTunUtils.awaitReqAndInjectResp(
-                IKE_DETERMINISTIC_INITIATOR_SPI, expectedMsgId, expectedUseEncap, deleteIkeRespHex);
-    }
-
-    /** Testing callback that allows caller to block current thread until a method get called */
-    static class TestIkeSessionCallback implements IkeSessionCallback {
-        private CompletableFuture<IkeSessionConfiguration> mFutureIkeConfig =
-                new CompletableFuture<>();
-        private CompletableFuture<Boolean> mFutureOnClosedCall = new CompletableFuture<>();
-        private CompletableFuture<IkeException> mFutureOnClosedException =
-                new CompletableFuture<>();
-
-        private int mOnErrorExceptionsCount = 0;
-        private ArrayTrackRecord<IkeProtocolException> mOnErrorExceptionsTrackRecord =
-                new ArrayTrackRecord<>();
-
-        @Override
-        public void onOpened(@NonNull IkeSessionConfiguration sessionConfiguration) {
-            mFutureIkeConfig.complete(sessionConfiguration);
-        }
-
-        @Override
-        public void onClosed() {
-            mFutureOnClosedCall.complete(true /* unused */);
-        }
-
-        @Override
-        public void onClosedExceptionally(@NonNull IkeException exception) {
-            mFutureOnClosedException.complete(exception);
-        }
-
-        @Override
-        public void onError(@NonNull IkeProtocolException exception) {
-            mOnErrorExceptionsTrackRecord.add(exception);
-        }
-
-        public IkeSessionConfiguration awaitIkeConfig() throws Exception {
-            return mFutureIkeConfig.get(TIMEOUT_MS, TimeUnit.MILLISECONDS);
-        }
-
-        public IkeException awaitOnClosedException() throws Exception {
-            return mFutureOnClosedException.get(TIMEOUT_MS, TimeUnit.MILLISECONDS);
-        }
-
-        public IkeProtocolException awaitNextOnErrorException() {
-            return mOnErrorExceptionsTrackRecord.poll(
-                    (long) TIMEOUT_MS,
-                    mOnErrorExceptionsCount++,
-                    (transform) -> {
-                        return true;
-                    });
-        }
-
-        public void awaitOnClosed() throws Exception {
-            mFutureOnClosedCall.get(TIMEOUT_MS, TimeUnit.MILLISECONDS);
-        }
-    }
-
-    /** Testing callback that allows caller to block current thread until a method get called */
-    static class TestChildSessionCallback implements ChildSessionCallback {
-        private CompletableFuture<ChildSessionConfiguration> mFutureChildConfig =
-                new CompletableFuture<>();
-        private CompletableFuture<Boolean> mFutureOnClosedCall = new CompletableFuture<>();
-        private CompletableFuture<IkeException> mFutureOnClosedException =
-                new CompletableFuture<>();
-
-        private int mCreatedIpSecTransformCount = 0;
-        private int mDeletedIpSecTransformCount = 0;
-        private ArrayTrackRecord<IpSecTransformCallRecord> mCreatedIpSecTransformsTrackRecord =
-                new ArrayTrackRecord<>();
-        private ArrayTrackRecord<IpSecTransformCallRecord> mDeletedIpSecTransformsTrackRecord =
-                new ArrayTrackRecord<>();
-
-        @Override
-        public void onOpened(@NonNull ChildSessionConfiguration sessionConfiguration) {
-            mFutureChildConfig.complete(sessionConfiguration);
-        }
-
-        @Override
-        public void onClosed() {
-            mFutureOnClosedCall.complete(true /* unused */);
-        }
-
-        @Override
-        public void onClosedExceptionally(@NonNull IkeException exception) {
-            mFutureOnClosedException.complete(exception);
-        }
-
-        @Override
-        public void onIpSecTransformCreated(@NonNull IpSecTransform ipSecTransform, int direction) {
-            mCreatedIpSecTransformsTrackRecord.add(
-                    new IpSecTransformCallRecord(ipSecTransform, direction));
-        }
-
-        @Override
-        public void onIpSecTransformDeleted(@NonNull IpSecTransform ipSecTransform, int direction) {
-            mDeletedIpSecTransformsTrackRecord.add(
-                    new IpSecTransformCallRecord(ipSecTransform, direction));
-        }
-
-        public ChildSessionConfiguration awaitChildConfig() throws Exception {
-            return mFutureChildConfig.get(TIMEOUT_MS, TimeUnit.MILLISECONDS);
-        }
-
-        public IkeException awaitOnClosedException() throws Exception {
-            return mFutureOnClosedException.get(TIMEOUT_MS, TimeUnit.MILLISECONDS);
-        }
-
-        public IpSecTransformCallRecord awaitNextCreatedIpSecTransform() {
-            return mCreatedIpSecTransformsTrackRecord.poll(
-                    (long) TIMEOUT_MS,
-                    mCreatedIpSecTransformCount++,
-                    (transform) -> {
-                        return true;
-                    });
-        }
-
-        public IpSecTransformCallRecord awaitNextDeletedIpSecTransform() {
-            return mDeletedIpSecTransformsTrackRecord.poll(
-                    (long) TIMEOUT_MS,
-                    mDeletedIpSecTransformCount++,
-                    (transform) -> {
-                        return true;
-                    });
-        }
-
-        public void awaitOnClosed() throws Exception {
-            mFutureOnClosedCall.get(TIMEOUT_MS, TimeUnit.MILLISECONDS);
-        }
-    }
-
-    /**
-     * This class represents a created or deleted IpSecTransfrom that is provided by
-     * ChildSessionCallback
-     */
-    static class IpSecTransformCallRecord {
-        public final IpSecTransform ipSecTransform;
-        public final int direction;
-
-        IpSecTransformCallRecord(IpSecTransform ipSecTransform, @PolicyDirection int direction) {
-            this.ipSecTransform = ipSecTransform;
-            this.direction = direction;
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(ipSecTransform, direction);
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (!(o instanceof IpSecTransformCallRecord)) return false;
-
-            IpSecTransformCallRecord record = (IpSecTransformCallRecord) o;
-            return ipSecTransform.equals(record.ipSecTransform) && direction == record.direction;
-        }
-    }
-
-    void verifyIkeSessionSetupBlocking() throws Exception {
-        IkeSessionConfiguration ikeConfig = mIkeSessionCallback.awaitIkeConfig();
-        assertNotNull(ikeConfig);
-        assertEquals(EXPECTED_REMOTE_APP_VERSION_EMPTY, ikeConfig.getRemoteApplicationVersion());
-        assertTrue(ikeConfig.getRemoteVendorIds().isEmpty());
-        assertTrue(ikeConfig.getPcscfServers().isEmpty());
-        assertTrue(ikeConfig.isIkeExtensionEnabled(EXTENSION_TYPE_FRAGMENTATION));
-
-        IkeSessionConnectionInfo ikeConnectInfo = ikeConfig.getIkeSessionConnectionInfo();
-        assertNotNull(ikeConnectInfo);
-        assertEquals(mLocalAddress, ikeConnectInfo.getLocalAddress());
-        assertEquals(mRemoteAddress, ikeConnectInfo.getRemoteAddress());
-        assertEquals(mTunNetwork, ikeConnectInfo.getNetwork());
-    }
-
-    void verifyChildSessionSetupBlocking(
-            TestChildSessionCallback childCallback,
-            List<IkeTrafficSelector> expectedInboundTs,
-            List<IkeTrafficSelector> expectedOutboundTs,
-            List<LinkAddress> expectedInternalAddresses)
-            throws Exception {
-        verifyChildSessionSetupBlocking(
-                childCallback,
-                expectedInboundTs,
-                expectedOutboundTs,
-                expectedInternalAddresses,
-                new ArrayList<InetAddress>() /* expectedDnsServers */);
-    }
-
-    void verifyChildSessionSetupBlocking(
-            TestChildSessionCallback childCallback,
-            List<IkeTrafficSelector> expectedInboundTs,
-            List<IkeTrafficSelector> expectedOutboundTs,
-            List<LinkAddress> expectedInternalAddresses,
-            List<InetAddress> expectedDnsServers)
-            throws Exception {
-        ChildSessionConfiguration childConfig = childCallback.awaitChildConfig();
-        assertNotNull(childConfig);
-        assertEquals(expectedInboundTs, childConfig.getInboundTrafficSelectors());
-        assertEquals(expectedOutboundTs, childConfig.getOutboundTrafficSelectors());
-        assertEquals(expectedInternalAddresses, childConfig.getInternalAddresses());
-        assertEquals(expectedDnsServers, childConfig.getInternalDnsServers());
-        assertTrue(childConfig.getInternalSubnets().isEmpty());
-        assertTrue(childConfig.getInternalDhcpServers().isEmpty());
-    }
-
-    void verifyCloseIkeAndChildBlocking(
-            IpSecTransformCallRecord expectedTransformRecordA,
-            IpSecTransformCallRecord expectedTransformRecordB)
-            throws Exception {
-        verifyDeleteIpSecTransformPair(
-                mFirstChildSessionCallback, expectedTransformRecordA, expectedTransformRecordB);
-        mFirstChildSessionCallback.awaitOnClosed();
-        mIkeSessionCallback.awaitOnClosed();
-    }
-
-    static void verifyCreateIpSecTransformPair(
-            IpSecTransformCallRecord transformRecordA, IpSecTransformCallRecord transformRecordB) {
-        IpSecTransform transformA = transformRecordA.ipSecTransform;
-        IpSecTransform transformB = transformRecordB.ipSecTransform;
-
-        assertNotNull(transformA);
-        assertNotNull(transformB);
-
-        Set<Integer> expectedDirections = new HashSet<>();
-        expectedDirections.add(IpSecManager.DIRECTION_IN);
-        expectedDirections.add(IpSecManager.DIRECTION_OUT);
-
-        Set<Integer> resultDirections = new HashSet<>();
-        resultDirections.add(transformRecordA.direction);
-        resultDirections.add(transformRecordB.direction);
-
-        assertEquals(expectedDirections, resultDirections);
-    }
-
-    static void verifyDeleteIpSecTransformPair(
-            TestChildSessionCallback childCb,
-            IpSecTransformCallRecord expectedTransformRecordA,
-            IpSecTransformCallRecord expectedTransformRecordB) {
-        Set<IpSecTransformCallRecord> expectedTransforms = new HashSet<>();
-        expectedTransforms.add(expectedTransformRecordA);
-        expectedTransforms.add(expectedTransformRecordB);
-
-        Set<IpSecTransformCallRecord> resultTransforms = new HashSet<>();
-        resultTransforms.add(childCb.awaitNextDeletedIpSecTransform());
-        resultTransforms.add(childCb.awaitNextDeletedIpSecTransform());
-
-        assertEquals(expectedTransforms, resultTransforms);
-    }
-
-    /** Package private method to check if device has IPsec tunnels feature */
-    static boolean hasTunnelsFeature() {
-        return sContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_IPSEC_TUNNELS);
-    }
-
-    // TODO(b/148689509): Verify hostname based creation
-}
diff --git a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeTestBase.java b/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeTestBase.java
deleted file mode 100644
index c70e537..0000000
--- a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeTestBase.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2020 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.ipsec.ike.cts;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import android.net.InetAddresses;
-import android.net.ipsec.ike.IkeTrafficSelector;
-
-import java.net.Inet4Address;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/** Shared parameters and util methods for testing different components of IKE */
-abstract class IkeTestBase {
-    static final int MIN_PORT = 0;
-    static final int MAX_PORT = 65535;
-    private static final int INBOUND_TS_START_PORT = MIN_PORT;
-    private static final int INBOUND_TS_END_PORT = 65520;
-    private static final int OUTBOUND_TS_START_PORT = 16;
-    private static final int OUTBOUND_TS_END_PORT = MAX_PORT;
-
-    static final int IP4_ADDRESS_LEN = 4;
-    static final int IP6_ADDRESS_LEN = 16;
-    static final int IP4_PREFIX_LEN = 32;
-    static final int IP6_PREFIX_LEN = 64;
-
-    static final byte[] IKE_PSK = "ikeAndroidPsk".getBytes();
-
-    static final String LOCAL_HOSTNAME = "client.test.ike.android.net";
-    static final String REMOTE_HOSTNAME = "server.test.ike.android.net";
-    static final String LOCAL_ASN1_DN_STRING = "CN=client.test.ike.android.net, O=Android, C=US";
-    static final String LOCAL_RFC822_NAME = "client.test.ike@example.com";
-    static final byte[] LOCAL_KEY_ID = "Local Key ID".getBytes();
-
-    static final int SUB_ID = 1;
-    static final byte[] EAP_IDENTITY = "test@android.net".getBytes();
-    static final String NETWORK_NAME = "android.net";
-    static final String EAP_MSCHAPV2_USERNAME = "mschapv2user";
-    static final String EAP_MSCHAPV2_PASSWORD = "password";
-
-    static final Inet4Address IPV4_ADDRESS_LOCAL =
-            (Inet4Address) (InetAddresses.parseNumericAddress("192.0.2.100"));
-    static final Inet4Address IPV4_ADDRESS_REMOTE =
-            (Inet4Address) (InetAddresses.parseNumericAddress("198.51.100.100"));
-    static final Inet6Address IPV6_ADDRESS_LOCAL =
-            (Inet6Address) (InetAddresses.parseNumericAddress("2001:db8::100"));
-    static final Inet6Address IPV6_ADDRESS_REMOTE =
-            (Inet6Address) (InetAddresses.parseNumericAddress("2001:db8:255::100"));
-
-    static final InetAddress PCSCF_IPV4_ADDRESS_1 = InetAddresses.parseNumericAddress("192.0.2.1");
-    static final InetAddress PCSCF_IPV4_ADDRESS_2 = InetAddresses.parseNumericAddress("192.0.2.2");
-    static final InetAddress PCSCF_IPV6_ADDRESS_1 =
-            InetAddresses.parseNumericAddress("2001:DB8::1");
-    static final InetAddress PCSCF_IPV6_ADDRESS_2 =
-            InetAddresses.parseNumericAddress("2001:DB8::2");
-
-    static final IkeTrafficSelector DEFAULT_V4_TS =
-            new IkeTrafficSelector(
-                    MIN_PORT,
-                    MAX_PORT,
-                    InetAddresses.parseNumericAddress("0.0.0.0"),
-                    InetAddresses.parseNumericAddress("255.255.255.255"));
-    static final IkeTrafficSelector DEFAULT_V6_TS =
-            new IkeTrafficSelector(
-                    MIN_PORT,
-                    MAX_PORT,
-                    InetAddresses.parseNumericAddress("::"),
-                    InetAddresses.parseNumericAddress("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"));
-    static final IkeTrafficSelector INBOUND_V4_TS =
-            new IkeTrafficSelector(
-                    INBOUND_TS_START_PORT,
-                    INBOUND_TS_END_PORT,
-                    InetAddresses.parseNumericAddress("192.0.2.10"),
-                    InetAddresses.parseNumericAddress("192.0.2.20"));
-    static final IkeTrafficSelector OUTBOUND_V4_TS =
-            new IkeTrafficSelector(
-                    OUTBOUND_TS_START_PORT,
-                    OUTBOUND_TS_END_PORT,
-                    InetAddresses.parseNumericAddress("198.51.100.0"),
-                    InetAddresses.parseNumericAddress("198.51.100.255"));
-
-    static final IkeTrafficSelector INBOUND_V6_TS =
-            new IkeTrafficSelector(
-                    INBOUND_TS_START_PORT,
-                    INBOUND_TS_END_PORT,
-                    InetAddresses.parseNumericAddress("2001:db8::10"),
-                    InetAddresses.parseNumericAddress("2001:db8::128"));
-    static final IkeTrafficSelector OUTBOUND_V6_TS =
-            new IkeTrafficSelector(
-                    OUTBOUND_TS_START_PORT,
-                    OUTBOUND_TS_END_PORT,
-                    InetAddresses.parseNumericAddress("2001:db8:255::64"),
-                    InetAddresses.parseNumericAddress("2001:db8:255::255"));
-
-    // Verify Config requests in TunnelModeChildSessionParams and IkeSessionParams
-    <T> void verifyConfigRequestTypes(
-            Map<Class<? extends T>, Integer> expectedReqCntMap, List<? extends T> resultReqList) {
-        Map<Class<? extends T>, Integer> resultReqCntMap = new HashMap<>();
-
-        // Verify that every config request type in resultReqList is expected, and build
-        // resultReqCntMap at the same time
-        for (T resultReq : resultReqList) {
-            boolean isResultReqExpected = false;
-
-            for (Class<? extends T> expectedReqInterface : expectedReqCntMap.keySet()) {
-                if (expectedReqInterface.isInstance(resultReq)) {
-                    isResultReqExpected = true;
-
-                    resultReqCntMap.put(
-                            expectedReqInterface,
-                            resultReqCntMap.getOrDefault(expectedReqInterface, 0) + 1);
-                }
-            }
-
-            if (!isResultReqExpected) {
-                fail("Failed due to unexpected config request " + resultReq);
-            }
-        }
-
-        assertEquals(expectedReqCntMap, resultReqCntMap);
-
-        // TODO: Think of a neat way to validate both counts and values in this method. Probably can
-        // build Runnables as validators for count and values.
-    }
-}
diff --git a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeTunUtils.java b/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeTunUtils.java
deleted file mode 100644
index 41cbf0b..0000000
--- a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/IkeTunUtils.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- * Copyright (C) 2020 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.ipsec.ike.cts;
-
-import static android.net.ipsec.ike.cts.PacketUtils.BytePayload;
-import static android.net.ipsec.ike.cts.PacketUtils.IP4_HDRLEN;
-import static android.net.ipsec.ike.cts.PacketUtils.IP6_HDRLEN;
-import static android.net.ipsec.ike.cts.PacketUtils.Ip4Header;
-import static android.net.ipsec.ike.cts.PacketUtils.Ip6Header;
-import static android.net.ipsec.ike.cts.PacketUtils.IpHeader;
-import static android.net.ipsec.ike.cts.PacketUtils.Payload;
-import static android.net.ipsec.ike.cts.PacketUtils.UDP_HDRLEN;
-import static android.net.ipsec.ike.cts.PacketUtils.UdpHeader;
-import static android.system.OsConstants.IPPROTO_UDP;
-
-import static com.android.internal.util.HexDump.hexStringToByteArray;
-
-import static org.junit.Assert.fail;
-
-import android.os.ParcelFileDescriptor;
-
-import java.net.Inet4Address;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.function.Predicate;
-
-public class IkeTunUtils extends TunUtils {
-    private static final int PORT_LEN = 2;
-
-    private static final int NON_ESP_MARKER_LEN = 4;
-    private static final byte[] NON_ESP_MARKER = new byte[NON_ESP_MARKER_LEN];
-
-    private static final int IKE_INIT_SPI_OFFSET = 0;
-    private static final int IKE_FIRST_PAYLOAD_OFFSET = 16;
-    private static final int IKE_IS_RESP_BYTE_OFFSET = 19;
-    private static final int IKE_MSG_ID_OFFSET = 20;
-    private static final int IKE_HEADER_LEN = 28;
-    private static final int IKE_FRAG_NUM_OFFSET = 32;
-    private static final int IKE_PAYLOAD_TYPE_SKF = 53;
-
-    private static final int RSP_FLAG_MASK = 0x20;
-
-    public IkeTunUtils(ParcelFileDescriptor tunFd) {
-        super(tunFd);
-    }
-
-    /**
-     * Await the expected IKE request inject an IKE response (or a list of response fragments)
-     *
-     * @param ikeRespDataFragmentsHex IKE response hex (or a list of response fragments) without
-     *     IP/UDP headers or NON ESP MARKER.
-     */
-    public byte[] awaitReqAndInjectResp(
-            long expectedInitIkeSpi,
-            int expectedMsgId,
-            boolean expectedUseEncap,
-            String... ikeRespDataFragmentsHex)
-            throws Exception {
-        return awaitReqAndInjectResp(
-                        expectedInitIkeSpi,
-                        expectedMsgId,
-                        expectedUseEncap,
-                        1 /* expectedReqPktCnt */,
-                        ikeRespDataFragmentsHex)
-                .get(0);
-    }
-
-    /**
-     * Await the expected IKE request (or the list of IKE request fragments) and inject an IKE
-     * response (or a list of response fragments)
-     *
-     * @param ikeRespDataFragmentsHex IKE response hex (or a list of response fragments) without
-     *     IP/UDP headers or NON ESP MARKER.
-     */
-    public List<byte[]> awaitReqAndInjectResp(
-            long expectedInitIkeSpi,
-            int expectedMsgId,
-            boolean expectedUseEncap,
-            int expectedReqPktCnt,
-            String... ikeRespDataFragmentsHex)
-            throws Exception {
-        List<byte[]> reqList = new ArrayList<>(expectedReqPktCnt);
-        if (expectedReqPktCnt == 1) {
-            // Expecting one complete IKE packet
-            byte[] req =
-                    awaitIkePacket(
-                            (pkt) -> {
-                                return isExpectedIkePkt(
-                                        pkt,
-                                        expectedInitIkeSpi,
-                                        expectedMsgId,
-                                        false /* expectedResp */,
-                                        expectedUseEncap);
-                            });
-            reqList.add(req);
-        } else {
-            // Expecting "expectedReqPktCnt" number of request fragments
-            for (int i = 0; i < expectedReqPktCnt; i++) {
-                // IKE Fragment number always starts from 1
-                int expectedFragNum = i + 1;
-                byte[] req =
-                        awaitIkePacket(
-                                (pkt) -> {
-                                    return isExpectedIkeFragPkt(
-                                            pkt,
-                                            expectedInitIkeSpi,
-                                            expectedMsgId,
-                                            false /* expectedResp */,
-                                            expectedUseEncap,
-                                            expectedFragNum);
-                                });
-                reqList.add(req);
-            }
-        }
-
-        // All request fragments have the same addresses and ports
-        byte[] request = reqList.get(0);
-
-        // Build response header by flipping address and port
-        InetAddress srcAddr = getAddress(request, false /* shouldGetSource */);
-        InetAddress dstAddr = getAddress(request, true /* shouldGetSource */);
-        int srcPort = getPort(request, false /* shouldGetSource */);
-        int dstPort = getPort(request, true /* shouldGetSource */);
-        for (String resp : ikeRespDataFragmentsHex) {
-            byte[] response =
-                    buildIkePacket(
-                            srcAddr,
-                            dstAddr,
-                            srcPort,
-                            dstPort,
-                            expectedUseEncap,
-                            hexStringToByteArray(resp));
-            injectPacket(response);
-        }
-
-        return reqList;
-    }
-
-    /** Await the expected IKE response */
-    public byte[] awaitResp(long expectedInitIkeSpi, int expectedMsgId, boolean expectedUseEncap)
-            throws Exception {
-        return awaitIkePacket(
-                (pkt) -> {
-                    return isExpectedIkePkt(
-                            pkt,
-                            expectedInitIkeSpi,
-                            expectedMsgId,
-                            true /* expectedResp*/,
-                            expectedUseEncap);
-                });
-    }
-
-    private byte[] awaitIkePacket(Predicate<byte[]> pktVerifier) throws Exception {
-        long endTime = System.currentTimeMillis() + TIMEOUT;
-        int startIndex = 0;
-        synchronized (mPackets) {
-            while (System.currentTimeMillis() < endTime) {
-                byte[] ikePkt = getFirstMatchingPacket(pktVerifier, startIndex);
-                if (ikePkt != null) {
-                    return ikePkt; // We've found the packet we're looking for.
-                }
-
-                startIndex = mPackets.size();
-
-                // Try to prevent waiting too long. If waitTimeout <= 0, we've already hit timeout
-                long waitTimeout = endTime - System.currentTimeMillis();
-                if (waitTimeout > 0) {
-                    mPackets.wait(waitTimeout);
-                }
-            }
-
-            fail("No matching packet found");
-        }
-
-        throw new IllegalStateException(
-                "Hit an impossible case where fail() didn't throw an exception");
-    }
-
-    private static boolean isExpectedIkePkt(
-            byte[] pkt,
-            long expectedInitIkeSpi,
-            int expectedMsgId,
-            boolean expectedResp,
-            boolean expectedUseEncap) {
-        int ipProtocolOffset = isIpv6(pkt) ? IP6_PROTO_OFFSET : IP4_PROTO_OFFSET;
-        int ikeOffset = getIkeOffset(pkt, expectedUseEncap);
-
-        return pkt[ipProtocolOffset] == IPPROTO_UDP
-                && expectedUseEncap == hasNonEspMarker(pkt)
-                && isExpectedSpiAndMsgId(
-                        pkt, ikeOffset, expectedInitIkeSpi, expectedMsgId, expectedResp);
-    }
-
-    private static boolean isExpectedIkeFragPkt(
-            byte[] pkt,
-            long expectedInitIkeSpi,
-            int expectedMsgId,
-            boolean expectedResp,
-            boolean expectedUseEncap,
-            int expectedFragNum) {
-        return isExpectedIkePkt(
-                        pkt, expectedInitIkeSpi, expectedMsgId, expectedResp, expectedUseEncap)
-                && isExpectedFragNum(pkt, getIkeOffset(pkt, expectedUseEncap), expectedFragNum);
-    }
-
-    private static int getIkeOffset(byte[] pkt, boolean useEncap) {
-        if (isIpv6(pkt)) {
-            // IPv6 UDP expectedUseEncap not supported by kernels; assume non-expectedUseEncap.
-            return IP6_HDRLEN + UDP_HDRLEN;
-        } else {
-            // Use default IPv4 header length (assuming no options)
-            int ikeOffset = IP4_HDRLEN + UDP_HDRLEN;
-            return useEncap ? ikeOffset + NON_ESP_MARKER_LEN : ikeOffset;
-        }
-    }
-
-    private static boolean hasNonEspMarker(byte[] pkt) {
-        ByteBuffer buffer = ByteBuffer.wrap(pkt);
-        int ikeOffset = IP4_HDRLEN + UDP_HDRLEN;
-        if (buffer.remaining() < ikeOffset) return false;
-
-        buffer.get(new byte[ikeOffset]); // Skip IP and UDP header
-        byte[] nonEspMarker = new byte[NON_ESP_MARKER_LEN];
-        if (buffer.remaining() < NON_ESP_MARKER_LEN) return false;
-
-        buffer.get(nonEspMarker);
-        return Arrays.equals(NON_ESP_MARKER, nonEspMarker);
-    }
-
-    private static boolean isExpectedSpiAndMsgId(
-            byte[] pkt,
-            int ikeOffset,
-            long expectedInitIkeSpi,
-            int expectedMsgId,
-            boolean expectedResp) {
-        if (pkt.length <= ikeOffset + IKE_HEADER_LEN) return false;
-
-        ByteBuffer buffer = ByteBuffer.wrap(pkt);
-        buffer.get(new byte[ikeOffset]); // Skip IP, UDP header (and NON_ESP_MARKER)
-        buffer.mark(); // Mark this position so that later we can reset back here
-
-        // Check SPI
-        buffer.get(new byte[IKE_INIT_SPI_OFFSET]);
-        long initSpi = buffer.getLong();
-        if (expectedInitIkeSpi != initSpi) {
-            return false;
-        }
-
-        // Check direction
-        buffer.reset();
-        buffer.get(new byte[IKE_IS_RESP_BYTE_OFFSET]);
-        byte flagsByte = buffer.get();
-        boolean isResp = ((flagsByte & RSP_FLAG_MASK) != 0);
-        if (expectedResp != isResp) {
-            return false;
-        }
-
-        // Check message ID
-        buffer.reset();
-        buffer.get(new byte[IKE_MSG_ID_OFFSET]);
-
-        // Both the expected message ID and the packet's msgId are signed integers, so directly
-        // compare them.
-        int msgId = buffer.getInt();
-        if (expectedMsgId != msgId) {
-            return false;
-        }
-
-        return true;
-    }
-
-    private static boolean isExpectedFragNum(byte[] pkt, int ikeOffset, int expectedFragNum) {
-        ByteBuffer buffer = ByteBuffer.wrap(pkt);
-        buffer.get(new byte[ikeOffset]);
-        buffer.mark(); // Mark this position so that later we can reset back here
-
-        // Check if it is a fragment packet
-        buffer.get(new byte[IKE_FIRST_PAYLOAD_OFFSET]);
-        int firstPayload = Byte.toUnsignedInt(buffer.get());
-        if (firstPayload != IKE_PAYLOAD_TYPE_SKF) {
-            return false;
-        }
-
-        // Check fragment number
-        buffer.reset();
-        buffer.get(new byte[IKE_FRAG_NUM_OFFSET]);
-        int fragNum = Short.toUnsignedInt(buffer.getShort());
-        return expectedFragNum == fragNum;
-    }
-
-    public static class PortPair {
-        public final int srcPort;
-        public final int dstPort;
-
-        public PortPair(int sourcePort, int destinationPort) {
-            srcPort = sourcePort;
-            dstPort = destinationPort;
-        }
-    }
-
-    public static PortPair getSrcDestPortPair(byte[] outboundIkePkt) throws Exception {
-        return new PortPair(
-                getPort(outboundIkePkt, true /* shouldGetSource */),
-                getPort(outboundIkePkt, false /* shouldGetSource */));
-    }
-
-    private static InetAddress getAddress(byte[] pkt, boolean shouldGetSource) throws Exception {
-        int ipLen = isIpv6(pkt) ? IP6_ADDR_LEN : IP4_ADDR_LEN;
-        int srcIpOffset = isIpv6(pkt) ? IP6_ADDR_OFFSET : IP4_ADDR_OFFSET;
-        int ipOffset = shouldGetSource ? srcIpOffset : srcIpOffset + ipLen;
-
-        ByteBuffer buffer = ByteBuffer.wrap(pkt);
-        buffer.get(new byte[ipOffset]);
-        byte[] ipAddrBytes = new byte[ipLen];
-        buffer.get(ipAddrBytes);
-        return InetAddress.getByAddress(ipAddrBytes);
-    }
-
-    private static int getPort(byte[] pkt, boolean shouldGetSource) {
-        ByteBuffer buffer = ByteBuffer.wrap(pkt);
-        int srcPortOffset = isIpv6(pkt) ? IP6_HDRLEN : IP4_HDRLEN;
-        int portOffset = shouldGetSource ? srcPortOffset : srcPortOffset + PORT_LEN;
-
-        buffer.get(new byte[portOffset]);
-        return Short.toUnsignedInt(buffer.getShort());
-    }
-
-    public static byte[] buildIkePacket(
-            InetAddress srcAddr,
-            InetAddress dstAddr,
-            int srcPort,
-            int dstPort,
-            boolean useEncap,
-            byte[] ikePacket)
-            throws Exception {
-        if (useEncap) {
-            ByteBuffer buffer = ByteBuffer.allocate(NON_ESP_MARKER_LEN + ikePacket.length);
-            buffer.put(NON_ESP_MARKER);
-            buffer.put(ikePacket);
-            ikePacket = buffer.array();
-        }
-
-        UdpHeader udpPkt = new UdpHeader(srcPort, dstPort, new BytePayload(ikePacket));
-        IpHeader ipPkt = getIpHeader(udpPkt.getProtocolId(), srcAddr, dstAddr, udpPkt);
-        return ipPkt.getPacketBytes();
-    }
-
-    private static IpHeader getIpHeader(
-            int protocol, InetAddress src, InetAddress dst, Payload payload) {
-        if ((src instanceof Inet6Address) != (dst instanceof Inet6Address)) {
-            throw new IllegalArgumentException("Invalid src/dst address combination");
-        }
-
-        if (src instanceof Inet6Address) {
-            return new Ip6Header(protocol, (Inet6Address) src, (Inet6Address) dst, payload);
-        } else {
-            return new Ip4Header(protocol, (Inet4Address) src, (Inet4Address) dst, payload);
-        }
-    }
-}
diff --git a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/PacketUtils.java b/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/PacketUtils.java
deleted file mode 100644
index 35e6719..0000000
--- a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/PacketUtils.java
+++ /dev/null
@@ -1,467 +0,0 @@
-/*
- * Copyright (C) 2020 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.ipsec.ike.cts;
-
-import static android.system.OsConstants.IPPROTO_IPV6;
-import static android.system.OsConstants.IPPROTO_UDP;
-
-import java.net.Inet4Address;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.nio.ByteBuffer;
-import java.nio.ShortBuffer;
-import java.security.GeneralSecurityException;
-import java.security.SecureRandom;
-import java.util.Arrays;
-
-import javax.crypto.Cipher;
-import javax.crypto.Mac;
-import javax.crypto.spec.IvParameterSpec;
-import javax.crypto.spec.SecretKeySpec;
-
-/**
- * This code is a exact copy of {@link PacketUtils} in
- * cts/tests/tests/net/src/android/net/cts/PacketUtils.java.
- *
- * <p>TODO(b/148689509): Statically include the PacketUtils source file instead of copying it.
- */
-public class PacketUtils {
-    private static final String TAG = PacketUtils.class.getSimpleName();
-
-    private static final int DATA_BUFFER_LEN = 4096;
-
-    static final int IP4_HDRLEN = 20;
-    static final int IP6_HDRLEN = 40;
-    static final int UDP_HDRLEN = 8;
-    static final int TCP_HDRLEN = 20;
-    static final int TCP_HDRLEN_WITH_TIMESTAMP_OPT = TCP_HDRLEN + 12;
-
-    // Not defined in OsConstants
-    static final int IPPROTO_IPV4 = 4;
-    static final int IPPROTO_ESP = 50;
-
-    // Encryption parameters
-    static final int AES_GCM_IV_LEN = 8;
-    static final int AES_CBC_IV_LEN = 16;
-    static final int AES_GCM_BLK_SIZE = 4;
-    static final int AES_CBC_BLK_SIZE = 16;
-
-    // Encryption algorithms
-    static final String AES = "AES";
-    static final String AES_CBC = "AES/CBC/NoPadding";
-    static final String HMAC_SHA_256 = "HmacSHA256";
-
-    public interface Payload {
-        byte[] getPacketBytes(IpHeader header) throws Exception;
-
-        void addPacketBytes(IpHeader header, ByteBuffer resultBuffer) throws Exception;
-
-        short length();
-
-        int getProtocolId();
-    }
-
-    public abstract static class IpHeader {
-
-        public final byte proto;
-        public final InetAddress srcAddr;
-        public final InetAddress dstAddr;
-        public final Payload payload;
-
-        public IpHeader(int proto, InetAddress src, InetAddress dst, Payload payload) {
-            this.proto = (byte) proto;
-            this.srcAddr = src;
-            this.dstAddr = dst;
-            this.payload = payload;
-        }
-
-        public abstract byte[] getPacketBytes() throws Exception;
-
-        public abstract int getProtocolId();
-    }
-
-    public static class Ip4Header extends IpHeader {
-        private short checksum;
-
-        public Ip4Header(int proto, Inet4Address src, Inet4Address dst, Payload payload) {
-            super(proto, src, dst, payload);
-        }
-
-        public byte[] getPacketBytes() throws Exception {
-            ByteBuffer resultBuffer = buildHeader();
-            payload.addPacketBytes(this, resultBuffer);
-
-            return getByteArrayFromBuffer(resultBuffer);
-        }
-
-        public ByteBuffer buildHeader() {
-            ByteBuffer bb = ByteBuffer.allocate(DATA_BUFFER_LEN);
-
-            // Version, IHL
-            bb.put((byte) (0x45));
-
-            // DCSP, ECN
-            bb.put((byte) 0);
-
-            // Total Length
-            bb.putShort((short) (IP4_HDRLEN + payload.length()));
-
-            // Empty for Identification, Flags and Fragment Offset
-            bb.putShort((short) 0);
-            bb.put((byte) 0x40);
-            bb.put((byte) 0x00);
-
-            // TTL
-            bb.put((byte) 64);
-
-            // Protocol
-            bb.put(proto);
-
-            // Header Checksum
-            final int ipChecksumOffset = bb.position();
-            bb.putShort((short) 0);
-
-            // Src/Dst addresses
-            bb.put(srcAddr.getAddress());
-            bb.put(dstAddr.getAddress());
-
-            bb.putShort(ipChecksumOffset, calculateChecksum(bb));
-
-            return bb;
-        }
-
-        private short calculateChecksum(ByteBuffer bb) {
-            int checksum = 0;
-
-            // Calculate sum of 16-bit values, excluding checksum. IPv4 headers are always 32-bit
-            // aligned, so no special cases needed for unaligned values.
-            ShortBuffer shortBuffer = ByteBuffer.wrap(getByteArrayFromBuffer(bb)).asShortBuffer();
-            while (shortBuffer.hasRemaining()) {
-                short val = shortBuffer.get();
-
-                // Wrap as needed
-                checksum = addAndWrapForChecksum(checksum, val);
-            }
-
-            return onesComplement(checksum);
-        }
-
-        public int getProtocolId() {
-            return IPPROTO_IPV4;
-        }
-    }
-
-    public static class Ip6Header extends IpHeader {
-        public Ip6Header(int nextHeader, Inet6Address src, Inet6Address dst, Payload payload) {
-            super(nextHeader, src, dst, payload);
-        }
-
-        public byte[] getPacketBytes() throws Exception {
-            ByteBuffer bb = ByteBuffer.allocate(DATA_BUFFER_LEN);
-
-            // Version | Traffic Class (First 4 bits)
-            bb.put((byte) 0x60);
-
-            // Traffic class (Last 4 bits), Flow Label
-            bb.put((byte) 0);
-            bb.put((byte) 0);
-            bb.put((byte) 0);
-
-            // Payload Length
-            bb.putShort((short) payload.length());
-
-            // Next Header
-            bb.put(proto);
-
-            // Hop Limit
-            bb.put((byte) 64);
-
-            // Src/Dst addresses
-            bb.put(srcAddr.getAddress());
-            bb.put(dstAddr.getAddress());
-
-            // Payload
-            payload.addPacketBytes(this, bb);
-
-            return getByteArrayFromBuffer(bb);
-        }
-
-        public int getProtocolId() {
-            return IPPROTO_IPV6;
-        }
-    }
-
-    public static class BytePayload implements Payload {
-        public final byte[] payload;
-
-        public BytePayload(byte[] payload) {
-            this.payload = payload;
-        }
-
-        public int getProtocolId() {
-            return -1;
-        }
-
-        public byte[] getPacketBytes(IpHeader header) {
-            ByteBuffer bb = ByteBuffer.allocate(DATA_BUFFER_LEN);
-
-            addPacketBytes(header, bb);
-            return getByteArrayFromBuffer(bb);
-        }
-
-        public void addPacketBytes(IpHeader header, ByteBuffer resultBuffer) {
-            resultBuffer.put(payload);
-        }
-
-        public short length() {
-            return (short) payload.length;
-        }
-    }
-
-    public static class UdpHeader implements Payload {
-
-        public final short srcPort;
-        public final short dstPort;
-        public final Payload payload;
-
-        public UdpHeader(int srcPort, int dstPort, Payload payload) {
-            this.srcPort = (short) srcPort;
-            this.dstPort = (short) dstPort;
-            this.payload = payload;
-        }
-
-        public int getProtocolId() {
-            return IPPROTO_UDP;
-        }
-
-        public short length() {
-            return (short) (payload.length() + 8);
-        }
-
-        public byte[] getPacketBytes(IpHeader header) throws Exception {
-            ByteBuffer bb = ByteBuffer.allocate(DATA_BUFFER_LEN);
-
-            addPacketBytes(header, bb);
-            return getByteArrayFromBuffer(bb);
-        }
-
-        public void addPacketBytes(IpHeader header, ByteBuffer resultBuffer) throws Exception {
-            // Source, Destination port
-            resultBuffer.putShort(srcPort);
-            resultBuffer.putShort(dstPort);
-
-            // Payload Length
-            resultBuffer.putShort(length());
-
-            // Get payload bytes for checksum + payload
-            ByteBuffer payloadBuffer = ByteBuffer.allocate(DATA_BUFFER_LEN);
-            payload.addPacketBytes(header, payloadBuffer);
-            byte[] payloadBytes = getByteArrayFromBuffer(payloadBuffer);
-
-            // Checksum
-            resultBuffer.putShort(calculateChecksum(header, payloadBytes));
-
-            // Payload
-            resultBuffer.put(payloadBytes);
-        }
-
-        private short calculateChecksum(IpHeader header, byte[] payloadBytes) throws Exception {
-            int newChecksum = 0;
-            ShortBuffer srcBuffer = ByteBuffer.wrap(header.srcAddr.getAddress()).asShortBuffer();
-            ShortBuffer dstBuffer = ByteBuffer.wrap(header.dstAddr.getAddress()).asShortBuffer();
-
-            while (srcBuffer.hasRemaining() || dstBuffer.hasRemaining()) {
-                short val = srcBuffer.hasRemaining() ? srcBuffer.get() : dstBuffer.get();
-
-                // Wrap as needed
-                newChecksum = addAndWrapForChecksum(newChecksum, val);
-            }
-
-            // Add pseudo-header values. Proto is 0-padded, so just use the byte.
-            newChecksum = addAndWrapForChecksum(newChecksum, header.proto);
-            newChecksum = addAndWrapForChecksum(newChecksum, length());
-            newChecksum = addAndWrapForChecksum(newChecksum, srcPort);
-            newChecksum = addAndWrapForChecksum(newChecksum, dstPort);
-            newChecksum = addAndWrapForChecksum(newChecksum, length());
-
-            ShortBuffer payloadShortBuffer = ByteBuffer.wrap(payloadBytes).asShortBuffer();
-            while (payloadShortBuffer.hasRemaining()) {
-                newChecksum = addAndWrapForChecksum(newChecksum, payloadShortBuffer.get());
-            }
-            if (payload.length() % 2 != 0) {
-                newChecksum =
-                        addAndWrapForChecksum(
-                                newChecksum, (payloadBytes[payloadBytes.length - 1] << 8));
-            }
-
-            return onesComplement(newChecksum);
-        }
-    }
-
-    public static class EspHeader implements Payload {
-        public final int nextHeader;
-        public final int spi;
-        public final int seqNum;
-        public final byte[] key;
-        public final byte[] payload;
-
-        /**
-         * Generic constructor for ESP headers.
-         *
-         * <p>For Tunnel mode, payload will be a full IP header + attached payloads
-         *
-         * <p>For Transport mode, payload will be only the attached payloads, but with the checksum
-         * calculated using the pre-encryption IP header
-         */
-        public EspHeader(int nextHeader, int spi, int seqNum, byte[] key, byte[] payload) {
-            this.nextHeader = nextHeader;
-            this.spi = spi;
-            this.seqNum = seqNum;
-            this.key = key;
-            this.payload = payload;
-        }
-
-        public int getProtocolId() {
-            return IPPROTO_ESP;
-        }
-
-        public short length() {
-            // ALWAYS uses AES-CBC, HMAC-SHA256 (128b trunc len)
-            return (short)
-                    calculateEspPacketSize(payload.length, AES_CBC_IV_LEN, AES_CBC_BLK_SIZE, 128);
-        }
-
-        public byte[] getPacketBytes(IpHeader header) throws Exception {
-            ByteBuffer bb = ByteBuffer.allocate(DATA_BUFFER_LEN);
-
-            addPacketBytes(header, bb);
-            return getByteArrayFromBuffer(bb);
-        }
-
-        public void addPacketBytes(IpHeader header, ByteBuffer resultBuffer) throws Exception {
-            ByteBuffer espPayloadBuffer = ByteBuffer.allocate(DATA_BUFFER_LEN);
-            espPayloadBuffer.putInt(spi);
-            espPayloadBuffer.putInt(seqNum);
-            espPayloadBuffer.put(getCiphertext(key));
-
-            espPayloadBuffer.put(getIcv(getByteArrayFromBuffer(espPayloadBuffer)), 0, 16);
-            resultBuffer.put(getByteArrayFromBuffer(espPayloadBuffer));
-        }
-
-        private byte[] getIcv(byte[] authenticatedSection) throws GeneralSecurityException {
-            Mac sha256HMAC = Mac.getInstance(HMAC_SHA_256);
-            SecretKeySpec authKey = new SecretKeySpec(key, HMAC_SHA_256);
-            sha256HMAC.init(authKey);
-
-            return sha256HMAC.doFinal(authenticatedSection);
-        }
-
-        /**
-         * Encrypts and builds ciphertext block. Includes the IV, Padding and Next-Header blocks
-         *
-         * <p>The ciphertext does NOT include the SPI/Sequence numbers, or the ICV.
-         */
-        private byte[] getCiphertext(byte[] key) throws GeneralSecurityException {
-            int paddedLen = calculateEspEncryptedLength(payload.length, AES_CBC_BLK_SIZE);
-            ByteBuffer paddedPayload = ByteBuffer.allocate(paddedLen);
-            paddedPayload.put(payload);
-
-            // Add padding - consecutive integers from 0x01
-            int pad = 1;
-            while (paddedPayload.position() < paddedPayload.limit()) {
-                paddedPayload.put((byte) pad++);
-            }
-
-            paddedPayload.position(paddedPayload.limit() - 2);
-            paddedPayload.put((byte) (paddedLen - 2 - payload.length)); // Pad length
-            paddedPayload.put((byte) nextHeader);
-
-            // Generate Initialization Vector
-            byte[] iv = new byte[AES_CBC_IV_LEN];
-            new SecureRandom().nextBytes(iv);
-            IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
-            SecretKeySpec secretKeySpec = new SecretKeySpec(key, AES);
-
-            // Encrypt payload
-            Cipher cipher = Cipher.getInstance(AES_CBC);
-            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
-            byte[] encrypted = cipher.doFinal(getByteArrayFromBuffer(paddedPayload));
-
-            // Build ciphertext
-            ByteBuffer cipherText = ByteBuffer.allocate(AES_CBC_IV_LEN + encrypted.length);
-            cipherText.put(iv);
-            cipherText.put(encrypted);
-
-            return getByteArrayFromBuffer(cipherText);
-        }
-    }
-
-    private static int addAndWrapForChecksum(int currentChecksum, int value) {
-        currentChecksum += value & 0x0000ffff;
-
-        // Wrap anything beyond the first 16 bits, and add to lower order bits
-        return (currentChecksum >>> 16) + (currentChecksum & 0x0000ffff);
-    }
-
-    private static short onesComplement(int val) {
-        val = (val >>> 16) + (val & 0xffff);
-
-        if (val == 0) return 0;
-        return (short) ((~val) & 0xffff);
-    }
-
-    public static int calculateEspPacketSize(
-            int payloadLen, int cryptIvLength, int cryptBlockSize, int authTruncLen) {
-        final int ESP_HDRLEN = 4 + 4; // SPI + Seq#
-        final int ICV_LEN = authTruncLen / 8; // Auth trailer; based on truncation length
-        payloadLen += cryptIvLength; // Initialization Vector
-
-        // Align to block size of encryption algorithm
-        payloadLen = calculateEspEncryptedLength(payloadLen, cryptBlockSize);
-        return payloadLen + ESP_HDRLEN + ICV_LEN;
-    }
-
-    private static int calculateEspEncryptedLength(int payloadLen, int cryptBlockSize) {
-        payloadLen += 2; // ESP trailer
-
-        // Align to block size of encryption algorithm
-        return payloadLen + calculateEspPadLen(payloadLen, cryptBlockSize);
-    }
-
-    private static int calculateEspPadLen(int payloadLen, int cryptBlockSize) {
-        return (cryptBlockSize - (payloadLen % cryptBlockSize)) % cryptBlockSize;
-    }
-
-    private static byte[] getByteArrayFromBuffer(ByteBuffer buffer) {
-        return Arrays.copyOfRange(buffer.array(), 0, buffer.position());
-    }
-
-    /*
-     * Debug printing
-     */
-    private static final char[] hexArray = "0123456789ABCDEF".toCharArray();
-
-    public static String bytesToHex(byte[] bytes) {
-        StringBuilder sb = new StringBuilder();
-        for (byte b : bytes) {
-            sb.append(hexArray[b >>> 4]);
-            sb.append(hexArray[b & 0x0F]);
-            sb.append(' ');
-        }
-        return sb.toString();
-    }
-}
diff --git a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/SaProposalTest.java b/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/SaProposalTest.java
deleted file mode 100644
index e0d3be0..0000000
--- a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/SaProposalTest.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Copyright (C) 2020 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.ipsec.ike.cts;
-
-import static android.net.ipsec.ike.SaProposal.DH_GROUP_1024_BIT_MODP;
-import static android.net.ipsec.ike.SaProposal.DH_GROUP_2048_BIT_MODP;
-import static android.net.ipsec.ike.SaProposal.DH_GROUP_NONE;
-import static android.net.ipsec.ike.SaProposal.ENCRYPTION_ALGORITHM_3DES;
-import static android.net.ipsec.ike.SaProposal.ENCRYPTION_ALGORITHM_AES_CBC;
-import static android.net.ipsec.ike.SaProposal.ENCRYPTION_ALGORITHM_AES_GCM_12;
-import static android.net.ipsec.ike.SaProposal.ENCRYPTION_ALGORITHM_AES_GCM_16;
-import static android.net.ipsec.ike.SaProposal.ENCRYPTION_ALGORITHM_AES_GCM_8;
-import static android.net.ipsec.ike.SaProposal.INTEGRITY_ALGORITHM_AES_XCBC_96;
-import static android.net.ipsec.ike.SaProposal.INTEGRITY_ALGORITHM_HMAC_SHA1_96;
-import static android.net.ipsec.ike.SaProposal.INTEGRITY_ALGORITHM_HMAC_SHA2_256_128;
-import static android.net.ipsec.ike.SaProposal.INTEGRITY_ALGORITHM_HMAC_SHA2_384_192;
-import static android.net.ipsec.ike.SaProposal.INTEGRITY_ALGORITHM_HMAC_SHA2_512_256;
-import static android.net.ipsec.ike.SaProposal.INTEGRITY_ALGORITHM_NONE;
-import static android.net.ipsec.ike.SaProposal.KEY_LEN_AES_128;
-import static android.net.ipsec.ike.SaProposal.KEY_LEN_AES_192;
-import static android.net.ipsec.ike.SaProposal.KEY_LEN_AES_256;
-import static android.net.ipsec.ike.SaProposal.KEY_LEN_UNUSED;
-import static android.net.ipsec.ike.SaProposal.PSEUDORANDOM_FUNCTION_AES128_XCBC;
-import static android.net.ipsec.ike.SaProposal.PSEUDORANDOM_FUNCTION_HMAC_SHA1;
-import static android.net.ipsec.ike.SaProposal.PSEUDORANDOM_FUNCTION_SHA2_256;
-import static android.net.ipsec.ike.SaProposal.PSEUDORANDOM_FUNCTION_SHA2_384;
-import static android.net.ipsec.ike.SaProposal.PSEUDORANDOM_FUNCTION_SHA2_512;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import android.net.ipsec.ike.ChildSaProposal;
-import android.net.ipsec.ike.IkeSaProposal;
-import android.util.Pair;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-@RunWith(AndroidJUnit4.class)
-public class SaProposalTest {
-    private static final List<Pair<Integer, Integer>> NORMAL_MODE_CIPHERS = new ArrayList<>();
-    private static final List<Pair<Integer, Integer>> COMBINED_MODE_CIPHERS = new ArrayList<>();
-    private static final List<Integer> INTEGRITY_ALGOS = new ArrayList<>();
-    private static final List<Integer> DH_GROUPS = new ArrayList<>();
-    private static final List<Integer> DH_GROUPS_WITH_NONE = new ArrayList<>();
-    private static final List<Integer> PRFS = new ArrayList<>();
-
-    static {
-        NORMAL_MODE_CIPHERS.add(new Pair<>(ENCRYPTION_ALGORITHM_3DES, KEY_LEN_UNUSED));
-        NORMAL_MODE_CIPHERS.add(new Pair<>(ENCRYPTION_ALGORITHM_AES_CBC, KEY_LEN_AES_128));
-        NORMAL_MODE_CIPHERS.add(new Pair<>(ENCRYPTION_ALGORITHM_AES_CBC, KEY_LEN_AES_192));
-        NORMAL_MODE_CIPHERS.add(new Pair<>(ENCRYPTION_ALGORITHM_AES_CBC, KEY_LEN_AES_256));
-
-        COMBINED_MODE_CIPHERS.add(new Pair<>(ENCRYPTION_ALGORITHM_AES_GCM_8, KEY_LEN_AES_128));
-        COMBINED_MODE_CIPHERS.add(new Pair<>(ENCRYPTION_ALGORITHM_AES_GCM_12, KEY_LEN_AES_192));
-        COMBINED_MODE_CIPHERS.add(new Pair<>(ENCRYPTION_ALGORITHM_AES_GCM_16, KEY_LEN_AES_256));
-
-        INTEGRITY_ALGOS.add(INTEGRITY_ALGORITHM_HMAC_SHA1_96);
-        INTEGRITY_ALGOS.add(INTEGRITY_ALGORITHM_AES_XCBC_96);
-        INTEGRITY_ALGOS.add(INTEGRITY_ALGORITHM_HMAC_SHA2_256_128);
-        INTEGRITY_ALGOS.add(INTEGRITY_ALGORITHM_HMAC_SHA2_384_192);
-        INTEGRITY_ALGOS.add(INTEGRITY_ALGORITHM_HMAC_SHA2_512_256);
-
-        DH_GROUPS.add(DH_GROUP_1024_BIT_MODP);
-        DH_GROUPS.add(DH_GROUP_2048_BIT_MODP);
-
-        DH_GROUPS_WITH_NONE.add(DH_GROUP_NONE);
-        DH_GROUPS_WITH_NONE.addAll(DH_GROUPS);
-
-        PRFS.add(PSEUDORANDOM_FUNCTION_HMAC_SHA1);
-        PRFS.add(PSEUDORANDOM_FUNCTION_AES128_XCBC);
-        PRFS.add(PSEUDORANDOM_FUNCTION_SHA2_256);
-        PRFS.add(PSEUDORANDOM_FUNCTION_SHA2_384);
-        PRFS.add(PSEUDORANDOM_FUNCTION_SHA2_512);
-    }
-
-    // Package private
-    static IkeSaProposal buildIkeSaProposalWithNormalModeCipher() {
-        return buildIkeSaProposal(NORMAL_MODE_CIPHERS, INTEGRITY_ALGOS, PRFS, DH_GROUPS);
-    }
-
-    // Package private
-    static IkeSaProposal buildIkeSaProposalWithCombinedModeCipher() {
-        return buildIkeSaProposalWithCombinedModeCipher(true /* hasIntegrityNone */);
-    }
-
-    private static IkeSaProposal buildIkeSaProposalWithCombinedModeCipher(
-            boolean hasIntegrityNone) {
-        List<Integer> integerAlgos = new ArrayList<>();
-        if (hasIntegrityNone) {
-            integerAlgos.add(INTEGRITY_ALGORITHM_NONE);
-        }
-        return buildIkeSaProposal(COMBINED_MODE_CIPHERS, integerAlgos, PRFS, DH_GROUPS);
-    }
-
-    private static IkeSaProposal buildIkeSaProposal(
-            List<Pair<Integer, Integer>> ciphers,
-            List<Integer> integrityAlgos,
-            List<Integer> prfs,
-            List<Integer> dhGroups) {
-        IkeSaProposal.Builder builder = new IkeSaProposal.Builder();
-
-        for (Pair<Integer, Integer> pair : ciphers) {
-            builder.addEncryptionAlgorithm(pair.first, pair.second);
-        }
-        for (int algo : integrityAlgos) {
-            builder.addIntegrityAlgorithm(algo);
-        }
-        for (int algo : prfs) {
-            builder.addPseudorandomFunction(algo);
-        }
-        for (int algo : dhGroups) {
-            builder.addDhGroup(algo);
-        }
-
-        return builder.build();
-    }
-
-    // Package private
-    static ChildSaProposal buildChildSaProposalWithNormalModeCipher() {
-        return buildChildSaProposal(NORMAL_MODE_CIPHERS, INTEGRITY_ALGOS, DH_GROUPS_WITH_NONE);
-    }
-
-    // Package private
-    static ChildSaProposal buildChildSaProposalWithCombinedModeCipher() {
-        return buildChildSaProposalWithCombinedModeCipher(true /* hasIntegrityNone */);
-    }
-
-    private static ChildSaProposal buildChildSaProposalWithCombinedModeCipher(
-            boolean hasIntegrityNone) {
-        List<Integer> integerAlgos = new ArrayList<>();
-        if (hasIntegrityNone) {
-            integerAlgos.add(INTEGRITY_ALGORITHM_NONE);
-        }
-
-        return buildChildSaProposal(COMBINED_MODE_CIPHERS, integerAlgos, DH_GROUPS_WITH_NONE);
-    }
-
-    private static ChildSaProposal buildChildSaProposal(
-            List<Pair<Integer, Integer>> ciphers,
-            List<Integer> integrityAlgos,
-            List<Integer> dhGroups) {
-        ChildSaProposal.Builder builder = new ChildSaProposal.Builder();
-
-        for (Pair<Integer, Integer> pair : ciphers) {
-            builder.addEncryptionAlgorithm(pair.first, pair.second);
-        }
-        for (int algo : integrityAlgos) {
-            builder.addIntegrityAlgorithm(algo);
-        }
-        for (int algo : dhGroups) {
-            builder.addDhGroup(algo);
-        }
-
-        return builder.build();
-    }
-
-    // Package private
-    static ChildSaProposal buildChildSaProposalWithOnlyCiphers() {
-        return buildChildSaProposal(
-                COMBINED_MODE_CIPHERS, Collections.EMPTY_LIST, Collections.EMPTY_LIST);
-    }
-
-    @Test
-    public void testBuildIkeSaProposalWithNormalModeCipher() {
-        IkeSaProposal saProposal = buildIkeSaProposalWithNormalModeCipher();
-
-        assertEquals(NORMAL_MODE_CIPHERS, saProposal.getEncryptionAlgorithms());
-        assertEquals(INTEGRITY_ALGOS, saProposal.getIntegrityAlgorithms());
-        assertEquals(PRFS, saProposal.getPseudorandomFunctions());
-        assertEquals(DH_GROUPS, saProposal.getDhGroups());
-    }
-
-    @Test
-    public void testBuildIkeSaProposalWithCombinedModeCipher() {
-        IkeSaProposal saProposal =
-                buildIkeSaProposalWithCombinedModeCipher(false /* hasIntegrityNone */);
-
-        assertEquals(COMBINED_MODE_CIPHERS, saProposal.getEncryptionAlgorithms());
-        assertEquals(PRFS, saProposal.getPseudorandomFunctions());
-        assertEquals(DH_GROUPS, saProposal.getDhGroups());
-        assertTrue(saProposal.getIntegrityAlgorithms().isEmpty());
-    }
-
-    @Test
-    public void testBuildIkeSaProposalWithCombinedModeCipherAndIntegrityNone() {
-        IkeSaProposal saProposal =
-                buildIkeSaProposalWithCombinedModeCipher(true /* hasIntegrityNone */);
-
-        assertEquals(COMBINED_MODE_CIPHERS, saProposal.getEncryptionAlgorithms());
-        assertEquals(PRFS, saProposal.getPseudorandomFunctions());
-        assertEquals(DH_GROUPS, saProposal.getDhGroups());
-        assertEquals(Arrays.asList(INTEGRITY_ALGORITHM_NONE), saProposal.getIntegrityAlgorithms());
-    }
-
-    @Test
-    public void testBuildChildSaProposalWithNormalModeCipher() {
-        ChildSaProposal saProposal = buildChildSaProposalWithNormalModeCipher();
-
-        assertEquals(NORMAL_MODE_CIPHERS, saProposal.getEncryptionAlgorithms());
-        assertEquals(INTEGRITY_ALGOS, saProposal.getIntegrityAlgorithms());
-        assertEquals(DH_GROUPS_WITH_NONE, saProposal.getDhGroups());
-    }
-
-    @Test
-    public void testBuildChildProposalWithCombinedModeCipher() {
-        ChildSaProposal saProposal =
-                buildChildSaProposalWithCombinedModeCipher(false /* hasIntegrityNone */);
-
-        assertEquals(COMBINED_MODE_CIPHERS, saProposal.getEncryptionAlgorithms());
-        assertTrue(saProposal.getIntegrityAlgorithms().isEmpty());
-        assertEquals(DH_GROUPS_WITH_NONE, saProposal.getDhGroups());
-    }
-
-    @Test
-    public void testBuildChildProposalWithCombinedModeCipherAndIntegrityNone() {
-        ChildSaProposal saProposal =
-                buildChildSaProposalWithCombinedModeCipher(true /* hasIntegrityNone */);
-
-        assertEquals(COMBINED_MODE_CIPHERS, saProposal.getEncryptionAlgorithms());
-        assertEquals(Arrays.asList(INTEGRITY_ALGORITHM_NONE), saProposal.getIntegrityAlgorithms());
-        assertEquals(DH_GROUPS_WITH_NONE, saProposal.getDhGroups());
-    }
-
-    @Test
-    public void testBuildChildSaProposalWithOnlyCiphers() {
-        ChildSaProposal saProposal = buildChildSaProposalWithOnlyCiphers();
-
-        assertEquals(COMBINED_MODE_CIPHERS, saProposal.getEncryptionAlgorithms());
-        assertTrue(saProposal.getIntegrityAlgorithms().isEmpty());
-        assertTrue(saProposal.getDhGroups().isEmpty());
-    }
-
-    // TODO(b/148689509): Test throwing exception when algorithm combination is invalid
-}
diff --git a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/TestNetworkUtils.java b/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/TestNetworkUtils.java
deleted file mode 100644
index 5b08cdc..0000000
--- a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/TestNetworkUtils.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2020 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.ipsec.ike.cts;
-
-import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VPN;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_TRUSTED;
-import static android.net.NetworkCapabilities.TRANSPORT_TEST;
-
-import android.net.ConnectivityManager;
-import android.net.Network;
-import android.net.NetworkRequest;
-import android.net.TestNetworkManager;
-import android.os.IBinder;
-import android.os.RemoteException;
-
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
-
-// TODO(b/148689509): Share this class with net CTS test (e.g. IpSecManagerTunnelTest)
-public class TestNetworkUtils {
-    private static final int TIMEOUT_MS = 500;
-
-    /** Callback to receive requested test network. */
-    public static class TestNetworkCallback extends ConnectivityManager.NetworkCallback {
-        private final CompletableFuture<Network> futureNetwork = new CompletableFuture<>();
-
-        @Override
-        public void onAvailable(Network network) {
-            futureNetwork.complete(network);
-        }
-
-        public Network getNetworkBlocking() throws Exception {
-            return futureNetwork.get(TIMEOUT_MS, TimeUnit.MILLISECONDS);
-        }
-    }
-
-    /**
-     * Set up test network.
-     *
-     * <p>Caller MUST have MANAGE_TEST_NETWORKS permission to use this method.
-     *
-     * @param connMgr ConnectivityManager to request network.
-     * @param testNetworkMgr TestNetworkManager to set up test network.
-     * @param ifname the name of the interface to be used for the Network LinkProperties.
-     * @param binder a binder object guarding the lifecycle of this test network.
-     * @return TestNetworkCallback to retrieve the test network.
-     * @throws RemoteException if test network setup failed.
-     * @see android.net.TestNetworkManager
-     */
-    public static TestNetworkCallback setupAndGetTestNetwork(
-            ConnectivityManager connMgr,
-            TestNetworkManager testNetworkMgr,
-            String ifname,
-            IBinder binder)
-            throws RemoteException {
-        NetworkRequest nr =
-                new NetworkRequest.Builder()
-                        .addTransportType(TRANSPORT_TEST)
-                        .removeCapability(NET_CAPABILITY_TRUSTED)
-                        .removeCapability(NET_CAPABILITY_NOT_VPN)
-                        .setNetworkSpecifier(ifname)
-                        .build();
-
-        TestNetworkCallback cb = new TestNetworkCallback();
-        connMgr.requestNetwork(nr, cb);
-
-        // Setup the test network after network request is filed to prevent Network from being
-        // reaped due to no requests matching it.
-        testNetworkMgr.setupTestNetwork(ifname, binder);
-
-        return cb;
-    }
-}
diff --git a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/TunUtils.java b/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/TunUtils.java
deleted file mode 100644
index 5539dbc..0000000
--- a/tests/tests/net/ipsec/src/android/net/ipsec/ike/cts/TunUtils.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- * Copyright (C) 2020 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.ipsec.ike.cts;
-
-import static android.net.ipsec.ike.cts.PacketUtils.IP4_HDRLEN;
-import static android.net.ipsec.ike.cts.PacketUtils.IP6_HDRLEN;
-import static android.net.ipsec.ike.cts.PacketUtils.IPPROTO_ESP;
-import static android.net.ipsec.ike.cts.PacketUtils.UDP_HDRLEN;
-import static android.system.OsConstants.IPPROTO_UDP;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.fail;
-
-import android.os.ParcelFileDescriptor;
-
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.function.Predicate;
-
-/**
- * This code is a exact copy of {@link TunUtils} in
- * cts/tests/tests/net/src/android/net/cts/TunUtils.java, except the import path of PacketUtils is
- * the path to the copy of PacktUtils.
- *
- * <p>TODO(b/148689509): Statically include the TunUtils source file instead of copying it.
- */
-public class TunUtils {
-    private static final String TAG = TunUtils.class.getSimpleName();
-
-    private static final int DATA_BUFFER_LEN = 4096;
-    static final int TIMEOUT = 500;
-
-    static final int IP4_PROTO_OFFSET = 9;
-    static final int IP6_PROTO_OFFSET = 6;
-
-    static final int IP4_ADDR_OFFSET = 12;
-    static final int IP4_ADDR_LEN = 4;
-    static final int IP6_ADDR_OFFSET = 8;
-    static final int IP6_ADDR_LEN = 16;
-
-    final List<byte[]> mPackets = new ArrayList<>();
-    private final ParcelFileDescriptor mTunFd;
-    private final Thread mReaderThread;
-
-    public TunUtils(ParcelFileDescriptor tunFd) {
-        mTunFd = tunFd;
-
-        // Start background reader thread
-        mReaderThread =
-                new Thread(
-                        () -> {
-                            try {
-                                // Loop will exit and thread will quit when tunFd is closed.
-                                // Receiving either EOF or an exception will exit this reader loop.
-                                // FileInputStream in uninterruptable, so there's no good way to
-                                // ensure that this thread shuts down except upon FD closure.
-                                while (true) {
-                                    byte[] intercepted = receiveFromTun();
-                                    if (intercepted == null) {
-                                        // Exit once we've hit EOF
-                                        return;
-                                    } else if (intercepted.length > 0) {
-                                        // Only save packet if we've received any bytes.
-                                        synchronized (mPackets) {
-                                            mPackets.add(intercepted);
-                                            mPackets.notifyAll();
-                                        }
-                                    }
-                                }
-                            } catch (IOException ignored) {
-                                // Simply exit this reader thread
-                                return;
-                            }
-                        });
-        mReaderThread.start();
-    }
-
-    private byte[] receiveFromTun() throws IOException {
-        FileInputStream in = new FileInputStream(mTunFd.getFileDescriptor());
-        byte[] inBytes = new byte[DATA_BUFFER_LEN];
-        int bytesRead = in.read(inBytes);
-
-        if (bytesRead < 0) {
-            return null; // return null for EOF
-        } else if (bytesRead >= DATA_BUFFER_LEN) {
-            throw new IllegalStateException("Too big packet. Fragmentation unsupported");
-        }
-        return Arrays.copyOf(inBytes, bytesRead);
-    }
-
-    byte[] getFirstMatchingPacket(Predicate<byte[]> verifier, int startIndex) {
-        synchronized (mPackets) {
-            for (int i = startIndex; i < mPackets.size(); i++) {
-                byte[] pkt = mPackets.get(i);
-                if (verifier.test(pkt)) {
-                    return pkt;
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Checks if the specified bytes were ever sent in plaintext.
-     *
-     * <p>Only checks for known plaintext bytes to prevent triggering on ICMP/RA packets or the like
-     *
-     * @param plaintext the plaintext bytes to check for
-     * @param startIndex the index in the list to check for
-     */
-    public boolean hasPlaintextPacket(byte[] plaintext, int startIndex) {
-        Predicate<byte[]> verifier =
-                (pkt) -> {
-                    return Collections.indexOfSubList(Arrays.asList(pkt), Arrays.asList(plaintext))
-                            != -1;
-                };
-        return getFirstMatchingPacket(verifier, startIndex) != null;
-    }
-
-    public byte[] getEspPacket(int spi, boolean encap, int startIndex) {
-        return getFirstMatchingPacket(
-                (pkt) -> {
-                    return isEsp(pkt, spi, encap);
-                },
-                startIndex);
-    }
-
-    public byte[] awaitEspPacketNoPlaintext(
-            int spi, byte[] plaintext, boolean useEncap, int expectedPacketSize) throws Exception {
-        long endTime = System.currentTimeMillis() + TIMEOUT;
-        int startIndex = 0;
-
-        synchronized (mPackets) {
-            while (System.currentTimeMillis() < endTime) {
-                byte[] espPkt = getEspPacket(spi, useEncap, startIndex);
-                if (espPkt != null) {
-                    // Validate packet size
-                    assertEquals(expectedPacketSize, espPkt.length);
-
-                    // Always check plaintext from start
-                    assertFalse(hasPlaintextPacket(plaintext, 0));
-                    return espPkt; // We've found the packet we're looking for.
-                }
-
-                startIndex = mPackets.size();
-
-                // Try to prevent waiting too long. If waitTimeout <= 0, we've already hit timeout
-                long waitTimeout = endTime - System.currentTimeMillis();
-                if (waitTimeout > 0) {
-                    mPackets.wait(waitTimeout);
-                }
-            }
-
-            fail("No such ESP packet found with SPI " + spi);
-        }
-        return null;
-    }
-
-    private static boolean isSpiEqual(byte[] pkt, int espOffset, int spi) {
-        // Check SPI byte by byte.
-        return pkt[espOffset] == (byte) ((spi >>> 24) & 0xff)
-                && pkt[espOffset + 1] == (byte) ((spi >>> 16) & 0xff)
-                && pkt[espOffset + 2] == (byte) ((spi >>> 8) & 0xff)
-                && pkt[espOffset + 3] == (byte) (spi & 0xff);
-    }
-
-    private static boolean isEsp(byte[] pkt, int spi, boolean encap) {
-        if (isIpv6(pkt)) {
-            // IPv6 UDP encap not supported by kernels; assume non-encap.
-            return pkt[IP6_PROTO_OFFSET] == IPPROTO_ESP && isSpiEqual(pkt, IP6_HDRLEN, spi);
-        } else {
-            // Use default IPv4 header length (assuming no options)
-            if (encap) {
-                return pkt[IP4_PROTO_OFFSET] == IPPROTO_UDP
-                        && isSpiEqual(pkt, IP4_HDRLEN + UDP_HDRLEN, spi);
-            } else {
-                return pkt[IP4_PROTO_OFFSET] == IPPROTO_ESP && isSpiEqual(pkt, IP4_HDRLEN, spi);
-            }
-        }
-    }
-
-    static boolean isIpv6(byte[] pkt) {
-        // First nibble shows IP version. 0x60 for IPv6
-        return (pkt[0] & (byte) 0xF0) == (byte) 0x60;
-    }
-
-    private static byte[] getReflectedPacket(byte[] pkt) {
-        byte[] reflected = Arrays.copyOf(pkt, pkt.length);
-
-        if (isIpv6(pkt)) {
-            // Set reflected packet's dst to that of the original's src
-            System.arraycopy(
-                    pkt, // src
-                    IP6_ADDR_OFFSET + IP6_ADDR_LEN, // src offset
-                    reflected, // dst
-                    IP6_ADDR_OFFSET, // dst offset
-                    IP6_ADDR_LEN); // len
-            // Set reflected packet's src IP to that of the original's dst IP
-            System.arraycopy(
-                    pkt, // src
-                    IP6_ADDR_OFFSET, // src offset
-                    reflected, // dst
-                    IP6_ADDR_OFFSET + IP6_ADDR_LEN, // dst offset
-                    IP6_ADDR_LEN); // len
-        } else {
-            // Set reflected packet's dst to that of the original's src
-            System.arraycopy(
-                    pkt, // src
-                    IP4_ADDR_OFFSET + IP4_ADDR_LEN, // src offset
-                    reflected, // dst
-                    IP4_ADDR_OFFSET, // dst offset
-                    IP4_ADDR_LEN); // len
-            // Set reflected packet's src IP to that of the original's dst IP
-            System.arraycopy(
-                    pkt, // src
-                    IP4_ADDR_OFFSET, // src offset
-                    reflected, // dst
-                    IP4_ADDR_OFFSET + IP4_ADDR_LEN, // dst offset
-                    IP4_ADDR_LEN); // len
-        }
-        return reflected;
-    }
-
-    /** Takes all captured packets, flips the src/dst, and re-injects them. */
-    public void reflectPackets() throws IOException {
-        synchronized (mPackets) {
-            for (byte[] pkt : mPackets) {
-                injectPacket(getReflectedPacket(pkt));
-            }
-        }
-    }
-
-    public void injectPacket(byte[] pkt) throws IOException {
-        FileOutputStream out = new FileOutputStream(mTunFd.getFileDescriptor());
-        out.write(pkt);
-        out.flush();
-    }
-
-    /** Resets the intercepted packets. */
-    public void reset() throws IOException {
-        synchronized (mPackets) {
-            mPackets.clear();
-        }
-    }
-}
diff --git a/tests/tests/net/jarjar-rules-shared.txt b/tests/tests/net/jarjar-rules-shared.txt
deleted file mode 100644
index 11dba74..0000000
--- a/tests/tests/net/jarjar-rules-shared.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-# Module library in frameworks/libs/net
-rule com.android.net.module.util.** android.net.cts.util.@1
\ No newline at end of file
diff --git a/tests/tests/net/jni/Android.bp b/tests/tests/net/jni/Android.bp
deleted file mode 100644
index 3953aeb..0000000
--- a/tests/tests/net/jni/Android.bp
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (C) 2013 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.
-
-cc_library_shared {
-    name: "libnativedns_jni",
-
-    srcs: ["NativeDnsJni.c"],
-    sdk_version: "current",
-
-    shared_libs: [
-        "libnativehelper_compat_libc++",
-        "liblog",
-    ],
-    stl: "libc++_static",
-
-    cflags: [
-        "-Wall",
-        "-Werror",
-        "-Wno-unused-parameter",
-    ],
-
-}
-
-cc_library_shared {
-    name: "libnativemultinetwork_jni",
-
-    srcs: ["NativeMultinetworkJni.cpp"],
-    sdk_version: "current",
-    cflags: [
-        "-Wall",
-        "-Werror",
-        "-Wno-format",
-    ],
-    shared_libs: [
-        "libandroid",
-        "libnativehelper_compat_libc++",
-        "liblog",
-    ],
-    stl: "libc++_static",
-}
diff --git a/tests/tests/net/jni/NativeDnsJni.c b/tests/tests/net/jni/NativeDnsJni.c
deleted file mode 100644
index 4ec800e..0000000
--- a/tests/tests/net/jni/NativeDnsJni.c
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <arpa/inet.h>
-#include <jni.h>
-#include <netdb.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <android/log.h>
-
-#define LOG_TAG "NativeDns-JNI"
-#define LOGD(fmt, ...) \
-        __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, fmt, ##__VA_ARGS__)
-
-const char *GoogleDNSIpV4Address="8.8.8.8";
-const char *GoogleDNSIpV4Address2="8.8.4.4";
-const char *GoogleDNSIpV6Address="2001:4860:4860::8888";
-const char *GoogleDNSIpV6Address2="2001:4860:4860::8844";
-
-JNIEXPORT jboolean Java_android_net_cts_DnsTest_testNativeDns(JNIEnv* env, jclass class)
-{
-    const char *node = "www.google.com";
-    char *service = NULL;
-    struct addrinfo *answer;
-
-    int res = getaddrinfo(node, service, NULL, &answer);
-    LOGD("getaddrinfo(www.google.com) gave res=%d (%s)", res, gai_strerror(res));
-    if (res != 0) return JNI_FALSE;
-
-    // check for v4 & v6
-    {
-        int foundv4 = 0;
-        int foundv6 = 0;
-        struct addrinfo *current = answer;
-        while (current != NULL) {
-            char buf[256];
-            if (current->ai_addr->sa_family == AF_INET) {
-                inet_ntop(current->ai_family, &((struct sockaddr_in *)current->ai_addr)->sin_addr,
-                        buf, sizeof(buf));
-                foundv4 = 1;
-                LOGD("  %s", buf);
-            } else if (current->ai_addr->sa_family == AF_INET6) {
-                inet_ntop(current->ai_family, &((struct sockaddr_in6 *)current->ai_addr)->sin6_addr,
-                        buf, sizeof(buf));
-                foundv6 = 1;
-                LOGD("  %s", buf);
-            }
-            current = current->ai_next;
-        }
-
-        freeaddrinfo(answer);
-        answer = NULL;
-        if (foundv4 != 1 && foundv6 != 1) {
-            LOGD("getaddrinfo(www.google.com) didn't find either v4 or v6 address");
-            return JNI_FALSE;
-        }
-    }
-
-    node = "ipv6.google.com";
-    res = getaddrinfo(node, service, NULL, &answer);
-    LOGD("getaddrinfo(ipv6.google.com) gave res=%d", res);
-    if (res != 0) return JNI_FALSE;
-
-    {
-        int foundv4 = 0;
-        int foundv6 = 0;
-        struct addrinfo *current = answer;
-        while (current != NULL) {
-            char buf[256];
-            if (current->ai_addr->sa_family == AF_INET) {
-                inet_ntop(current->ai_family, &((struct sockaddr_in *)current->ai_addr)->sin_addr,
-                        buf, sizeof(buf));
-                LOGD("  %s", buf);
-                foundv4 = 1;
-            } else if (current->ai_addr->sa_family == AF_INET6) {
-                inet_ntop(current->ai_family, &((struct sockaddr_in6 *)current->ai_addr)->sin6_addr,
-                        buf, sizeof(buf));
-                LOGD("  %s", buf);
-                foundv6 = 1;
-            }
-            current = current->ai_next;
-        }
-
-        freeaddrinfo(answer);
-        answer = NULL;
-        if (foundv4 == 1 || foundv6 != 1) {
-            LOGD("getaddrinfo(ipv6.google.com) didn't find only v6");
-            return JNI_FALSE;
-        }
-    }
-
-    // getnameinfo
-    struct sockaddr_in sa4;
-    sa4.sin_family = AF_INET;
-    sa4.sin_port = 0;
-    inet_pton(AF_INET, GoogleDNSIpV4Address, &(sa4.sin_addr));
-
-    struct sockaddr_in6 sa6;
-    sa6.sin6_family = AF_INET6;
-    sa6.sin6_port = 0;
-    sa6.sin6_flowinfo = 0;
-    sa6.sin6_scope_id = 0;
-    inet_pton(AF_INET6, GoogleDNSIpV6Address2, &(sa6.sin6_addr));
-
-    char buf[NI_MAXHOST];
-    int flags = NI_NAMEREQD;
-
-    res = getnameinfo((const struct sockaddr*)&sa4, sizeof(sa4), buf, sizeof(buf), NULL, 0, flags);
-    if (res != 0) {
-        LOGD("getnameinfo(%s (GoogleDNS) ) gave error %d (%s)", GoogleDNSIpV4Address, res,
-            gai_strerror(res));
-        return JNI_FALSE;
-    }
-    if (strstr(buf, "google.com") == NULL && strstr(buf, "dns.google") == NULL) {
-        LOGD("getnameinfo(%s (GoogleDNS) ) didn't return google.com or dns.google: %s",
-            GoogleDNSIpV4Address, buf);
-        return JNI_FALSE;
-    }
-
-    memset(buf, 0, sizeof(buf));
-    res = getnameinfo((const struct sockaddr*)&sa6, sizeof(sa6), buf, sizeof(buf), NULL, 0, flags);
-    if (res != 0) {
-        LOGD("getnameinfo(%s (GoogleDNS) ) gave error %d (%s)", GoogleDNSIpV6Address2,
-            res, gai_strerror(res));
-        return JNI_FALSE;
-    }
-    if (strstr(buf, "google.com") == NULL && strstr(buf, "dns.google") == NULL) {
-        LOGD("getnameinfo(%s (GoogleDNS) ) didn't return google.com or dns.google: %s",
-            GoogleDNSIpV6Address2, buf);
-        return JNI_FALSE;
-    }
-
-    // gethostbyname
-    struct hostent *my_hostent = gethostbyname("www.youtube.com");
-    if (my_hostent == NULL) {
-        LOGD("gethostbyname(www.youtube.com) gave null response");
-        return JNI_FALSE;
-    }
-    if ((my_hostent->h_addr_list == NULL) || (*my_hostent->h_addr_list == NULL)) {
-        LOGD("gethostbyname(www.youtube.com) gave 0 addresses");
-        return JNI_FALSE;
-    }
-    {
-        char **current = my_hostent->h_addr_list;
-        while (*current != NULL) {
-            char buf[256];
-            inet_ntop(my_hostent->h_addrtype, *current, buf, sizeof(buf));
-            LOGD("gethostbyname(www.youtube.com) gave %s", buf);
-            current++;
-        }
-    }
-
-    // gethostbyaddr
-    char addr6[16];
-    inet_pton(AF_INET6, GoogleDNSIpV6Address, addr6);
-    my_hostent = gethostbyaddr(addr6, sizeof(addr6), AF_INET6);
-    if (my_hostent == NULL) {
-        LOGD("gethostbyaddr(%s (GoogleDNS) ) gave null response", GoogleDNSIpV6Address);
-        return JNI_FALSE;
-    }
-
-    LOGD("gethostbyaddr(%s (GoogleDNS) ) gave %s for name", GoogleDNSIpV6Address,
-        my_hostent->h_name ? my_hostent->h_name : "null");
-
-    if (my_hostent->h_name == NULL) return JNI_FALSE;
-    return JNI_TRUE;
-}
diff --git a/tests/tests/net/jni/NativeMultinetworkJni.cpp b/tests/tests/net/jni/NativeMultinetworkJni.cpp
deleted file mode 100644
index 60e31bc..0000000
--- a/tests/tests/net/jni/NativeMultinetworkJni.cpp
+++ /dev/null
@@ -1,515 +0,0 @@
-/*
- * Copyright (C) 2019 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.
- */
-
-
-#define LOG_TAG "MultinetworkApiTest"
-
-#include <arpa/inet.h>
-#include <arpa/nameser.h>
-#include <errno.h>
-#include <inttypes.h>
-#include <jni.h>
-#include <netdb.h>
-#include <poll.h> /* poll */
-#include <resolv.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-
-#include <string>
-
-#include <android/log.h>
-#include <android/multinetwork.h>
-#include <nativehelper/JNIHelp.h>
-
-#define LOGD(fmt, ...) \
-        __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, fmt, ##__VA_ARGS__)
-
-#define EXPECT_GE(env, actual, expected, msg)                        \
-    do {                                                             \
-        if (actual < expected) {                                     \
-            jniThrowExceptionFmt(env, "java/lang/AssertionError",    \
-                    "%s:%d: %s EXPECT_GE: expected %d, got %d",      \
-                    __FILE__, __LINE__, msg, expected, actual);      \
-        }                                                            \
-    } while (0)
-
-#define EXPECT_GT(env, actual, expected, msg)                        \
-    do {                                                             \
-        if (actual <= expected) {                                    \
-            jniThrowExceptionFmt(env, "java/lang/AssertionError",    \
-                    "%s:%d: %s EXPECT_GT: expected %d, got %d",      \
-                    __FILE__, __LINE__, msg, expected, actual);      \
-        }                                                            \
-    } while (0)
-
-#define EXPECT_EQ(env, expected, actual, msg)                        \
-    do {                                                             \
-        if (actual != expected) {                                    \
-            jniThrowExceptionFmt(env, "java/lang/AssertionError",    \
-                    "%s:%d: %s EXPECT_EQ: expected %d, got %d",      \
-                    __FILE__, __LINE__, msg, expected, actual);      \
-        }                                                            \
-    } while (0)
-
-static const int MAXPACKET = 8 * 1024;
-static const int TIMEOUT_MS = 15000;
-static const char kHostname[] = "connectivitycheck.android.com";
-static const char kNxDomainName[] = "test1-nx.metric.gstatic.com";
-static const char kGoogleName[] = "www.google.com";
-
-int makeQuery(const char* name, int qtype, uint8_t* buf, size_t buflen) {
-    return res_mkquery(ns_o_query, name, ns_c_in, qtype, NULL, 0, NULL, buf, buflen);
-}
-
-int getAsyncResponse(JNIEnv* env, int fd, int timeoutMs, int* rcode, uint8_t* buf, size_t bufLen) {
-    struct pollfd wait_fd = { .fd = fd, .events = POLLIN };
-
-    poll(&wait_fd, 1, timeoutMs);
-    if (wait_fd.revents & POLLIN) {
-        int n = android_res_nresult(fd, rcode, buf, bufLen);
-        // Verify that android_res_nresult() closed the fd
-        char dummy;
-        EXPECT_EQ(env, -1, read(fd, &dummy, sizeof(dummy)), "res_nresult check for closing fd");
-        EXPECT_EQ(env, EBADF, errno, "res_nresult check for errno");
-        return n;
-    }
-
-    return -ETIMEDOUT;
-}
-
-int extractIpAddressAnswers(uint8_t* buf, size_t bufLen, int family) {
-    ns_msg handle;
-    if (ns_initparse((const uint8_t*) buf, bufLen, &handle) < 0) {
-        return -errno;
-    }
-    const int ancount = ns_msg_count(handle, ns_s_an);
-    // Answer count = 0 is valid(e.g. response of query with root)
-    if (!ancount) {
-        return 0;
-    }
-    ns_rr rr;
-    bool hasValidAns = false;
-    for (int i = 0; i < ancount; i++) {
-        if (ns_parserr(&handle, ns_s_an, i, &rr) < 0) {
-            // If there is no valid answer, test will fail.
-            continue;
-        }
-        const uint8_t* rdata = ns_rr_rdata(rr);
-        char buffer[INET6_ADDRSTRLEN];
-        if (inet_ntop(family, (const char*) rdata, buffer, sizeof(buffer)) == NULL) {
-            return -errno;
-        }
-        hasValidAns = true;
-    }
-    return hasValidAns ? 0 : -EBADMSG;
-}
-
-int expectAnswersValid(JNIEnv* env, int fd, int family, int expectedRcode) {
-    int rcode = -1;
-    uint8_t buf[MAXPACKET] = {};
-    int res = getAsyncResponse(env, fd, TIMEOUT_MS, &rcode, buf, MAXPACKET);
-    if (res < 0) {
-        return res;
-    }
-
-    EXPECT_EQ(env, expectedRcode, rcode, "rcode is not expected");
-
-    if (expectedRcode == ns_r_noerror && res > 0) {
-        return extractIpAddressAnswers(buf, res, family);
-    }
-    return 0;
-}
-
-int expectAnswersNotValid(JNIEnv* env, int fd, int expectedErrno) {
-    int rcode = -1;
-    uint8_t buf[MAXPACKET] = {};
-    int res = getAsyncResponse(env, fd, TIMEOUT_MS, &rcode, buf, MAXPACKET);
-    if (res != expectedErrno) {
-        LOGD("res:%d, expectedErrno = %d", res, expectedErrno);
-        return (res > 0) ? -EREMOTEIO : res;
-    }
-    return 0;
-}
-
-extern "C"
-JNIEXPORT void Java_android_net_cts_MultinetworkApiTest_runResNqueryCheck(
-        JNIEnv* env, jclass, jlong nethandle) {
-    net_handle_t handle = (net_handle_t) nethandle;
-
-    // V4
-    int fd = android_res_nquery(handle, kHostname, ns_c_in, ns_t_a, 0);
-    EXPECT_GE(env, fd, 0, "v4 res_nquery");
-    EXPECT_EQ(env, 0, expectAnswersValid(env, fd, AF_INET, ns_r_noerror),
-            "v4 res_nquery check answers");
-
-    // V6
-    fd = android_res_nquery(handle, kHostname, ns_c_in, ns_t_aaaa, 0);
-    EXPECT_GE(env, fd, 0, "v6 res_nquery");
-    EXPECT_EQ(env, 0, expectAnswersValid(env, fd, AF_INET, ns_r_noerror),
-            "v6 res_nquery check answers");
-}
-
-extern "C"
-JNIEXPORT void Java_android_net_cts_MultinetworkApiTest_runResNsendCheck(
-        JNIEnv* env, jclass, jlong nethandle) {
-    net_handle_t handle = (net_handle_t) nethandle;
-    // V4
-    uint8_t buf1[MAXPACKET] = {};
-
-    int len1 = makeQuery(kGoogleName, ns_t_a, buf1, sizeof(buf1));
-    EXPECT_GT(env, len1, 0, "v4 res_mkquery 1st");
-
-    uint8_t buf2[MAXPACKET] = {};
-    int len2 = makeQuery(kHostname, ns_t_a, buf2, sizeof(buf2));
-    EXPECT_GT(env, len2, 0, "v4 res_mkquery 2nd");
-
-    int fd1 = android_res_nsend(handle, buf1, len1, 0);
-    EXPECT_GE(env, fd1, 0, "v4 res_nsend 1st");
-    int fd2 = android_res_nsend(handle, buf2, len2, 0);
-    EXPECT_GE(env, fd2, 0, "v4 res_nsend 2nd");
-
-    EXPECT_EQ(env, 0, expectAnswersValid(env, fd2, AF_INET, ns_r_noerror),
-            "v4 res_nsend 2nd check answers");
-    EXPECT_EQ(env, 0, expectAnswersValid(env, fd1, AF_INET, ns_r_noerror),
-            "v4 res_nsend 1st check answers");
-
-    // V6
-    memset(buf1, 0, sizeof(buf1));
-    memset(buf2, 0, sizeof(buf2));
-    len1 = makeQuery(kGoogleName, ns_t_aaaa, buf1, sizeof(buf1));
-    EXPECT_GT(env, len1, 0, "v6 res_mkquery 1st");
-    len2 = makeQuery(kHostname, ns_t_aaaa, buf2, sizeof(buf2));
-    EXPECT_GT(env, len2, 0, "v6 res_mkquery 2nd");
-
-    fd1 = android_res_nsend(handle, buf1, len1, 0);
-    EXPECT_GE(env, fd1, 0, "v6 res_nsend 1st");
-    fd2 = android_res_nsend(handle, buf2, len2, 0);
-    EXPECT_GE(env, fd2, 0, "v6 res_nsend 2nd");
-
-    EXPECT_EQ(env, 0, expectAnswersValid(env, fd2, AF_INET6, ns_r_noerror),
-            "v6 res_nsend 2nd check answers");
-    EXPECT_EQ(env, 0, expectAnswersValid(env, fd1, AF_INET6, ns_r_noerror),
-            "v6 res_nsend 1st check answers");
-}
-
-extern "C"
-JNIEXPORT void Java_android_net_cts_MultinetworkApiTest_runResNnxDomainCheck(
-        JNIEnv* env, jclass, jlong nethandle) {
-    net_handle_t handle = (net_handle_t) nethandle;
-
-    // res_nquery V4 NXDOMAIN
-    int fd = android_res_nquery(handle, kNxDomainName, ns_c_in, ns_t_a, 0);
-    EXPECT_GE(env, fd, 0, "v4 res_nquery NXDOMAIN");
-    EXPECT_EQ(env, 0, expectAnswersValid(env, fd, AF_INET, ns_r_nxdomain),
-            "v4 res_nquery NXDOMAIN check answers");
-
-    // res_nquery V6 NXDOMAIN
-    fd = android_res_nquery(handle, kNxDomainName, ns_c_in, ns_t_aaaa, 0);
-    EXPECT_GE(env, fd, 0, "v6 res_nquery NXDOMAIN");
-    EXPECT_EQ(env, 0, expectAnswersValid(env, fd, AF_INET6, ns_r_nxdomain),
-            "v6 res_nquery NXDOMAIN check answers");
-
-    uint8_t buf[MAXPACKET] = {};
-    // res_nsend V4 NXDOMAIN
-    int len = makeQuery(kNxDomainName, ns_t_a, buf, sizeof(buf));
-    EXPECT_GT(env, len, 0, "v4 res_mkquery NXDOMAIN");
-    fd = android_res_nsend(handle, buf, len, 0);
-    EXPECT_GE(env, fd, 0, "v4 res_nsend NXDOMAIN");
-    EXPECT_EQ(env, 0, expectAnswersValid(env, fd, AF_INET, ns_r_nxdomain),
-            "v4 res_nsend NXDOMAIN check answers");
-
-    // res_nsend V6 NXDOMAIN
-    memset(buf, 0, sizeof(buf));
-    len = makeQuery(kNxDomainName, ns_t_aaaa, buf, sizeof(buf));
-    EXPECT_GT(env, len, 0, "v6 res_mkquery NXDOMAIN");
-    fd = android_res_nsend(handle, buf, len, 0);
-    EXPECT_GE(env, fd, 0, "v6 res_nsend NXDOMAIN");
-    EXPECT_EQ(env, 0, expectAnswersValid(env, fd, AF_INET6, ns_r_nxdomain),
-            "v6 res_nsend NXDOMAIN check answers");
-}
-
-
-extern "C"
-JNIEXPORT void Java_android_net_cts_MultinetworkApiTest_runResNcancelCheck(
-        JNIEnv* env, jclass, jlong nethandle) {
-    net_handle_t handle = (net_handle_t) nethandle;
-
-    int fd = android_res_nquery(handle, kGoogleName, ns_c_in, ns_t_a, 0);
-    errno = 0;
-    android_res_cancel(fd);
-    int err = errno;
-    EXPECT_EQ(env, 0, err, "res_cancel");
-    // DO NOT call cancel or result with the same fd more than once,
-    // otherwise it will hit fdsan double-close fd.
-}
-
-extern "C"
-JNIEXPORT void Java_android_net_cts_MultinetworkApiTest_runResNapiMalformedCheck(
-        JNIEnv* env, jclass, jlong nethandle) {
-    net_handle_t handle = (net_handle_t) nethandle;
-
-    // It is the equivalent of "dig . a", Query with an empty name.
-    int fd = android_res_nquery(handle, "", ns_c_in, ns_t_a, 0);
-    EXPECT_GE(env, fd, 0, "res_nquery root");
-    EXPECT_EQ(env, 0, expectAnswersValid(env, fd, AF_INET, ns_r_noerror),
-            "res_nquery root check answers");
-
-    // Label limit 63
-    std::string exceedingLabelQuery = "www." + std::string(70, 'g') + ".com";
-    // Name limit 255
-    std::string exceedingDomainQuery = "www." + std::string(255, 'g') + ".com";
-
-    fd = android_res_nquery(handle, exceedingLabelQuery.c_str(), ns_c_in, ns_t_a, 0);
-    EXPECT_EQ(env, -EMSGSIZE, fd, "res_nquery exceedingLabelQuery");
-    fd = android_res_nquery(handle, exceedingDomainQuery.c_str(), ns_c_in, ns_t_aaaa, 0);
-    EXPECT_EQ(env, -EMSGSIZE, fd, "res_nquery exceedingDomainQuery");
-
-    uint8_t buf[10] = {};
-    // empty BLOB
-    fd = android_res_nsend(handle, buf, 10, 0);
-    EXPECT_GE(env, fd, 0, "res_nsend empty BLOB");
-    EXPECT_EQ(env, 0, expectAnswersNotValid(env, fd, -EINVAL),
-            "res_nsend empty BLOB check answers");
-
-    uint8_t largeBuf[2 * MAXPACKET] = {};
-    // A buffer larger than 8KB
-    fd = android_res_nsend(handle, largeBuf, sizeof(largeBuf), 0);
-    EXPECT_EQ(env, -EMSGSIZE, fd, "res_nsend buffer larger than 8KB");
-
-    // 5000 bytes filled with 0. This returns EMSGSIZE because FrameworkListener limits the size of
-    // commands to 4096 bytes.
-    fd = android_res_nsend(handle, largeBuf, 5000, 0);
-    EXPECT_EQ(env, -EMSGSIZE, fd, "res_nsend 5000 bytes filled with 0");
-
-    // 500 bytes filled with 0
-    fd = android_res_nsend(handle, largeBuf, 500, 0);
-    EXPECT_GE(env, fd, 0, "res_nsend 500 bytes filled with 0");
-    EXPECT_EQ(env, 0, expectAnswersNotValid(env, fd, -EINVAL),
-            "res_nsend 500 bytes filled with 0 check answers");
-
-    // 5000 bytes filled with 0xFF
-    uint8_t ffBuf[5001] = {};
-    memset(ffBuf, 0xFF, sizeof(ffBuf));
-    ffBuf[5000] = '\0';
-    fd = android_res_nsend(handle, ffBuf, sizeof(ffBuf), 0);
-    EXPECT_EQ(env, -EMSGSIZE, fd, "res_nsend 5000 bytes filled with 0xFF");
-
-    // 500 bytes filled with 0xFF
-    ffBuf[500] = '\0';
-    fd = android_res_nsend(handle, ffBuf, 501, 0);
-    EXPECT_GE(env, fd, 0, "res_nsend 500 bytes filled with 0xFF");
-    EXPECT_EQ(env, 0, expectAnswersNotValid(env, fd, -EINVAL),
-            "res_nsend 500 bytes filled with 0xFF check answers");
-}
-
-extern "C"
-JNIEXPORT jint Java_android_net_cts_MultinetworkApiTest_runGetaddrinfoCheck(
-        JNIEnv*, jclass, jlong nethandle) {
-    net_handle_t handle = (net_handle_t) nethandle;
-    struct addrinfo *res = NULL;
-
-    errno = 0;
-    int rval = android_getaddrinfofornetwork(handle, kHostname, NULL, NULL, &res);
-    const int saved_errno = errno;
-    freeaddrinfo(res);
-
-    LOGD("android_getaddrinfofornetwork(%" PRIu64 ", %s) returned rval=%d errno=%d",
-          handle, kHostname, rval, saved_errno);
-    return rval == 0 ? 0 : -saved_errno;
-}
-
-extern "C"
-JNIEXPORT jint Java_android_net_cts_MultinetworkApiTest_runSetprocnetwork(
-        JNIEnv*, jclass, jlong nethandle) {
-    net_handle_t handle = (net_handle_t) nethandle;
-
-    errno = 0;
-    int rval = android_setprocnetwork(handle);
-    const int saved_errno = errno;
-    LOGD("android_setprocnetwork(%" PRIu64 ") returned rval=%d errno=%d",
-          handle, rval, saved_errno);
-    return rval == 0 ? 0 : -saved_errno;
-}
-
-extern "C"
-JNIEXPORT jint Java_android_net_cts_MultinetworkApiTest_runSetsocknetwork(
-        JNIEnv*, jclass, jlong nethandle) {
-    net_handle_t handle = (net_handle_t) nethandle;
-
-    errno = 0;
-    int fd = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
-    if (fd < 0) {
-        LOGD("socket() failed, errno=%d", errno);
-        return -errno;
-    }
-
-    errno = 0;
-    int rval = android_setsocknetwork(handle, fd);
-    const int saved_errno = errno;
-    LOGD("android_setprocnetwork(%" PRIu64 ", %d) returned rval=%d errno=%d",
-          handle, fd, rval, saved_errno);
-    close(fd);
-    return rval == 0 ? 0 : -saved_errno;
-}
-
-// Use sizeof("x") - 1 because we need a compile-time constant, and strlen("x")
-// isn't guaranteed to fold to a constant.
-static const int kSockaddrStrLen = INET6_ADDRSTRLEN + sizeof("[]:65535") - 1;
-
-void sockaddr_ntop(const struct sockaddr *sa, socklen_t salen, char *dst, const size_t size) {
-    char addrstr[INET6_ADDRSTRLEN];
-    char portstr[sizeof("65535")];
-    char buf[kSockaddrStrLen+1];
-
-    int ret = getnameinfo(sa, salen,
-                          addrstr, sizeof(addrstr),
-                          portstr, sizeof(portstr),
-                          NI_NUMERICHOST | NI_NUMERICSERV);
-    if (ret == 0) {
-        snprintf(buf, sizeof(buf),
-                 (sa->sa_family == AF_INET6) ? "[%s]:%s" : "%s:%s",
-                 addrstr, portstr);
-    } else {
-        sprintf(buf, "???");
-    }
-
-    strlcpy(dst, buf, size);
-}
-
-extern "C"
-JNIEXPORT jint Java_android_net_cts_MultinetworkApiTest_runDatagramCheck(
-        JNIEnv*, jclass, jlong nethandle) {
-    const struct addrinfo kHints = {
-        .ai_flags = AI_ADDRCONFIG,
-        .ai_family = AF_UNSPEC,
-        .ai_socktype = SOCK_DGRAM,
-        .ai_protocol = IPPROTO_UDP,
-    };
-    struct addrinfo *res = NULL;
-    net_handle_t handle = (net_handle_t) nethandle;
-
-    static const char kPort[] = "443";
-    int rval = android_getaddrinfofornetwork(handle, kHostname, kPort, &kHints, &res);
-    if (rval != 0) {
-        LOGD("android_getaddrinfofornetwork(%llu, %s) returned rval=%d errno=%d",
-              handle, kHostname, rval, errno);
-        freeaddrinfo(res);
-        return -errno;
-    }
-
-    // Rely upon getaddrinfo sorting the best destination to the front.
-    int fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
-    if (fd < 0) {
-        LOGD("socket(%d, %d, %d) failed, errno=%d",
-              res->ai_family, res->ai_socktype, res->ai_protocol, errno);
-        freeaddrinfo(res);
-        return -errno;
-    }
-
-    rval = android_setsocknetwork(handle, fd);
-    LOGD("android_setprocnetwork(%llu, %d) returned rval=%d errno=%d",
-          handle, fd, rval, errno);
-    if (rval != 0) {
-        close(fd);
-        freeaddrinfo(res);
-        return -errno;
-    }
-
-    char addrstr[kSockaddrStrLen+1];
-    sockaddr_ntop(res->ai_addr, res->ai_addrlen, addrstr, sizeof(addrstr));
-    LOGD("Attempting connect() to %s ...", addrstr);
-
-    rval = connect(fd, res->ai_addr, res->ai_addrlen);
-    if (rval != 0) {
-        close(fd);
-        freeaddrinfo(res);
-        return -errno;
-    }
-    freeaddrinfo(res);
-
-    struct sockaddr_storage src_addr;
-    socklen_t src_addrlen = sizeof(src_addr);
-    if (getsockname(fd, (struct sockaddr *)&src_addr, &src_addrlen) != 0) {
-        close(fd);
-        return -errno;
-    }
-    sockaddr_ntop((const struct sockaddr *)&src_addr, sizeof(src_addr), addrstr, sizeof(addrstr));
-    LOGD("... from %s", addrstr);
-
-    // Don't let reads or writes block indefinitely.
-    const struct timeval timeo = { 2, 0 };  // 2 seconds
-    setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeo, sizeof(timeo));
-    setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &timeo, sizeof(timeo));
-
-    // For reference see:
-    //     https://datatracker.ietf.org/doc/html/draft-ietf-quic-invariants
-    uint8_t quic_packet[1200] = {
-        0xc0,                    // long header
-        0xaa, 0xda, 0xca, 0xca,  // reserved-space version number
-        0x08,                    // destination connection ID length
-        0, 0, 0, 0, 0, 0, 0, 0,  // 64bit connection ID
-        0x00,                    // source connection ID length
-    };
-
-    arc4random_buf(quic_packet + 6, 8);  // random connection ID
-
-    uint8_t response[1500];
-    ssize_t sent, rcvd;
-    static const int MAX_RETRIES = 5;
-    int i, errnum = 0;
-
-    for (i = 0; i < MAX_RETRIES; i++) {
-        sent = send(fd, quic_packet, sizeof(quic_packet), 0);
-        if (sent < (ssize_t)sizeof(quic_packet)) {
-            errnum = errno;
-            LOGD("send(QUIC packet) returned sent=%zd, errno=%d", sent, errnum);
-            close(fd);
-            return -errnum;
-        }
-
-        rcvd = recv(fd, response, sizeof(response), 0);
-        if (rcvd > 0) {
-            break;
-        } else {
-            errnum = errno;
-            LOGD("[%d/%d] recv(QUIC response) returned rcvd=%zd, errno=%d",
-                  i + 1, MAX_RETRIES, rcvd, errnum);
-        }
-    }
-    if (rcvd < 15) {
-        LOGD("QUIC UDP %s: sent=%zd but rcvd=%zd, errno=%d", kPort, sent, rcvd, errnum);
-        if (rcvd <= 0) {
-            LOGD("Does this network block UDP port %s?", kPort);
-        }
-        close(fd);
-        return -EPROTO;
-    }
-
-    int conn_id_cmp = memcmp(quic_packet + 6, response + 7, 8);
-    if (conn_id_cmp != 0) {
-        LOGD("sent and received connection IDs do not match");
-        close(fd);
-        return -EPROTO;
-    }
-
-    // TODO: Replace this quick 'n' dirty test with proper QUIC-capable code.
-
-    close(fd);
-    return 0;
-}
diff --git a/tests/tests/net/native/dns/Android.bp b/tests/tests/net/native/dns/Android.bp
deleted file mode 100644
index 1704a2b..0000000
--- a/tests/tests/net/native/dns/Android.bp
+++ /dev/null
@@ -1,40 +0,0 @@
-cc_defaults {
-    name: "dns_async_defaults",
-
-    cflags: [
-        "-fstack-protector-all",
-        "-g",
-        "-Wall",
-        "-Wextra",
-        "-Werror",
-        "-Wnullable-to-nonnull-conversion",
-        "-Wsign-compare",
-        "-Wthread-safety",
-        "-Wunused-parameter",
-    ],
-    srcs: [
-        "NativeDnsAsyncTest.cpp",
-    ],
-    shared_libs: [
-        "libandroid",
-        "liblog",
-        "libutils",
-    ],
-}
-
-cc_test {
-    name: "CtsNativeNetDnsTestCases",
-    defaults: ["dns_async_defaults"],
-    multilib: {
-        lib32: {
-            suffix: "32",
-        },
-        lib64: {
-            suffix: "64",
-        },
-    },
-    test_suites: [
-        "cts",
-        "mts",
-    ],
-}
diff --git a/tests/tests/net/native/dns/AndroidTest.xml b/tests/tests/net/native/dns/AndroidTest.xml
deleted file mode 100644
index 6d03c23..0000000
--- a/tests/tests/net/native/dns/AndroidTest.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2018 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.
--->
-<configuration description="Config for CTS Native Network dns test cases">
-    <option name="test-suite-tag" value="cts" />
-    <option name="config-descriptor:metadata" key="component" value="networking" />
-    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
-    <option name="config-descriptor:metadata" key="parameter" value="multi_abi" />
-    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
-    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.FilePusher">
-        <option name="cleanup" value="true" />
-        <option name="push" value="CtsNativeNetDnsTestCases->/data/local/tmp/CtsNativeNetDnsTestCases" />
-        <option name="append-bitness" value="true" />
-    </target_preparer>
-    <test class="com.android.tradefed.testtype.GTest" >
-        <option name="native-test-device-path" value="/data/local/tmp" />
-        <option name="module-name" value="CtsNativeNetDnsTestCases" />
-        <option name="runtime-hint" value="1m" />
-    </test>
-</configuration>
diff --git a/tests/tests/net/native/dns/NativeDnsAsyncTest.cpp b/tests/tests/net/native/dns/NativeDnsAsyncTest.cpp
deleted file mode 100644
index e501475..0000000
--- a/tests/tests/net/native/dns/NativeDnsAsyncTest.cpp
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <arpa/inet.h>
-#include <arpa/nameser.h>
-#include <error.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <inttypes.h>
-#include <netinet/in.h>
-#include <poll.h> /* poll */
-#include <resolv.h>
-#include <string.h>
-#include <sys/socket.h>
-
-#include <android/multinetwork.h>
-#include <gtest/gtest.h>
-
-namespace {
-constexpr int MAXPACKET = 8 * 1024;
-constexpr int PTON_MAX = 16;
-constexpr int TIMEOUT_MS = 10000;
-
-int getAsyncResponse(int fd, int timeoutMs, int* rcode, uint8_t* buf, size_t bufLen) {
-    struct pollfd wait_fd[1];
-    wait_fd[0].fd = fd;
-    wait_fd[0].events = POLLIN;
-    short revents;
-    int ret;
-    ret = poll(wait_fd, 1, timeoutMs);
-    revents = wait_fd[0].revents;
-    if (revents & POLLIN) {
-        int n = android_res_nresult(fd, rcode, buf, bufLen);
-        // Verify that android_res_nresult() closed the fd
-        char dummy;
-        EXPECT_EQ(-1, read(fd, &dummy, sizeof dummy));
-        EXPECT_EQ(EBADF, errno);
-        return n;
-    }
-
-    return -1;
-}
-
-std::vector<std::string> extractIpAddressAnswers(uint8_t* buf, size_t bufLen, int ipType) {
-    ns_msg handle;
-    if (ns_initparse((const uint8_t*) buf, bufLen, &handle) < 0) {
-        return {};
-    }
-    const int ancount = ns_msg_count(handle, ns_s_an);
-    ns_rr rr;
-    std::vector<std::string> answers;
-    for (int i = 0; i < ancount; i++) {
-        if (ns_parserr(&handle, ns_s_an, i, &rr) < 0) {
-            continue;
-        }
-        const uint8_t* rdata = ns_rr_rdata(rr);
-        char buffer[INET6_ADDRSTRLEN];
-        if (inet_ntop(ipType, (const char*) rdata, buffer, sizeof(buffer))) {
-            answers.push_back(buffer);
-        }
-    }
-    return answers;
-}
-
-void expectAnswersValid(int fd, int ipType, int expectedRcode) {
-    int rcode = -1;
-    uint8_t buf[MAXPACKET] = {};
-    int res = getAsyncResponse(fd, TIMEOUT_MS, &rcode, buf, MAXPACKET);
-    EXPECT_GE(res, 0);
-    EXPECT_EQ(rcode, expectedRcode);
-
-    if (expectedRcode == ns_r_noerror) {
-        auto answers = extractIpAddressAnswers(buf, res, ipType);
-        EXPECT_GE(answers.size(), 0U);
-        for (auto &answer : answers) {
-            char pton[PTON_MAX];
-            EXPECT_EQ(1, inet_pton(ipType, answer.c_str(), pton));
-        }
-    }
-}
-
-void expectAnswersNotValid(int fd, int expectedErrno) {
-    int rcode = -1;
-    uint8_t buf[MAXPACKET] = {};
-    int res = getAsyncResponse(fd, TIMEOUT_MS, &rcode, buf, MAXPACKET);
-    EXPECT_EQ(expectedErrno, res);
-}
-
-} // namespace
-
-TEST (NativeDnsAsyncTest, Async_Query) {
-    // V4
-    int fd1 = android_res_nquery(
-            NETWORK_UNSPECIFIED, "www.google.com", ns_c_in, ns_t_a, 0);
-    EXPECT_GE(fd1, 0);
-    int fd2 = android_res_nquery(
-            NETWORK_UNSPECIFIED, "www.youtube.com", ns_c_in, ns_t_a, 0);
-    EXPECT_GE(fd2, 0);
-    expectAnswersValid(fd2, AF_INET, ns_r_noerror);
-    expectAnswersValid(fd1, AF_INET, ns_r_noerror);
-
-    // V6
-    fd1 = android_res_nquery(
-            NETWORK_UNSPECIFIED, "www.google.com", ns_c_in, ns_t_aaaa, 0);
-    EXPECT_GE(fd1, 0);
-    fd2 = android_res_nquery(
-            NETWORK_UNSPECIFIED, "www.youtube.com", ns_c_in, ns_t_aaaa, 0);
-    EXPECT_GE(fd2, 0);
-    expectAnswersValid(fd2, AF_INET6, ns_r_noerror);
-    expectAnswersValid(fd1, AF_INET6, ns_r_noerror);
-}
-
-TEST (NativeDnsAsyncTest, Async_Send) {
-    // V4
-    uint8_t buf1[MAXPACKET] = {};
-    int len1 = res_mkquery(ns_o_query, "www.googleapis.com",
-            ns_c_in, ns_t_a, nullptr, 0, nullptr, buf1, sizeof(buf1));
-    EXPECT_GT(len1, 0);
-
-    uint8_t buf2[MAXPACKET] = {};
-    int len2 = res_mkquery(ns_o_query, "play.googleapis.com",
-            ns_c_in, ns_t_a, nullptr, 0, nullptr, buf2, sizeof(buf2));
-    EXPECT_GT(len2, 0);
-
-    int fd1 = android_res_nsend(NETWORK_UNSPECIFIED, buf1, len1, 0);
-    EXPECT_GE(fd1, 0);
-    int fd2 = android_res_nsend(NETWORK_UNSPECIFIED, buf2, len2, 0);
-    EXPECT_GE(fd2, 0);
-
-    expectAnswersValid(fd2, AF_INET, ns_r_noerror);
-    expectAnswersValid(fd1, AF_INET, ns_r_noerror);
-
-    // V6
-    memset(buf1, 0, sizeof(buf1));
-    memset(buf2, 0, sizeof(buf2));
-    len1 = res_mkquery(ns_o_query, "www.googleapis.com",
-            ns_c_in, ns_t_aaaa, nullptr, 0, nullptr, buf1, sizeof(buf1));
-    EXPECT_GT(len1, 0);
-    len2 = res_mkquery(ns_o_query, "play.googleapis.com",
-            ns_c_in, ns_t_aaaa, nullptr, 0, nullptr, buf2, sizeof(buf2));
-    EXPECT_GT(len2, 0);
-
-    fd1 = android_res_nsend(NETWORK_UNSPECIFIED, buf1, len1, 0);
-    EXPECT_GE(fd1, 0);
-    fd2 = android_res_nsend(NETWORK_UNSPECIFIED, buf2, len2, 0);
-    EXPECT_GE(fd2, 0);
-
-    expectAnswersValid(fd2, AF_INET6, ns_r_noerror);
-    expectAnswersValid(fd1, AF_INET6, ns_r_noerror);
-}
-
-TEST (NativeDnsAsyncTest, Async_NXDOMAIN) {
-    uint8_t buf[MAXPACKET] = {};
-    int len = res_mkquery(ns_o_query, "test1-nx.metric.gstatic.com",
-            ns_c_in, ns_t_a, nullptr, 0, nullptr, buf, sizeof(buf));
-    EXPECT_GT(len, 0);
-    int fd1 = android_res_nsend(NETWORK_UNSPECIFIED, buf, len, ANDROID_RESOLV_NO_CACHE_LOOKUP);
-    EXPECT_GE(fd1, 0);
-
-    len = res_mkquery(ns_o_query, "test2-nx.metric.gstatic.com",
-            ns_c_in, ns_t_a, nullptr, 0, nullptr, buf, sizeof(buf));
-    EXPECT_GT(len, 0);
-    int fd2 = android_res_nsend(NETWORK_UNSPECIFIED, buf, len, ANDROID_RESOLV_NO_CACHE_LOOKUP);
-    EXPECT_GE(fd2, 0);
-
-    expectAnswersValid(fd2, AF_INET, ns_r_nxdomain);
-    expectAnswersValid(fd1, AF_INET, ns_r_nxdomain);
-
-    fd1 = android_res_nquery(
-            NETWORK_UNSPECIFIED, "test3-nx.metric.gstatic.com",
-            ns_c_in, ns_t_aaaa, ANDROID_RESOLV_NO_CACHE_LOOKUP);
-    EXPECT_GE(fd1, 0);
-    fd2 = android_res_nquery(
-            NETWORK_UNSPECIFIED, "test4-nx.metric.gstatic.com",
-            ns_c_in, ns_t_aaaa, ANDROID_RESOLV_NO_CACHE_LOOKUP);
-    EXPECT_GE(fd2, 0);
-    expectAnswersValid(fd2, AF_INET6, ns_r_nxdomain);
-    expectAnswersValid(fd1, AF_INET6, ns_r_nxdomain);
-}
-
-TEST (NativeDnsAsyncTest, Async_Cancel) {
-    int fd = android_res_nquery(
-            NETWORK_UNSPECIFIED, "www.google.com", ns_c_in, ns_t_a, 0);
-    errno = 0;
-    android_res_cancel(fd);
-    int err = errno;
-    EXPECT_EQ(err, 0);
-    // DO NOT call cancel or result with the same fd more than once,
-    // otherwise it will hit fdsan double-close fd.
-}
-
-TEST (NativeDnsAsyncTest, Async_Query_MALFORMED) {
-    // Empty string to create BLOB and query, we will get empty result and rcode = 0
-    // on DNSTLS.
-    int fd = android_res_nquery(
-            NETWORK_UNSPECIFIED, "", ns_c_in, ns_t_a, 0);
-    EXPECT_GE(fd, 0);
-    expectAnswersValid(fd, AF_INET, ns_r_noerror);
-
-    std::string exceedingLabelQuery = "www." + std::string(70, 'g') + ".com";
-    std::string exceedingDomainQuery = "www." + std::string(255, 'g') + ".com";
-
-    fd = android_res_nquery(NETWORK_UNSPECIFIED,
-            exceedingLabelQuery.c_str(), ns_c_in, ns_t_a, 0);
-    EXPECT_EQ(-EMSGSIZE, fd);
-    fd = android_res_nquery(NETWORK_UNSPECIFIED,
-            exceedingDomainQuery.c_str(), ns_c_in, ns_t_a, 0);
-    EXPECT_EQ(-EMSGSIZE, fd);
-}
-
-TEST (NativeDnsAsyncTest, Async_Send_MALFORMED) {
-    uint8_t buf[10] = {};
-    // empty BLOB
-    int fd = android_res_nsend(NETWORK_UNSPECIFIED, buf, 10, 0);
-    EXPECT_GE(fd, 0);
-    expectAnswersNotValid(fd, -EINVAL);
-
-    std::vector<uint8_t> largeBuf(2 * MAXPACKET, 0);
-    // A buffer larger than 8KB
-    fd = android_res_nsend(
-            NETWORK_UNSPECIFIED, largeBuf.data(), largeBuf.size(), 0);
-    EXPECT_EQ(-EMSGSIZE, fd);
-
-    // 5000 bytes filled with 0. This returns EMSGSIZE because FrameworkListener limits the size of
-    // commands to 4096 bytes.
-    fd = android_res_nsend(NETWORK_UNSPECIFIED, largeBuf.data(), 5000, 0);
-    EXPECT_EQ(-EMSGSIZE, fd);
-
-    // 500 bytes filled with 0
-    fd = android_res_nsend(NETWORK_UNSPECIFIED, largeBuf.data(), 500, 0);
-    EXPECT_GE(fd, 0);
-    expectAnswersNotValid(fd, -EINVAL);
-
-    // 5000 bytes filled with 0xFF
-    std::vector<uint8_t> ffBuf(5000, 0xFF);
-    fd = android_res_nsend(
-            NETWORK_UNSPECIFIED, ffBuf.data(), ffBuf.size(), 0);
-    EXPECT_EQ(-EMSGSIZE, fd);
-
-    // 500 bytes filled with 0xFF
-    fd = android_res_nsend(NETWORK_UNSPECIFIED, ffBuf.data(), 500, 0);
-    EXPECT_GE(fd, 0);
-    expectAnswersNotValid(fd, -EINVAL);
-}
diff --git a/tests/tests/net/native/qtaguid/Android.bp b/tests/tests/net/native/qtaguid/Android.bp
deleted file mode 100644
index 23a0cf7..0000000
--- a/tests/tests/net/native/qtaguid/Android.bp
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (C) 2017 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.
-
-// Build the unit tests.
-
-cc_test {
-    name: "CtsNativeNetTestCases",
-
-    compile_multilib: "both",
-    multilib: {
-        lib32: {
-            suffix: "32",
-        },
-        lib64: {
-            suffix: "64",
-        },
-    },
-
-    srcs: ["src/NativeQtaguidTest.cpp"],
-
-    shared_libs: [
-        "libutils",
-        "liblog",
-    ],
-
-    static_libs: [
-        "libgtest",
-        "libqtaguid",
-    ],
-
-    // Tag this module as a cts test artifact
-    test_suites: [
-        "cts",
-        "vts10",
-    ],
-
-    cflags: [
-        "-Werror",
-        "-Wall",
-    ],
-
-}
diff --git a/tests/tests/net/native/qtaguid/AndroidTest.xml b/tests/tests/net/native/qtaguid/AndroidTest.xml
deleted file mode 100644
index fa4b2cf..0000000
--- a/tests/tests/net/native/qtaguid/AndroidTest.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2017 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.
--->
-<configuration description="Config for CTS Native Network xt_qtaguid test cases">
-    <option name="test-suite-tag" value="cts" />
-    <option name="config-descriptor:metadata" key="component" value="networking" />
-    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
-    <option name="config-descriptor:metadata" key="parameter" value="multi_abi" />
-    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
-    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.FilePusher">
-        <option name="cleanup" value="true" />
-        <option name="push" value="CtsNativeNetTestCases->/data/local/tmp/CtsNativeNetTestCases" />
-        <option name="append-bitness" value="true" />
-    </target_preparer>
-    <test class="com.android.tradefed.testtype.GTest" >
-        <option name="native-test-device-path" value="/data/local/tmp" />
-        <option name="module-name" value="CtsNativeNetTestCases" />
-        <option name="runtime-hint" value="1m" />
-    </test>
-</configuration>
diff --git a/tests/tests/net/native/qtaguid/src/NativeQtaguidTest.cpp b/tests/tests/net/native/qtaguid/src/NativeQtaguidTest.cpp
deleted file mode 100644
index 7dc6240..0000000
--- a/tests/tests/net/native/qtaguid/src/NativeQtaguidTest.cpp
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <arpa/inet.h>
-#include <error.h>
-#include <errno.h>
-#include <inttypes.h>
-#include <fcntl.h>
-#include <string.h>
-#include <sys/socket.h>
-
-#include <gtest/gtest.h>
-#include <qtaguid/qtaguid.h>
-
-int canAccessQtaguidFile() {
-    int fd = open("/proc/net/xt_qtaguid/ctrl", O_RDONLY | O_CLOEXEC);
-    close(fd);
-    return fd != -1;
-}
-
-#define SKIP_IF_QTAGUID_NOT_SUPPORTED()                                                       \
-  do {                                                                                        \
-    int res = canAccessQtaguidFile();                                                      \
-    ASSERT_LE(0, res);                                                                        \
-    if (!res) {                                                                               \
-          GTEST_LOG_(INFO) << "This test is skipped since kernel may not have the module\n";  \
-          return;                                                                             \
-    }                                                                                         \
-  } while (0)
-
-int getCtrlSkInfo(int tag, uid_t uid, uint64_t* sk_addr, int* ref_cnt) {
-    FILE *fp;
-    fp = fopen("/proc/net/xt_qtaguid/ctrl", "r");
-    if (!fp)
-        return -ENOENT;
-    uint64_t full_tag = (uint64_t)tag << 32 | uid;
-    char pattern[40];
-    snprintf(pattern, sizeof(pattern), " tag=0x%" PRIx64 " (uid=%" PRIu32 ")", full_tag, uid);
-
-    size_t len;
-    char *line_buffer = NULL;
-    while(getline(&line_buffer, &len, fp) != -1) {
-        if (strstr(line_buffer, pattern) == NULL)
-            continue;
-        int res;
-        pid_t dummy_pid;
-        uint64_t k_tag;
-        uint32_t k_uid;
-        const int TOTAL_PARAM = 5;
-        res = sscanf(line_buffer, "sock=%" PRIx64 " tag=0x%" PRIx64 " (uid=%" PRIu32 ") "
-                     "pid=%u f_count=%u", sk_addr, &k_tag, &k_uid,
-                     &dummy_pid, ref_cnt);
-        if (!(res == TOTAL_PARAM && k_tag == full_tag && k_uid == uid))
-            return -EINVAL;
-        free(line_buffer);
-        return 0;
-    }
-    free(line_buffer);
-    return -ENOENT;
-}
-
-void checkNoSocketPointerLeaks(int family) {
-    int sockfd = socket(family, SOCK_STREAM, 0);
-    uid_t uid = getuid();
-    int tag = arc4random();
-    int ref_cnt;
-    uint64_t sk_addr;
-    uint64_t expect_addr = 0;
-
-    EXPECT_EQ(0, legacy_tagSocket(sockfd, tag, uid));
-    EXPECT_EQ(0, getCtrlSkInfo(tag, uid, &sk_addr, &ref_cnt));
-    EXPECT_EQ(expect_addr, sk_addr);
-    close(sockfd);
-    EXPECT_EQ(-ENOENT, getCtrlSkInfo(tag, uid, &sk_addr, &ref_cnt));
-}
-
-TEST (NativeQtaguidTest, close_socket_without_untag) {
-    SKIP_IF_QTAGUID_NOT_SUPPORTED();
-
-    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
-    uid_t uid = getuid();
-    int tag = arc4random();
-    int ref_cnt;
-    uint64_t dummy_sk;
-    EXPECT_EQ(0, legacy_tagSocket(sockfd, tag, uid));
-    EXPECT_EQ(0, getCtrlSkInfo(tag, uid, &dummy_sk, &ref_cnt));
-    EXPECT_EQ(2, ref_cnt);
-    close(sockfd);
-    EXPECT_EQ(-ENOENT, getCtrlSkInfo(tag, uid, &dummy_sk, &ref_cnt));
-}
-
-TEST (NativeQtaguidTest, close_socket_without_untag_ipv6) {
-    SKIP_IF_QTAGUID_NOT_SUPPORTED();
-
-    int sockfd = socket(AF_INET6, SOCK_STREAM, 0);
-    uid_t uid = getuid();
-    int tag = arc4random();
-    int ref_cnt;
-    uint64_t dummy_sk;
-    EXPECT_EQ(0, legacy_tagSocket(sockfd, tag, uid));
-    EXPECT_EQ(0, getCtrlSkInfo(tag, uid, &dummy_sk, &ref_cnt));
-    EXPECT_EQ(2, ref_cnt);
-    close(sockfd);
-    EXPECT_EQ(-ENOENT, getCtrlSkInfo(tag, uid, &dummy_sk, &ref_cnt));
-}
-
-TEST (NativeQtaguidTest, no_socket_addr_leak) {
-  SKIP_IF_QTAGUID_NOT_SUPPORTED();
-
-  checkNoSocketPointerLeaks(AF_INET);
-  checkNoSocketPointerLeaks(AF_INET6);
-}
-
-int main(int argc, char **argv) {
-      testing::InitGoogleTest(&argc, argv);
-      return RUN_ALL_TESTS();
-}
diff --git a/tests/tests/net/src/android/net/cts/AirplaneModeTest.java b/tests/tests/net/src/android/net/cts/AirplaneModeTest.java
deleted file mode 100644
index 524e549..0000000
--- a/tests/tests/net/src/android/net/cts/AirplaneModeTest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * 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.platform.test.annotations.AppModeFull;
-import android.provider.Settings;
-import android.test.AndroidTestCase;
-import android.util.Log;
-
-import java.lang.Thread;
-
-@AppModeFull(reason = "WRITE_SECURE_SETTINGS permission can't be granted to instant apps")
-public class AirplaneModeTest extends AndroidTestCase {
-    private static final String TAG = "AirplaneModeTest";
-    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 testAirplaneMode() {
-        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("Airplane mode failed to change in " + TIMEOUT_MS + "msec");
-                return;
-            }
-        }
-    }
-
-    private boolean doOneTest() {
-        boolean airplaneModeOn = isAirplaneModeOn();
-        setAirplaneModeOn(!airplaneModeOn);
-
-        try {
-            Thread.sleep(TIMEOUT_MS);
-        } catch (InterruptedException e) {
-            Log.e(TAG, "Sleep time interrupted.", e);
-        }
-
-        if (airplaneModeOn == isAirplaneModeOn()) {
-            return false;
-        }
-        return true;
-    }
-
-    private void setAirplaneModeOn(boolean enabling) {
-        // Change the system setting for airplane mode
-        Settings.Global.putInt(resolver, Settings.Global.AIRPLANE_MODE_ON, enabling ? 1 : 0);
-    }
-
-    private boolean isAirplaneModeOn() {
-        // Read the system setting for airplane mode
-        return Settings.Global.getInt(mContext.getContentResolver(),
-                                      Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/CaptivePortalApiTest.kt b/tests/tests/net/src/android/net/cts/CaptivePortalApiTest.kt
deleted file mode 100644
index 99fcd4c..0000000
--- a/tests/tests/net/src/android/net/cts/CaptivePortalApiTest.kt
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- * Copyright (C) 2020 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.Manifest.permission.MANAGE_TEST_NETWORKS
-import android.Manifest.permission.NETWORK_SETTINGS
-import android.content.Context
-import android.content.pm.PackageManager
-import android.net.ConnectivityManager
-import android.net.EthernetManager
-import android.net.InetAddresses
-import android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL
-import android.net.NetworkCapabilities.NET_CAPABILITY_TRUSTED
-import android.net.NetworkCapabilities.TRANSPORT_ETHERNET
-import android.net.NetworkCapabilities.TRANSPORT_TEST
-import android.net.NetworkRequest
-import android.net.TestNetworkInterface
-import android.net.TestNetworkManager
-import android.net.Uri
-import android.net.dhcp.DhcpDiscoverPacket
-import android.net.dhcp.DhcpPacket
-import android.net.dhcp.DhcpPacket.DHCP_MESSAGE_TYPE
-import android.net.dhcp.DhcpPacket.DHCP_MESSAGE_TYPE_DISCOVER
-import android.net.dhcp.DhcpPacket.DHCP_MESSAGE_TYPE_REQUEST
-import android.net.dhcp.DhcpRequestPacket
-import android.os.Build
-import android.os.HandlerThread
-import android.platform.test.annotations.AppModeFull
-import androidx.test.platform.app.InstrumentationRegistry
-import androidx.test.runner.AndroidJUnit4
-import com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity
-import com.android.compatibility.common.util.ThrowingRunnable
-import com.android.net.module.util.Inet4AddressUtils.getBroadcastAddress
-import com.android.net.module.util.Inet4AddressUtils.getPrefixMaskAsInet4Address
-import com.android.server.util.NetworkStackConstants.IPV4_ADDR_ANY
-import com.android.testutils.DevSdkIgnoreRule
-import com.android.testutils.DhcpClientPacketFilter
-import com.android.testutils.DhcpOptionFilter
-import com.android.testutils.RecorderCallback.CallbackEntry
-import com.android.testutils.TapPacketReader
-import com.android.testutils.TestableNetworkCallback
-import fi.iki.elonen.NanoHTTPD
-import org.junit.After
-import org.junit.Assume.assumeFalse
-import org.junit.Assume.assumeTrue
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import java.net.Inet4Address
-import java.util.concurrent.ArrayBlockingQueue
-import java.util.concurrent.TimeUnit
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertTrue
-import kotlin.test.fail
-
-private const val MAX_PACKET_LENGTH = 1500
-private const val TEST_TIMEOUT_MS = 10_000L
-
-private const val TEST_LEASE_TIMEOUT_SECS = 3600 * 12
-private const val TEST_PREFIX_LENGTH = 24
-
-private const val TEST_LOGIN_URL = "https://login.capport.android.com"
-private const val TEST_VENUE_INFO_URL = "https://venueinfo.capport.android.com"
-private const val TEST_DOMAIN_NAME = "lan"
-private const val TEST_MTU = 1500.toShort()
-
-@AppModeFull(reason = "Instant apps cannot create test networks")
-@RunWith(AndroidJUnit4::class)
-class CaptivePortalApiTest {
-    @JvmField
-    @Rule
-    val ignoreRule = DevSdkIgnoreRule(ignoreClassUpTo = Build.VERSION_CODES.Q)
-
-    private val context by lazy { InstrumentationRegistry.getInstrumentation().context }
-    private val tnm by lazy { context.assertHasService(TestNetworkManager::class.java) }
-    private val eth by lazy { context.assertHasService(EthernetManager::class.java) }
-    private val cm by lazy { context.assertHasService(ConnectivityManager::class.java) }
-
-    private val handlerThread = HandlerThread(CaptivePortalApiTest::class.java.simpleName)
-    private val serverIpAddr = InetAddresses.parseNumericAddress("192.0.2.222") as Inet4Address
-    private val clientIpAddr = InetAddresses.parseNumericAddress("192.0.2.111") as Inet4Address
-    private val httpServer = HttpServer()
-    private val ethRequest = NetworkRequest.Builder()
-            // ETHERNET|TEST transport networks do not have NET_CAPABILITY_TRUSTED
-            .removeCapability(NET_CAPABILITY_TRUSTED)
-            .addTransportType(TRANSPORT_ETHERNET)
-            .addTransportType(TRANSPORT_TEST).build()
-    private val ethRequestCb = TestableNetworkCallback()
-
-    private lateinit var iface: TestNetworkInterface
-    private lateinit var reader: TapPacketReader
-    private lateinit var capportUrl: Uri
-
-    private var testSkipped = false
-
-    @Before
-    fun setUp() {
-        // This test requires using a tap interface as an ethernet interface.
-        val pm = context.getPackageManager()
-        testSkipped = !pm.hasSystemFeature(PackageManager.FEATURE_ETHERNET) &&
-                context.getSystemService(EthernetManager::class.java) == null
-        assumeFalse(testSkipped)
-
-        // Register a request so the network does not get torn down
-        cm.requestNetwork(ethRequest, ethRequestCb)
-        runAsShell(NETWORK_SETTINGS, MANAGE_TEST_NETWORKS) {
-            eth.setIncludeTestInterfaces(true)
-            // Keeping a reference to the test interface also makes sure the ParcelFileDescriptor
-            // does not go out of scope, which would cause it to close the underlying FileDescriptor
-            // in its finalizer.
-            iface = tnm.createTapInterface()
-        }
-
-        handlerThread.start()
-        reader = TapPacketReader(
-                handlerThread.threadHandler,
-                iface.fileDescriptor.fileDescriptor,
-                MAX_PACKET_LENGTH)
-        handlerThread.threadHandler.post { reader.start() }
-        httpServer.start()
-
-        // Pad the listening port to make sure it is always of length 5. This ensures the URL has
-        // always the same length so the test can use constant IP and UDP header lengths.
-        // The maximum port number is 65535 so a length of 5 is always enough.
-        capportUrl = Uri.parse("http://localhost:${httpServer.listeningPort}/testapi.html?par=val")
-    }
-
-    @After
-    fun tearDown() {
-        if (testSkipped) return
-        cm.unregisterNetworkCallback(ethRequestCb)
-
-        runAsShell(NETWORK_SETTINGS) { eth.setIncludeTestInterfaces(false) }
-
-        httpServer.stop()
-        handlerThread.threadHandler.post { reader.stop() }
-        handlerThread.quitSafely()
-
-        iface.fileDescriptor.close()
-    }
-
-    @Test
-    fun testApiCallbacks() {
-        // Handle the DHCP handshake that includes the capport API URL
-        val discover = reader.assertDhcpPacketReceived(
-                DhcpDiscoverPacket::class.java, TEST_TIMEOUT_MS, DHCP_MESSAGE_TYPE_DISCOVER)
-        reader.sendResponse(makeOfferPacket(discover.clientMac, discover.transactionId))
-
-        val request = reader.assertDhcpPacketReceived(
-                DhcpRequestPacket::class.java, TEST_TIMEOUT_MS, DHCP_MESSAGE_TYPE_REQUEST)
-        assertEquals(discover.transactionId, request.transactionId)
-        assertEquals(clientIpAddr, request.mRequestedIp)
-        reader.sendResponse(makeAckPacket(request.clientMac, request.transactionId))
-
-        // Expect a request to the capport API
-        val capportReq = httpServer.recordedRequests.poll(TEST_TIMEOUT_MS, TimeUnit.MILLISECONDS)
-        assertNotNull(capportReq, "The device did not fetch captive portal API data within timeout")
-        assertEquals(capportUrl.path, capportReq.uri)
-        assertEquals(capportUrl.query, capportReq.queryParameterString)
-
-        // Expect network callbacks with capport info
-        val testCb = TestableNetworkCallback(TEST_TIMEOUT_MS)
-        // LinkProperties do not contain captive portal info if the callback is registered without
-        // NETWORK_SETTINGS permissions.
-        val lp = runAsShell(NETWORK_SETTINGS) {
-            cm.registerNetworkCallback(ethRequest, testCb)
-
-            try {
-                val ncCb = testCb.eventuallyExpect<CallbackEntry.CapabilitiesChanged> {
-                    it.caps.hasCapability(NET_CAPABILITY_CAPTIVE_PORTAL)
-                }
-                testCb.eventuallyExpect<CallbackEntry.LinkPropertiesChanged> {
-                    it.network == ncCb.network && it.lp.captivePortalData != null
-                }.lp
-            } finally {
-                cm.unregisterNetworkCallback(testCb)
-            }
-        }
-
-        assertEquals(capportUrl, lp.captivePortalApiUrl)
-        with(lp.captivePortalData) {
-            assertNotNull(this)
-            assertTrue(isCaptive)
-            assertEquals(Uri.parse(TEST_LOGIN_URL), userPortalUrl)
-            assertEquals(Uri.parse(TEST_VENUE_INFO_URL), venueInfoUrl)
-        }
-    }
-
-    private fun makeOfferPacket(clientMac: ByteArray, transactionId: Int) =
-            DhcpPacket.buildOfferPacket(DhcpPacket.ENCAP_L2, transactionId,
-                    false /* broadcast */, serverIpAddr, IPV4_ADDR_ANY /* relayIp */, clientIpAddr,
-                    clientMac, TEST_LEASE_TIMEOUT_SECS,
-                    getPrefixMaskAsInet4Address(TEST_PREFIX_LENGTH),
-                    getBroadcastAddress(clientIpAddr, TEST_PREFIX_LENGTH),
-                    listOf(serverIpAddr) /* gateways */, listOf(serverIpAddr) /* dnsServers */,
-                    serverIpAddr, TEST_DOMAIN_NAME, null /* hostname */, true /* metered */,
-                    TEST_MTU, capportUrl.toString())
-
-    private fun makeAckPacket(clientMac: ByteArray, transactionId: Int) =
-            DhcpPacket.buildAckPacket(DhcpPacket.ENCAP_L2, transactionId,
-                    false /* broadcast */, serverIpAddr, IPV4_ADDR_ANY /* relayIp */, clientIpAddr,
-                    clientIpAddr /* requestClientIp */, clientMac, TEST_LEASE_TIMEOUT_SECS,
-                    getPrefixMaskAsInet4Address(TEST_PREFIX_LENGTH),
-                    getBroadcastAddress(clientIpAddr, TEST_PREFIX_LENGTH),
-                    listOf(serverIpAddr) /* gateways */, listOf(serverIpAddr) /* dnsServers */,
-                    serverIpAddr, TEST_DOMAIN_NAME, null /* hostname */, true /* metered */,
-                    TEST_MTU, false /* rapidCommit */, capportUrl.toString())
-
-    private fun parseDhcpPacket(bytes: ByteArray) = DhcpPacket.decodeFullPacket(
-            bytes, MAX_PACKET_LENGTH, DhcpPacket.ENCAP_L2)
-}
-
-/**
- * A minimal HTTP server running on localhost (loopback), on a random available port.
- *
- * The server records each request in [recordedRequests] and will not serve any further request
- * until the last one is removed from the queue for verification.
- */
-private class HttpServer : NanoHTTPD("localhost", 0 /* auto-select the port */) {
-    val recordedRequests = ArrayBlockingQueue<IHTTPSession>(1 /* capacity */)
-
-    override fun serve(session: IHTTPSession): Response {
-        recordedRequests.offer(session)
-        return newFixedLengthResponse("""
-                |{
-                |  "captive": true,
-                |  "user-portal-url": "$TEST_LOGIN_URL",
-                |  "venue-info-url": "$TEST_VENUE_INFO_URL"
-                |}
-            """.trimMargin())
-    }
-}
-
-private fun <T : DhcpPacket> TapPacketReader.assertDhcpPacketReceived(
-    packetType: Class<T>,
-    timeoutMs: Long,
-    type: Byte
-): T {
-    val packetBytes = popPacket(timeoutMs, DhcpClientPacketFilter()
-            .and(DhcpOptionFilter(DHCP_MESSAGE_TYPE, type)))
-            ?: fail("${packetType.simpleName} not received within timeout")
-    val packet = DhcpPacket.decodeFullPacket(packetBytes, packetBytes.size, DhcpPacket.ENCAP_L2)
-    assertTrue(packetType.isInstance(packet),
-            "Expected ${packetType.simpleName} but got ${packet.javaClass.simpleName}")
-    return packetType.cast(packet)
-}
-
-private fun <T> Context.assertHasService(manager: Class<T>): T {
-    return getSystemService(manager) ?: fail("Service $manager not found")
-}
-
-/**
- * Wrapper around runWithShellPermissionIdentity with kotlin-like syntax.
- */
-private fun <T> runAsShell(vararg permissions: String, task: () -> T): T {
-    var ret: T? = null
-    runWithShellPermissionIdentity(ThrowingRunnable { ret = task() }, *permissions)
-    return ret ?: fail("ThrowingRunnable was not run")
-}
diff --git a/tests/tests/net/src/android/net/cts/CaptivePortalTest.kt b/tests/tests/net/src/android/net/cts/CaptivePortalTest.kt
deleted file mode 100644
index 4a7d38a..0000000
--- a/tests/tests/net/src/android/net/cts/CaptivePortalTest.kt
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * Copyright (C) 2020 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.Manifest.permission.CONNECTIVITY_INTERNAL
-import android.Manifest.permission.NETWORK_SETTINGS
-import android.Manifest.permission.READ_DEVICE_CONFIG
-import android.Manifest.permission.WRITE_DEVICE_CONFIG
-import android.content.pm.PackageManager.FEATURE_TELEPHONY
-import android.content.pm.PackageManager.FEATURE_WIFI
-import android.net.ConnectivityManager
-import android.net.ConnectivityManager.NetworkCallback
-import android.net.Network
-import android.net.NetworkCapabilities
-import android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL
-import android.net.NetworkCapabilities.TRANSPORT_WIFI
-import android.net.NetworkRequest
-import android.net.Uri
-import android.net.cts.util.CtsNetUtils
-import android.net.wifi.WifiManager
-import android.os.Build
-import android.os.ConditionVariable
-import android.platform.test.annotations.AppModeFull
-import android.provider.DeviceConfig
-import android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY
-import android.text.TextUtils
-import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
-import androidx.test.runner.AndroidJUnit4
-import com.android.compatibility.common.util.SystemUtil
-import com.android.testutils.isDevSdkInRange
-import fi.iki.elonen.NanoHTTPD
-import fi.iki.elonen.NanoHTTPD.Response.IStatus
-import fi.iki.elonen.NanoHTTPD.Response.Status
-import junit.framework.AssertionFailedError
-import org.junit.After
-import org.junit.Assume.assumeTrue
-import org.junit.Before
-import org.junit.runner.RunWith
-import java.util.concurrent.CompletableFuture
-import java.util.concurrent.TimeUnit
-import java.util.concurrent.TimeoutException
-import kotlin.test.Test
-import kotlin.test.assertNotEquals
-import kotlin.test.assertTrue
-
-private const val TEST_CAPTIVE_PORTAL_HTTPS_URL_SETTING = "test_captive_portal_https_url"
-private const val TEST_CAPTIVE_PORTAL_HTTP_URL_SETTING = "test_captive_portal_http_url"
-private const val TEST_URL_EXPIRATION_TIME = "test_url_expiration_time"
-
-private const val TEST_HTTPS_URL_PATH = "https_path"
-private const val TEST_HTTP_URL_PATH = "http_path"
-private const val TEST_PORTAL_URL_PATH = "portal_path"
-
-private const val LOCALHOST_HOSTNAME = "localhost"
-
-// Re-connecting to the AP, obtaining an IP address, revalidating can take a long time
-private const val WIFI_CONNECT_TIMEOUT_MS = 120_000L
-private const val TEST_TIMEOUT_MS = 10_000L
-
-private fun <T> CompletableFuture<T>.assertGet(timeoutMs: Long, message: String): T {
-    try {
-        return get(timeoutMs, TimeUnit.MILLISECONDS)
-    } catch (e: TimeoutException) {
-        throw AssertionFailedError(message)
-    }
-}
-
-@AppModeFull(reason = "WRITE_DEVICE_CONFIG permission can't be granted to instant apps")
-@RunWith(AndroidJUnit4::class)
-class CaptivePortalTest {
-    private val context: android.content.Context by lazy { getInstrumentation().context }
-    private val wm by lazy { context.getSystemService(WifiManager::class.java) }
-    private val cm by lazy { context.getSystemService(ConnectivityManager::class.java) }
-    private val pm by lazy { context.packageManager }
-    private val utils by lazy { CtsNetUtils(context) }
-
-    private val server = HttpServer()
-
-    @Before
-    fun setUp() {
-        doAsShell(READ_DEVICE_CONFIG) {
-            // Verify that the test URLs are not normally set on the device, but do not fail if the
-            // test URLs are set to what this test uses (URLs on localhost), in case the test was
-            // interrupted manually and rerun.
-            assertEmptyOrLocalhostUrl(TEST_CAPTIVE_PORTAL_HTTPS_URL_SETTING)
-            assertEmptyOrLocalhostUrl(TEST_CAPTIVE_PORTAL_HTTP_URL_SETTING)
-        }
-        clearTestUrls()
-        server.start()
-    }
-
-    @After
-    fun tearDown() {
-        clearTestUrls()
-        if (pm.hasSystemFeature(FEATURE_WIFI)) {
-            reconnectWifi()
-        }
-        server.stop()
-    }
-
-    private fun assertEmptyOrLocalhostUrl(urlKey: String) {
-        val url = DeviceConfig.getProperty(NAMESPACE_CONNECTIVITY, urlKey)
-        assertTrue(TextUtils.isEmpty(url) || LOCALHOST_HOSTNAME == Uri.parse(url).host,
-                "$urlKey must not be set in production scenarios (current value: $url)")
-    }
-
-    private fun clearTestUrls() {
-        setHttpsUrl(null)
-        setHttpUrl(null)
-        setUrlExpiration(null)
-    }
-
-    @Test
-    fun testCaptivePortalIsNotDefaultNetwork() {
-        assumeTrue(pm.hasSystemFeature(FEATURE_TELEPHONY))
-        assumeTrue(pm.hasSystemFeature(FEATURE_WIFI))
-        utils.connectToWifi()
-        utils.connectToCell()
-
-        // Have network validation use a local server that serves a HTTPS error / HTTP redirect
-        server.addResponse(TEST_PORTAL_URL_PATH, Status.OK,
-                content = "Test captive portal content")
-        server.addResponse(TEST_HTTPS_URL_PATH, Status.INTERNAL_ERROR)
-        server.addResponse(TEST_HTTP_URL_PATH, Status.REDIRECT,
-                locationHeader = server.makeUrl(TEST_PORTAL_URL_PATH))
-        setHttpsUrl(server.makeUrl(TEST_HTTPS_URL_PATH))
-        setHttpUrl(server.makeUrl(TEST_HTTP_URL_PATH))
-        // URL expiration needs to be in the next 10 minutes
-        setUrlExpiration(System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(9))
-
-        // Expect the portal content to be fetched at some point after detecting the portal.
-        // Some implementations may fetch the URL before startCaptivePortalApp is called.
-        val portalContentRequestCv = server.addExpectRequestCv(TEST_PORTAL_URL_PATH)
-
-        // Wait for a captive portal to be detected on the network
-        val wifiNetworkFuture = CompletableFuture<Network>()
-        val wifiCb = object : NetworkCallback() {
-            override fun onCapabilitiesChanged(
-                network: Network,
-                nc: NetworkCapabilities
-            ) {
-                if (nc.hasCapability(NET_CAPABILITY_CAPTIVE_PORTAL)) {
-                    wifiNetworkFuture.complete(network)
-                }
-            }
-        }
-        cm.requestNetwork(NetworkRequest.Builder().addTransportType(TRANSPORT_WIFI).build(), wifiCb)
-
-        try {
-            reconnectWifi()
-            val network = wifiNetworkFuture.assertGet(WIFI_CONNECT_TIMEOUT_MS,
-                    "Captive portal not detected after ${WIFI_CONNECT_TIMEOUT_MS}ms")
-
-            val wifiDefaultMessage = "Wifi should not be the default network when a captive " +
-                    "portal was detected and another network (mobile data) can provide internet " +
-                    "access."
-            assertNotEquals(network, cm.activeNetwork, wifiDefaultMessage)
-
-            val startPortalAppPermission =
-                    if (isDevSdkInRange(0, Build.VERSION_CODES.Q)) CONNECTIVITY_INTERNAL
-                    else NETWORK_SETTINGS
-            doAsShell(startPortalAppPermission) { cm.startCaptivePortalApp(network) }
-            assertTrue(portalContentRequestCv.block(TEST_TIMEOUT_MS), "The captive portal login " +
-                    "page was still not fetched ${TEST_TIMEOUT_MS}ms after startCaptivePortalApp.")
-
-            assertNotEquals(network, cm.activeNetwork, wifiDefaultMessage)
-        } finally {
-            cm.unregisterNetworkCallback(wifiCb)
-            server.stop()
-            // disconnectFromCell should be called after connectToCell
-            utils.disconnectFromCell()
-        }
-    }
-
-    private fun setHttpsUrl(url: String?) = setConfig(TEST_CAPTIVE_PORTAL_HTTPS_URL_SETTING, url)
-    private fun setHttpUrl(url: String?) = setConfig(TEST_CAPTIVE_PORTAL_HTTP_URL_SETTING, url)
-    private fun setUrlExpiration(timestamp: Long?) = setConfig(TEST_URL_EXPIRATION_TIME,
-            timestamp?.toString())
-
-    private fun setConfig(configKey: String, value: String?) {
-        doAsShell(WRITE_DEVICE_CONFIG) {
-            DeviceConfig.setProperty(
-                    NAMESPACE_CONNECTIVITY, configKey, value, false /* makeDefault */)
-        }
-    }
-
-    private fun doAsShell(vararg permissions: String, action: () -> Unit) {
-        // Wrap the below call to allow for more kotlin-like syntax
-        SystemUtil.runWithShellPermissionIdentity(action, permissions)
-    }
-
-    private fun reconnectWifi() {
-        utils.ensureWifiDisconnected(null /* wifiNetworkToCheck */)
-        utils.ensureWifiConnected()
-    }
-
-    /**
-     * A minimal HTTP server running on localhost (loopback), on a random available port.
-     */
-    private class HttpServer : NanoHTTPD("localhost", 0 /* auto-select the port */) {
-        // Map of URL path -> HTTP response code
-        private val responses = HashMap<String, Response>()
-
-        // Map of path -> CV to open as soon as a request to the path is received
-        private val waitForRequestCv = HashMap<String, ConditionVariable>()
-
-        /**
-         * Create a URL string that, when fetched, will hit this server with the given URL [path].
-         */
-        fun makeUrl(path: String): String {
-            return Uri.Builder()
-                    .scheme("http")
-                    .encodedAuthority("localhost:$listeningPort")
-                    .query(path)
-                    .build()
-                    .toString()
-        }
-
-        fun addResponse(
-            path: String,
-            statusCode: IStatus,
-            locationHeader: String? = null,
-            content: String = ""
-        ) {
-            val response = newFixedLengthResponse(statusCode, "text/plain", content)
-            locationHeader?.let { response.addHeader("Location", it) }
-            responses[path] = response
-        }
-
-        /**
-         * Create a [ConditionVariable] that will open when a request to [path] is received.
-         */
-        fun addExpectRequestCv(path: String): ConditionVariable {
-            return ConditionVariable().apply { waitForRequestCv[path] = this }
-        }
-
-        override fun serve(session: IHTTPSession): Response {
-            waitForRequestCv[session.queryParameterString]?.open()
-            return responses[session.queryParameterString]
-                    // Default response is a 404
-                    ?: super.serve(session)
-        }
-    }
-}
\ No newline at end of file
diff --git a/tests/tests/net/src/android/net/cts/ConnectivityDiagnosticsManagerTest.java b/tests/tests/net/src/android/net/cts/ConnectivityDiagnosticsManagerTest.java
deleted file mode 100644
index bd56f4b..0000000
--- a/tests/tests/net/src/android/net/cts/ConnectivityDiagnosticsManagerTest.java
+++ /dev/null
@@ -1,576 +0,0 @@
-/*
- * Copyright (C) 2020 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 static android.content.pm.PackageManager.FEATURE_TELEPHONY;
-import static android.net.ConnectivityDiagnosticsManager.ConnectivityDiagnosticsCallback;
-import static android.net.ConnectivityDiagnosticsManager.ConnectivityReport;
-import static android.net.ConnectivityDiagnosticsManager.ConnectivityReport.KEY_NETWORK_PROBES_ATTEMPTED_BITMASK;
-import static android.net.ConnectivityDiagnosticsManager.ConnectivityReport.KEY_NETWORK_PROBES_SUCCEEDED_BITMASK;
-import static android.net.ConnectivityDiagnosticsManager.ConnectivityReport.KEY_NETWORK_VALIDATION_RESULT;
-import static android.net.ConnectivityDiagnosticsManager.ConnectivityReport.NETWORK_VALIDATION_RESULT_VALID;
-import static android.net.ConnectivityDiagnosticsManager.DataStallReport;
-import static android.net.ConnectivityDiagnosticsManager.DataStallReport.DETECTION_METHOD_DNS_EVENTS;
-import static android.net.ConnectivityDiagnosticsManager.DataStallReport.DETECTION_METHOD_TCP_METRICS;
-import static android.net.ConnectivityDiagnosticsManager.DataStallReport.KEY_DNS_CONSECUTIVE_TIMEOUTS;
-import static android.net.ConnectivityDiagnosticsManager.DataStallReport.KEY_TCP_METRICS_COLLECTION_PERIOD_MILLIS;
-import static android.net.ConnectivityDiagnosticsManager.DataStallReport.KEY_TCP_PACKET_FAIL_RATE;
-import static android.net.ConnectivityDiagnosticsManager.persistableBundleEquals;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VPN;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_TRUSTED;
-import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
-import static android.net.NetworkCapabilities.TRANSPORT_TEST;
-import static android.net.cts.util.CtsNetUtils.TestNetworkCallback;
-
-import static com.android.compatibility.common.util.SystemUtil.callWithShellPermissionIdentity;
-import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
-
-import android.annotation.NonNull;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.net.ConnectivityDiagnosticsManager;
-import android.net.ConnectivityManager;
-import android.net.LinkAddress;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.NetworkRequest;
-import android.net.TestNetworkInterface;
-import android.net.TestNetworkManager;
-import android.os.Binder;
-import android.os.Build;
-import android.os.IBinder;
-import android.os.ParcelFileDescriptor;
-import android.os.PersistableBundle;
-import android.os.Process;
-import android.platform.test.annotations.AppModeFull;
-import android.telephony.CarrierConfigManager;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-import android.util.Pair;
-
-import androidx.test.InstrumentationRegistry;
-
-import com.android.internal.telephony.uicc.IccUtils;
-import com.android.internal.util.ArrayUtils;
-import com.android.testutils.ArrayTrackRecord;
-import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo;
-import com.android.testutils.DevSdkIgnoreRunner;
-import com.android.testutils.SkipPresubmit;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.security.MessageDigest;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Executor;
-import java.util.concurrent.TimeUnit;
-
-@RunWith(DevSdkIgnoreRunner.class)
-@IgnoreUpTo(Build.VERSION_CODES.Q) // ConnectivityDiagnosticsManager did not exist in Q
-@AppModeFull(reason = "CHANGE_NETWORK_STATE, MANAGE_TEST_NETWORKS not grantable to instant apps")
-public class ConnectivityDiagnosticsManagerTest {
-    private static final int CALLBACK_TIMEOUT_MILLIS = 5000;
-    private static final int NO_CALLBACK_INVOKED_TIMEOUT = 500;
-    private static final long TIMESTAMP = 123456789L;
-    private static final int DNS_CONSECUTIVE_TIMEOUTS = 5;
-    private static final int COLLECTION_PERIOD_MILLIS = 5000;
-    private static final int FAIL_RATE_PERCENTAGE = 100;
-    private static final int UNKNOWN_DETECTION_METHOD = 4;
-    private static final int FILTERED_UNKNOWN_DETECTION_METHOD = 0;
-    private static final int CARRIER_CONFIG_CHANGED_BROADCAST_TIMEOUT = 5000;
-    private static final int DELAY_FOR_ADMIN_UIDS_MILLIS = 2000;
-
-    private static final Executor INLINE_EXECUTOR = x -> x.run();
-
-    private static final NetworkRequest TEST_NETWORK_REQUEST =
-            new NetworkRequest.Builder()
-                    .addTransportType(TRANSPORT_TEST)
-                    .removeCapability(NET_CAPABILITY_TRUSTED)
-                    .removeCapability(NET_CAPABILITY_NOT_VPN)
-                    .build();
-
-    private static final String SHA_256 = "SHA-256";
-
-    private static final NetworkRequest CELLULAR_NETWORK_REQUEST =
-            new NetworkRequest.Builder()
-                    .addTransportType(TRANSPORT_CELLULAR)
-                    .addCapability(NET_CAPABILITY_INTERNET)
-                    .build();
-
-    private static final IBinder BINDER = new Binder();
-
-    private Context mContext;
-    private ConnectivityManager mConnectivityManager;
-    private ConnectivityDiagnosticsManager mCdm;
-    private CarrierConfigManager mCarrierConfigManager;
-    private PackageManager mPackageManager;
-    private TelephonyManager mTelephonyManager;
-
-    // Callback used to keep TestNetworks up when there are no other outstanding NetworkRequests
-    // for it.
-    private TestNetworkCallback mTestNetworkCallback;
-    private Network mTestNetwork;
-    private ParcelFileDescriptor mTestNetworkFD;
-
-    private List<TestConnectivityDiagnosticsCallback> mRegisteredCallbacks;
-
-    @Before
-    public void setUp() throws Exception {
-        mContext = InstrumentationRegistry.getContext();
-        mConnectivityManager = mContext.getSystemService(ConnectivityManager.class);
-        mCdm = mContext.getSystemService(ConnectivityDiagnosticsManager.class);
-        mCarrierConfigManager = mContext.getSystemService(CarrierConfigManager.class);
-        mPackageManager = mContext.getPackageManager();
-        mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
-
-        mTestNetworkCallback = new TestNetworkCallback();
-        mConnectivityManager.requestNetwork(TEST_NETWORK_REQUEST, mTestNetworkCallback);
-
-        mRegisteredCallbacks = new ArrayList<>();
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        mConnectivityManager.unregisterNetworkCallback(mTestNetworkCallback);
-        if (mTestNetwork != null) {
-            runWithShellPermissionIdentity(() -> {
-                final TestNetworkManager tnm = mContext.getSystemService(TestNetworkManager.class);
-                tnm.teardownTestNetwork(mTestNetwork);
-            });
-            mTestNetwork = null;
-        }
-
-        if (mTestNetworkFD != null) {
-            mTestNetworkFD.close();
-            mTestNetworkFD = null;
-        }
-
-        for (TestConnectivityDiagnosticsCallback cb : mRegisteredCallbacks) {
-            mCdm.unregisterConnectivityDiagnosticsCallback(cb);
-        }
-    }
-
-    @Test
-    public void testRegisterConnectivityDiagnosticsCallback() throws Exception {
-        mTestNetworkFD = setUpTestNetwork().getFileDescriptor();
-        mTestNetwork = mTestNetworkCallback.waitForAvailable();
-
-        final TestConnectivityDiagnosticsCallback cb =
-                createAndRegisterConnectivityDiagnosticsCallback(TEST_NETWORK_REQUEST);
-
-        final String interfaceName =
-                mConnectivityManager.getLinkProperties(mTestNetwork).getInterfaceName();
-
-        cb.expectOnConnectivityReportAvailable(mTestNetwork, interfaceName);
-        cb.assertNoCallback();
-    }
-
-    @SkipPresubmit(reason = "Flaky: b/159718782; add to presubmit after fixing")
-    @Test
-    public void testRegisterCallbackWithCarrierPrivileges() throws Exception {
-        assumeTrue(mPackageManager.hasSystemFeature(FEATURE_TELEPHONY));
-
-        final int subId = SubscriptionManager.getDefaultSubscriptionId();
-        if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
-            fail("Need an active subscription. Please ensure that the device has working mobile"
-                    + " data.");
-        }
-
-        final CarrierConfigReceiver carrierConfigReceiver = new CarrierConfigReceiver(subId);
-        mContext.registerReceiver(
-                carrierConfigReceiver,
-                new IntentFilter(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED));
-
-        final TestNetworkCallback testNetworkCallback = new TestNetworkCallback();
-
-        try {
-            doBroadcastCarrierConfigsAndVerifyOnConnectivityReportAvailable(
-                    subId, carrierConfigReceiver, testNetworkCallback);
-        } finally {
-            runWithShellPermissionIdentity(
-                    () -> mCarrierConfigManager.overrideConfig(subId, null),
-                    android.Manifest.permission.MODIFY_PHONE_STATE);
-            mConnectivityManager.unregisterNetworkCallback(testNetworkCallback);
-            mContext.unregisterReceiver(carrierConfigReceiver);
-        }
-    }
-
-    private String getCertHashForThisPackage() throws Exception {
-        final PackageInfo pkgInfo =
-                mPackageManager.getPackageInfo(
-                        mContext.getOpPackageName(), PackageManager.GET_SIGNATURES);
-        final MessageDigest md = MessageDigest.getInstance(SHA_256);
-        final byte[] certHash = md.digest(pkgInfo.signatures[0].toByteArray());
-        return IccUtils.bytesToHexString(certHash);
-    }
-
-    private void doBroadcastCarrierConfigsAndVerifyOnConnectivityReportAvailable(
-            int subId,
-            @NonNull CarrierConfigReceiver carrierConfigReceiver,
-            @NonNull TestNetworkCallback testNetworkCallback)
-            throws Exception {
-        final PersistableBundle carrierConfigs = new PersistableBundle();
-        carrierConfigs.putStringArray(
-                CarrierConfigManager.KEY_CARRIER_CERTIFICATE_STRING_ARRAY,
-                new String[] {getCertHashForThisPackage()});
-
-        runWithShellPermissionIdentity(
-                () -> {
-                    mCarrierConfigManager.overrideConfig(subId, carrierConfigs);
-                    mCarrierConfigManager.notifyConfigChangedForSubId(subId);
-                },
-                android.Manifest.permission.MODIFY_PHONE_STATE);
-
-        // TODO(b/157779832): This should use android.permission.CHANGE_NETWORK_STATE. However, the
-        // shell does not have CHANGE_NETWORK_STATE, so use CONNECTIVITY_INTERNAL until the shell
-        // permissions are updated.
-        runWithShellPermissionIdentity(
-                () -> mConnectivityManager.requestNetwork(
-                        CELLULAR_NETWORK_REQUEST, testNetworkCallback),
-                android.Manifest.permission.CONNECTIVITY_INTERNAL);
-
-        final Network network = testNetworkCallback.waitForAvailable();
-        assertNotNull(network);
-
-        assertTrue("Didn't receive broadcast for ACTION_CARRIER_CONFIG_CHANGED for subId=" + subId,
-                carrierConfigReceiver.waitForCarrierConfigChanged());
-        assertTrue("Don't have Carrier Privileges after adding cert for this package",
-                mTelephonyManager.createForSubscriptionId(subId).hasCarrierPrivileges());
-
-        // Wait for CarrierPrivilegesTracker to receive the ACTION_CARRIER_CONFIG_CHANGED
-        // broadcast. CPT then needs to update the corresponding DataConnection, which then
-        // updates ConnectivityService. Unfortunately, this update to the NetworkCapabilities in
-        // CS does not trigger NetworkCallback#onCapabilitiesChanged as changing the
-        // administratorUids is not a publicly visible change. In lieu of a better signal to
-        // detministically wait for, use Thread#sleep here.
-        // TODO(b/157949581): replace this Thread#sleep with a deterministic signal
-        Thread.sleep(DELAY_FOR_ADMIN_UIDS_MILLIS);
-
-        final TestConnectivityDiagnosticsCallback connDiagsCallback =
-                createAndRegisterConnectivityDiagnosticsCallback(CELLULAR_NETWORK_REQUEST);
-
-        final String interfaceName =
-                mConnectivityManager.getLinkProperties(network).getInterfaceName();
-        connDiagsCallback.expectOnConnectivityReportAvailable(
-                network, interfaceName, TRANSPORT_CELLULAR);
-        connDiagsCallback.assertNoCallback();
-    }
-
-    @Test
-    public void testRegisterDuplicateConnectivityDiagnosticsCallback() {
-        final TestConnectivityDiagnosticsCallback cb =
-                createAndRegisterConnectivityDiagnosticsCallback(TEST_NETWORK_REQUEST);
-
-        try {
-            mCdm.registerConnectivityDiagnosticsCallback(TEST_NETWORK_REQUEST, INLINE_EXECUTOR, cb);
-            fail("Registering the same callback twice should throw an IllegalArgumentException");
-        } catch (IllegalArgumentException expected) {
-        }
-    }
-
-    @Test
-    public void testUnregisterConnectivityDiagnosticsCallback() {
-        final TestConnectivityDiagnosticsCallback cb = new TestConnectivityDiagnosticsCallback();
-        mCdm.registerConnectivityDiagnosticsCallback(TEST_NETWORK_REQUEST, INLINE_EXECUTOR, cb);
-        mCdm.unregisterConnectivityDiagnosticsCallback(cb);
-    }
-
-    @Test
-    public void testUnregisterUnknownConnectivityDiagnosticsCallback() {
-        // Expected to silently ignore the unregister() call
-        mCdm.unregisterConnectivityDiagnosticsCallback(new TestConnectivityDiagnosticsCallback());
-    }
-
-    @Test
-    public void testOnConnectivityReportAvailable() throws Exception {
-        final TestConnectivityDiagnosticsCallback cb =
-                createAndRegisterConnectivityDiagnosticsCallback(TEST_NETWORK_REQUEST);
-
-        mTestNetworkFD = setUpTestNetwork().getFileDescriptor();
-        mTestNetwork = mTestNetworkCallback.waitForAvailable();
-
-        final String interfaceName =
-                mConnectivityManager.getLinkProperties(mTestNetwork).getInterfaceName();
-
-        cb.expectOnConnectivityReportAvailable(mTestNetwork, interfaceName);
-        cb.assertNoCallback();
-    }
-
-    @Test
-    public void testOnDataStallSuspected_DnsEvents() throws Exception {
-        final PersistableBundle extras = new PersistableBundle();
-        extras.putInt(KEY_DNS_CONSECUTIVE_TIMEOUTS, DNS_CONSECUTIVE_TIMEOUTS);
-
-        verifyOnDataStallSuspected(DETECTION_METHOD_DNS_EVENTS, TIMESTAMP, extras);
-    }
-
-    @Test
-    public void testOnDataStallSuspected_TcpMetrics() throws Exception {
-        final PersistableBundle extras = new PersistableBundle();
-        extras.putInt(KEY_TCP_METRICS_COLLECTION_PERIOD_MILLIS, COLLECTION_PERIOD_MILLIS);
-        extras.putInt(KEY_TCP_PACKET_FAIL_RATE, FAIL_RATE_PERCENTAGE);
-
-        verifyOnDataStallSuspected(DETECTION_METHOD_TCP_METRICS, TIMESTAMP, extras);
-    }
-
-    @Test
-    public void testOnDataStallSuspected_UnknownDetectionMethod() throws Exception {
-        verifyOnDataStallSuspected(
-                UNKNOWN_DETECTION_METHOD,
-                FILTERED_UNKNOWN_DETECTION_METHOD,
-                TIMESTAMP,
-                PersistableBundle.EMPTY);
-    }
-
-    private void verifyOnDataStallSuspected(
-            int detectionMethod, long timestampMillis, @NonNull PersistableBundle extras)
-            throws Exception {
-        // Input detection method is expected to match received detection method
-        verifyOnDataStallSuspected(detectionMethod, detectionMethod, timestampMillis, extras);
-    }
-
-    private void verifyOnDataStallSuspected(
-            int inputDetectionMethod,
-            int expectedDetectionMethod,
-            long timestampMillis,
-            @NonNull PersistableBundle extras)
-            throws Exception {
-        mTestNetworkFD = setUpTestNetwork().getFileDescriptor();
-        mTestNetwork = mTestNetworkCallback.waitForAvailable();
-
-        final TestConnectivityDiagnosticsCallback cb =
-                createAndRegisterConnectivityDiagnosticsCallback(TEST_NETWORK_REQUEST);
-
-        final String interfaceName =
-                mConnectivityManager.getLinkProperties(mTestNetwork).getInterfaceName();
-
-        cb.expectOnConnectivityReportAvailable(mTestNetwork, interfaceName);
-
-        runWithShellPermissionIdentity(
-                () -> mConnectivityManager.simulateDataStall(
-                        inputDetectionMethod, timestampMillis, mTestNetwork, extras),
-                android.Manifest.permission.MANAGE_TEST_NETWORKS);
-
-        cb.expectOnDataStallSuspected(
-                mTestNetwork, interfaceName, expectedDetectionMethod, timestampMillis, extras);
-        cb.assertNoCallback();
-    }
-
-    @Test
-    public void testOnNetworkConnectivityReportedTrue() throws Exception {
-        verifyOnNetworkConnectivityReported(true /* hasConnectivity */);
-    }
-
-    @Test
-    public void testOnNetworkConnectivityReportedFalse() throws Exception {
-        verifyOnNetworkConnectivityReported(false /* hasConnectivity */);
-    }
-
-    private void verifyOnNetworkConnectivityReported(boolean hasConnectivity) throws Exception {
-        mTestNetworkFD = setUpTestNetwork().getFileDescriptor();
-        mTestNetwork = mTestNetworkCallback.waitForAvailable();
-
-        final TestConnectivityDiagnosticsCallback cb =
-                createAndRegisterConnectivityDiagnosticsCallback(TEST_NETWORK_REQUEST);
-
-        // onConnectivityReportAvailable always invoked when the test network is established
-        final String interfaceName =
-                mConnectivityManager.getLinkProperties(mTestNetwork).getInterfaceName();
-        cb.expectOnConnectivityReportAvailable(mTestNetwork, interfaceName);
-        cb.assertNoCallback();
-
-        mConnectivityManager.reportNetworkConnectivity(mTestNetwork, hasConnectivity);
-
-        cb.expectOnNetworkConnectivityReported(mTestNetwork, hasConnectivity);
-
-        // if hasConnectivity does not match the network's known connectivity, it will be
-        // revalidated which will trigger another onConnectivityReportAvailable callback.
-        if (!hasConnectivity) {
-            cb.expectOnConnectivityReportAvailable(mTestNetwork, interfaceName);
-        }
-
-        cb.assertNoCallback();
-    }
-
-    private TestConnectivityDiagnosticsCallback createAndRegisterConnectivityDiagnosticsCallback(
-            NetworkRequest request) {
-        final TestConnectivityDiagnosticsCallback cb = new TestConnectivityDiagnosticsCallback();
-        mCdm.registerConnectivityDiagnosticsCallback(request, INLINE_EXECUTOR, cb);
-        mRegisteredCallbacks.add(cb);
-        return cb;
-    }
-
-    /**
-     * Registers a test NetworkAgent with ConnectivityService with limited capabilities, which leads
-     * to the Network being validated.
-     */
-    @NonNull
-    private TestNetworkInterface setUpTestNetwork() throws Exception {
-        final int[] administratorUids = new int[] {Process.myUid()};
-        return callWithShellPermissionIdentity(
-                () -> {
-                    final TestNetworkManager tnm =
-                            mContext.getSystemService(TestNetworkManager.class);
-                    final TestNetworkInterface tni = tnm.createTunInterface(new LinkAddress[0]);
-                    tnm.setupTestNetwork(tni.getInterfaceName(), administratorUids, BINDER);
-                    return tni;
-                });
-    }
-
-    private static class TestConnectivityDiagnosticsCallback
-            extends ConnectivityDiagnosticsCallback {
-        private final ArrayTrackRecord<Object>.ReadHead mHistory =
-                new ArrayTrackRecord<Object>().newReadHead();
-
-        @Override
-        public void onConnectivityReportAvailable(ConnectivityReport report) {
-            mHistory.add(report);
-        }
-
-        @Override
-        public void onDataStallSuspected(DataStallReport report) {
-            mHistory.add(report);
-        }
-
-        @Override
-        public void onNetworkConnectivityReported(Network network, boolean hasConnectivity) {
-            mHistory.add(new Pair<Network, Boolean>(network, hasConnectivity));
-        }
-
-        public void expectOnConnectivityReportAvailable(
-                @NonNull Network network, @NonNull String interfaceName) {
-            expectOnConnectivityReportAvailable(network, interfaceName, TRANSPORT_TEST);
-        }
-
-        public void expectOnConnectivityReportAvailable(
-                @NonNull Network network, @NonNull String interfaceName, int transportType) {
-            final ConnectivityReport result =
-                    (ConnectivityReport) mHistory.poll(CALLBACK_TIMEOUT_MILLIS, x -> true);
-            assertEquals(network, result.getNetwork());
-
-            final NetworkCapabilities nc = result.getNetworkCapabilities();
-            assertNotNull(nc);
-            assertTrue(nc.hasTransport(transportType));
-            assertNotNull(result.getLinkProperties());
-            assertEquals(interfaceName, result.getLinkProperties().getInterfaceName());
-
-            final PersistableBundle extras = result.getAdditionalInfo();
-            assertTrue(extras.containsKey(KEY_NETWORK_VALIDATION_RESULT));
-            final int validationResult = extras.getInt(KEY_NETWORK_VALIDATION_RESULT);
-            assertEquals("Network validation result is not 'valid'",
-                    NETWORK_VALIDATION_RESULT_VALID, validationResult);
-
-            assertTrue(extras.containsKey(KEY_NETWORK_PROBES_SUCCEEDED_BITMASK));
-            final int probesSucceeded = extras.getInt(KEY_NETWORK_VALIDATION_RESULT);
-            assertTrue("PROBES_SUCCEEDED mask not in expected range", probesSucceeded >= 0);
-
-            assertTrue(extras.containsKey(KEY_NETWORK_PROBES_ATTEMPTED_BITMASK));
-            final int probesAttempted = extras.getInt(KEY_NETWORK_PROBES_ATTEMPTED_BITMASK);
-            assertTrue("PROBES_ATTEMPTED mask not in expected range", probesAttempted >= 0);
-        }
-
-        public void expectOnDataStallSuspected(
-                @NonNull Network network,
-                @NonNull String interfaceName,
-                int detectionMethod,
-                long timestampMillis,
-                @NonNull PersistableBundle extras) {
-            final DataStallReport result =
-                    (DataStallReport) mHistory.poll(CALLBACK_TIMEOUT_MILLIS, x -> true);
-            assertEquals(network, result.getNetwork());
-            assertEquals(detectionMethod, result.getDetectionMethod());
-            assertEquals(timestampMillis, result.getReportTimestamp());
-
-            final NetworkCapabilities nc = result.getNetworkCapabilities();
-            assertNotNull(nc);
-            assertTrue(nc.hasTransport(TRANSPORT_TEST));
-            assertNotNull(result.getLinkProperties());
-            assertEquals(interfaceName, result.getLinkProperties().getInterfaceName());
-
-            assertTrue(persistableBundleEquals(extras, result.getStallDetails()));
-        }
-
-        public void expectOnNetworkConnectivityReported(
-                @NonNull Network network, boolean hasConnectivity) {
-            final Pair<Network, Boolean> result =
-                    (Pair<Network, Boolean>) mHistory.poll(CALLBACK_TIMEOUT_MILLIS, x -> true);
-            assertEquals(network, result.first /* network */);
-            assertEquals(hasConnectivity, result.second /* hasConnectivity */);
-        }
-
-        public void assertNoCallback() {
-            // If no more callbacks exist, there should be nothing left in the ReadHead
-            assertNull("Unexpected event in history",
-                    mHistory.poll(NO_CALLBACK_INVOKED_TIMEOUT, x -> true));
-        }
-    }
-
-    private class CarrierConfigReceiver extends BroadcastReceiver {
-        private final CountDownLatch mLatch = new CountDownLatch(1);
-        private final int mSubId;
-
-        CarrierConfigReceiver(int subId) {
-            mSubId = subId;
-        }
-
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            if (!CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED.equals(intent.getAction())) {
-                return;
-            }
-
-            final int subId =
-                    intent.getIntExtra(
-                            CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX,
-                            SubscriptionManager.INVALID_SUBSCRIPTION_ID);
-            if (mSubId != subId) return;
-
-            final PersistableBundle carrierConfigs = mCarrierConfigManager.getConfigForSubId(subId);
-            if (!CarrierConfigManager.isConfigForIdentifiedCarrier(carrierConfigs)) return;
-
-            final String[] certs =
-                    carrierConfigs.getStringArray(
-                            CarrierConfigManager.KEY_CARRIER_CERTIFICATE_STRING_ARRAY);
-            try {
-                if (ArrayUtils.contains(certs, getCertHashForThisPackage())) {
-                    mLatch.countDown();
-                }
-            } catch (Exception e) {
-            }
-        }
-
-        boolean waitForCarrierConfigChanged() throws Exception {
-            return mLatch.await(CARRIER_CONFIG_CHANGED_BROADCAST_TIMEOUT, TimeUnit.MILLISECONDS);
-        }
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java b/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java
deleted file mode 100644
index 3880664..0000000
--- a/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java
+++ /dev/null
@@ -1,1374 +0,0 @@
-/*
- * Copyright (C) 2009 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 static android.Manifest.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS;
-import static android.content.pm.PackageManager.FEATURE_ETHERNET;
-import static android.content.pm.PackageManager.FEATURE_TELEPHONY;
-import static android.content.pm.PackageManager.FEATURE_USB_HOST;
-import static android.content.pm.PackageManager.FEATURE_WIFI;
-import static android.content.pm.PackageManager.GET_PERMISSIONS;
-import static android.content.pm.PackageManager.PERMISSION_GRANTED;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_IMS;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED;
-import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
-import static android.net.cts.util.CtsNetUtils.ConnectivityActionReceiver;
-import static android.net.cts.util.CtsNetUtils.HTTP_PORT;
-import static android.net.cts.util.CtsNetUtils.NETWORK_CALLBACK_ACTION;
-import static android.net.cts.util.CtsNetUtils.TEST_HOST;
-import static android.net.cts.util.CtsNetUtils.TestNetworkCallback;
-import static android.os.MessageQueue.OnFileDescriptorEventListener.EVENT_INPUT;
-import static android.provider.Settings.Global.NETWORK_METERED_MULTIPATH_PREFERENCE;
-import static android.system.OsConstants.AF_INET;
-import static android.system.OsConstants.AF_INET6;
-import static android.system.OsConstants.AF_UNSPEC;
-
-import static com.android.compatibility.common.util.SystemUtil.runShellCommand;
-import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
-
-import android.annotation.NonNull;
-import android.app.Instrumentation;
-import android.app.PendingIntent;
-import android.app.UiAutomation;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.res.Resources;
-import android.net.ConnectivityManager;
-import android.net.ConnectivityManager.NetworkCallback;
-import android.net.IpSecManager;
-import android.net.IpSecManager.UdpEncapsulationSocket;
-import android.net.LinkProperties;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.NetworkConfig;
-import android.net.NetworkInfo;
-import android.net.NetworkInfo.DetailedState;
-import android.net.NetworkInfo.State;
-import android.net.NetworkRequest;
-import android.net.NetworkUtils;
-import android.net.SocketKeepalive;
-import android.net.cts.util.CtsNetUtils;
-import android.net.util.KeepaliveUtils;
-import android.net.wifi.WifiManager;
-import android.os.Binder;
-import android.os.Build;
-import android.os.Looper;
-import android.os.MessageQueue;
-import android.os.SystemClock;
-import android.os.SystemProperties;
-import android.os.VintfRuntimeInfo;
-import android.platform.test.annotations.AppModeFull;
-import android.provider.Settings;
-import android.text.TextUtils;
-import android.util.Log;
-import android.util.Pair;
-
-import androidx.test.InstrumentationRegistry;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.internal.util.ArrayUtils;
-import com.android.testutils.SkipPresubmit;
-
-import libcore.io.Streams;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.io.FileDescriptor;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.net.HttpURLConnection;
-import java.net.Inet4Address;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import java.net.URL;
-import java.net.UnknownHostException;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Executor;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Supplier;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-@RunWith(AndroidJUnit4.class)
-public class ConnectivityManagerTest {
-
-    private static final String TAG = ConnectivityManagerTest.class.getSimpleName();
-
-    public static final int TYPE_MOBILE = ConnectivityManager.TYPE_MOBILE;
-    public static final int TYPE_WIFI = ConnectivityManager.TYPE_WIFI;
-
-    private static final int HOST_ADDRESS = 0x7f000001;// represent ip 127.0.0.1
-    private static final int KEEPALIVE_CALLBACK_TIMEOUT_MS = 2000;
-    private static final int INTERVAL_KEEPALIVE_RETRY_MS = 500;
-    private static final int MAX_KEEPALIVE_RETRY_COUNT = 3;
-    private static final int MIN_KEEPALIVE_INTERVAL = 10;
-
-    // Changing meteredness on wifi involves reconnecting, which can take several seconds (involves
-    // re-associating, DHCP...)
-    private static final int NETWORK_CHANGE_METEREDNESS_TIMEOUT = 30_000;
-    private static final int NUM_TRIES_MULTIPATH_PREF_CHECK = 20;
-    private static final long INTERVAL_MULTIPATH_PREF_CHECK_MS = 500;
-    // device could have only one interface: data, wifi.
-    private static final int MIN_NUM_NETWORK_TYPES = 1;
-
-    // Minimum supported keepalive counts for wifi and cellular.
-    public static final int MIN_SUPPORTED_CELLULAR_KEEPALIVE_COUNT = 1;
-    public static final int MIN_SUPPORTED_WIFI_KEEPALIVE_COUNT = 3;
-
-    private static final String NETWORK_METERED_MULTIPATH_PREFERENCE_RES_NAME =
-            "config_networkMeteredMultipathPreference";
-    private static final String KEEPALIVE_ALLOWED_UNPRIVILEGED_RES_NAME =
-            "config_allowedUnprivilegedKeepalivePerUid";
-    private static final String KEEPALIVE_RESERVED_PER_SLOT_RES_NAME =
-            "config_reservedPrivilegedKeepaliveSlots";
-
-    private Context mContext;
-    private Instrumentation mInstrumentation;
-    private ConnectivityManager mCm;
-    private WifiManager mWifiManager;
-    private PackageManager mPackageManager;
-    private final HashMap<Integer, NetworkConfig> mNetworks =
-            new HashMap<Integer, NetworkConfig>();
-    boolean mWifiWasDisabled;
-    private UiAutomation mUiAutomation;
-    private CtsNetUtils mCtsNetUtils;
-
-    @Before
-    public void setUp() throws Exception {
-        mInstrumentation = InstrumentationRegistry.getInstrumentation();
-        mContext = mInstrumentation.getContext();
-        mCm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
-        mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
-        mPackageManager = mContext.getPackageManager();
-        mCtsNetUtils = new CtsNetUtils(mContext);
-        mWifiWasDisabled = false;
-
-        // Get com.android.internal.R.array.networkAttributes
-        int resId = mContext.getResources().getIdentifier("networkAttributes", "array", "android");
-        String[] naStrings = mContext.getResources().getStringArray(resId);
-        //TODO: What is the "correct" way to determine if this is a wifi only device?
-        boolean wifiOnly = SystemProperties.getBoolean("ro.radio.noril", false);
-        for (String naString : naStrings) {
-            try {
-                NetworkConfig n = new NetworkConfig(naString);
-                if (wifiOnly && ConnectivityManager.isNetworkTypeMobile(n.type)) {
-                    continue;
-                }
-                mNetworks.put(n.type, n);
-            } catch (Exception e) {}
-        }
-        mUiAutomation = mInstrumentation.getUiAutomation();
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        // Return WiFi to its original disabled state after tests that explicitly connect.
-        if (mWifiWasDisabled) {
-            mCtsNetUtils.disconnectFromWifi(null);
-        }
-        if (mCtsNetUtils.cellConnectAttempted()) {
-            mCtsNetUtils.disconnectFromCell();
-        }
-    }
-
-    /**
-     * Make sure WiFi is connected to an access point if it is not already. If
-     * WiFi is enabled as a result of this function, it will be disabled
-     * automatically in tearDown().
-     */
-    private Network ensureWifiConnected() {
-        mWifiWasDisabled = !mWifiManager.isWifiEnabled();
-        // Even if wifi is enabled, the network may not be connected or ready yet
-        return mCtsNetUtils.connectToWifi();
-    }
-
-    @Test
-    public void testIsNetworkTypeValid() {
-        assertTrue(ConnectivityManager.isNetworkTypeValid(ConnectivityManager.TYPE_MOBILE));
-        assertTrue(ConnectivityManager.isNetworkTypeValid(ConnectivityManager.TYPE_WIFI));
-        assertTrue(ConnectivityManager.isNetworkTypeValid(ConnectivityManager.TYPE_MOBILE_MMS));
-        assertTrue(ConnectivityManager.isNetworkTypeValid(ConnectivityManager.TYPE_MOBILE_SUPL));
-        assertTrue(ConnectivityManager.isNetworkTypeValid(ConnectivityManager.TYPE_MOBILE_DUN));
-        assertTrue(ConnectivityManager.isNetworkTypeValid(ConnectivityManager.TYPE_MOBILE_HIPRI));
-        assertTrue(ConnectivityManager.isNetworkTypeValid(ConnectivityManager.TYPE_WIMAX));
-        assertTrue(ConnectivityManager.isNetworkTypeValid(ConnectivityManager.TYPE_BLUETOOTH));
-        assertTrue(ConnectivityManager.isNetworkTypeValid(ConnectivityManager.TYPE_DUMMY));
-        assertTrue(ConnectivityManager.isNetworkTypeValid(ConnectivityManager.TYPE_ETHERNET));
-        assertTrue(mCm.isNetworkTypeValid(ConnectivityManager.TYPE_MOBILE_FOTA));
-        assertTrue(mCm.isNetworkTypeValid(ConnectivityManager.TYPE_MOBILE_IMS));
-        assertTrue(mCm.isNetworkTypeValid(ConnectivityManager.TYPE_MOBILE_CBS));
-        assertTrue(mCm.isNetworkTypeValid(ConnectivityManager.TYPE_WIFI_P2P));
-        assertTrue(mCm.isNetworkTypeValid(ConnectivityManager.TYPE_MOBILE_IA));
-        assertFalse(mCm.isNetworkTypeValid(-1));
-        assertTrue(mCm.isNetworkTypeValid(0));
-        assertTrue(mCm.isNetworkTypeValid(ConnectivityManager.MAX_NETWORK_TYPE));
-        assertFalse(ConnectivityManager.isNetworkTypeValid(ConnectivityManager.MAX_NETWORK_TYPE+1));
-
-        NetworkInfo[] ni = mCm.getAllNetworkInfo();
-
-        for (NetworkInfo n: ni) {
-            assertTrue(ConnectivityManager.isNetworkTypeValid(n.getType()));
-        }
-
-    }
-
-    @Test
-    public void testSetNetworkPreference() {
-        // getNetworkPreference() and setNetworkPreference() are both deprecated so they do
-        // not preform any action.  Verify they are at least still callable.
-        mCm.setNetworkPreference(mCm.getNetworkPreference());
-    }
-
-    @Test
-    public void testGetActiveNetworkInfo() {
-        NetworkInfo ni = mCm.getActiveNetworkInfo();
-
-        assertNotNull("You must have an active network connection to complete CTS", ni);
-        assertTrue(ConnectivityManager.isNetworkTypeValid(ni.getType()));
-        assertTrue(ni.getState() == State.CONNECTED);
-    }
-
-    @Test
-    public void testGetActiveNetwork() {
-        Network network = mCm.getActiveNetwork();
-        assertNotNull("You must have an active network connection to complete CTS", network);
-
-        NetworkInfo ni = mCm.getNetworkInfo(network);
-        assertNotNull("Network returned from getActiveNetwork was invalid", ni);
-
-        // Similar to testGetActiveNetworkInfo above.
-        assertTrue(ConnectivityManager.isNetworkTypeValid(ni.getType()));
-        assertTrue(ni.getState() == State.CONNECTED);
-    }
-
-    @Test
-    public void testGetNetworkInfo() {
-        for (int type = -1; type <= ConnectivityManager.MAX_NETWORK_TYPE+1; type++) {
-            if (shouldBeSupported(type)) {
-                NetworkInfo ni = mCm.getNetworkInfo(type);
-                assertTrue("Info shouldn't be null for " + type, ni != null);
-                State state = ni.getState();
-                assertTrue("Bad state for " + type, State.UNKNOWN.ordinal() >= state.ordinal()
-                           && state.ordinal() >= State.CONNECTING.ordinal());
-                DetailedState ds = ni.getDetailedState();
-                assertTrue("Bad detailed state for " + type,
-                           DetailedState.FAILED.ordinal() >= ds.ordinal()
-                           && ds.ordinal() >= DetailedState.IDLE.ordinal());
-            } else {
-                assertNull("Info should be null for " + type, mCm.getNetworkInfo(type));
-            }
-        }
-    }
-
-    @Test
-    public void testGetAllNetworkInfo() {
-        NetworkInfo[] ni = mCm.getAllNetworkInfo();
-        assertTrue(ni.length >= MIN_NUM_NETWORK_TYPES);
-        for (int type = 0; type <= ConnectivityManager.MAX_NETWORK_TYPE; type++) {
-            int desiredFoundCount = (shouldBeSupported(type) ? 1 : 0);
-            int foundCount = 0;
-            for (NetworkInfo i : ni) {
-                if (i.getType() == type) foundCount++;
-            }
-            if (foundCount != desiredFoundCount) {
-                Log.e(TAG, "failure in testGetAllNetworkInfo.  Dump of returned NetworkInfos:");
-                for (NetworkInfo networkInfo : ni) Log.e(TAG, "  " + networkInfo);
-            }
-            assertTrue("Unexpected foundCount of " + foundCount + " for type " + type,
-                    foundCount == desiredFoundCount);
-        }
-    }
-
-    /**
-     * Tests that connections can be opened on WiFi and cellphone networks,
-     * and that they are made from different IP addresses.
-     */
-    @AppModeFull(reason = "Cannot get WifiManager in instant app mode")
-    @Test
-    @SkipPresubmit(reason = "Virtual devices use a single internet connection for all networks")
-    public void testOpenConnection() throws Exception {
-        boolean canRunTest = mPackageManager.hasSystemFeature(FEATURE_WIFI)
-                && mPackageManager.hasSystemFeature(FEATURE_TELEPHONY);
-        if (!canRunTest) {
-            Log.i(TAG,"testOpenConnection cannot execute unless device supports both WiFi "
-                    + "and a cellular connection");
-            return;
-        }
-
-        Network wifiNetwork = mCtsNetUtils.connectToWifi();
-        Network cellNetwork = mCtsNetUtils.connectToCell();
-        // This server returns the requestor's IP address as the response body.
-        URL url = new URL("http://google-ipv6test.appspot.com/ip.js?fmt=text");
-        String wifiAddressString = httpGet(wifiNetwork, url);
-        String cellAddressString = httpGet(cellNetwork, url);
-
-        assertFalse(String.format("Same address '%s' on two different networks (%s, %s)",
-                wifiAddressString, wifiNetwork, cellNetwork),
-                wifiAddressString.equals(cellAddressString));
-
-        // Sanity check that the IP addresses that the requests appeared to come from
-        // are actually on the respective networks.
-        assertOnNetwork(wifiAddressString, wifiNetwork);
-        assertOnNetwork(cellAddressString, cellNetwork);
-
-        assertFalse("Unexpectedly equal: " + wifiNetwork, wifiNetwork.equals(cellNetwork));
-    }
-
-    /**
-     * Performs a HTTP GET to the specified URL on the specified Network, and returns
-     * the response body decoded as UTF-8.
-     */
-    private static String httpGet(Network network, URL httpUrl) throws IOException {
-        HttpURLConnection connection = (HttpURLConnection) network.openConnection(httpUrl);
-        try {
-            InputStream inputStream = connection.getInputStream();
-            return Streams.readFully(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
-        } finally {
-            connection.disconnect();
-        }
-    }
-
-    private void assertOnNetwork(String adressString, Network network) throws UnknownHostException {
-        InetAddress address = InetAddress.getByName(adressString);
-        LinkProperties linkProperties = mCm.getLinkProperties(network);
-        // To make sure that the request went out on the right network, check that
-        // the IP address seen by the server is assigned to the expected network.
-        // We can only do this for IPv6 addresses, because in IPv4 we will likely
-        // have a private IPv4 address, and that won't match what the server sees.
-        if (address instanceof Inet6Address) {
-            assertContains(linkProperties.getAddresses(), address);
-        }
-    }
-
-    private static<T> void assertContains(Collection<T> collection, T element) {
-        assertTrue(element + " not found in " + collection, collection.contains(element));
-    }
-
-    private void assertStartUsingNetworkFeatureUnsupported(int networkType, String feature) {
-        try {
-            mCm.startUsingNetworkFeature(networkType, feature);
-            fail("startUsingNetworkFeature is no longer supported in the current API version");
-        } catch (UnsupportedOperationException expected) {}
-    }
-
-    private void assertStopUsingNetworkFeatureUnsupported(int networkType, String feature) {
-        try {
-            mCm.startUsingNetworkFeature(networkType, feature);
-            fail("stopUsingNetworkFeature is no longer supported in the current API version");
-        } catch (UnsupportedOperationException expected) {}
-    }
-
-    private void assertRequestRouteToHostUnsupported(int networkType, int hostAddress) {
-        try {
-            mCm.requestRouteToHost(networkType, hostAddress);
-            fail("requestRouteToHost is no longer supported in the current API version");
-        } catch (UnsupportedOperationException expected) {}
-    }
-
-    @Test
-    public void testStartUsingNetworkFeature() {
-
-        final String invalidateFeature = "invalidateFeature";
-        final String mmsFeature = "enableMMS";
-
-        assertStartUsingNetworkFeatureUnsupported(TYPE_MOBILE, invalidateFeature);
-        assertStopUsingNetworkFeatureUnsupported(TYPE_MOBILE, invalidateFeature);
-        assertStartUsingNetworkFeatureUnsupported(TYPE_WIFI, mmsFeature);
-    }
-
-    private boolean shouldEthernetBeSupported() {
-        // Instant mode apps aren't allowed to query the Ethernet service due to selinux policies.
-        // When in instant mode, don't fail if the Ethernet service is available. Instead, rely on
-        // the fact that Ethernet should be supported if the device has a hardware Ethernet port, or
-        // if the device can be a USB host and thus can use USB Ethernet adapters.
-        //
-        // Note that this test this will still fail in instant mode if a device supports Ethernet
-        // via other hardware means. We are not currently aware of any such device.
-        return (mContext.getSystemService(Context.ETHERNET_SERVICE) != null) ||
-            mPackageManager.hasSystemFeature(FEATURE_ETHERNET) ||
-            mPackageManager.hasSystemFeature(FEATURE_USB_HOST);
-    }
-
-    private boolean shouldBeSupported(int networkType) {
-        return mNetworks.containsKey(networkType) ||
-               (networkType == ConnectivityManager.TYPE_VPN) ||
-               (networkType == ConnectivityManager.TYPE_ETHERNET && shouldEthernetBeSupported());
-    }
-
-    @Test
-    public void testIsNetworkSupported() {
-        for (int type = -1; type <= ConnectivityManager.MAX_NETWORK_TYPE; type++) {
-            boolean supported = mCm.isNetworkSupported(type);
-            if (shouldBeSupported(type)) {
-                assertTrue("Network type " + type + " should be supported", supported);
-            } else {
-                assertFalse("Network type " + type + " should not be supported", supported);
-            }
-        }
-    }
-
-    @Test
-    public void testRequestRouteToHost() {
-        for (int type = -1 ; type <= ConnectivityManager.MAX_NETWORK_TYPE; type++) {
-            assertRequestRouteToHostUnsupported(type, HOST_ADDRESS);
-        }
-    }
-
-    @Test
-    public void testTest() {
-        mCm.getBackgroundDataSetting();
-    }
-
-    private NetworkRequest makeWifiNetworkRequest() {
-        return new NetworkRequest.Builder()
-                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
-                .build();
-    }
-
-    /**
-     * Exercises both registerNetworkCallback and unregisterNetworkCallback. This checks to
-     * see if we get a callback for the TRANSPORT_WIFI transport type being available.
-     *
-     * <p>In order to test that a NetworkCallback occurs, we need some change in the network
-     * state (either a transport or capability is now available). The most straightforward is
-     * WiFi. We could add a version that uses the telephony data connection but it's not clear
-     * that it would increase test coverage by much (how many devices have 3G radio but not Wifi?).
-     */
-    @AppModeFull(reason = "Cannot get WifiManager in instant app mode")
-    @Test
-    public void testRegisterNetworkCallback() {
-        if (!mPackageManager.hasSystemFeature(FEATURE_WIFI)) {
-            Log.i(TAG, "testRegisterNetworkCallback cannot execute unless device supports WiFi");
-            return;
-        }
-
-        // We will register for a WIFI network being available or lost.
-        final TestNetworkCallback callback = new TestNetworkCallback();
-        mCm.registerNetworkCallback(makeWifiNetworkRequest(), callback);
-
-        final TestNetworkCallback defaultTrackingCallback = new TestNetworkCallback();
-        mCm.registerDefaultNetworkCallback(defaultTrackingCallback);
-
-        Network wifiNetwork = null;
-
-        try {
-            ensureWifiConnected();
-
-            // Now we should expect to get a network callback about availability of the wifi
-            // network even if it was already connected as a state-based action when the callback
-            // is registered.
-            wifiNetwork = callback.waitForAvailable();
-            assertNotNull("Did not receive NetworkCallback.onAvailable for TRANSPORT_WIFI",
-                    wifiNetwork);
-
-            assertNotNull("Did not receive NetworkCallback.onAvailable for any default network",
-                    defaultTrackingCallback.waitForAvailable());
-        } catch (InterruptedException e) {
-            fail("Broadcast receiver or NetworkCallback wait was interrupted.");
-        } finally {
-            mCm.unregisterNetworkCallback(callback);
-            mCm.unregisterNetworkCallback(defaultTrackingCallback);
-        }
-    }
-
-    /**
-     * Tests both registerNetworkCallback and unregisterNetworkCallback similarly to
-     * {@link #testRegisterNetworkCallback} except that a {@code PendingIntent} is used instead
-     * of a {@code NetworkCallback}.
-     */
-    @AppModeFull(reason = "Cannot get WifiManager in instant app mode")
-    @Test
-    public void testRegisterNetworkCallback_withPendingIntent() {
-        if (!mPackageManager.hasSystemFeature(FEATURE_WIFI)) {
-            Log.i(TAG, "testRegisterNetworkCallback cannot execute unless device supports WiFi");
-            return;
-        }
-
-        // Create a ConnectivityActionReceiver that has an IntentFilter for our locally defined
-        // action, NETWORK_CALLBACK_ACTION.
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(NETWORK_CALLBACK_ACTION);
-
-        ConnectivityActionReceiver receiver = new ConnectivityActionReceiver(
-                mCm, ConnectivityManager.TYPE_WIFI, NetworkInfo.State.CONNECTED);
-        mContext.registerReceiver(receiver, filter);
-
-        // Create a broadcast PendingIntent for NETWORK_CALLBACK_ACTION.
-        Intent intent = new Intent(NETWORK_CALLBACK_ACTION);
-        PendingIntent pendingIntent = PendingIntent.getBroadcast(
-                mContext, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
-
-        // We will register for a WIFI network being available or lost.
-        mCm.registerNetworkCallback(makeWifiNetworkRequest(), pendingIntent);
-
-        try {
-            ensureWifiConnected();
-
-            // Now we expect to get the Intent delivered notifying of the availability of the wifi
-            // network even if it was already connected as a state-based action when the callback
-            // is registered.
-            assertTrue("Did not receive expected Intent " + intent + " for TRANSPORT_WIFI",
-                    receiver.waitForState());
-        } catch (InterruptedException e) {
-            fail("Broadcast receiver or NetworkCallback wait was interrupted.");
-        } finally {
-            mCm.unregisterNetworkCallback(pendingIntent);
-            pendingIntent.cancel();
-            mContext.unregisterReceiver(receiver);
-        }
-    }
-
-    /**
-     * Exercises the requestNetwork with NetworkCallback API. This checks to
-     * see if we get a callback for an INTERNET request.
-     */
-    @AppModeFull(reason = "CHANGE_NETWORK_STATE permission can't be granted to instant apps")
-    @Test
-    public void testRequestNetworkCallback() {
-        final TestNetworkCallback callback = new TestNetworkCallback();
-        mCm.requestNetwork(new NetworkRequest.Builder()
-                .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
-                .build(), callback);
-
-        try {
-            // Wait to get callback for availability of internet
-            Network internetNetwork = callback.waitForAvailable();
-            assertNotNull("Did not receive NetworkCallback#onAvailable for INTERNET",
-                    internetNetwork);
-        } catch (InterruptedException e) {
-            fail("NetworkCallback wait was interrupted.");
-        } finally {
-            mCm.unregisterNetworkCallback(callback);
-        }
-    }
-
-    /**
-     * Exercises the requestNetwork with NetworkCallback API with timeout - expected to
-     * fail. Use WIFI and switch Wi-Fi off.
-     */
-    @AppModeFull(reason = "Cannot get WifiManager in instant app mode")
-    @Test
-    public void testRequestNetworkCallback_onUnavailable() {
-        final boolean previousWifiEnabledState = mWifiManager.isWifiEnabled();
-        if (previousWifiEnabledState) {
-            mCtsNetUtils.disconnectFromWifi(null);
-        }
-
-        final TestNetworkCallback callback = new TestNetworkCallback();
-        mCm.requestNetwork(new NetworkRequest.Builder()
-                .addTransportType(TRANSPORT_WIFI)
-                .build(), callback, 100);
-
-        try {
-            // Wait to get callback for unavailability of requested network
-            assertTrue("Did not receive NetworkCallback#onUnavailable",
-                    callback.waitForUnavailable());
-        } catch (InterruptedException e) {
-            fail("NetworkCallback wait was interrupted.");
-        } finally {
-            mCm.unregisterNetworkCallback(callback);
-            if (previousWifiEnabledState) {
-                mCtsNetUtils.connectToWifi();
-            }
-        }
-    }
-
-    private InetAddress getFirstV4Address(Network network) {
-        LinkProperties linkProperties = mCm.getLinkProperties(network);
-        for (InetAddress address : linkProperties.getAddresses()) {
-            if (address instanceof Inet4Address) {
-                return address;
-            }
-        }
-        return null;
-    }
-
-    /** Verify restricted networks cannot be requested. */
-    @AppModeFull(reason = "CHANGE_NETWORK_STATE permission can't be granted to instant apps")
-    @Test
-    public void testRestrictedNetworks() {
-        // Verify we can request unrestricted networks:
-        NetworkRequest request = new NetworkRequest.Builder()
-                .addCapability(NET_CAPABILITY_INTERNET).build();
-        NetworkCallback callback = new NetworkCallback();
-        mCm.requestNetwork(request, callback);
-        mCm.unregisterNetworkCallback(callback);
-        // Verify we cannot request restricted networks:
-        request = new NetworkRequest.Builder().addCapability(NET_CAPABILITY_IMS).build();
-        callback = new NetworkCallback();
-        try {
-            mCm.requestNetwork(request, callback);
-            fail("No exception thrown when restricted network requested.");
-        } catch (SecurityException expected) {}
-    }
-
-    // Returns "true", "false" or "none"
-    private String getWifiMeteredStatus(String ssid) throws Exception {
-        // Interestingly giving the SSID as an argument to list wifi-networks
-        // only works iff the network in question has the "false" policy.
-        // Also unfortunately runShellCommand does not pass the command to the interpreter
-        // so it's not possible to | grep the ssid.
-        final String command = "cmd netpolicy list wifi-networks";
-        final String policyString = runShellCommand(mInstrumentation, command);
-
-        final Matcher m = Pattern.compile("^" + ssid + ";(true|false|none)$",
-                Pattern.MULTILINE | Pattern.UNIX_LINES).matcher(policyString);
-        if (!m.find()) {
-            fail("Unexpected format from cmd netpolicy");
-        }
-        return m.group(1);
-    }
-
-    // metered should be "true", "false" or "none"
-    private void setWifiMeteredStatus(String ssid, String metered) throws Exception {
-        final String setCommand = "cmd netpolicy set metered-network " + ssid + " " + metered;
-        runShellCommand(mInstrumentation, setCommand);
-        assertEquals(getWifiMeteredStatus(ssid), metered);
-    }
-
-    private String unquoteSSID(String ssid) {
-        // SSID is returned surrounded by quotes if it can be decoded as UTF-8.
-        // Otherwise it's guaranteed not to start with a quote.
-        if (ssid.charAt(0) == '"') {
-            return ssid.substring(1, ssid.length() - 1);
-        } else {
-            return ssid;
-        }
-    }
-
-    private void waitForActiveNetworkMetered(int targetTransportType, boolean requestedMeteredness)
-            throws Exception {
-        final CountDownLatch latch = new CountDownLatch(1);
-        final NetworkCallback networkCallback = new NetworkCallback() {
-            @Override
-            public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) {
-                if (!nc.hasTransport(targetTransportType)) return;
-
-                final boolean metered = !nc.hasCapability(NET_CAPABILITY_NOT_METERED);
-                if (metered == requestedMeteredness) {
-                    latch.countDown();
-                }
-            }
-        };
-        // Registering a callback here guarantees onCapabilitiesChanged is called immediately
-        // with the current setting. Therefore, if the setting has already been changed,
-        // this method will return right away, and if not it will wait for the setting to change.
-        mCm.registerDefaultNetworkCallback(networkCallback);
-        if (!latch.await(NETWORK_CHANGE_METEREDNESS_TIMEOUT, TimeUnit.MILLISECONDS)) {
-            fail("Timed out waiting for active network metered status to change to "
-                 + requestedMeteredness + " ; network = " + mCm.getActiveNetwork());
-        }
-        mCm.unregisterNetworkCallback(networkCallback);
-    }
-
-    private void assertMultipathPreferenceIsEventually(Network network, int oldValue,
-            int expectedValue) {
-        // Sanity check : if oldValue == expectedValue, there is no way to guarantee the test
-        // is not flaky.
-        assertNotSame(oldValue, expectedValue);
-
-        for (int i = 0; i < NUM_TRIES_MULTIPATH_PREF_CHECK; ++i) {
-            final int actualValue = mCm.getMultipathPreference(network);
-            if (actualValue == expectedValue) {
-                return;
-            }
-            if (actualValue != oldValue) {
-                fail("Multipath preference is neither previous (" + oldValue
-                        + ") nor expected (" + expectedValue + ")");
-            }
-            SystemClock.sleep(INTERVAL_MULTIPATH_PREF_CHECK_MS);
-        }
-        fail("Timed out waiting for multipath preference to change. expected = "
-                + expectedValue + " ; actual = " + mCm.getMultipathPreference(network));
-    }
-
-    private int getCurrentMeteredMultipathPreference(ContentResolver resolver) {
-        final String rawMeteredPref = Settings.Global.getString(resolver,
-                NETWORK_METERED_MULTIPATH_PREFERENCE);
-        return TextUtils.isEmpty(rawMeteredPref)
-            ? getIntResourceForName(NETWORK_METERED_MULTIPATH_PREFERENCE_RES_NAME)
-            : Integer.parseInt(rawMeteredPref);
-    }
-
-    private int findNextPrefValue(ContentResolver resolver) {
-        // A bit of a nuclear hammer, but race conditions in CTS are bad. To be able to
-        // detect a correct setting value without race conditions, the next pref must
-        // be a valid value (range 0..3) that is different from the old setting of the
-        // metered preference and from the unmetered preference.
-        final int meteredPref = getCurrentMeteredMultipathPreference(resolver);
-        final int unmeteredPref = ConnectivityManager.MULTIPATH_PREFERENCE_UNMETERED;
-        if (0 != meteredPref && 0 != unmeteredPref) return 0;
-        if (1 != meteredPref && 1 != unmeteredPref) return 1;
-        return 2;
-    }
-
-    /**
-     * Verify that getMultipathPreference does return appropriate values
-     * for metered and unmetered networks.
-     */
-    @AppModeFull(reason = "Cannot get WifiManager in instant app mode")
-    @Test
-    public void testGetMultipathPreference() throws Exception {
-        final ContentResolver resolver = mContext.getContentResolver();
-        ensureWifiConnected();
-        final String ssid = unquoteSSID(mWifiManager.getConnectionInfo().getSSID());
-        final String oldMeteredSetting = getWifiMeteredStatus(ssid);
-        final String oldMeteredMultipathPreference = Settings.Global.getString(
-                resolver, NETWORK_METERED_MULTIPATH_PREFERENCE);
-        try {
-            final int initialMeteredPreference = getCurrentMeteredMultipathPreference(resolver);
-            int newMeteredPreference = findNextPrefValue(resolver);
-            Settings.Global.putString(resolver, NETWORK_METERED_MULTIPATH_PREFERENCE,
-                    Integer.toString(newMeteredPreference));
-            setWifiMeteredStatus(ssid, "true");
-            waitForActiveNetworkMetered(TRANSPORT_WIFI, true);
-            // Wifi meterness changes from unmetered to metered will disconnect and reconnect since
-            // R.
-            final Network network = ensureWifiConnected();
-            assertEquals(ssid, unquoteSSID(mWifiManager.getConnectionInfo().getSSID()));
-            assertEquals(mCm.getNetworkCapabilities(network).hasCapability(
-                    NET_CAPABILITY_NOT_METERED), false);
-            assertMultipathPreferenceIsEventually(network, initialMeteredPreference,
-                    newMeteredPreference);
-
-            final int oldMeteredPreference = newMeteredPreference;
-            newMeteredPreference = findNextPrefValue(resolver);
-            Settings.Global.putString(resolver, NETWORK_METERED_MULTIPATH_PREFERENCE,
-                    Integer.toString(newMeteredPreference));
-            assertEquals(mCm.getNetworkCapabilities(network).hasCapability(
-                    NET_CAPABILITY_NOT_METERED), false);
-            assertMultipathPreferenceIsEventually(network,
-                    oldMeteredPreference, newMeteredPreference);
-
-            setWifiMeteredStatus(ssid, "false");
-            // No disconnect from unmetered to metered.
-            waitForActiveNetworkMetered(TRANSPORT_WIFI, false);
-            assertEquals(mCm.getNetworkCapabilities(network).hasCapability(
-                    NET_CAPABILITY_NOT_METERED), true);
-            assertMultipathPreferenceIsEventually(network, newMeteredPreference,
-                    ConnectivityManager.MULTIPATH_PREFERENCE_UNMETERED);
-        } finally {
-            Settings.Global.putString(resolver, NETWORK_METERED_MULTIPATH_PREFERENCE,
-                    oldMeteredMultipathPreference);
-            setWifiMeteredStatus(ssid, oldMeteredSetting);
-        }
-    }
-
-    // TODO: move the following socket keep alive test to dedicated test class.
-    /**
-     * Callback used in tcp keepalive offload that allows caller to wait callback fires.
-     */
-    private static class TestSocketKeepaliveCallback extends SocketKeepalive.Callback {
-        public enum CallbackType { ON_STARTED, ON_STOPPED, ON_ERROR };
-
-        public static class CallbackValue {
-            public final CallbackType callbackType;
-            public final int error;
-
-            private CallbackValue(final CallbackType type, final int error) {
-                this.callbackType = type;
-                this.error = error;
-            }
-
-            public static class OnStartedCallback extends CallbackValue {
-                OnStartedCallback() { super(CallbackType.ON_STARTED, 0); }
-            }
-
-            public static class OnStoppedCallback extends CallbackValue {
-                OnStoppedCallback() { super(CallbackType.ON_STOPPED, 0); }
-            }
-
-            public static class OnErrorCallback extends CallbackValue {
-                OnErrorCallback(final int error) { super(CallbackType.ON_ERROR, error); }
-            }
-
-            @Override
-            public boolean equals(Object o) {
-                return o.getClass() == this.getClass()
-                        && this.callbackType == ((CallbackValue) o).callbackType
-                        && this.error == ((CallbackValue) o).error;
-            }
-
-            @Override
-            public String toString() {
-                return String.format("%s(%s, %d)", getClass().getSimpleName(), callbackType, error);
-            }
-        }
-
-        private final LinkedBlockingQueue<CallbackValue> mCallbacks = new LinkedBlockingQueue<>();
-
-        @Override
-        public void onStarted() {
-            mCallbacks.add(new CallbackValue.OnStartedCallback());
-        }
-
-        @Override
-        public void onStopped() {
-            mCallbacks.add(new CallbackValue.OnStoppedCallback());
-        }
-
-        @Override
-        public void onError(final int error) {
-            mCallbacks.add(new CallbackValue.OnErrorCallback(error));
-        }
-
-        public CallbackValue pollCallback() {
-            try {
-                return mCallbacks.poll(KEEPALIVE_CALLBACK_TIMEOUT_MS,
-                        TimeUnit.MILLISECONDS);
-            } catch (InterruptedException e) {
-                fail("Callback not seen after " + KEEPALIVE_CALLBACK_TIMEOUT_MS + " ms");
-            }
-            return null;
-        }
-        private void expectCallback(CallbackValue expectedCallback) {
-            final CallbackValue actualCallback = pollCallback();
-            assertEquals(expectedCallback, actualCallback);
-        }
-
-        public void expectStarted() {
-            expectCallback(new CallbackValue.OnStartedCallback());
-        }
-
-        public void expectStopped() {
-            expectCallback(new CallbackValue.OnStoppedCallback());
-        }
-
-        public void expectError(int error) {
-            expectCallback(new CallbackValue.OnErrorCallback(error));
-        }
-    }
-
-    private InetAddress getAddrByName(final String hostname, final int family) throws Exception {
-        final InetAddress[] allAddrs = InetAddress.getAllByName(hostname);
-        for (InetAddress addr : allAddrs) {
-            if (family == AF_INET && addr instanceof Inet4Address) return addr;
-
-            if (family == AF_INET6 && addr instanceof Inet6Address) return addr;
-
-            if (family == AF_UNSPEC) return addr;
-        }
-        return null;
-    }
-
-    private Socket getConnectedSocket(final Network network, final String host, final int port,
-            final int family) throws Exception {
-        final Socket s = network.getSocketFactory().createSocket();
-        try {
-            final InetAddress addr = getAddrByName(host, family);
-            if (addr == null) fail("Fail to get destination address for " + family);
-
-            final InetSocketAddress sockAddr = new InetSocketAddress(addr, port);
-            s.connect(sockAddr);
-        } catch (Exception e) {
-            s.close();
-            throw e;
-        }
-        return s;
-    }
-
-    private int getSupportedKeepalivesForNet(@NonNull Network network) throws Exception {
-        final NetworkCapabilities nc = mCm.getNetworkCapabilities(network);
-
-        // Get number of supported concurrent keepalives for testing network.
-        final int[] keepalivesPerTransport = KeepaliveUtils.getSupportedKeepalives(mContext);
-        return KeepaliveUtils.getSupportedKeepalivesForNetworkCapabilities(
-                keepalivesPerTransport, nc);
-    }
-
-    private static boolean isTcpKeepaliveSupportedByKernel() {
-        final String kVersionString = VintfRuntimeInfo.getKernelVersion();
-        return compareMajorMinorVersion(kVersionString, "4.8") >= 0;
-    }
-
-    private static Pair<Integer, Integer> getVersionFromString(String version) {
-        // Only gets major and minor number of the version string.
-        final Pattern versionPattern = Pattern.compile("^(\\d+)(\\.(\\d+))?.*");
-        final Matcher m = versionPattern.matcher(version);
-        if (m.matches()) {
-            final int major = Integer.parseInt(m.group(1));
-            final int minor = TextUtils.isEmpty(m.group(3)) ? 0 : Integer.parseInt(m.group(3));
-            return new Pair<>(major, minor);
-        } else {
-            return new Pair<>(0, 0);
-        }
-    }
-
-    // TODO: Move to util class.
-    private static int compareMajorMinorVersion(final String s1, final String s2) {
-        final Pair<Integer, Integer> v1 = getVersionFromString(s1);
-        final Pair<Integer, Integer> v2 = getVersionFromString(s2);
-
-        if (v1.first == v2.first) {
-            return Integer.compare(v1.second, v2.second);
-        } else {
-            return Integer.compare(v1.first, v2.first);
-        }
-    }
-
-    /**
-     * Verifies that version string compare logic returns expected result for various cases.
-     * Note that only major and minor number are compared.
-     */
-    @Test
-    public void testMajorMinorVersionCompare() {
-        assertEquals(0, compareMajorMinorVersion("4.8.1", "4.8"));
-        assertEquals(1, compareMajorMinorVersion("4.9", "4.8.1"));
-        assertEquals(1, compareMajorMinorVersion("5.0", "4.8"));
-        assertEquals(1, compareMajorMinorVersion("5", "4.8"));
-        assertEquals(0, compareMajorMinorVersion("5", "5.0"));
-        assertEquals(1, compareMajorMinorVersion("5-beta1", "4.8"));
-        assertEquals(0, compareMajorMinorVersion("4.8.0.0", "4.8"));
-        assertEquals(0, compareMajorMinorVersion("4.8-RC1", "4.8"));
-        assertEquals(0, compareMajorMinorVersion("4.8", "4.8"));
-        assertEquals(-1, compareMajorMinorVersion("3.10", "4.8.0"));
-        assertEquals(-1, compareMajorMinorVersion("4.7.10.10", "4.8"));
-    }
-
-    /**
-     * Verifies that the keepalive API cannot create any keepalive when the maximum number of
-     * keepalives is set to 0.
-     */
-    @AppModeFull(reason = "Cannot get WifiManager in instant app mode")
-    @Test
-    public void testKeepaliveWifiUnsupported() throws Exception {
-        if (!mPackageManager.hasSystemFeature(FEATURE_WIFI)) {
-            Log.i(TAG, "testKeepaliveUnsupported cannot execute unless device"
-                    + " supports WiFi");
-            return;
-        }
-
-        final Network network = ensureWifiConnected();
-        if (getSupportedKeepalivesForNet(network) != 0) return;
-        final InetAddress srcAddr = getFirstV4Address(network);
-        assumeTrue("This test requires native IPv4", srcAddr != null);
-
-        runWithShellPermissionIdentity(() -> {
-            assertEquals(0, createConcurrentSocketKeepalives(network, srcAddr, 1, 0));
-            assertEquals(0, createConcurrentSocketKeepalives(network, srcAddr, 0, 1));
-        });
-    }
-
-    @AppModeFull(reason = "Cannot get WifiManager in instant app mode")
-    @Test
-    @SkipPresubmit(reason = "Keepalive is not supported on virtual hardware")
-    public void testCreateTcpKeepalive() throws Exception {
-        if (!mPackageManager.hasSystemFeature(FEATURE_WIFI)) {
-            Log.i(TAG, "testCreateTcpKeepalive cannot execute unless device supports WiFi");
-            return;
-        }
-
-        final Network network = ensureWifiConnected();
-        if (getSupportedKeepalivesForNet(network) == 0) return;
-        final InetAddress srcAddr = getFirstV4Address(network);
-        assumeTrue("This test requires native IPv4", srcAddr != null);
-
-        // If kernel < 4.8 then it doesn't support TCP keepalive, but it might still support
-        // NAT-T keepalive. If keepalive limits from resource overlay is not zero, TCP keepalive
-        // needs to be supported except if the kernel doesn't support it.
-        if (!isTcpKeepaliveSupportedByKernel()) {
-            // Sanity check to ensure the callback result is expected.
-            runWithShellPermissionIdentity(() -> {
-                assertEquals(0, createConcurrentSocketKeepalives(network, srcAddr, 0, 1));
-            });
-            Log.i(TAG, "testCreateTcpKeepalive is skipped for kernel "
-                    + VintfRuntimeInfo.getKernelVersion());
-            return;
-        }
-
-        final byte[] requestBytes = CtsNetUtils.HTTP_REQUEST.getBytes("UTF-8");
-        // So far only ipv4 tcp keepalive offload is supported.
-        // TODO: add test case for ipv6 tcp keepalive offload when it is supported.
-        try (Socket s = getConnectedSocket(network, TEST_HOST, HTTP_PORT, AF_INET)) {
-
-            // Should able to start keep alive offload when socket is idle.
-            final Executor executor = mContext.getMainExecutor();
-            final TestSocketKeepaliveCallback callback = new TestSocketKeepaliveCallback();
-
-            mUiAutomation.adoptShellPermissionIdentity();
-            try (SocketKeepalive sk = mCm.createSocketKeepalive(network, s, executor, callback)) {
-                sk.start(MIN_KEEPALIVE_INTERVAL);
-                callback.expectStarted();
-
-                // App should not able to write during keepalive offload.
-                final OutputStream out = s.getOutputStream();
-                try {
-                    out.write(requestBytes);
-                    fail("Should not able to write");
-                } catch (IOException e) { }
-                // App should not able to read during keepalive offload.
-                final InputStream in = s.getInputStream();
-                byte[] responseBytes = new byte[4096];
-                try {
-                    in.read(responseBytes);
-                    fail("Should not able to read");
-                } catch (IOException e) { }
-
-                // Stop.
-                sk.stop();
-                callback.expectStopped();
-            } finally {
-                mUiAutomation.dropShellPermissionIdentity();
-            }
-
-            // Ensure socket is still connected.
-            assertTrue(s.isConnected());
-            assertFalse(s.isClosed());
-
-            // Let socket be not idle.
-            try {
-                final OutputStream out = s.getOutputStream();
-                out.write(requestBytes);
-            } catch (IOException e) {
-                fail("Failed to write data " + e);
-            }
-            // Make sure response data arrives.
-            final MessageQueue fdHandlerQueue = Looper.getMainLooper().getQueue();
-            final FileDescriptor fd = s.getFileDescriptor$();
-            final CountDownLatch mOnReceiveLatch = new CountDownLatch(1);
-            fdHandlerQueue.addOnFileDescriptorEventListener(fd, EVENT_INPUT, (readyFd, events) -> {
-                mOnReceiveLatch.countDown();
-                return 0; // Unregister listener.
-            });
-            if (!mOnReceiveLatch.await(2, TimeUnit.SECONDS)) {
-                fdHandlerQueue.removeOnFileDescriptorEventListener(fd);
-                fail("Timeout: no response data");
-            }
-
-            // Should get ERROR_SOCKET_NOT_IDLE because there is still data in the receive queue
-            // that has not been read.
-            mUiAutomation.adoptShellPermissionIdentity();
-            try (SocketKeepalive sk = mCm.createSocketKeepalive(network, s, executor, callback)) {
-                sk.start(MIN_KEEPALIVE_INTERVAL);
-                callback.expectError(SocketKeepalive.ERROR_SOCKET_NOT_IDLE);
-            } finally {
-                mUiAutomation.dropShellPermissionIdentity();
-            }
-        }
-    }
-
-    private ArrayList<SocketKeepalive> createConcurrentKeepalivesOfType(
-            int requestCount, @NonNull TestSocketKeepaliveCallback callback,
-            Supplier<SocketKeepalive> kaFactory) {
-        final ArrayList<SocketKeepalive> kalist = new ArrayList<>();
-
-        int remainingRetries = MAX_KEEPALIVE_RETRY_COUNT;
-
-        // Test concurrent keepalives with the given supplier.
-        while (kalist.size() < requestCount) {
-            final SocketKeepalive ka = kaFactory.get();
-            ka.start(MIN_KEEPALIVE_INTERVAL);
-            TestSocketKeepaliveCallback.CallbackValue cv = callback.pollCallback();
-            assertNotNull(cv);
-            if (cv.callbackType == TestSocketKeepaliveCallback.CallbackType.ON_ERROR) {
-                if (kalist.size() == 0 && cv.error == SocketKeepalive.ERROR_UNSUPPORTED) {
-                    // Unsupported.
-                    break;
-                } else if (cv.error == SocketKeepalive.ERROR_INSUFFICIENT_RESOURCES) {
-                    // Limit reached or temporary unavailable due to stopped slot is not yet
-                    // released.
-                    if (remainingRetries > 0) {
-                        SystemClock.sleep(INTERVAL_KEEPALIVE_RETRY_MS);
-                        remainingRetries--;
-                        continue;
-                    }
-                    break;
-                }
-            }
-            if (cv.callbackType == TestSocketKeepaliveCallback.CallbackType.ON_STARTED) {
-                kalist.add(ka);
-            } else {
-                fail("Unexpected error when creating " + (kalist.size() + 1) + " "
-                        + ka.getClass().getSimpleName() + ": " + cv);
-            }
-        }
-
-        return kalist;
-    }
-
-    private @NonNull ArrayList<SocketKeepalive> createConcurrentNattSocketKeepalives(
-            @NonNull Network network, @NonNull InetAddress srcAddr, int requestCount,
-            @NonNull TestSocketKeepaliveCallback callback)  throws Exception {
-
-        final Executor executor = mContext.getMainExecutor();
-
-        // Initialize a real NaT-T socket.
-        final IpSecManager mIpSec = (IpSecManager) mContext.getSystemService(Context.IPSEC_SERVICE);
-        final UdpEncapsulationSocket nattSocket = mIpSec.openUdpEncapsulationSocket();
-        final InetAddress dstAddr = getAddrByName(TEST_HOST, AF_INET);
-        assertNotNull(srcAddr);
-        assertNotNull(dstAddr);
-
-        // Test concurrent Nat-T keepalives.
-        final ArrayList<SocketKeepalive> result = createConcurrentKeepalivesOfType(requestCount,
-                callback, () -> mCm.createSocketKeepalive(network, nattSocket,
-                        srcAddr, dstAddr, executor, callback));
-
-        nattSocket.close();
-        return result;
-    }
-
-    private @NonNull ArrayList<SocketKeepalive> createConcurrentTcpSocketKeepalives(
-            @NonNull Network network, int requestCount,
-            @NonNull TestSocketKeepaliveCallback callback) {
-        final Executor executor = mContext.getMainExecutor();
-
-        // Create concurrent TCP keepalives.
-        return createConcurrentKeepalivesOfType(requestCount, callback, () -> {
-            // Assert that TCP connections can be established. The file descriptor of tcp
-            // sockets will be duplicated and kept valid in service side if the keepalives are
-            // successfully started.
-            try (Socket tcpSocket = getConnectedSocket(network, TEST_HOST, HTTP_PORT,
-                    AF_INET)) {
-                return mCm.createSocketKeepalive(network, tcpSocket, executor, callback);
-            } catch (Exception e) {
-                fail("Unexpected error when creating TCP socket: " + e);
-            }
-            return null;
-        });
-    }
-
-    /**
-     * Creates concurrent keepalives until the specified counts of each type of keepalives are
-     * reached or the expected error callbacks are received for each type of keepalives.
-     *
-     * @return the total number of keepalives created.
-     */
-    private int createConcurrentSocketKeepalives(
-            @NonNull Network network, @NonNull InetAddress srcAddr, int nattCount, int tcpCount)
-            throws Exception {
-        final ArrayList<SocketKeepalive> kalist = new ArrayList<>();
-        final TestSocketKeepaliveCallback callback = new TestSocketKeepaliveCallback();
-
-        kalist.addAll(createConcurrentNattSocketKeepalives(network, srcAddr, nattCount, callback));
-        kalist.addAll(createConcurrentTcpSocketKeepalives(network, tcpCount, callback));
-
-        final int ret = kalist.size();
-
-        // Clean up.
-        for (final SocketKeepalive ka : kalist) {
-            ka.stop();
-            callback.expectStopped();
-        }
-        kalist.clear();
-
-        return ret;
-    }
-
-    /**
-     * Verifies that the concurrent keepalive slots meet the minimum requirement, and don't
-     * get leaked after iterations.
-     */
-    @AppModeFull(reason = "Cannot get WifiManager in instant app mode")
-    @Test
-    @SkipPresubmit(reason = "Keepalive is not supported on virtual hardware")
-    public void testSocketKeepaliveLimitWifi() throws Exception {
-        if (!mPackageManager.hasSystemFeature(FEATURE_WIFI)) {
-            Log.i(TAG, "testSocketKeepaliveLimitWifi cannot execute unless device"
-                    + " supports WiFi");
-            return;
-        }
-
-        final Network network = ensureWifiConnected();
-        final int supported = getSupportedKeepalivesForNet(network);
-        if (supported == 0) {
-            return;
-        }
-        final InetAddress srcAddr = getFirstV4Address(network);
-        assumeTrue("This test requires native IPv4", srcAddr != null);
-
-        runWithShellPermissionIdentity(() -> {
-            // Verifies that the supported keepalive slots meet MIN_SUPPORTED_KEEPALIVE_COUNT.
-            assertGreaterOrEqual(supported, MIN_SUPPORTED_WIFI_KEEPALIVE_COUNT);
-
-            // Verifies that Nat-T keepalives can be established.
-            assertEquals(supported, createConcurrentSocketKeepalives(network, srcAddr,
-                    supported + 1, 0));
-            // Verifies that keepalives don't get leaked in second round.
-            assertEquals(supported, createConcurrentSocketKeepalives(network, srcAddr, supported,
-                    0));
-        });
-
-        // If kernel < 4.8 then it doesn't support TCP keepalive, but it might still support
-        // NAT-T keepalive. Test below cases only if TCP keepalive is supported by kernel.
-        if (!isTcpKeepaliveSupportedByKernel()) return;
-
-        runWithShellPermissionIdentity(() -> {
-            assertEquals(supported, createConcurrentSocketKeepalives(network, srcAddr, 0,
-                    supported + 1));
-
-            // Verifies that different types can be established at the same time.
-            assertEquals(supported, createConcurrentSocketKeepalives(network, srcAddr,
-                    supported / 2, supported - supported / 2));
-
-            // Verifies that keepalives don't get leaked in second round.
-            assertEquals(supported, createConcurrentSocketKeepalives(network, srcAddr, 0,
-                    supported));
-            assertEquals(supported, createConcurrentSocketKeepalives(network, srcAddr,
-                    supported / 2, supported - supported / 2));
-        });
-    }
-
-    /**
-     * Verifies that the concurrent keepalive slots meet the minimum telephony requirement, and
-     * don't get leaked after iterations.
-     */
-    @AppModeFull(reason = "Cannot request network in instant app mode")
-    @Test
-    @SkipPresubmit(reason = "Keepalive is not supported on virtual hardware")
-    public void testSocketKeepaliveLimitTelephony() throws Exception {
-        if (!mPackageManager.hasSystemFeature(FEATURE_TELEPHONY)) {
-            Log.i(TAG, "testSocketKeepaliveLimitTelephony cannot execute unless device"
-                    + " supports telephony");
-            return;
-        }
-
-        final int firstSdk = Build.VERSION.FIRST_SDK_INT;
-        if (firstSdk < Build.VERSION_CODES.Q) {
-            Log.i(TAG, "testSocketKeepaliveLimitTelephony: skip test for devices launching"
-                    + " before Q: " + firstSdk);
-            return;
-        }
-
-        final Network network = mCtsNetUtils.connectToCell();
-        final int supported = getSupportedKeepalivesForNet(network);
-        final InetAddress srcAddr = getFirstV4Address(network);
-        assumeTrue("This test requires native IPv4", srcAddr != null);
-
-        runWithShellPermissionIdentity(() -> {
-            // Verifies that the supported keepalive slots meet minimum requirement.
-            assertGreaterOrEqual(supported, MIN_SUPPORTED_CELLULAR_KEEPALIVE_COUNT);
-            // Verifies that Nat-T keepalives can be established.
-            assertEquals(supported, createConcurrentSocketKeepalives(network, srcAddr,
-                    supported + 1, 0));
-            // Verifies that keepalives don't get leaked in second round.
-            assertEquals(supported, createConcurrentSocketKeepalives(network, srcAddr, supported,
-                    0));
-        });
-    }
-
-    private int getIntResourceForName(@NonNull String resName) {
-        final Resources r = mContext.getResources();
-        final int resId = r.getIdentifier(resName, "integer", "android");
-        return r.getInteger(resId);
-    }
-
-    /**
-     * Verifies that the keepalive slots are limited as customized for unprivileged requests.
-     */
-    @AppModeFull(reason = "Cannot get WifiManager in instant app mode")
-    @Test
-    @SkipPresubmit(reason = "Keepalive is not supported on virtual hardware")
-    public void testSocketKeepaliveUnprivileged() throws Exception {
-        if (!mPackageManager.hasSystemFeature(FEATURE_WIFI)) {
-            Log.i(TAG, "testSocketKeepaliveUnprivileged cannot execute unless device"
-                    + " supports WiFi");
-            return;
-        }
-
-        final Network network = ensureWifiConnected();
-        final int supported = getSupportedKeepalivesForNet(network);
-        if (supported == 0) {
-            return;
-        }
-        final InetAddress srcAddr = getFirstV4Address(network);
-        assumeTrue("This test requires native IPv4", srcAddr != null);
-
-        // Resource ID might be shifted on devices that compiled with different symbols.
-        // Thus, resolve ID at runtime is needed.
-        final int allowedUnprivilegedPerUid =
-                getIntResourceForName(KEEPALIVE_ALLOWED_UNPRIVILEGED_RES_NAME);
-        final int reservedPrivilegedSlots =
-                getIntResourceForName(KEEPALIVE_RESERVED_PER_SLOT_RES_NAME);
-        // Verifies that unprivileged request per uid cannot exceed the limit customized in the
-        // resource. Currently, unprivileged keepalive slots are limited to Nat-T only, this test
-        // does not apply to TCP.
-        assertGreaterOrEqual(supported, reservedPrivilegedSlots);
-        assertGreaterOrEqual(supported, allowedUnprivilegedPerUid);
-        final int expectedUnprivileged =
-                Math.min(allowedUnprivilegedPerUid, supported - reservedPrivilegedSlots);
-        assertEquals(expectedUnprivileged,
-                createConcurrentSocketKeepalives(network, srcAddr, supported + 1, 0));
-    }
-
-    private static void assertGreaterOrEqual(long greater, long lesser) {
-        assertTrue("" + greater + " expected to be greater than or equal to " + lesser,
-                greater >= lesser);
-    }
-
-    /**
-     * Verifies that apps are not allowed to access restricted networks even if they declare the
-     * CONNECTIVITY_USE_RESTRICTED_NETWORKS permission in their manifests.
-     * See. b/144679405.
-     */
-    @AppModeFull(reason = "Cannot get WifiManager in instant app mode")
-    @Test
-    public void testRestrictedNetworkPermission() throws Exception {
-        // Ensure that CONNECTIVITY_USE_RESTRICTED_NETWORKS isn't granted to this package.
-        final PackageInfo app = mPackageManager.getPackageInfo(mContext.getPackageName(),
-                GET_PERMISSIONS);
-        final int index = ArrayUtils.indexOf(
-                app.requestedPermissions, CONNECTIVITY_USE_RESTRICTED_NETWORKS);
-        assertTrue(index >= 0);
-        assertTrue(app.requestedPermissionsFlags[index] != PERMISSION_GRANTED);
-
-        // Ensure that NetworkUtils.queryUserAccess always returns false since this package should
-        // not have netd system permission to call this function.
-        final Network wifiNetwork = ensureWifiConnected();
-        assertFalse(NetworkUtils.queryUserAccess(Binder.getCallingUid(), wifiNetwork.netId));
-
-        // Ensure that this package cannot bind to any restricted network that's currently
-        // connected.
-        Network[] networks = mCm.getAllNetworks();
-        for (Network network : networks) {
-            NetworkCapabilities nc = mCm.getNetworkCapabilities(network);
-            if (nc != null && !nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED)) {
-                try {
-                    network.bindSocket(new Socket());
-                    fail("Bind to restricted network " + network + " unexpectedly succeeded");
-                } catch (IOException expected) {}
-            }
-        }
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/CredentialsTest.java b/tests/tests/net/src/android/net/cts/CredentialsTest.java
deleted file mode 100644
index 91c3621..0000000
--- a/tests/tests/net/src/android/net/cts/CredentialsTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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.net.cts;
-
-import android.net.Credentials;
-import android.test.AndroidTestCase;
-
-public class CredentialsTest extends AndroidTestCase {
-
-    public void testCredentials() {
-        // new the Credentials instance
-        // Test with zero inputs
-        Credentials cred = new Credentials(0, 0, 0);
-        assertEquals(0, cred.getGid());
-        assertEquals(0, cred.getPid());
-        assertEquals(0, cred.getUid());
-
-        // Test with big integer
-        cred = new Credentials(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE);
-        assertEquals(Integer.MAX_VALUE, cred.getGid());
-        assertEquals(Integer.MAX_VALUE, cred.getPid());
-        assertEquals(Integer.MAX_VALUE, cred.getUid());
-
-        // Test with big negative integer
-        cred = new Credentials(Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE);
-        assertEquals(Integer.MIN_VALUE, cred.getGid());
-        assertEquals(Integer.MIN_VALUE, cred.getPid());
-        assertEquals(Integer.MIN_VALUE, cred.getUid());
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/DnsResolverTest.java b/tests/tests/net/src/android/net/cts/DnsResolverTest.java
deleted file mode 100644
index 4acbbcf..0000000
--- a/tests/tests/net/src/android/net/cts/DnsResolverTest.java
+++ /dev/null
@@ -1,756 +0,0 @@
-/*
- * Copyright (C) 2019 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 static android.net.DnsResolver.CLASS_IN;
-import static android.net.DnsResolver.FLAG_EMPTY;
-import static android.net.DnsResolver.FLAG_NO_CACHE_LOOKUP;
-import static android.net.DnsResolver.TYPE_A;
-import static android.net.DnsResolver.TYPE_AAAA;
-import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
-import static android.system.OsConstants.ETIMEDOUT;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.Context;
-import android.content.ContentResolver;
-import android.net.ConnectivityManager;
-import android.net.ConnectivityManager.NetworkCallback;
-import android.net.DnsResolver;
-import android.net.LinkProperties;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.NetworkRequest;
-import android.net.ParseException;
-import android.net.cts.util.CtsNetUtils;
-import android.os.CancellationSignal;
-import android.os.Handler;
-import android.os.Looper;
-import android.platform.test.annotations.AppModeFull;
-import android.provider.Settings;
-import android.system.ErrnoException;
-import android.test.AndroidTestCase;
-import android.util.Log;
-
-import com.android.net.module.util.DnsPacket;
-import com.android.testutils.SkipPresubmit;
-
-import java.net.Inet4Address;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Executor;
-import java.util.concurrent.TimeUnit;
-
-@AppModeFull(reason = "WRITE_SECURE_SETTINGS permission can't be granted to instant apps")
-public class DnsResolverTest extends AndroidTestCase {
-    private static final String TAG = "DnsResolverTest";
-    private static final char[] HEX_CHARS = {
-            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
-    };
-
-    static final String TEST_DOMAIN = "www.google.com";
-    static final String TEST_NX_DOMAIN = "test1-nx.metric.gstatic.com";
-    static final String INVALID_PRIVATE_DNS_SERVER = "invalid.google";
-    static final String GOOGLE_PRIVATE_DNS_SERVER = "dns.google";
-    static final byte[] TEST_BLOB = new byte[]{
-            /* Header */
-            0x55, 0x66, /* Transaction ID */
-            0x01, 0x00, /* Flags */
-            0x00, 0x01, /* Questions */
-            0x00, 0x00, /* Answer RRs */
-            0x00, 0x00, /* Authority RRs */
-            0x00, 0x00, /* Additional RRs */
-            /* Queries */
-            0x03, 0x77, 0x77, 0x77, 0x06, 0x67, 0x6F, 0x6F, 0x67, 0x6c, 0x65,
-            0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
-            0x00, 0x01, /* Type */
-            0x00, 0x01  /* Class */
-    };
-    static final int TIMEOUT_MS = 12_000;
-    static final int CANCEL_TIMEOUT_MS = 3_000;
-    static final int CANCEL_RETRY_TIMES = 5;
-    static final int QUERY_TIMES = 10;
-    static final int NXDOMAIN = 3;
-
-    private ContentResolver mCR;
-    private ConnectivityManager mCM;
-    private CtsNetUtils mCtsNetUtils;
-    private Executor mExecutor;
-    private Executor mExecutorInline;
-    private DnsResolver mDns;
-
-    private String mOldMode;
-    private String mOldDnsSpecifier;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mCM = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
-        mDns = DnsResolver.getInstance();
-        mExecutor = new Handler(Looper.getMainLooper())::post;
-        mExecutorInline = (Runnable r) -> r.run();
-        mCR = getContext().getContentResolver();
-        mCtsNetUtils = new CtsNetUtils(getContext());
-        mCtsNetUtils.storePrivateDnsSetting();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        mCtsNetUtils.restorePrivateDnsSetting();
-        super.tearDown();
-    }
-
-    private static String byteArrayToHexString(byte[] bytes) {
-        char[] hexChars = new char[bytes.length * 2];
-        for (int i = 0; i < bytes.length; ++i) {
-            int b = bytes[i] & 0xFF;
-            hexChars[i * 2] = HEX_CHARS[b >>> 4];
-            hexChars[i * 2 + 1] = HEX_CHARS[b & 0x0F];
-        }
-        return new String(hexChars);
-    }
-
-    private Network[] getTestableNetworks() {
-        final ArrayList<Network> testableNetworks = new ArrayList<Network>();
-        for (Network network : mCM.getAllNetworks()) {
-            final NetworkCapabilities nc = mCM.getNetworkCapabilities(network);
-            if (nc != null
-                    && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
-                    && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) {
-                testableNetworks.add(network);
-            }
-        }
-
-        assertTrue(
-                "This test requires that at least one network be connected. " +
-                        "Please ensure that the device is connected to a network.",
-                testableNetworks.size() >= 1);
-        // In order to test query with null network, add null as an element.
-        // Test cases which query with null network will go on default network.
-        testableNetworks.add(null);
-        return testableNetworks.toArray(new Network[0]);
-    }
-
-    static private void assertGreaterThan(String msg, int first, int second) {
-        assertTrue(msg + " Excepted " + first + " to be greater than " + second, first > second);
-    }
-
-    private static class DnsParseException extends Exception {
-        public DnsParseException(String msg) {
-            super(msg);
-        }
-    }
-
-    private static class DnsAnswer extends DnsPacket {
-        DnsAnswer(@NonNull byte[] data) throws DnsParseException {
-            super(data);
-
-            // Check QR field.(query (0), or a response (1)).
-            if ((mHeader.flags & (1 << 15)) == 0) {
-                throw new DnsParseException("Not an answer packet");
-            }
-        }
-
-        int getRcode() {
-            return mHeader.rcode;
-        }
-
-        int getANCount() {
-            return mHeader.getRecordCount(ANSECTION);
-        }
-
-        int getQDCount() {
-            return mHeader.getRecordCount(QDSECTION);
-        }
-    }
-
-    /**
-     * A query callback that ensures that the query is cancelled and that onAnswer is never
-     * called. If the query succeeds before it is cancelled, needRetry will return true so the
-     * test can retry.
-     */
-    class VerifyCancelCallback implements DnsResolver.Callback<byte[]> {
-        private final CountDownLatch mLatch = new CountDownLatch(1);
-        private final String mMsg;
-        private final CancellationSignal mCancelSignal;
-        private int mRcode;
-        private DnsAnswer mDnsAnswer;
-        private String mErrorMsg = null;
-
-        VerifyCancelCallback(@NonNull String msg, @Nullable CancellationSignal cancel) {
-            mMsg = msg;
-            mCancelSignal = cancel;
-        }
-
-        VerifyCancelCallback(@NonNull String msg) {
-            this(msg, null);
-        }
-
-        public boolean waitForAnswer(int timeout) throws InterruptedException {
-            return mLatch.await(timeout, TimeUnit.MILLISECONDS);
-        }
-
-        public boolean waitForAnswer() throws InterruptedException {
-            return waitForAnswer(TIMEOUT_MS);
-        }
-
-        public boolean needRetry() throws InterruptedException {
-            return mLatch.await(CANCEL_TIMEOUT_MS, TimeUnit.MILLISECONDS);
-        }
-
-        @Override
-        public void onAnswer(@NonNull byte[] answer, int rcode) {
-            if (mCancelSignal != null && mCancelSignal.isCanceled()) {
-                mErrorMsg = mMsg + " should not have returned any answers";
-                mLatch.countDown();
-                return;
-            }
-
-            mRcode = rcode;
-            try {
-                mDnsAnswer = new DnsAnswer(answer);
-            } catch (ParseException | DnsParseException e) {
-                mErrorMsg = mMsg + e.getMessage();
-                mLatch.countDown();
-                return;
-            }
-            Log.d(TAG, "Reported blob: " + byteArrayToHexString(answer));
-            mLatch.countDown();
-        }
-
-        @Override
-        public void onError(@NonNull DnsResolver.DnsException error) {
-            mErrorMsg = mMsg + error.getMessage();
-            mLatch.countDown();
-        }
-
-        private void assertValidAnswer() {
-            assertNull(mErrorMsg);
-            assertNotNull(mMsg + " No valid answer", mDnsAnswer);
-            assertEquals(mMsg + " Unexpected error: reported rcode" + mRcode +
-                    " blob's rcode " + mDnsAnswer.getRcode(), mRcode, mDnsAnswer.getRcode());
-        }
-
-        public void assertHasAnswer() {
-            assertValidAnswer();
-            // Check rcode field.(0, No error condition).
-            assertEquals(mMsg + " Response error, rcode: " + mRcode, mRcode, 0);
-            // Check answer counts.
-            assertGreaterThan(mMsg + " No answer found", mDnsAnswer.getANCount(), 0);
-            // Check question counts.
-            assertGreaterThan(mMsg + " No question found", mDnsAnswer.getQDCount(), 0);
-        }
-
-        public void assertNXDomain() {
-            assertValidAnswer();
-            // Check rcode field.(3, NXDomain).
-            assertEquals(mMsg + " Unexpected rcode: " + mRcode, mRcode, NXDOMAIN);
-            // Check answer counts. Expect 0 answer.
-            assertEquals(mMsg + " Not an empty answer", mDnsAnswer.getANCount(), 0);
-            // Check question counts.
-            assertGreaterThan(mMsg + " No question found", mDnsAnswer.getQDCount(), 0);
-        }
-
-        public void assertEmptyAnswer() {
-            assertValidAnswer();
-            // Check rcode field.(0, No error condition).
-            assertEquals(mMsg + " Response error, rcode: " + mRcode, mRcode, 0);
-            // Check answer counts. Expect 0 answer.
-            assertEquals(mMsg + " Not an empty answer", mDnsAnswer.getANCount(), 0);
-            // Check question counts.
-            assertGreaterThan(mMsg + " No question found", mDnsAnswer.getQDCount(), 0);
-        }
-    }
-
-    public void testRawQuery() throws Exception {
-        doTestRawQuery(mExecutor);
-    }
-
-    public void testRawQueryInline() throws Exception {
-        doTestRawQuery(mExecutorInline);
-    }
-
-    public void testRawQueryBlob() throws Exception {
-        doTestRawQueryBlob(mExecutor);
-    }
-
-    public void testRawQueryBlobInline() throws Exception {
-        doTestRawQueryBlob(mExecutorInline);
-    }
-
-    public void testRawQueryRoot() throws Exception {
-        doTestRawQueryRoot(mExecutor);
-    }
-
-    public void testRawQueryRootInline() throws Exception {
-        doTestRawQueryRoot(mExecutorInline);
-    }
-
-    public void testRawQueryNXDomain() throws Exception {
-        doTestRawQueryNXDomain(mExecutor);
-    }
-
-    public void testRawQueryNXDomainInline() throws Exception {
-        doTestRawQueryNXDomain(mExecutorInline);
-    }
-
-    public void testRawQueryNXDomainWithPrivateDns() throws Exception {
-        doTestRawQueryNXDomainWithPrivateDns(mExecutor);
-    }
-
-    public void testRawQueryNXDomainInlineWithPrivateDns() throws Exception {
-        doTestRawQueryNXDomainWithPrivateDns(mExecutorInline);
-    }
-
-    public void doTestRawQuery(Executor executor) throws InterruptedException {
-        final String msg = "RawQuery " + TEST_DOMAIN;
-        for (Network network : getTestableNetworks()) {
-            final VerifyCancelCallback callback = new VerifyCancelCallback(msg);
-            mDns.rawQuery(network, TEST_DOMAIN, CLASS_IN, TYPE_AAAA, FLAG_NO_CACHE_LOOKUP,
-                    executor, null, callback);
-
-            assertTrue(msg + " but no answer after " + TIMEOUT_MS + "ms.",
-                    callback.waitForAnswer());
-            callback.assertHasAnswer();
-        }
-    }
-
-    public void doTestRawQueryBlob(Executor executor) throws InterruptedException {
-        final byte[] blob = new byte[]{
-                /* Header */
-                0x55, 0x66, /* Transaction ID */
-                0x01, 0x00, /* Flags */
-                0x00, 0x01, /* Questions */
-                0x00, 0x00, /* Answer RRs */
-                0x00, 0x00, /* Authority RRs */
-                0x00, 0x00, /* Additional RRs */
-                /* Queries */
-                0x03, 0x77, 0x77, 0x77, 0x06, 0x67, 0x6F, 0x6F, 0x67, 0x6c, 0x65,
-                0x03, 0x63, 0x6f, 0x6d, 0x00, /* Name */
-                0x00, 0x01, /* Type */
-                0x00, 0x01  /* Class */
-        };
-        final String msg = "RawQuery blob " + byteArrayToHexString(blob);
-        for (Network network : getTestableNetworks()) {
-            final VerifyCancelCallback callback = new VerifyCancelCallback(msg);
-            mDns.rawQuery(network, blob, FLAG_NO_CACHE_LOOKUP, executor, null, callback);
-
-            assertTrue(msg + " but no answer after " + TIMEOUT_MS + "ms.",
-                    callback.waitForAnswer());
-            callback.assertHasAnswer();
-        }
-    }
-
-    public void doTestRawQueryRoot(Executor executor) throws InterruptedException {
-        final String dname = "";
-        final String msg = "RawQuery empty dname(ROOT) ";
-        for (Network network : getTestableNetworks()) {
-            final VerifyCancelCallback callback = new VerifyCancelCallback(msg);
-            mDns.rawQuery(network, dname, CLASS_IN, TYPE_AAAA, FLAG_NO_CACHE_LOOKUP,
-                    executor, null, callback);
-
-            assertTrue(msg + " but no answer after " + TIMEOUT_MS + "ms.",
-                    callback.waitForAnswer());
-            // Except no answer record because the root does not have AAAA records.
-            callback.assertEmptyAnswer();
-        }
-    }
-
-    public void doTestRawQueryNXDomain(Executor executor) throws InterruptedException {
-        final String msg = "RawQuery " + TEST_NX_DOMAIN;
-
-        for (Network network : getTestableNetworks()) {
-            final NetworkCapabilities nc = (network != null)
-                    ? mCM.getNetworkCapabilities(network)
-                    : mCM.getNetworkCapabilities(mCM.getActiveNetwork());
-            assertNotNull("Couldn't determine NetworkCapabilities for " + network, nc);
-            // Some cellular networks configure their DNS servers never to return NXDOMAIN, so don't
-            // test NXDOMAIN on these DNS servers.
-            // b/144521720
-            if (nc.hasTransport(TRANSPORT_CELLULAR)) continue;
-            final VerifyCancelCallback callback = new VerifyCancelCallback(msg);
-            mDns.rawQuery(network, TEST_NX_DOMAIN, CLASS_IN, TYPE_AAAA, FLAG_NO_CACHE_LOOKUP,
-                    executor, null, callback);
-
-            assertTrue(msg + " but no answer after " + TIMEOUT_MS + "ms.",
-                    callback.waitForAnswer());
-            callback.assertNXDomain();
-        }
-    }
-
-    public void doTestRawQueryNXDomainWithPrivateDns(Executor executor)
-            throws InterruptedException {
-        final String msg = "RawQuery " + TEST_NX_DOMAIN + " with private DNS";
-        // Enable private DNS strict mode and set server to dns.google before doing NxDomain test.
-        // b/144521720
-        mCtsNetUtils.setPrivateDnsStrictMode(GOOGLE_PRIVATE_DNS_SERVER);
-        for (Network network :  getTestableNetworks()) {
-            final Network networkForPrivateDns =
-                    (network != null) ? network : mCM.getActiveNetwork();
-            assertNotNull("Can't find network to await private DNS on", networkForPrivateDns);
-            mCtsNetUtils.awaitPrivateDnsSetting(msg + " wait private DNS setting timeout",
-                    networkForPrivateDns, GOOGLE_PRIVATE_DNS_SERVER, true);
-            final VerifyCancelCallback callback = new VerifyCancelCallback(msg);
-            mDns.rawQuery(network, TEST_NX_DOMAIN, CLASS_IN, TYPE_AAAA, FLAG_NO_CACHE_LOOKUP,
-                    executor, null, callback);
-
-            assertTrue(msg + " but no answer after " + TIMEOUT_MS + "ms.",
-                    callback.waitForAnswer());
-            callback.assertNXDomain();
-        }
-    }
-
-    public void testRawQueryCancel() throws InterruptedException {
-        final String msg = "Test cancel RawQuery " + TEST_DOMAIN;
-        // Start a DNS query and the cancel it immediately. Use VerifyCancelCallback to expect
-        // that the query is cancelled before it succeeds. If it is not cancelled before it
-        // succeeds, retry the test until it is.
-        for (Network network : getTestableNetworks()) {
-            boolean retry = false;
-            int round = 0;
-            do {
-                if (++round > CANCEL_RETRY_TIMES) {
-                    fail(msg + " cancel failed " + CANCEL_RETRY_TIMES + " times");
-                }
-                final CountDownLatch latch = new CountDownLatch(1);
-                final CancellationSignal cancelSignal = new CancellationSignal();
-                final VerifyCancelCallback callback = new VerifyCancelCallback(msg, cancelSignal);
-                mDns.rawQuery(network, TEST_DOMAIN, CLASS_IN, TYPE_AAAA, FLAG_EMPTY,
-                        mExecutor, cancelSignal, callback);
-                mExecutor.execute(() -> {
-                    cancelSignal.cancel();
-                    latch.countDown();
-                });
-
-                retry = callback.needRetry();
-                assertTrue(msg + " query was not cancelled",
-                        latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-            } while (retry);
-        }
-    }
-
-    public void testRawQueryBlobCancel() throws InterruptedException {
-        final String msg = "Test cancel RawQuery blob " + byteArrayToHexString(TEST_BLOB);
-        // Start a DNS query and the cancel it immediately. Use VerifyCancelCallback to expect
-        // that the query is cancelled before it succeeds. If it is not cancelled before it
-        // succeeds, retry the test until it is.
-        for (Network network : getTestableNetworks()) {
-            boolean retry = false;
-            int round = 0;
-            do {
-                if (++round > CANCEL_RETRY_TIMES) {
-                    fail(msg + " cancel failed " + CANCEL_RETRY_TIMES + " times");
-                }
-                final CountDownLatch latch = new CountDownLatch(1);
-                final CancellationSignal cancelSignal = new CancellationSignal();
-                final VerifyCancelCallback callback = new VerifyCancelCallback(msg, cancelSignal);
-                mDns.rawQuery(network, TEST_BLOB, FLAG_EMPTY, mExecutor, cancelSignal, callback);
-                mExecutor.execute(() -> {
-                    cancelSignal.cancel();
-                    latch.countDown();
-                });
-
-                retry = callback.needRetry();
-                assertTrue(msg + " cancel is not done",
-                        latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-            } while (retry);
-        }
-    }
-
-    public void testCancelBeforeQuery() throws InterruptedException {
-        final String msg = "Test cancelled RawQuery " + TEST_DOMAIN;
-        for (Network network : getTestableNetworks()) {
-            final VerifyCancelCallback callback = new VerifyCancelCallback(msg);
-            final CancellationSignal cancelSignal = new CancellationSignal();
-            cancelSignal.cancel();
-            mDns.rawQuery(network, TEST_DOMAIN, CLASS_IN, TYPE_AAAA, FLAG_EMPTY,
-                    mExecutor, cancelSignal, callback);
-
-            assertTrue(msg + " should not return any answers",
-                    !callback.waitForAnswer(CANCEL_TIMEOUT_MS));
-        }
-    }
-
-    /**
-     * A query callback for InetAddress that ensures that the query is
-     * cancelled and that onAnswer is never called. If the query succeeds
-     * before it is cancelled, needRetry will return true so the
-     * test can retry.
-     */
-    class VerifyCancelInetAddressCallback implements DnsResolver.Callback<List<InetAddress>> {
-        private final CountDownLatch mLatch = new CountDownLatch(1);
-        private final String mMsg;
-        private final List<InetAddress> mAnswers;
-        private final CancellationSignal mCancelSignal;
-        private String mErrorMsg = null;
-
-        VerifyCancelInetAddressCallback(@NonNull String msg, @Nullable CancellationSignal cancel) {
-            this.mMsg = msg;
-            this.mCancelSignal = cancel;
-            mAnswers = new ArrayList<>();
-        }
-
-        public boolean waitForAnswer() throws InterruptedException {
-            return mLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS);
-        }
-
-        public boolean needRetry() throws InterruptedException {
-            return mLatch.await(CANCEL_TIMEOUT_MS, TimeUnit.MILLISECONDS);
-        }
-
-        public boolean isAnswerEmpty() {
-            return mAnswers.isEmpty();
-        }
-
-        public boolean hasIpv6Answer() {
-            for (InetAddress answer : mAnswers) {
-                if (answer instanceof Inet6Address) return true;
-            }
-            return false;
-        }
-
-        public boolean hasIpv4Answer() {
-            for (InetAddress answer : mAnswers) {
-                if (answer instanceof Inet4Address) return true;
-            }
-            return false;
-        }
-
-        public void assertNoError() {
-            assertNull(mErrorMsg);
-        }
-
-        @Override
-        public void onAnswer(@NonNull List<InetAddress> answerList, int rcode) {
-            if (mCancelSignal != null && mCancelSignal.isCanceled()) {
-                mErrorMsg = mMsg + " should not have returned any answers";
-                mLatch.countDown();
-                return;
-            }
-            for (InetAddress addr : answerList) {
-                Log.d(TAG, "Reported addr: " + addr.toString());
-            }
-            mAnswers.clear();
-            mAnswers.addAll(answerList);
-            mLatch.countDown();
-        }
-
-        @Override
-        public void onError(@NonNull DnsResolver.DnsException error) {
-            mErrorMsg = mMsg + error.getMessage();
-        }
-    }
-
-    public void testQueryForInetAddress() throws Exception {
-        doTestQueryForInetAddress(mExecutor);
-    }
-
-    public void testQueryForInetAddressInline() throws Exception {
-        doTestQueryForInetAddress(mExecutorInline);
-    }
-
-    public void testQueryForInetAddressIpv4() throws Exception {
-        doTestQueryForInetAddressIpv4(mExecutor);
-    }
-
-    public void testQueryForInetAddressIpv4Inline() throws Exception {
-        doTestQueryForInetAddressIpv4(mExecutorInline);
-    }
-
-    public void testQueryForInetAddressIpv6() throws Exception {
-        doTestQueryForInetAddressIpv6(mExecutor);
-    }
-
-    public void testQueryForInetAddressIpv6Inline() throws Exception {
-        doTestQueryForInetAddressIpv6(mExecutorInline);
-    }
-
-    public void testContinuousQueries() throws Exception {
-        doTestContinuousQueries(mExecutor);
-    }
-
-    @SkipPresubmit(reason = "Flaky: b/159762682; add to presubmit after fixing")
-    public void testContinuousQueriesInline() throws Exception {
-        doTestContinuousQueries(mExecutorInline);
-    }
-
-    public void doTestQueryForInetAddress(Executor executor) throws InterruptedException {
-        final String msg = "Test query for InetAddress " + TEST_DOMAIN;
-        for (Network network : getTestableNetworks()) {
-            final VerifyCancelInetAddressCallback callback =
-                    new VerifyCancelInetAddressCallback(msg, null);
-            mDns.query(network, TEST_DOMAIN, FLAG_NO_CACHE_LOOKUP, executor, null, callback);
-
-            assertTrue(msg + " but no answer after " + TIMEOUT_MS + "ms.",
-                    callback.waitForAnswer());
-            callback.assertNoError();
-            assertTrue(msg + " returned 0 results", !callback.isAnswerEmpty());
-        }
-    }
-
-    public void testQueryCancelForInetAddress() throws InterruptedException {
-        final String msg = "Test cancel query for InetAddress " + TEST_DOMAIN;
-        // Start a DNS query and the cancel it immediately. Use VerifyCancelInetAddressCallback to
-        // expect that the query is cancelled before it succeeds. If it is not cancelled before it
-        // succeeds, retry the test until it is.
-        for (Network network : getTestableNetworks()) {
-            boolean retry = false;
-            int round = 0;
-            do {
-                if (++round > CANCEL_RETRY_TIMES) {
-                    fail(msg + " cancel failed " + CANCEL_RETRY_TIMES + " times");
-                }
-                final CountDownLatch latch = new CountDownLatch(1);
-                final CancellationSignal cancelSignal = new CancellationSignal();
-                final VerifyCancelInetAddressCallback callback =
-                        new VerifyCancelInetAddressCallback(msg, cancelSignal);
-                mDns.query(network, TEST_DOMAIN, FLAG_EMPTY, mExecutor, cancelSignal, callback);
-                mExecutor.execute(() -> {
-                    cancelSignal.cancel();
-                    latch.countDown();
-                });
-
-                retry = callback.needRetry();
-                assertTrue(msg + " query was not cancelled",
-                        latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-            } while (retry);
-        }
-    }
-
-    public void doTestQueryForInetAddressIpv4(Executor executor) throws InterruptedException {
-        final String msg = "Test query for IPv4 InetAddress " + TEST_DOMAIN;
-        for (Network network : getTestableNetworks()) {
-            final VerifyCancelInetAddressCallback callback =
-                    new VerifyCancelInetAddressCallback(msg, null);
-            mDns.query(network, TEST_DOMAIN, TYPE_A, FLAG_NO_CACHE_LOOKUP,
-                    executor, null, callback);
-
-            assertTrue(msg + " but no answer after " + TIMEOUT_MS + "ms.",
-                    callback.waitForAnswer());
-            callback.assertNoError();
-            assertTrue(msg + " returned 0 results", !callback.isAnswerEmpty());
-            assertTrue(msg + " returned Ipv6 results", !callback.hasIpv6Answer());
-        }
-    }
-
-    public void doTestQueryForInetAddressIpv6(Executor executor) throws InterruptedException {
-        final String msg = "Test query for IPv6 InetAddress " + TEST_DOMAIN;
-        for (Network network : getTestableNetworks()) {
-            final VerifyCancelInetAddressCallback callback =
-                    new VerifyCancelInetAddressCallback(msg, null);
-            mDns.query(network, TEST_DOMAIN, TYPE_AAAA, FLAG_NO_CACHE_LOOKUP,
-                    executor, null, callback);
-
-            assertTrue(msg + " but no answer after " + TIMEOUT_MS + "ms.",
-                    callback.waitForAnswer());
-            callback.assertNoError();
-            assertTrue(msg + " returned 0 results", !callback.isAnswerEmpty());
-            assertTrue(msg + " returned Ipv4 results", !callback.hasIpv4Answer());
-        }
-    }
-
-    public void testPrivateDnsBypass() throws InterruptedException {
-        final Network[] testNetworks = getTestableNetworks();
-
-        // Set an invalid private DNS server
-        mCtsNetUtils.setPrivateDnsStrictMode(INVALID_PRIVATE_DNS_SERVER);
-        final String msg = "Test PrivateDnsBypass " + TEST_DOMAIN;
-        for (Network network : testNetworks) {
-            // This test cannot be ran with null network because we need to explicitly pass a
-            // private DNS bypassable network or bind one.
-            if (network == null) continue;
-
-            // wait for private DNS setting propagating
-            mCtsNetUtils.awaitPrivateDnsSetting(msg + " wait private DNS setting timeout",
-                    network, INVALID_PRIVATE_DNS_SERVER, false);
-
-            final CountDownLatch latch = new CountDownLatch(1);
-            final DnsResolver.Callback<List<InetAddress>> errorCallback =
-                    new DnsResolver.Callback<List<InetAddress>>() {
-                        @Override
-                        public void onAnswer(@NonNull List<InetAddress> answerList, int rcode) {
-                            fail(msg + " should not get valid answer");
-                        }
-
-                        @Override
-                        public void onError(@NonNull DnsResolver.DnsException error) {
-                            assertEquals(DnsResolver.ERROR_SYSTEM, error.code);
-                            assertEquals(ETIMEDOUT, ((ErrnoException) error.getCause()).errno);
-                            latch.countDown();
-                        }
-                    };
-            // Private DNS strict mode with invalid DNS server is set
-            // Expect no valid answer returned but ErrnoException with ETIMEDOUT
-            mDns.query(network, TEST_DOMAIN, FLAG_NO_CACHE_LOOKUP, mExecutor, null, errorCallback);
-
-            assertTrue(msg + " invalid server round. No response after " + TIMEOUT_MS + "ms.",
-                    latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-
-            final VerifyCancelInetAddressCallback callback =
-                    new VerifyCancelInetAddressCallback(msg, null);
-            // Bypass privateDns, expect query works fine
-            mDns.query(network.getPrivateDnsBypassingCopy(),
-                    TEST_DOMAIN, FLAG_NO_CACHE_LOOKUP, mExecutor, null, callback);
-
-            assertTrue(msg + " bypass private DNS round. No answer after " + TIMEOUT_MS + "ms.",
-                    callback.waitForAnswer());
-            callback.assertNoError();
-            assertTrue(msg + " returned 0 results", !callback.isAnswerEmpty());
-
-            // To ensure private DNS bypass still work even if passing null network.
-            // Bind process network with a private DNS bypassable network.
-            mCM.bindProcessToNetwork(network.getPrivateDnsBypassingCopy());
-            final VerifyCancelInetAddressCallback callbackWithNullNetwork =
-                    new VerifyCancelInetAddressCallback(msg + " with null network ", null);
-            mDns.query(null,
-                    TEST_DOMAIN, FLAG_NO_CACHE_LOOKUP, mExecutor, null, callbackWithNullNetwork);
-
-            assertTrue(msg + " with null network bypass private DNS round. No answer after " +
-                    TIMEOUT_MS + "ms.", callbackWithNullNetwork.waitForAnswer());
-            callbackWithNullNetwork.assertNoError();
-            assertTrue(msg + " with null network returned 0 results",
-                    !callbackWithNullNetwork.isAnswerEmpty());
-
-            // Reset process network to default.
-            mCM.bindProcessToNetwork(null);
-        }
-    }
-
-    public void doTestContinuousQueries(Executor executor) throws InterruptedException {
-        final String msg = "Test continuous " + QUERY_TIMES + " queries " + TEST_DOMAIN;
-        for (Network network : getTestableNetworks()) {
-            for (int i = 0; i < QUERY_TIMES ; ++i) {
-                final VerifyCancelInetAddressCallback callback =
-                        new VerifyCancelInetAddressCallback(msg, null);
-                // query v6/v4 in turn
-                boolean queryV6 = (i % 2 == 0);
-                mDns.query(network, TEST_DOMAIN, queryV6 ? TYPE_AAAA : TYPE_A,
-                        FLAG_NO_CACHE_LOOKUP, executor, null, callback);
-
-                assertTrue(msg + " but no answer after " + TIMEOUT_MS + "ms.",
-                        callback.waitForAnswer());
-                callback.assertNoError();
-                assertTrue(msg + " returned 0 results", !callback.isAnswerEmpty());
-                assertTrue(msg + " returned " + (queryV6 ? "Ipv4" : "Ipv6") + " results",
-                        queryV6 ? !callback.hasIpv4Answer() : !callback.hasIpv6Answer());
-            }
-        }
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/DnsTest.java b/tests/tests/net/src/android/net/cts/DnsTest.java
deleted file mode 100644
index fde27e9..0000000
--- a/tests/tests/net/src/android/net/cts/DnsTest.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * Copyright (C) 2013 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.Context;
-import android.content.pm.PackageManager;
-import android.net.ConnectivityManager;
-import android.net.ConnectivityManager.NetworkCallback;
-import android.net.LinkProperties;
-import android.net.Network;
-import android.net.NetworkInfo;
-import android.os.SystemClock;
-import android.test.AndroidTestCase;
-import android.util.Log;
-
-import com.android.testutils.SkipPresubmit;
-
-import java.net.Inet4Address;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-public class DnsTest extends AndroidTestCase {
-
-    static {
-        System.loadLibrary("nativedns_jni");
-    }
-
-    private static final boolean DBG = false;
-    private static final String TAG = "DnsTest";
-    private static final String PROXY_NETWORK_TYPE = "PROXY";
-
-    private ConnectivityManager mCm;
-
-    public void setUp() {
-        mCm = getContext().getSystemService(ConnectivityManager.class);
-    }
-
-    /**
-     * @return true on success
-     */
-    private static native boolean testNativeDns();
-
-    /**
-     * Verify:
-     * DNS works - forwards and backwards, giving ipv4 and ipv6
-     * Test that DNS work on v4 and v6 networks
-     * Test Native dns calls (4)
-     * Todo:
-     * Cache is flushed when we change networks
-     * have per-network caches
-     * No cache when there's no network
-     * Perf - measure size of first and second tier caches and their effect
-     * Assert requires network permission
-     */
-    @SkipPresubmit(reason = "IPv6 support may be missing on presubmit virtual hardware")
-    public void testDnsWorks() throws Exception {
-        ensureIpv6Connectivity();
-
-        InetAddress addrs[] = {};
-        try {
-            addrs = InetAddress.getAllByName("www.google.com");
-        } catch (UnknownHostException e) {}
-        assertTrue("[RERUN] DNS could not resolve www.google.com. Check internet connection",
-                addrs.length != 0);
-        boolean foundV4 = false, foundV6 = false;
-        for (InetAddress addr : addrs) {
-            if (addr instanceof Inet4Address) foundV4 = true;
-            else if (addr instanceof Inet6Address) foundV6 = true;
-            if (DBG) Log.e(TAG, "www.google.com gave " + addr.toString());
-        }
-
-        // We should have at least one of the addresses to connect!
-        assertTrue("www.google.com must have IPv4 and/or IPv6 address", foundV4 || foundV6);
-
-        // Skip the rest of the test if the active network for watch is PROXY.
-        // TODO: Check NetworkInfo type in addition to type name once ag/601257 is merged.
-        if (getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH)
-                && activeNetworkInfoIsProxy()) {
-            Log.i(TAG, "Skipping test because the active network type name is PROXY.");
-            return;
-        }
-
-        // Clear test state so we don't get confused with the previous results.
-        addrs = new InetAddress[0];
-        foundV4 = foundV6 = false;
-        try {
-            addrs = InetAddress.getAllByName("ipv6.google.com");
-        } catch (UnknownHostException e) {}
-        String msg =
-            "[RERUN] DNS could not resolve ipv6.google.com, check the network supports IPv6. lp=" +
-            mCm.getActiveLinkProperties();
-        assertTrue(msg, addrs.length != 0);
-        for (InetAddress addr : addrs) {
-            msg = "[RERUN] ipv6.google.com returned IPv4 address: " + addr.getHostAddress() +
-                    ", check your network's DNS server. lp=" + mCm.getActiveLinkProperties();
-            assertFalse (msg, addr instanceof Inet4Address);
-            foundV6 |= (addr instanceof Inet6Address);
-            if (DBG) Log.e(TAG, "ipv6.google.com gave " + addr.toString());
-        }
-
-        assertTrue(foundV6);
-
-        assertTrue(testNativeDns());
-    }
-
-    private static final String[] URLS = { "www.google.com", "ipv6.google.com", "www.yahoo.com",
-            "facebook.com", "youtube.com", "blogspot.com", "baidu.com", "wikipedia.org",
-// live.com fails rev lookup.
-            "twitter.com", "qq.com", "msn.com", "yahoo.co.jp", "linkedin.com",
-            "taobao.com", "google.co.in", "sina.com.cn", "amazon.com", "wordpress.com",
-            "google.co.uk", "ebay.com", "yandex.ru", "163.com", "google.co.jp", "google.fr",
-            "microsoft.com", "paypal.com", "google.com.br", "flickr.com",
-            "mail.ru", "craigslist.org", "fc2.com", "google.it",
-// "apple.com", fails rev lookup
-            "google.es",
-            "imdb.com", "google.ru", "soho.com", "bbc.co.uk", "vkontakte.ru", "ask.com",
-            "tumblr.com", "weibo.com", "go.com", "xvideos.com", "livejasmin.com", "cnn.com",
-            "youku.com", "blogspot.com", "soso.com", "google.ca", "aol.com", "tudou.com",
-            "xhamster.com", "megaupload.com", "ifeng.com", "zedo.com", "mediafire.com", "ameblo.jp",
-            "pornhub.com", "google.co.id", "godaddy.com", "adobe.com", "rakuten.co.jp", "about.com",
-            "espn.go.com", "4shared.com", "alibaba.com","ebay.de", "yieldmanager.com",
-            "wordpress.org", "livejournal.com", "google.com.tr", "google.com.mx", "renren.com",
-           "livedoor.com", "google.com.au", "youporn.com", "uol.com.br", "cnet.com", "conduit.com",
-            "google.pl", "myspace.com", "nytimes.com", "ebay.co.uk", "chinaz.com", "hao123.com",
-            "thepiratebay.org", "doubleclick.com", "alipay.com", "netflix.com", "cnzz.com",
-            "huffingtonpost.com", "twitpic.com", "weather.com", "babylon.com", "amazon.de",
-            "dailymotion.com", "orkut.com", "orkut.com.br", "google.com.sa", "odnoklassniki.ru",
-            "amazon.co.jp", "google.nl", "goo.ne.jp", "stumbleupon.com", "tube8.com", "tmall.com",
-            "imgur.com", "globo.com", "secureserver.net", "fileserve.com", "tianya.cn", "badoo.com",
-            "ehow.com", "photobucket.com", "imageshack.us", "xnxx.com", "deviantart.com",
-            "filestube.com", "addthis.com", "douban.com", "vimeo.com", "sogou.com",
-            "stackoverflow.com", "reddit.com", "dailymail.co.uk", "redtube.com", "megavideo.com",
-            "taringa.net", "pengyou.com", "amazon.co.uk", "fbcdn.net", "aweber.com", "spiegel.de",
-            "rapidshare.com", "mixi.jp", "360buy.com", "google.cn", "digg.com", "answers.com",
-            "bit.ly", "indiatimes.com", "skype.com", "yfrog.com", "optmd.com", "google.com.eg",
-            "google.com.pk", "58.com", "hotfile.com", "google.co.th",
-            "bankofamerica.com", "sourceforge.net", "maktoob.com", "warriorforum.com", "rediff.com",
-            "google.co.za", "56.com", "torrentz.eu", "clicksor.com", "avg.com",
-            "download.com", "ku6.com", "statcounter.com", "foxnews.com", "google.com.ar",
-            "nicovideo.jp", "reference.com", "liveinternet.ru", "ucoz.ru", "xinhuanet.com",
-            "xtendmedia.com", "naver.com", "youjizz.com", "domaintools.com", "sparkstudios.com",
-            "rambler.ru", "scribd.com", "kaixin001.com", "mashable.com", "adultfirendfinder.com",
-            "files.wordpress.com", "guardian.co.uk", "bild.de", "yelp.com", "wikimedia.org",
-            "chase.com", "onet.pl", "ameba.jp", "pconline.com.cn", "free.fr", "etsy.com",
-            "typepad.com", "youdao.com", "megaclick.com", "digitalpoint.com", "blogfa.com",
-            "salesforce.com", "adf.ly", "ganji.com", "wikia.com", "archive.org", "terra.com.br",
-            "w3schools.com", "ezinearticles.com", "wjs.com", "google.com.my", "clickbank.com",
-            "squidoo.com", "hulu.com", "repubblica.it", "google.be", "allegro.pl", "comcast.net",
-            "narod.ru", "zol.com.cn", "orange.fr", "soufun.com", "hatena.ne.jp", "google.gr",
-            "in.com", "techcrunch.com", "orkut.co.in", "xunlei.com",
-            "reuters.com", "google.com.vn", "hostgator.com", "kaskus.us", "espncricinfo.com",
-            "hootsuite.com", "qiyi.com", "gmx.net", "xing.com", "php.net", "soku.com", "web.de",
-            "libero.it", "groupon.com", "51.la", "slideshare.net", "booking.com", "seesaa.net",
-            "126.com", "telegraph.co.uk", "wretch.cc", "twimg.com", "rutracker.org", "angege.com",
-            "nba.com", "dell.com", "leboncoin.fr", "people.com", "google.com.tw", "walmart.com",
-            "daum.net", "2ch.net", "constantcontact.com", "nifty.com", "mywebsearch.com",
-            "tripadvisor.com", "google.se", "paipai.com", "google.com.ua", "ning.com", "hp.com",
-            "google.at", "joomla.org", "icio.us", "hudong.com", "csdn.net", "getfirebug.com",
-            "ups.com", "cj.com", "google.ch", "camzap.com", "wordreference.com", "tagged.com",
-            "wp.pl", "mozilla.com", "google.ru", "usps.com", "china.com", "themeforest.net",
-            "search-results.com", "tribalfusion.com", "thefreedictionary.com", "isohunt.com",
-            "linkwithin.com", "cam4.com", "plentyoffish.com", "wellsfargo.com", "metacafe.com",
-            "depositfiles.com", "freelancer.com", "opendns.com", "homeway.com", "engadget.com",
-            "10086.cn", "360.cn", "marca.com", "dropbox.com", "ign.com", "match.com", "google.pt",
-            "facemoods.com", "hardsextube.com", "google.com.ph", "lockerz.com", "istockphoto.com",
-            "partypoker.com", "netlog.com", "outbrain.com", "elpais.com", "fiverr.com",
-            "biglobe.ne.jp", "corriere.it", "love21cn.com", "yesky.com", "spankwire.com",
-            "ig.com.br", "imagevenue.com", "hubpages.com", "google.co.ve"};
-
-// TODO - this works, but is slow and cts doesn't do anything with the result.
-// Maybe require a min performance, a min cache size (detectable) and/or move
-// to perf testing
-    private static final int LOOKUP_COUNT_GOAL = URLS.length;
-    public void skiptestDnsPerf() {
-        ArrayList<String> results = new ArrayList<String>();
-        int failures = 0;
-        try {
-            for (int numberOfUrls = URLS.length; numberOfUrls > 0; numberOfUrls--) {
-                failures = 0;
-                int iterationLimit = LOOKUP_COUNT_GOAL / numberOfUrls;
-                long startTime = SystemClock.elapsedRealtimeNanos();
-                for (int iteration = 0; iteration < iterationLimit; iteration++) {
-                    for (int urlIndex = 0; urlIndex < numberOfUrls; urlIndex++) {
-                        try {
-                            InetAddress addr = InetAddress.getByName(URLS[urlIndex]);
-                        } catch (UnknownHostException e) {
-                            Log.e(TAG, "failed first lookup of " + URLS[urlIndex]);
-                            failures++;
-                            try {
-                                InetAddress addr = InetAddress.getByName(URLS[urlIndex]);
-                            } catch (UnknownHostException ee) {
-                                failures++;
-                                Log.e(TAG, "failed SECOND lookup of " + URLS[urlIndex]);
-                            }
-                        }
-                    }
-                }
-                long endTime = SystemClock.elapsedRealtimeNanos();
-                float nsPer = ((float)(endTime-startTime) / iterationLimit) / numberOfUrls/ 1000;
-                String thisResult = new String("getByName for " + numberOfUrls + " took " +
-                        (endTime - startTime)/1000 + "(" + nsPer + ") with " +
-                        failures + " failures\n");
-                Log.d(TAG, thisResult);
-                results.add(thisResult);
-            }
-            // build up a list of addresses
-            ArrayList<byte[]> addressList = new ArrayList<byte[]>();
-            for (String url : URLS) {
-                try {
-                    InetAddress addr = InetAddress.getByName(url);
-                    addressList.add(addr.getAddress());
-                } catch (UnknownHostException e) {
-                    Log.e(TAG, "Exception making reverseDNS list: " + e.toString());
-                }
-            }
-            for (int numberOfAddrs = addressList.size(); numberOfAddrs > 0; numberOfAddrs--) {
-                int iterationLimit = LOOKUP_COUNT_GOAL / numberOfAddrs;
-                failures = 0;
-                long startTime = SystemClock.elapsedRealtimeNanos();
-                for (int iteration = 0; iteration < iterationLimit; iteration++) {
-                    for (int addrIndex = 0; addrIndex < numberOfAddrs; addrIndex++) {
-                        try {
-                            InetAddress addr = InetAddress.getByAddress(addressList.get(addrIndex));
-                            String hostname = addr.getHostName();
-                        } catch (UnknownHostException e) {
-                            failures++;
-                            Log.e(TAG, "Failure doing reverse DNS lookup: " + e.toString());
-                            try {
-                                InetAddress addr =
-                                        InetAddress.getByAddress(addressList.get(addrIndex));
-                                String hostname = addr.getHostName();
-
-                            } catch (UnknownHostException ee) {
-                                failures++;
-                                Log.e(TAG, "Failure doing SECOND reverse DNS lookup: " +
-                                        ee.toString());
-                            }
-                        }
-                    }
-                }
-                long endTime = SystemClock.elapsedRealtimeNanos();
-                float nsPer = ((endTime-startTime) / iterationLimit) / numberOfAddrs / 1000;
-                String thisResult = new String("getHostName for " + numberOfAddrs + " took " +
-                        (endTime - startTime)/1000 + "(" + nsPer + ") with " +
-                        failures + " failures\n");
-                Log.d(TAG, thisResult);
-                results.add(thisResult);
-            }
-            for (String result : results) Log.d(TAG, result);
-
-            InetAddress exit = InetAddress.getByName("exitrightnow.com");
-            Log.e(TAG, " exit address= "+exit.toString());
-
-        } catch (Exception e) {
-            Log.e(TAG, "bad URL in testDnsPerf: " + e.toString());
-        }
-    }
-
-    private boolean activeNetworkInfoIsProxy() {
-        NetworkInfo info = mCm.getActiveNetworkInfo();
-        if (PROXY_NETWORK_TYPE.equals(info.getTypeName())) {
-            return true;
-        }
-
-        return false;
-    }
-
-    private void ensureIpv6Connectivity() throws InterruptedException {
-        CountDownLatch latch = new CountDownLatch(1);
-        final int TIMEOUT_MS = 5_000;
-
-        final NetworkCallback callback = new NetworkCallback() {
-            @Override
-            public void onLinkPropertiesChanged(Network network, LinkProperties lp) {
-                if (lp.hasGlobalIpv6Address()) {
-                    latch.countDown();
-                }
-            }
-        };
-        mCm.registerDefaultNetworkCallback(callback);
-
-        String msg = "Default network did not provide IPv6 connectivity after " + TIMEOUT_MS
-                + "ms. Please connect to an IPv6-capable network. lp="
-                + mCm.getActiveLinkProperties();
-        try {
-            assertTrue(msg, latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        } finally {
-            mCm.unregisterNetworkCallback(callback);
-        }
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/IkeTunUtils.java b/tests/tests/net/src/android/net/cts/IkeTunUtils.java
deleted file mode 100644
index fc25292..0000000
--- a/tests/tests/net/src/android/net/cts/IkeTunUtils.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Copyright (C) 2020 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 static android.net.cts.PacketUtils.BytePayload;
-import static android.net.cts.PacketUtils.IP4_HDRLEN;
-import static android.net.cts.PacketUtils.IP6_HDRLEN;
-import static android.net.cts.PacketUtils.IpHeader;
-import static android.net.cts.PacketUtils.UDP_HDRLEN;
-import static android.net.cts.PacketUtils.UdpHeader;
-import static android.net.cts.PacketUtils.getIpHeader;
-import static android.system.OsConstants.IPPROTO_UDP;
-
-import android.os.ParcelFileDescriptor;
-
-import java.net.InetAddress;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-
-// TODO: Merge this with the version in the IPsec module (IKEv2 library) CTS tests.
-/** An extension of the TunUtils class with IKE-specific packet handling. */
-public class IkeTunUtils extends TunUtils {
-    private static final int PORT_LEN = 2;
-
-    private static final byte[] NON_ESP_MARKER = new byte[] {0, 0, 0, 0};
-
-    private static final int IKE_HEADER_LEN = 28;
-    private static final int IKE_SPI_LEN = 8;
-    private static final int IKE_IS_RESP_BYTE_OFFSET = 19;
-    private static final int IKE_MSG_ID_OFFSET = 20;
-    private static final int IKE_MSG_ID_LEN = 4;
-
-    public IkeTunUtils(ParcelFileDescriptor tunFd) {
-        super(tunFd);
-    }
-
-    /**
-     * Await an expected IKE request and inject an IKE response.
-     *
-     * @param respIkePkt IKE response packet without IP/UDP headers or NON ESP MARKER.
-     */
-    public byte[] awaitReqAndInjectResp(long expectedInitIkeSpi, int expectedMsgId,
-            boolean encapExpected, byte[] respIkePkt) throws Exception {
-        final byte[] request = awaitIkePacket(expectedInitIkeSpi, expectedMsgId, encapExpected);
-
-        // Build response header by flipping address and port
-        final InetAddress srcAddr = getDstAddress(request);
-        final InetAddress dstAddr = getSrcAddress(request);
-        final int srcPort = getDstPort(request);
-        final int dstPort = getSrcPort(request);
-
-        final byte[] response =
-                buildIkePacket(srcAddr, dstAddr, srcPort, dstPort, encapExpected, respIkePkt);
-        injectPacket(response);
-        return request;
-    }
-
-    private byte[] awaitIkePacket(long expectedInitIkeSpi, int expectedMsgId, boolean expectEncap)
-            throws Exception {
-        return super.awaitPacket(pkt -> isIke(pkt, expectedInitIkeSpi, expectedMsgId, expectEncap));
-    }
-
-    private static boolean isIke(
-            byte[] pkt, long expectedInitIkeSpi, int expectedMsgId, boolean encapExpected) {
-        final int ipProtocolOffset;
-        final int ikeOffset;
-
-        if (isIpv6(pkt)) {
-            ipProtocolOffset = IP6_PROTO_OFFSET;
-            ikeOffset = IP6_HDRLEN + UDP_HDRLEN;
-        } else {
-            if (encapExpected && !hasNonEspMarkerv4(pkt)) {
-                return false;
-            }
-
-            // Use default IPv4 header length (assuming no options)
-            final int encapMarkerLen = encapExpected ? NON_ESP_MARKER.length : 0;
-            ipProtocolOffset = IP4_PROTO_OFFSET;
-            ikeOffset = IP4_HDRLEN + UDP_HDRLEN + encapMarkerLen;
-        }
-
-        return pkt[ipProtocolOffset] == IPPROTO_UDP
-                && areSpiAndMsgIdEqual(pkt, ikeOffset, expectedInitIkeSpi, expectedMsgId);
-    }
-
-    /** Checks if the provided IPv4 packet has a UDP-encapsulation NON-ESP marker */
-    private static boolean hasNonEspMarkerv4(byte[] ipv4Pkt) {
-        final int nonEspMarkerOffset = IP4_HDRLEN + UDP_HDRLEN;
-        if (ipv4Pkt.length < nonEspMarkerOffset + NON_ESP_MARKER.length) {
-            return false;
-        }
-
-        final byte[] nonEspMarker = Arrays.copyOfRange(
-                ipv4Pkt, nonEspMarkerOffset, nonEspMarkerOffset + NON_ESP_MARKER.length);
-        return Arrays.equals(NON_ESP_MARKER, nonEspMarker);
-    }
-
-    private static boolean areSpiAndMsgIdEqual(
-            byte[] pkt, int ikeOffset, long expectedIkeInitSpi, int expectedMsgId) {
-        if (pkt.length <= ikeOffset + IKE_HEADER_LEN) {
-            return false;
-        }
-
-        final ByteBuffer buffer = ByteBuffer.wrap(pkt);
-        final long spi = buffer.getLong(ikeOffset);
-        final int msgId = buffer.getInt(ikeOffset + IKE_MSG_ID_OFFSET);
-
-        return expectedIkeInitSpi == spi && expectedMsgId == msgId;
-    }
-
-    private static InetAddress getSrcAddress(byte[] pkt) throws Exception {
-        return getAddress(pkt, true);
-    }
-
-    private static InetAddress getDstAddress(byte[] pkt) throws Exception {
-        return getAddress(pkt, false);
-    }
-
-    private static InetAddress getAddress(byte[] pkt, boolean getSrcAddr) throws Exception {
-        final int ipLen = isIpv6(pkt) ? IP6_ADDR_LEN : IP4_ADDR_LEN;
-        final int srcIpOffset = isIpv6(pkt) ? IP6_ADDR_OFFSET : IP4_ADDR_OFFSET;
-        final int ipOffset = getSrcAddr ? srcIpOffset : srcIpOffset + ipLen;
-
-        if (pkt.length < ipOffset + ipLen) {
-            // Should be impossible; getAddress() is only called with a full IKE request including
-            // the IP and UDP headers.
-            throw new IllegalArgumentException("Packet was too short to contain IP address");
-        }
-
-        return InetAddress.getByAddress(Arrays.copyOfRange(pkt, ipOffset, ipOffset + ipLen));
-    }
-
-    private static int getSrcPort(byte[] pkt) throws Exception {
-        return getPort(pkt, true);
-    }
-
-    private static int getDstPort(byte[] pkt) throws Exception {
-        return getPort(pkt, false);
-    }
-
-    private static int getPort(byte[] pkt, boolean getSrcPort) {
-        final int srcPortOffset = isIpv6(pkt) ? IP6_HDRLEN : IP4_HDRLEN;
-        final int portOffset = getSrcPort ? srcPortOffset : srcPortOffset + PORT_LEN;
-
-        if (pkt.length < portOffset + PORT_LEN) {
-            // Should be impossible; getPort() is only called with a full IKE request including the
-            // IP and UDP headers.
-            throw new IllegalArgumentException("Packet was too short to contain port");
-        }
-
-        final ByteBuffer buffer = ByteBuffer.wrap(pkt);
-        return Short.toUnsignedInt(buffer.getShort(portOffset));
-    }
-
-    private static byte[] buildIkePacket(
-            InetAddress srcAddr,
-            InetAddress dstAddr,
-            int srcPort,
-            int dstPort,
-            boolean useEncap,
-            byte[] payload)
-            throws Exception {
-        // Append non-ESP marker if encap is enabled
-        if (useEncap) {
-            final ByteBuffer buffer = ByteBuffer.allocate(NON_ESP_MARKER.length + payload.length);
-            buffer.put(NON_ESP_MARKER);
-            buffer.put(payload);
-            payload = buffer.array();
-        }
-
-        final UdpHeader udpPkt = new UdpHeader(srcPort, dstPort, new BytePayload(payload));
-        final IpHeader ipPkt = getIpHeader(udpPkt.getProtocolId(), srcAddr, dstAddr, udpPkt);
-        return ipPkt.getPacketBytes();
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/Ikev2VpnTest.java b/tests/tests/net/src/android/net/cts/Ikev2VpnTest.java
deleted file mode 100644
index 9eab024..0000000
--- a/tests/tests/net/src/android/net/cts/Ikev2VpnTest.java
+++ /dev/null
@@ -1,535 +0,0 @@
-/*
- * Copyright (C) 2020 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 static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
-import static android.net.NetworkCapabilities.TRANSPORT_VPN;
-import static android.net.cts.util.CtsNetUtils.TestNetworkCallback;
-
-import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
-
-import android.Manifest;
-import android.annotation.NonNull;
-import android.app.AppOpsManager;
-import android.content.Context;
-import android.content.Intent;
-import android.net.ConnectivityManager;
-import android.net.Ikev2VpnProfile;
-import android.net.IpSecAlgorithm;
-import android.net.LinkAddress;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.NetworkRequest;
-import android.net.ProxyInfo;
-import android.net.TestNetworkInterface;
-import android.net.TestNetworkManager;
-import android.net.VpnManager;
-import android.net.cts.util.CtsNetUtils;
-import android.os.Build;
-import android.os.Process;
-import android.platform.test.annotations.AppModeFull;
-
-import androidx.test.InstrumentationRegistry;
-
-import com.android.internal.util.HexDump;
-import com.android.org.bouncycastle.x509.X509V1CertificateGenerator;
-import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo;
-import com.android.testutils.DevSdkIgnoreRunner;
-
-import org.junit.After;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.math.BigInteger;
-import java.net.InetAddress;
-import java.security.KeyPair;
-import java.security.KeyPairGenerator;
-import java.security.PrivateKey;
-import java.security.cert.X509Certificate;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-import javax.security.auth.x500.X500Principal;
-
-@RunWith(DevSdkIgnoreRunner.class)
-@IgnoreUpTo(Build.VERSION_CODES.Q)
-@AppModeFull(reason = "Appops state changes disallowed for instant apps (OP_ACTIVATE_PLATFORM_VPN)")
-public class Ikev2VpnTest {
-    private static final String TAG = Ikev2VpnTest.class.getSimpleName();
-
-    // Test vectors for IKE negotiation in test mode.
-    private static final String SUCCESSFUL_IKE_INIT_RESP_V4 =
-            "46b8eca1e0d72a18b2b5d9006d47a0022120222000000000000002d0220000300000002c01010004030000"
-                    + "0c0100000c800e0100030000080300000c030000080200000400000008040000102800020800"
-                    + "100000b8070f159fe5141d8754ca86f72ecc28d66f514927e96cbe9eec0adb42bf2c276a0ab7"
-                    + "a97fa93555f4be9218c14e7f286bb28c6b4fb13825a420f2ffc165854f200bab37d69c8963d4"
-                    + "0acb831d983163aa50622fd35c182efe882cf54d6106222abcfaa597255d302f1b95ab71c142"
-                    + "c279ea5839a180070bff73f9d03fab815f0d5ee2adec7e409d1e35979f8bd92ffd8aab13d1a0"
-                    + "0657d816643ae767e9ae84d2ccfa2bcce1a50572be8d3748ae4863c41ae90da16271e014270f"
-                    + "77edd5cd2e3299f3ab27d7203f93d770bacf816041cdcecd0f9af249033979da4369cb242dd9"
-                    + "6d172e60513ff3db02de63e50eb7d7f596ada55d7946cad0af0669d1f3e2804846ab3f2a930d"
-                    + "df56f7f025f25c25ada694e6231abbb87ee8cfd072c8481dc0b0f6b083fdc3bd89b080e49feb"
-                    + "0288eef6fdf8a26ee2fc564a11e7385215cf2deaf2a9965638fc279c908ccdf04094988d91a2"
-                    + "464b4a8c0326533aff5119ed79ecbd9d99a218b44f506a5eb09351e67da86698b4c58718db25"
-                    + "d55f426fb4c76471b27a41fbce00777bc233c7f6e842e39146f466826de94f564cad8b92bfbe"
-                    + "87c99c4c7973ec5f1eea8795e7da82819753aa7c4fcfdab77066c56b939330c4b0d354c23f83"
-                    + "ea82fa7a64c4b108f1188379ea0eb4918ee009d804100e6bf118771b9058d42141c847d5ec37"
-                    + "6e5ec591c71fc9dac01063c2bd31f9c783b28bf1182900002430f3d5de3449462b31dd28bc27"
-                    + "297b6ad169bccce4f66c5399c6e0be9120166f2900001c0000400428b8df2e66f69c8584a186"
-                    + "c5eac66783551d49b72900001c000040054e7a622e802d5cbfb96d5f30a6e433994370173529"
-                    + "0000080000402e290000100000402f00020003000400050000000800004014";
-    private static final String SUCCESSFUL_IKE_INIT_RESP_V6 =
-            "46b8eca1e0d72a1800d9ea1babce26bf2120222000000000000002d0220000300000002c01010004030000"
-                    + "0c0100000c800e0100030000080300000c030000080200000400000008040000102800020800"
-                    + "100000ea0e6dd9ca5930a9a45c323a41f64bfd8cdef7730f5fbff37d7c377da427f489a42aa8"
-                    + "c89233380e6e925990d49de35c2cdcf63a61302c731a4b3569df1ee1bf2457e55a6751838ede"
-                    + "abb75cc63ba5c9e4355e8e784f383a5efe8a44727dc14aeaf8dacc2620fb1c8875416dc07739"
-                    + "7fe4decc1bd514a9c7d270cf21fd734c63a25c34b30b68686e54e8a198f37f27cb491fe27235"
-                    + "fab5476b036d875ccab9a68d65fbf3006197f9bebbf94de0d3802b4fafe1d48d931ce3a1a346"
-                    + "2d65bd639e9bd7fa46299650a9dbaf9b324e40b466942d91a59f41ef8042f8474c4850ed0f63"
-                    + "e9238949d41cd8bbaea9aefdb65443a6405792839563aa5dc5c36b5ce8326ccf8a94d9622b85"
-                    + "038d390d5fc0299e14e1f022966d4ac66515f6108ca04faec44821fe5bbf2ed4f84ff5671219"
-                    + "608cb4c36b44a31ba010c9088f8d5ff943bb9ff857f74be1755f57a5783874adc57f42bb174e"
-                    + "4ad3215de628707014dbcb1707bd214658118fdd7a42b3e1638b991ce5b812a667f1145be811"
-                    + "685e3cd3baf9b18d062657b64c206a4d19a531c252a6a51a04aeaf42c618620cdbab65baca23"
-                    + "82c57ed888422aeaacf7f1bc3fe2247ff7e7eaca218b74d7b31d02f2b0afa123f802529e7e6c"
-                    + "3259d418290740ddbf55686e26998d7edcbbf895664972fed666f2f20af40503aa2af436ec6d"
-                    + "4ec981ab19b9088755d94ae7a7c2066ea331d4e56e290000243fefe5555fce552d57a84e682c"
-                    + "d4a6dfb3f2f94a94464d5bec3d88b88e9559642900001c00004004eb4afff764e7b79bca78b1"
-                    + "3a89100d36d678ae982900001c00004005d177216a3c26f782076e12570d40bfaaa148822929"
-                    + "0000080000402e290000100000402f00020003000400050000000800004014";
-    private static final String SUCCESSFUL_IKE_AUTH_RESP_V4 =
-            "46b8eca1e0d72a18b2b5d9006d47a0022e20232000000001000000e0240000c420a2500a3da4c66fa6929e"
-                    + "600f36349ba0e38de14f78a3ad0416cba8c058735712a3d3f9a0a6ed36de09b5e9e02697e7c4"
-                    + "2d210ac86cfbd709503cfa51e2eab8cfdc6427d136313c072968f6506a546eb5927164200592"
-                    + "6e36a16ee994e63f029432a67bc7d37ca619e1bd6e1678df14853067ecf816b48b81e8746069"
-                    + "406363e5aa55f13cb2afda9dbebee94256c29d630b17dd7f1ee52351f92b6e1c3d8551c513f1"
-                    + "d74ac52a80b2041397e109fe0aeb3c105b0d4be0ae343a943398764281";
-    private static final String SUCCESSFUL_IKE_AUTH_RESP_V6 =
-            "46b8eca1e0d72a1800d9ea1babce26bf2e20232000000001000000f0240000d4aaf6eaa6c06b50447e6f54"
-                    + "827fd8a9d9d6ac8015c1ebb3e8cb03fc6e54b49a107441f50004027cc5021600828026367f03"
-                    + "bc425821cd7772ee98637361300c9b76056e874fea2bd4a17212370b291894264d8c023a01d1"
-                    + "c3b691fd4b7c0b534e8c95af4c4638e2d125cb21c6267e2507cd745d72e8da109c47b9259c6c"
-                    + "57a26f6bc5b337b9b9496d54bdde0333d7a32e6e1335c9ee730c3ecd607a8689aa7b0577b74f"
-                    + "3bf437696a9fd5fc0aee3ed346cd9e15d1dda293df89eb388a8719388a60ca7625754de12cdb"
-                    + "efe4c886c5c401";
-    private static final long IKE_INITIATOR_SPI = Long.parseLong("46B8ECA1E0D72A18", 16);
-
-    private static final InetAddress LOCAL_OUTER_4 = InetAddress.parseNumericAddress("192.0.2.1");
-    private static final InetAddress LOCAL_OUTER_6 =
-            InetAddress.parseNumericAddress("2001:db8::1");
-
-    private static final int IP4_PREFIX_LEN = 32;
-    private static final int IP6_PREFIX_LEN = 128;
-
-    // TODO: Use IPv6 address when we can generate test vectors (GCE does not allow IPv6 yet).
-    private static final String TEST_SERVER_ADDR_V4 = "192.0.2.2";
-    private static final String TEST_SERVER_ADDR_V6 = "2001:db8::2";
-    private static final String TEST_IDENTITY = "client.cts.android.com";
-    private static final List<String> TEST_ALLOWED_ALGORITHMS =
-            Arrays.asList(IpSecAlgorithm.AUTH_CRYPT_AES_GCM);
-
-    private static final ProxyInfo TEST_PROXY_INFO =
-            ProxyInfo.buildDirectProxy("proxy.cts.android.com", 1234);
-    private static final int TEST_MTU = 1300;
-
-    private static final byte[] TEST_PSK = "ikeAndroidPsk".getBytes();
-    private static final String TEST_USER = "username";
-    private static final String TEST_PASSWORD = "pa55w0rd";
-
-    // Static state to reduce setup/teardown
-    private static final Context sContext = InstrumentationRegistry.getContext();
-    private static final ConnectivityManager sCM =
-            (ConnectivityManager) sContext.getSystemService(Context.CONNECTIVITY_SERVICE);
-    private static final VpnManager sVpnMgr =
-            (VpnManager) sContext.getSystemService(Context.VPN_MANAGEMENT_SERVICE);
-    private static final CtsNetUtils mCtsNetUtils = new CtsNetUtils(sContext);
-
-    private final X509Certificate mServerRootCa;
-    private final CertificateAndKey mUserCertKey;
-
-    public Ikev2VpnTest() throws Exception {
-        // Build certificates
-        mServerRootCa = generateRandomCertAndKeyPair().cert;
-        mUserCertKey = generateRandomCertAndKeyPair();
-    }
-
-    @After
-    public void tearDown() {
-        setAppop(AppOpsManager.OP_ACTIVATE_VPN, false);
-        setAppop(AppOpsManager.OP_ACTIVATE_PLATFORM_VPN, false);
-    }
-
-    /**
-     * Sets the given appop using shell commands
-     *
-     * <p>This method must NEVER be called from within a shell permission, as it will attempt to
-     * acquire, and then drop the shell permission identity. This results in the caller losing the
-     * shell permission identity due to these calls not being reference counted.
-     */
-    public void setAppop(int appop, boolean allow) {
-        // Requires shell permission to update appops.
-        runWithShellPermissionIdentity(() -> {
-            mCtsNetUtils.setAppopPrivileged(appop, allow);
-        }, Manifest.permission.MANAGE_TEST_NETWORKS);
-    }
-
-    private Ikev2VpnProfile buildIkev2VpnProfileCommon(
-            Ikev2VpnProfile.Builder builder, boolean isRestrictedToTestNetworks) throws Exception {
-        if (isRestrictedToTestNetworks) {
-            builder.restrictToTestNetworks();
-        }
-
-        return builder.setBypassable(true)
-                .setAllowedAlgorithms(TEST_ALLOWED_ALGORITHMS)
-                .setProxy(TEST_PROXY_INFO)
-                .setMaxMtu(TEST_MTU)
-                .setMetered(false)
-                .build();
-    }
-
-    private Ikev2VpnProfile buildIkev2VpnProfilePsk(boolean isRestrictedToTestNetworks)
-            throws Exception {
-        return buildIkev2VpnProfilePsk(TEST_SERVER_ADDR_V6, isRestrictedToTestNetworks);
-    }
-
-    private Ikev2VpnProfile buildIkev2VpnProfilePsk(
-            String remote, boolean isRestrictedToTestNetworks) throws Exception {
-        final Ikev2VpnProfile.Builder builder =
-                new Ikev2VpnProfile.Builder(remote, TEST_IDENTITY).setAuthPsk(TEST_PSK);
-
-        return buildIkev2VpnProfileCommon(builder, isRestrictedToTestNetworks);
-    }
-
-    private Ikev2VpnProfile buildIkev2VpnProfileUsernamePassword(boolean isRestrictedToTestNetworks)
-            throws Exception {
-        final Ikev2VpnProfile.Builder builder =
-                new Ikev2VpnProfile.Builder(TEST_SERVER_ADDR_V6, TEST_IDENTITY)
-                        .setAuthUsernamePassword(TEST_USER, TEST_PASSWORD, mServerRootCa);
-
-        return buildIkev2VpnProfileCommon(builder, isRestrictedToTestNetworks);
-    }
-
-    private Ikev2VpnProfile buildIkev2VpnProfileDigitalSignature(boolean isRestrictedToTestNetworks)
-            throws Exception {
-        final Ikev2VpnProfile.Builder builder =
-                new Ikev2VpnProfile.Builder(TEST_SERVER_ADDR_V6, TEST_IDENTITY)
-                        .setAuthDigitalSignature(
-                                mUserCertKey.cert, mUserCertKey.key, mServerRootCa);
-
-        return buildIkev2VpnProfileCommon(builder, isRestrictedToTestNetworks);
-    }
-
-    private void checkBasicIkev2VpnProfile(@NonNull Ikev2VpnProfile profile) throws Exception {
-        assertEquals(TEST_SERVER_ADDR_V6, profile.getServerAddr());
-        assertEquals(TEST_IDENTITY, profile.getUserIdentity());
-        assertEquals(TEST_PROXY_INFO, profile.getProxyInfo());
-        assertEquals(TEST_ALLOWED_ALGORITHMS, profile.getAllowedAlgorithms());
-        assertTrue(profile.isBypassable());
-        assertFalse(profile.isMetered());
-        assertEquals(TEST_MTU, profile.getMaxMtu());
-        assertFalse(profile.isRestrictedToTestNetworks());
-    }
-
-    @Test
-    public void testBuildIkev2VpnProfilePsk() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-
-        final Ikev2VpnProfile profile =
-                buildIkev2VpnProfilePsk(false /* isRestrictedToTestNetworks */);
-
-        checkBasicIkev2VpnProfile(profile);
-        assertArrayEquals(TEST_PSK, profile.getPresharedKey());
-
-        // Verify nothing else is set.
-        assertNull(profile.getUsername());
-        assertNull(profile.getPassword());
-        assertNull(profile.getServerRootCaCert());
-        assertNull(profile.getRsaPrivateKey());
-        assertNull(profile.getUserCert());
-    }
-
-    @Test
-    public void testBuildIkev2VpnProfileUsernamePassword() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-
-        final Ikev2VpnProfile profile =
-                buildIkev2VpnProfileUsernamePassword(false /* isRestrictedToTestNetworks */);
-
-        checkBasicIkev2VpnProfile(profile);
-        assertEquals(TEST_USER, profile.getUsername());
-        assertEquals(TEST_PASSWORD, profile.getPassword());
-        assertEquals(mServerRootCa, profile.getServerRootCaCert());
-
-        // Verify nothing else is set.
-        assertNull(profile.getPresharedKey());
-        assertNull(profile.getRsaPrivateKey());
-        assertNull(profile.getUserCert());
-    }
-
-    @Test
-    public void testBuildIkev2VpnProfileDigitalSignature() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-
-        final Ikev2VpnProfile profile =
-                buildIkev2VpnProfileDigitalSignature(false /* isRestrictedToTestNetworks */);
-
-        checkBasicIkev2VpnProfile(profile);
-        assertEquals(mUserCertKey.cert, profile.getUserCert());
-        assertEquals(mUserCertKey.key, profile.getRsaPrivateKey());
-        assertEquals(mServerRootCa, profile.getServerRootCaCert());
-
-        // Verify nothing else is set.
-        assertNull(profile.getUsername());
-        assertNull(profile.getPassword());
-        assertNull(profile.getPresharedKey());
-    }
-
-    private void verifyProvisionVpnProfile(
-            boolean hasActivateVpn, boolean hasActivatePlatformVpn, boolean expectIntent)
-            throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-
-        setAppop(AppOpsManager.OP_ACTIVATE_VPN, hasActivateVpn);
-        setAppop(AppOpsManager.OP_ACTIVATE_PLATFORM_VPN, hasActivatePlatformVpn);
-
-        final Ikev2VpnProfile profile =
-                buildIkev2VpnProfilePsk(false /* isRestrictedToTestNetworks */);
-        final Intent intent = sVpnMgr.provisionVpnProfile(profile);
-        assertEquals(expectIntent, intent != null);
-    }
-
-    @Test
-    public void testProvisionVpnProfileNoPreviousConsent() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-
-        verifyProvisionVpnProfile(false /* hasActivateVpn */,
-                false /* hasActivatePlatformVpn */, true /* expectIntent */);
-    }
-
-    @Test
-    public void testProvisionVpnProfilePlatformVpnConsented() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-
-        verifyProvisionVpnProfile(false /* hasActivateVpn */,
-                true /* hasActivatePlatformVpn */, false /* expectIntent */);
-    }
-
-    @Test
-    public void testProvisionVpnProfileVpnServiceConsented() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-
-        verifyProvisionVpnProfile(true /* hasActivateVpn */,
-                false /* hasActivatePlatformVpn */, false /* expectIntent */);
-    }
-
-    @Test
-    public void testProvisionVpnProfileAllPreConsented() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-
-        verifyProvisionVpnProfile(true /* hasActivateVpn */,
-                true /* hasActivatePlatformVpn */, false /* expectIntent */);
-    }
-
-    @Test
-    public void testDeleteVpnProfile() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-
-        setAppop(AppOpsManager.OP_ACTIVATE_PLATFORM_VPN, true);
-
-        final Ikev2VpnProfile profile =
-                buildIkev2VpnProfilePsk(false /* isRestrictedToTestNetworks */);
-        assertNull(sVpnMgr.provisionVpnProfile(profile));
-
-        // Verify that deleting the profile works (even without the appop)
-        setAppop(AppOpsManager.OP_ACTIVATE_PLATFORM_VPN, false);
-        sVpnMgr.deleteProvisionedVpnProfile();
-
-        // Test that the profile was deleted - starting it should throw an IAE.
-        try {
-            setAppop(AppOpsManager.OP_ACTIVATE_PLATFORM_VPN, true);
-            sVpnMgr.startProvisionedVpnProfile();
-            fail("Expected IllegalArgumentException due to missing profile");
-        } catch (IllegalArgumentException expected) {
-        }
-    }
-
-    @Test
-    public void testStartVpnProfileNoPreviousConsent() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-
-        setAppop(AppOpsManager.OP_ACTIVATE_VPN, false);
-        setAppop(AppOpsManager.OP_ACTIVATE_PLATFORM_VPN, false);
-
-        // Make sure the VpnProfile is not provisioned already.
-        sVpnMgr.stopProvisionedVpnProfile();
-
-        try {
-            sVpnMgr.startProvisionedVpnProfile();
-            fail("Expected SecurityException for missing consent");
-        } catch (SecurityException expected) {
-        }
-    }
-
-    private void checkStartStopVpnProfileBuildsNetworks(IkeTunUtils tunUtils, boolean testIpv6)
-            throws Exception {
-        String serverAddr = testIpv6 ? TEST_SERVER_ADDR_V6 : TEST_SERVER_ADDR_V4;
-        String initResp = testIpv6 ? SUCCESSFUL_IKE_INIT_RESP_V6 : SUCCESSFUL_IKE_INIT_RESP_V4;
-        String authResp = testIpv6 ? SUCCESSFUL_IKE_AUTH_RESP_V6 : SUCCESSFUL_IKE_AUTH_RESP_V4;
-        boolean hasNat = !testIpv6;
-
-        // Requires MANAGE_TEST_NETWORKS to provision a test-mode profile.
-        mCtsNetUtils.setAppopPrivileged(AppOpsManager.OP_ACTIVATE_PLATFORM_VPN, true);
-
-        final Ikev2VpnProfile profile =
-                buildIkev2VpnProfilePsk(serverAddr, true /* isRestrictedToTestNetworks */);
-        assertNull(sVpnMgr.provisionVpnProfile(profile));
-
-        sVpnMgr.startProvisionedVpnProfile();
-
-        // Inject IKE negotiation
-        int expectedMsgId = 0;
-        tunUtils.awaitReqAndInjectResp(IKE_INITIATOR_SPI, expectedMsgId++, false /* isEncap */,
-                HexDump.hexStringToByteArray(initResp));
-        tunUtils.awaitReqAndInjectResp(IKE_INITIATOR_SPI, expectedMsgId++, hasNat /* isEncap */,
-                HexDump.hexStringToByteArray(authResp));
-
-        // Verify the VPN network came up
-        final NetworkRequest nr = new NetworkRequest.Builder()
-                .clearCapabilities().addTransportType(TRANSPORT_VPN).build();
-
-        final TestNetworkCallback cb = new TestNetworkCallback();
-        sCM.requestNetwork(nr, cb);
-        cb.waitForAvailable();
-        final Network vpnNetwork = cb.currentNetwork;
-        assertNotNull(vpnNetwork);
-
-        final NetworkCapabilities caps = sCM.getNetworkCapabilities(vpnNetwork);
-        assertTrue(caps.hasTransport(TRANSPORT_VPN));
-        assertTrue(caps.hasCapability(NET_CAPABILITY_INTERNET));
-        assertEquals(Process.myUid(), caps.getOwnerUid());
-
-        sVpnMgr.stopProvisionedVpnProfile();
-        cb.waitForLost();
-        assertEquals(vpnNetwork, cb.lastLostNetwork);
-    }
-
-    private void doTestStartStopVpnProfile(boolean testIpv6) throws Exception {
-        // Non-final; these variables ensure we clean up properly after our test if we have
-        // allocated test network resources
-        final TestNetworkManager tnm = sContext.getSystemService(TestNetworkManager.class);
-        TestNetworkInterface testIface = null;
-        TestNetworkCallback tunNetworkCallback = null;
-
-        try {
-            // Build underlying test network
-            testIface = tnm.createTunInterface(
-                    new LinkAddress[] {
-                            new LinkAddress(LOCAL_OUTER_4, IP4_PREFIX_LEN),
-                            new LinkAddress(LOCAL_OUTER_6, IP6_PREFIX_LEN)});
-
-            // Hold on to this callback to ensure network does not get reaped.
-            tunNetworkCallback = mCtsNetUtils.setupAndGetTestNetwork(
-                    testIface.getInterfaceName());
-            final IkeTunUtils tunUtils = new IkeTunUtils(testIface.getFileDescriptor());
-
-            checkStartStopVpnProfileBuildsNetworks(tunUtils, testIpv6);
-        } finally {
-            // Make sure to stop the VPN profile. This is safe to call multiple times.
-            sVpnMgr.stopProvisionedVpnProfile();
-
-            if (testIface != null) {
-                testIface.getFileDescriptor().close();
-            }
-
-            if (tunNetworkCallback != null) {
-                sCM.unregisterNetworkCallback(tunNetworkCallback);
-            }
-
-            final Network testNetwork = tunNetworkCallback.currentNetwork;
-            if (testNetwork != null) {
-                tnm.teardownTestNetwork(testNetwork);
-            }
-        }
-    }
-
-    @Test
-    public void testStartStopVpnProfileV4() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-
-        // Requires shell permission to update appops.
-        runWithShellPermissionIdentity(() -> {
-            doTestStartStopVpnProfile(false);
-        });
-    }
-
-    @Test
-    public void testStartStopVpnProfileV6() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-
-        // Requires shell permission to update appops.
-        runWithShellPermissionIdentity(() -> {
-            doTestStartStopVpnProfile(true);
-        });
-    }
-
-    private static class CertificateAndKey {
-        public final X509Certificate cert;
-        public final PrivateKey key;
-
-        CertificateAndKey(X509Certificate cert, PrivateKey key) {
-            this.cert = cert;
-            this.key = key;
-        }
-    }
-
-    private static CertificateAndKey generateRandomCertAndKeyPair() throws Exception {
-        final Date validityBeginDate =
-                new Date(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1L));
-        final Date validityEndDate =
-                new Date(System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1L));
-
-        // Generate a keypair
-        final KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
-        keyPairGenerator.initialize(512);
-        final KeyPair keyPair = keyPairGenerator.generateKeyPair();
-
-        final X500Principal dnName = new X500Principal("CN=test.android.com");
-        final X509V1CertificateGenerator certGen = new X509V1CertificateGenerator();
-        certGen.setSerialNumber(BigInteger.valueOf(System.currentTimeMillis()));
-        certGen.setSubjectDN(dnName);
-        certGen.setIssuerDN(dnName);
-        certGen.setNotBefore(validityBeginDate);
-        certGen.setNotAfter(validityEndDate);
-        certGen.setPublicKey(keyPair.getPublic());
-        certGen.setSignatureAlgorithm("SHA256WithRSAEncryption");
-
-        final X509Certificate cert = certGen.generate(keyPair.getPrivate(), "AndroidOpenSSL");
-        return new CertificateAndKey(cert, keyPair.getPrivate());
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/InetAddressesTest.java b/tests/tests/net/src/android/net/cts/InetAddressesTest.java
deleted file mode 100644
index 7837ce9..0000000
--- a/tests/tests/net/src/android/net/cts/InetAddressesTest.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2018 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.net.InetAddresses;
-import java.net.InetAddress;
-import junitparams.JUnitParamsRunner;
-import junitparams.Parameters;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-@RunWith(JUnitParamsRunner.class)
-public class InetAddressesTest {
-
-    public static String[][] validNumericAddressesAndStringRepresentation() {
-        return new String[][] {
-            // Regular IPv4.
-            { "1.2.3.4", "1.2.3.4" },
-
-            // Regular IPv6.
-            { "2001:4860:800d::68", "2001:4860:800d::68" },
-            { "1234:5678::9ABC:DEF0", "1234:5678::9abc:def0" },
-            { "2001:cdba:9abc:5678::", "2001:cdba:9abc:5678::" },
-            { "::2001:cdba:9abc:5678", "::2001:cdba:9abc:5678" },
-            { "64:ff9b::1.2.3.4", "64:ff9b::102:304" },
-
-            { "::9abc:5678", "::154.188.86.120" },
-
-            // Mapped IPv4
-            { "::ffff:127.0.0.1", "127.0.0.1" },
-
-            // Android does not recognize Octal (leading 0) cases: they are treated as decimal.
-            { "0177.00.00.01", "177.0.0.1" },
-
-            // Verify that examples from JavaDoc work correctly.
-            { "192.0.2.1", "192.0.2.1" },
-            { "2001:db8::1:2", "2001:db8::1:2" },
-        };
-    }
-
-    public static String[] invalidNumericAddresses() {
-        return new String[] {
-            "",
-            " ",
-            "\t",
-            "\n",
-            "1.2.3.4.",
-            "1.2.3",
-            "1.2",
-            "1",
-            "1234",
-            "0",
-            "0x1.0x2.0x3.0x4",
-            "0x7f.0x00.0x00.0x01",
-            "0256.00.00.01",
-            "fred",
-            "www.google.com",
-            // IPv6 encoded for use in URL as defined in RFC 2732
-            "[fe80::6:2222]",
-        };
-    }
-
-    @Parameters(method = "validNumericAddressesAndStringRepresentation")
-    @Test
-    public void parseNumericAddress(String address, String expectedString) {
-        InetAddress inetAddress = InetAddresses.parseNumericAddress(address);
-        assertEquals(expectedString, inetAddress.getHostAddress());
-    }
-
-    @Parameters(method = "invalidNumericAddresses")
-    @Test
-    public void test_parseNonNumericAddress(String address) {
-        try {
-            InetAddress inetAddress = InetAddresses.parseNumericAddress(address);
-            fail(String.format(
-                "Address %s is not numeric but was parsed as %s", address, inetAddress));
-        } catch (IllegalArgumentException e) {
-            assertThat(e.getMessage()).contains(address);
-        }
-    }
-
-    @Test
-    public void test_parseNumericAddress_null() {
-        try {
-            InetAddress inetAddress = InetAddresses.parseNumericAddress(null);
-            fail(String.format("null is not numeric but was parsed as %s", inetAddress));
-        } catch (NullPointerException e) {
-            // expected
-        }
-    }
-
-    @Parameters(method = "validNumericAddressesAndStringRepresentation")
-    @Test
-    public void test_isNumericAddress(String address, String unused) {
-        assertTrue("expected '" + address + "' to be treated as numeric",
-            InetAddresses.isNumericAddress(address));
-    }
-
-    @Parameters(method = "invalidNumericAddresses")
-    @Test
-    public void test_isNotNumericAddress(String address) {
-        assertFalse("expected '" + address + "' to be treated as non-numeric",
-            InetAddresses.isNumericAddress(address));
-    }
-
-    @Test
-    public void test_isNumericAddress_null() {
-        try {
-            InetAddresses.isNumericAddress(null);
-            fail("expected null to throw a NullPointerException");
-        } catch (NullPointerException e) {
-            // expected
-        }
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/IpConfigurationTest.java b/tests/tests/net/src/android/net/cts/IpConfigurationTest.java
deleted file mode 100644
index c6bc077..0000000
--- a/tests/tests/net/src/android/net/cts/IpConfigurationTest.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2019 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 static com.android.testutils.ParcelUtilsKt.assertParcelSane;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-import android.net.IpConfiguration;
-import android.net.LinkAddress;
-import android.net.ProxyInfo;
-import android.net.StaticIpConfiguration;
-
-import androidx.test.runner.AndroidJUnit4;
-
-import libcore.net.InetAddressUtils;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.net.InetAddress;
-import java.util.ArrayList;
-
-@RunWith(AndroidJUnit4.class)
-public final class IpConfigurationTest {
-    private static final LinkAddress LINKADDR = new LinkAddress("192.0.2.2/25");
-    private static final InetAddress GATEWAY = InetAddressUtils.parseNumericAddress("192.0.2.1");
-    private static final InetAddress DNS1 = InetAddressUtils.parseNumericAddress("8.8.8.8");
-    private static final InetAddress DNS2 = InetAddressUtils.parseNumericAddress("8.8.4.4");
-    private static final String DOMAINS = "example.com";
-
-    private static final ArrayList<InetAddress> dnsServers = new ArrayList<>();
-
-    private StaticIpConfiguration mStaticIpConfig;
-    private ProxyInfo mProxy;
-
-    @Before
-    public void setUp() {
-        dnsServers.add(DNS1);
-        dnsServers.add(DNS2);
-        mStaticIpConfig = new StaticIpConfiguration.Builder()
-                .setIpAddress(LINKADDR)
-                .setGateway(GATEWAY)
-                .setDnsServers(dnsServers)
-                .setDomains(DOMAINS)
-                .build();
-
-        mProxy = ProxyInfo.buildDirectProxy("test", 8888);
-    }
-
-    @Test
-    public void testConstructor() {
-        IpConfiguration ipConfig = new IpConfiguration();
-        checkEmpty(ipConfig);
-        assertIpConfigurationEqual(ipConfig, new IpConfiguration());
-        assertIpConfigurationEqual(ipConfig, new IpConfiguration(ipConfig));
-
-        ipConfig.setStaticIpConfiguration(mStaticIpConfig);
-        ipConfig.setHttpProxy(mProxy);
-
-        ipConfig.setIpAssignment(IpConfiguration.IpAssignment.STATIC);
-        ipConfig.setProxySettings(IpConfiguration.ProxySettings.PAC);
-        assertIpConfigurationEqual(ipConfig, new IpConfiguration(ipConfig));
-
-        ipConfig.setIpAssignment(IpConfiguration.IpAssignment.STATIC);
-        ipConfig.setProxySettings(IpConfiguration.ProxySettings.STATIC);
-        assertIpConfigurationEqual(ipConfig, new IpConfiguration(ipConfig));
-
-        ipConfig.setIpAssignment(IpConfiguration.IpAssignment.DHCP);
-        ipConfig.setProxySettings(IpConfiguration.ProxySettings.PAC);
-        assertIpConfigurationEqual(ipConfig, new IpConfiguration(ipConfig));
-
-        ipConfig.setIpAssignment(IpConfiguration.IpAssignment.DHCP);
-        ipConfig.setProxySettings(IpConfiguration.ProxySettings.PAC);
-        assertIpConfigurationEqual(ipConfig, new IpConfiguration(ipConfig));
-
-        ipConfig.setIpAssignment(IpConfiguration.IpAssignment.DHCP);
-        ipConfig.setProxySettings(IpConfiguration.ProxySettings.STATIC);
-        assertIpConfigurationEqual(ipConfig, new IpConfiguration(ipConfig));
-
-        ipConfig.setIpAssignment(IpConfiguration.IpAssignment.DHCP);
-        ipConfig.setProxySettings(IpConfiguration.ProxySettings.NONE);
-        assertIpConfigurationEqual(ipConfig, new IpConfiguration(ipConfig));
-    }
-
-    private void checkEmpty(IpConfiguration config) {
-        assertEquals(IpConfiguration.IpAssignment.UNASSIGNED,
-                config.getIpAssignment().UNASSIGNED);
-        assertEquals(IpConfiguration.ProxySettings.UNASSIGNED,
-                config.getProxySettings().UNASSIGNED);
-        assertNull(config.getStaticIpConfiguration());
-        assertNull(config.getHttpProxy());
-    }
-
-    private void assertIpConfigurationEqual(IpConfiguration source, IpConfiguration target) {
-        assertEquals(source.getIpAssignment(), target.getIpAssignment());
-        assertEquals(source.getProxySettings(), target.getProxySettings());
-        assertEquals(source.getHttpProxy(), target.getHttpProxy());
-        assertEquals(source.getStaticIpConfiguration(), target.getStaticIpConfiguration());
-    }
-
-    @Test
-    public void testParcel() {
-        final IpConfiguration config = new IpConfiguration();
-        assertParcelSane(config, 4);
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/IpSecBaseTest.java b/tests/tests/net/src/android/net/cts/IpSecBaseTest.java
deleted file mode 100644
index 10e43e7..0000000
--- a/tests/tests/net/src/android/net/cts/IpSecBaseTest.java
+++ /dev/null
@@ -1,556 +0,0 @@
-/*
- * Copyright (C) 2018 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 static org.junit.Assert.assertArrayEquals;
-
-import android.content.Context;
-import android.net.ConnectivityManager;
-import android.net.IpSecAlgorithm;
-import android.net.IpSecManager;
-import android.net.IpSecTransform;
-import android.platform.test.annotations.AppModeFull;
-import android.system.Os;
-import android.system.OsConstants;
-import android.util.Log;
-
-import androidx.test.InstrumentationRegistry;
-import androidx.test.runner.AndroidJUnit4;
-
-import java.io.FileDescriptor;
-import java.io.IOException;
-import java.net.DatagramPacket;
-import java.net.DatagramSocket;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.net.SocketException;
-import java.util.Arrays;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class IpSecBaseTest {
-
-    private static final String TAG = IpSecBaseTest.class.getSimpleName();
-
-    protected static final String IPV4_LOOPBACK = "127.0.0.1";
-    protected static final String IPV6_LOOPBACK = "::1";
-    protected static final String[] LOOPBACK_ADDRS = new String[] {IPV4_LOOPBACK, IPV6_LOOPBACK};
-    protected static final int[] DIRECTIONS =
-            new int[] {IpSecManager.DIRECTION_IN, IpSecManager.DIRECTION_OUT};
-
-    protected static final byte[] TEST_DATA = "Best test data ever!".getBytes();
-    protected static final int DATA_BUFFER_LEN = 4096;
-    protected static final int SOCK_TIMEOUT = 500;
-
-    private static final byte[] KEY_DATA = {
-        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-        0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-        0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-        0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
-        0x20, 0x21, 0x22, 0x23
-    };
-
-    protected static final byte[] AUTH_KEY = getKey(256);
-    protected static final byte[] CRYPT_KEY = getKey(256);
-
-    protected ConnectivityManager mCM;
-    protected IpSecManager mISM;
-
-    @Before
-    public void setUp() throws Exception {
-        mISM =
-                (IpSecManager)
-                        InstrumentationRegistry.getContext()
-                                .getSystemService(Context.IPSEC_SERVICE);
-        mCM =
-                (ConnectivityManager)
-                        InstrumentationRegistry.getContext()
-                                .getSystemService(Context.CONNECTIVITY_SERVICE);
-    }
-
-    protected static byte[] getKey(int bitLength) {
-        return Arrays.copyOf(KEY_DATA, bitLength / 8);
-    }
-
-    protected static int getDomain(InetAddress address) {
-        int domain;
-        if (address instanceof Inet6Address) {
-            domain = OsConstants.AF_INET6;
-        } else {
-            domain = OsConstants.AF_INET;
-        }
-        return domain;
-    }
-
-    protected static int getPort(FileDescriptor sock) throws Exception {
-        return ((InetSocketAddress) Os.getsockname(sock)).getPort();
-    }
-
-    public static interface GenericSocket extends AutoCloseable {
-        void send(byte[] data) throws Exception;
-
-        byte[] receive() throws Exception;
-
-        int getPort() throws Exception;
-
-        void close() throws Exception;
-
-        void applyTransportModeTransform(
-                IpSecManager ism, int direction, IpSecTransform transform) throws Exception;
-
-        void removeTransportModeTransforms(IpSecManager ism) throws Exception;
-    }
-
-    public static interface GenericTcpSocket extends GenericSocket {}
-
-    public static interface GenericUdpSocket extends GenericSocket {
-        void sendTo(byte[] data, InetAddress dstAddr, int port) throws Exception;
-    }
-
-    public abstract static class NativeSocket implements GenericSocket {
-        public FileDescriptor mFd;
-
-        public NativeSocket(FileDescriptor fd) {
-            mFd = fd;
-        }
-
-        @Override
-        public void send(byte[] data) throws Exception {
-            Os.write(mFd, data, 0, data.length);
-        }
-
-        @Override
-        public byte[] receive() throws Exception {
-            byte[] in = new byte[DATA_BUFFER_LEN];
-            AtomicInteger bytesRead = new AtomicInteger(-1);
-
-            Thread readSockThread = new Thread(() -> {
-                long startTime = System.currentTimeMillis();
-                while (bytesRead.get() < 0 && System.currentTimeMillis() < startTime + SOCK_TIMEOUT) {
-                    try {
-                        bytesRead.set(Os.recvfrom(mFd, in, 0, DATA_BUFFER_LEN, 0, null));
-                    } catch (Exception e) {
-                        Log.e(TAG, "Error encountered reading from socket", e);
-                    }
-                }
-            });
-
-            readSockThread.start();
-            readSockThread.join(SOCK_TIMEOUT);
-
-            if (bytesRead.get() < 0) {
-                throw new IOException("No data received from socket");
-            }
-
-            return Arrays.copyOfRange(in, 0, bytesRead.get());
-        }
-
-        @Override
-        public int getPort() throws Exception {
-            return IpSecBaseTest.getPort(mFd);
-        }
-
-        @Override
-        public void close() throws Exception {
-            Os.close(mFd);
-        }
-
-        @Override
-        public void applyTransportModeTransform(
-                IpSecManager ism, int direction, IpSecTransform transform) throws Exception {
-            ism.applyTransportModeTransform(mFd, direction, transform);
-        }
-
-        @Override
-        public void removeTransportModeTransforms(IpSecManager ism) throws Exception {
-            ism.removeTransportModeTransforms(mFd);
-        }
-    }
-
-    public static class NativeTcpSocket extends NativeSocket implements GenericTcpSocket {
-        public NativeTcpSocket(FileDescriptor fd) {
-            super(fd);
-        }
-    }
-
-    public static class NativeUdpSocket extends NativeSocket implements GenericUdpSocket {
-        public NativeUdpSocket(FileDescriptor fd) {
-            super(fd);
-        }
-
-        @Override
-        public void sendTo(byte[] data, InetAddress dstAddr, int port) throws Exception {
-            Os.sendto(mFd, data, 0, data.length, 0, dstAddr, port);
-        }
-    }
-
-    public static class JavaUdpSocket implements GenericUdpSocket {
-        public final DatagramSocket mSocket;
-
-        public JavaUdpSocket(InetAddress localAddr, int port) {
-            try {
-                mSocket = new DatagramSocket(port, localAddr);
-                mSocket.setSoTimeout(SOCK_TIMEOUT);
-            } catch (SocketException e) {
-                // Fail loudly if we can't set up sockets properly. And without the timeout, we
-                // could easily end up in an endless wait.
-                throw new RuntimeException(e);
-            }
-        }
-
-        public JavaUdpSocket(InetAddress localAddr) {
-            try {
-                mSocket = new DatagramSocket(0, localAddr);
-                mSocket.setSoTimeout(SOCK_TIMEOUT);
-            } catch (SocketException e) {
-                // Fail loudly if we can't set up sockets properly. And without the timeout, we
-                // could easily end up in an endless wait.
-                throw new RuntimeException(e);
-            }
-        }
-
-        @Override
-        public void send(byte[] data) throws Exception {
-            mSocket.send(new DatagramPacket(data, data.length));
-        }
-
-        @Override
-        public void sendTo(byte[] data, InetAddress dstAddr, int port) throws Exception {
-            mSocket.send(new DatagramPacket(data, data.length, dstAddr, port));
-        }
-
-        @Override
-        public int getPort() throws Exception {
-            return mSocket.getLocalPort();
-        }
-
-        @Override
-        public void close() throws Exception {
-            mSocket.close();
-        }
-
-        @Override
-        public byte[] receive() throws Exception {
-            DatagramPacket data = new DatagramPacket(new byte[DATA_BUFFER_LEN], DATA_BUFFER_LEN);
-            mSocket.receive(data);
-            return Arrays.copyOfRange(data.getData(), 0, data.getLength());
-        }
-
-        @Override
-        public void applyTransportModeTransform(
-                IpSecManager ism, int direction, IpSecTransform transform) throws Exception {
-            ism.applyTransportModeTransform(mSocket, direction, transform);
-        }
-
-        @Override
-        public void removeTransportModeTransforms(IpSecManager ism) throws Exception {
-            ism.removeTransportModeTransforms(mSocket);
-        }
-    }
-
-    public static class JavaTcpSocket implements GenericTcpSocket {
-        public final Socket mSocket;
-
-        public JavaTcpSocket(Socket socket) {
-            mSocket = socket;
-            try {
-                mSocket.setSoTimeout(SOCK_TIMEOUT);
-            } catch (SocketException e) {
-                // Fail loudly if we can't set up sockets properly. And without the timeout, we
-                // could easily end up in an endless wait.
-                throw new RuntimeException(e);
-            }
-        }
-
-        @Override
-        public void send(byte[] data) throws Exception {
-            mSocket.getOutputStream().write(data);
-        }
-
-        @Override
-        public byte[] receive() throws Exception {
-            byte[] in = new byte[DATA_BUFFER_LEN];
-            int bytesRead = mSocket.getInputStream().read(in);
-            return Arrays.copyOfRange(in, 0, bytesRead);
-        }
-
-        @Override
-        public int getPort() throws Exception {
-            return mSocket.getLocalPort();
-        }
-
-        @Override
-        public void close() throws Exception {
-            mSocket.close();
-        }
-
-        @Override
-        public void applyTransportModeTransform(
-                IpSecManager ism, int direction, IpSecTransform transform) throws Exception {
-            ism.applyTransportModeTransform(mSocket, direction, transform);
-        }
-
-        @Override
-        public void removeTransportModeTransforms(IpSecManager ism) throws Exception {
-            ism.removeTransportModeTransforms(mSocket);
-        }
-    }
-
-    public static class SocketPair<T> {
-        public final T mLeftSock;
-        public final T mRightSock;
-
-        public SocketPair(T leftSock, T rightSock) {
-            mLeftSock = leftSock;
-            mRightSock = rightSock;
-        }
-    }
-
-    protected static void applyTransformBidirectionally(
-            IpSecManager ism, IpSecTransform transform, GenericSocket socket) throws Exception {
-        for (int direction : DIRECTIONS) {
-            socket.applyTransportModeTransform(ism, direction, transform);
-        }
-    }
-
-    public static SocketPair<NativeUdpSocket> getNativeUdpSocketPair(
-            InetAddress localAddr, IpSecManager ism, IpSecTransform transform, boolean connected)
-            throws Exception {
-        int domain = getDomain(localAddr);
-
-        NativeUdpSocket leftSock = new NativeUdpSocket(
-            Os.socket(domain, OsConstants.SOCK_DGRAM, OsConstants.IPPROTO_UDP));
-        NativeUdpSocket rightSock = new NativeUdpSocket(
-            Os.socket(domain, OsConstants.SOCK_DGRAM, OsConstants.IPPROTO_UDP));
-
-        for (NativeUdpSocket sock : new NativeUdpSocket[] {leftSock, rightSock}) {
-            applyTransformBidirectionally(ism, transform, sock);
-            Os.bind(sock.mFd, localAddr, 0);
-        }
-
-        if (connected) {
-            Os.connect(leftSock.mFd, localAddr, rightSock.getPort());
-            Os.connect(rightSock.mFd, localAddr, leftSock.getPort());
-        }
-
-        return new SocketPair<>(leftSock, rightSock);
-    }
-
-    public static SocketPair<NativeTcpSocket> getNativeTcpSocketPair(
-            InetAddress localAddr, IpSecManager ism, IpSecTransform transform) throws Exception {
-        int domain = getDomain(localAddr);
-
-        NativeTcpSocket server = new NativeTcpSocket(
-                Os.socket(domain, OsConstants.SOCK_STREAM, OsConstants.IPPROTO_TCP));
-        NativeTcpSocket client = new NativeTcpSocket(
-                Os.socket(domain, OsConstants.SOCK_STREAM, OsConstants.IPPROTO_TCP));
-
-        Os.bind(server.mFd, localAddr, 0);
-
-        applyTransformBidirectionally(ism, transform, server);
-        applyTransformBidirectionally(ism, transform, client);
-
-        Os.listen(server.mFd, 10);
-        Os.connect(client.mFd, localAddr, server.getPort());
-        NativeTcpSocket accepted = new NativeTcpSocket(Os.accept(server.mFd, null));
-
-        applyTransformBidirectionally(ism, transform, accepted);
-        server.close();
-
-        return new SocketPair<>(client, accepted);
-    }
-
-    public static SocketPair<JavaUdpSocket> getJavaUdpSocketPair(
-            InetAddress localAddr, IpSecManager ism, IpSecTransform transform, boolean connected)
-            throws Exception {
-        JavaUdpSocket leftSock = new JavaUdpSocket(localAddr);
-        JavaUdpSocket rightSock = new JavaUdpSocket(localAddr);
-
-        applyTransformBidirectionally(ism, transform, leftSock);
-        applyTransformBidirectionally(ism, transform, rightSock);
-
-        if (connected) {
-            leftSock.mSocket.connect(localAddr, rightSock.mSocket.getLocalPort());
-            rightSock.mSocket.connect(localAddr, leftSock.mSocket.getLocalPort());
-        }
-
-        return new SocketPair<>(leftSock, rightSock);
-    }
-
-    public static SocketPair<JavaTcpSocket> getJavaTcpSocketPair(
-            InetAddress localAddr, IpSecManager ism, IpSecTransform transform) throws Exception {
-        JavaTcpSocket clientSock = new JavaTcpSocket(new Socket());
-        ServerSocket serverSocket = new ServerSocket();
-        serverSocket.bind(new InetSocketAddress(localAddr, 0));
-
-        // While technically the client socket does not need to be bound, the OpenJDK implementation
-        // of Socket only allocates an FD when bind() or connect() or other similar methods are
-        // called. So we call bind to force the FD creation, so that we can apply a transform to it
-        // prior to socket connect.
-        clientSock.mSocket.bind(new InetSocketAddress(localAddr, 0));
-
-        // IpSecService doesn't support serverSockets at the moment; workaround using FD
-        FileDescriptor serverFd = serverSocket.getImpl().getFD$();
-
-        applyTransformBidirectionally(ism, transform, new NativeTcpSocket(serverFd));
-        applyTransformBidirectionally(ism, transform, clientSock);
-
-        clientSock.mSocket.connect(new InetSocketAddress(localAddr, serverSocket.getLocalPort()));
-        JavaTcpSocket acceptedSock = new JavaTcpSocket(serverSocket.accept());
-
-        applyTransformBidirectionally(ism, transform, acceptedSock);
-        serverSocket.close();
-
-        return new SocketPair<>(clientSock, acceptedSock);
-    }
-
-    private void checkSocketPair(GenericSocket left, GenericSocket right) throws Exception {
-        left.send(TEST_DATA);
-        assertArrayEquals(TEST_DATA, right.receive());
-
-        right.send(TEST_DATA);
-        assertArrayEquals(TEST_DATA, left.receive());
-
-        left.close();
-        right.close();
-    }
-
-    private void checkUnconnectedUdpSocketPair(
-            GenericUdpSocket left, GenericUdpSocket right, InetAddress localAddr) throws Exception {
-        left.sendTo(TEST_DATA, localAddr, right.getPort());
-        assertArrayEquals(TEST_DATA, right.receive());
-
-        right.sendTo(TEST_DATA, localAddr, left.getPort());
-        assertArrayEquals(TEST_DATA, left.receive());
-
-        left.close();
-        right.close();
-    }
-
-    protected static IpSecTransform buildIpSecTransform(
-            Context context,
-            IpSecManager.SecurityParameterIndex spi,
-            IpSecManager.UdpEncapsulationSocket encapSocket,
-            InetAddress remoteAddr)
-            throws Exception {
-        IpSecTransform.Builder builder =
-                new IpSecTransform.Builder(context)
-                        .setEncryption(new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY))
-                        .setAuthentication(
-                                new IpSecAlgorithm(
-                                        IpSecAlgorithm.AUTH_HMAC_SHA256,
-                                        AUTH_KEY,
-                                        AUTH_KEY.length * 4));
-
-        if (encapSocket != null) {
-            builder.setIpv4Encapsulation(encapSocket, encapSocket.getPort());
-        }
-
-        return builder.buildTransportModeTransform(remoteAddr, spi);
-    }
-
-    private IpSecTransform buildDefaultTransform(InetAddress localAddr) throws Exception {
-        try (IpSecManager.SecurityParameterIndex spi =
-                mISM.allocateSecurityParameterIndex(localAddr)) {
-            return buildIpSecTransform(InstrumentationRegistry.getContext(), spi, null, localAddr);
-        }
-    }
-
-    @Test
-    @AppModeFull(reason = "Socket cannot bind in instant app mode")
-    public void testJavaTcpSocketPair() throws Exception {
-        for (String addr : LOOPBACK_ADDRS) {
-            InetAddress local = InetAddress.getByName(addr);
-            try (IpSecTransform transform = buildDefaultTransform(local)) {
-                SocketPair<JavaTcpSocket> sockets = getJavaTcpSocketPair(local, mISM, transform);
-                checkSocketPair(sockets.mLeftSock, sockets.mRightSock);
-            }
-        }
-    }
-
-    @Test
-    @AppModeFull(reason = "Socket cannot bind in instant app mode")
-    public void testJavaUdpSocketPair() throws Exception {
-        for (String addr : LOOPBACK_ADDRS) {
-            InetAddress local = InetAddress.getByName(addr);
-            try (IpSecTransform transform = buildDefaultTransform(local)) {
-                SocketPair<JavaUdpSocket> sockets =
-                        getJavaUdpSocketPair(local, mISM, transform, true);
-                checkSocketPair(sockets.mLeftSock, sockets.mRightSock);
-            }
-        }
-    }
-
-    @Test
-    @AppModeFull(reason = "Socket cannot bind in instant app mode")
-    public void testJavaUdpSocketPairUnconnected() throws Exception {
-        for (String addr : LOOPBACK_ADDRS) {
-            InetAddress local = InetAddress.getByName(addr);
-            try (IpSecTransform transform = buildDefaultTransform(local)) {
-                SocketPair<JavaUdpSocket> sockets =
-                        getJavaUdpSocketPair(local, mISM, transform, false);
-                checkUnconnectedUdpSocketPair(sockets.mLeftSock, sockets.mRightSock, local);
-            }
-        }
-    }
-
-    @Test
-    @AppModeFull(reason = "Socket cannot bind in instant app mode")
-    public void testNativeTcpSocketPair() throws Exception {
-        for (String addr : LOOPBACK_ADDRS) {
-            InetAddress local = InetAddress.getByName(addr);
-            try (IpSecTransform transform = buildDefaultTransform(local)) {
-                SocketPair<NativeTcpSocket> sockets =
-                        getNativeTcpSocketPair(local, mISM, transform);
-                checkSocketPair(sockets.mLeftSock, sockets.mRightSock);
-            }
-        }
-    }
-
-    @Test
-    @AppModeFull(reason = "Socket cannot bind in instant app mode")
-    public void testNativeUdpSocketPair() throws Exception {
-        for (String addr : LOOPBACK_ADDRS) {
-            InetAddress local = InetAddress.getByName(addr);
-            try (IpSecTransform transform = buildDefaultTransform(local)) {
-                SocketPair<NativeUdpSocket> sockets =
-                        getNativeUdpSocketPair(local, mISM, transform, true);
-                checkSocketPair(sockets.mLeftSock, sockets.mRightSock);
-            }
-        }
-    }
-
-    @Test
-    @AppModeFull(reason = "Socket cannot bind in instant app mode")
-    public void testNativeUdpSocketPairUnconnected() throws Exception {
-        for (String addr : LOOPBACK_ADDRS) {
-            InetAddress local = InetAddress.getByName(addr);
-            try (IpSecTransform transform = buildDefaultTransform(local)) {
-                SocketPair<NativeUdpSocket> sockets =
-                        getNativeUdpSocketPair(local, mISM, transform, false);
-                checkUnconnectedUdpSocketPair(sockets.mLeftSock, sockets.mRightSock, local);
-            }
-        }
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/IpSecManagerTest.java b/tests/tests/net/src/android/net/cts/IpSecManagerTest.java
deleted file mode 100644
index 355b496..0000000
--- a/tests/tests/net/src/android/net/cts/IpSecManagerTest.java
+++ /dev/null
@@ -1,1189 +0,0 @@
-/*
- * Copyright (C) 2017 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 static android.net.cts.PacketUtils.AES_CBC_BLK_SIZE;
-import static android.net.cts.PacketUtils.AES_CBC_IV_LEN;
-import static android.net.cts.PacketUtils.AES_GCM_BLK_SIZE;
-import static android.net.cts.PacketUtils.AES_GCM_IV_LEN;
-import static android.net.cts.PacketUtils.IP4_HDRLEN;
-import static android.net.cts.PacketUtils.IP6_HDRLEN;
-import static android.net.cts.PacketUtils.TCP_HDRLEN_WITH_TIMESTAMP_OPT;
-import static android.net.cts.PacketUtils.UDP_HDRLEN;
-import static android.system.OsConstants.IPPROTO_TCP;
-import static android.system.OsConstants.IPPROTO_UDP;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import android.net.IpSecAlgorithm;
-import android.net.IpSecManager;
-import android.net.IpSecTransform;
-import android.net.TrafficStats;
-import android.platform.test.annotations.AppModeFull;
-import android.system.ErrnoException;
-import android.system.Os;
-import android.system.OsConstants;
-
-import androidx.test.InstrumentationRegistry;
-import androidx.test.runner.AndroidJUnit4;
-
-import java.io.FileDescriptor;
-import java.io.IOException;
-import java.net.DatagramPacket;
-import java.net.DatagramSocket;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.util.Arrays;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-@AppModeFull(reason = "Socket cannot bind in instant app mode")
-public class IpSecManagerTest extends IpSecBaseTest {
-
-    private static final String TAG = IpSecManagerTest.class.getSimpleName();
-
-    private static final InetAddress GOOGLE_DNS_4 = InetAddress.parseNumericAddress("8.8.8.8");
-    private static final InetAddress GOOGLE_DNS_6 =
-            InetAddress.parseNumericAddress("2001:4860:4860::8888");
-
-    private static final InetAddress[] GOOGLE_DNS_LIST =
-            new InetAddress[] {GOOGLE_DNS_4, GOOGLE_DNS_6};
-
-    private static final int DROID_SPI = 0xD1201D;
-    private static final int MAX_PORT_BIND_ATTEMPTS = 10;
-
-    private static final byte[] AEAD_KEY = getKey(288);
-
-    /*
-     * Allocate a random SPI
-     * Allocate a specific SPI using previous randomly created SPI value
-     * Realloc the same SPI that was specifically created (expect SpiUnavailable)
-     * Close SPIs
-     */
-    @Test
-    public void testAllocSpi() throws Exception {
-        for (InetAddress addr : GOOGLE_DNS_LIST) {
-            IpSecManager.SecurityParameterIndex randomSpi = null, droidSpi = null;
-            randomSpi = mISM.allocateSecurityParameterIndex(addr);
-            assertTrue(
-                    "Failed to receive a valid SPI",
-                    randomSpi.getSpi() != IpSecManager.INVALID_SECURITY_PARAMETER_INDEX);
-
-            droidSpi = mISM.allocateSecurityParameterIndex(addr, DROID_SPI);
-            assertTrue("Failed to allocate specified SPI, " + DROID_SPI,
-                    droidSpi.getSpi() == DROID_SPI);
-
-            try {
-                mISM.allocateSecurityParameterIndex(addr, DROID_SPI);
-                fail("Duplicate SPI was allowed to be created");
-            } catch (IpSecManager.SpiUnavailableException expected) {
-                // This is a success case because we expect a dupe SPI to throw
-            }
-
-            randomSpi.close();
-            droidSpi.close();
-        }
-    }
-
-    /** This function finds an available port */
-    private static int findUnusedPort() throws Exception {
-        // Get an available port.
-        DatagramSocket s = new DatagramSocket();
-        int port = s.getLocalPort();
-        s.close();
-        return port;
-    }
-
-    private static FileDescriptor getBoundUdpSocket(InetAddress address) throws Exception {
-        FileDescriptor sock =
-                Os.socket(getDomain(address), OsConstants.SOCK_DGRAM, OsConstants.IPPROTO_UDP);
-
-        for (int i = 0; i < MAX_PORT_BIND_ATTEMPTS; i++) {
-            try {
-                int port = findUnusedPort();
-                Os.bind(sock, address, port);
-                break;
-            } catch (ErrnoException e) {
-                // Someone claimed the port since we called findUnusedPort.
-                if (e.errno == OsConstants.EADDRINUSE) {
-                    if (i == MAX_PORT_BIND_ATTEMPTS - 1) {
-
-                        fail("Failed " + MAX_PORT_BIND_ATTEMPTS + " attempts to bind to a port");
-                    }
-                    continue;
-                }
-                throw e.rethrowAsIOException();
-            }
-        }
-        return sock;
-    }
-
-    private void checkUnconnectedUdp(IpSecTransform transform, InetAddress local, int sendCount,
-                                     boolean useJavaSockets) throws Exception {
-        GenericUdpSocket sockLeft = null, sockRight = null;
-        if (useJavaSockets) {
-            SocketPair<JavaUdpSocket> sockets = getJavaUdpSocketPair(local, mISM, transform, false);
-            sockLeft = sockets.mLeftSock;
-            sockRight = sockets.mRightSock;
-        } else {
-            SocketPair<NativeUdpSocket> sockets =
-                    getNativeUdpSocketPair(local, mISM, transform, false);
-            sockLeft = sockets.mLeftSock;
-            sockRight = sockets.mRightSock;
-        }
-
-        for (int i = 0; i < sendCount; i++) {
-            byte[] in;
-
-            sockLeft.sendTo(TEST_DATA, local, sockRight.getPort());
-            in = sockRight.receive();
-            assertArrayEquals("Left-to-right encrypted data did not match.", TEST_DATA, in);
-
-            sockRight.sendTo(TEST_DATA, local, sockLeft.getPort());
-            in = sockLeft.receive();
-            assertArrayEquals("Right-to-left encrypted data did not match.", TEST_DATA, in);
-        }
-
-        sockLeft.close();
-        sockRight.close();
-    }
-
-    private void checkTcp(IpSecTransform transform, InetAddress local, int sendCount,
-                          boolean useJavaSockets) throws Exception {
-        GenericTcpSocket client = null, accepted = null;
-        if (useJavaSockets) {
-            SocketPair<JavaTcpSocket> sockets = getJavaTcpSocketPair(local, mISM, transform);
-            client = sockets.mLeftSock;
-            accepted = sockets.mRightSock;
-        } else {
-            SocketPair<NativeTcpSocket> sockets = getNativeTcpSocketPair(local, mISM, transform);
-            client = sockets.mLeftSock;
-            accepted = sockets.mRightSock;
-        }
-
-        // Wait for TCP handshake packets to be counted
-        StatsChecker.waitForNumPackets(3); // (SYN, SYN+ACK, ACK)
-
-        // Reset StatsChecker, to ignore negotiation overhead.
-        StatsChecker.initStatsChecker();
-        for (int i = 0; i < sendCount; i++) {
-            byte[] in;
-
-            client.send(TEST_DATA);
-            in = accepted.receive();
-            assertArrayEquals("Client-to-server encrypted data did not match.", TEST_DATA, in);
-
-            // Allow for newest data + ack packets to be returned before sending next packet
-            // Also add the number of expected packets in each of the previous runs (4 per run)
-            StatsChecker.waitForNumPackets(2 + (4 * i));
-
-            accepted.send(TEST_DATA);
-            in = client.receive();
-            assertArrayEquals("Server-to-client encrypted data did not match.", TEST_DATA, in);
-
-            // Allow for all data + ack packets to be returned before sending next packet
-            // Also add the number of expected packets in each of the previous runs (4 per run)
-            StatsChecker.waitForNumPackets(4 * (i + 1));
-        }
-
-        // Transforms should not be removed from the sockets, otherwise FIN packets will be sent
-        //     unencrypted.
-        // This test also unfortunately happens to rely on a nuance of the cleanup order. By
-        //     keeping the policy on the socket, but removing the SA before lingering FIN packets
-        //     are sent (at an undetermined later time), the FIN packets are dropped. Without this,
-        //     we run into all kinds of headaches trying to test data accounting (unsolicited
-        //     packets mysteriously appearing and messing up our counters)
-        // The right way to close sockets is to set SO_LINGER to ensure synchronous closure,
-        //     closing the sockets, and then closing the transforms. See documentation for the
-        //     Socket or FileDescriptor flavors of applyTransportModeTransform() in IpSecManager
-        //     for more details.
-
-        client.close();
-        accepted.close();
-    }
-
-    /*
-     * Alloc outbound SPI
-     * Alloc inbound SPI
-     * Create transport mode transform
-     * open socket
-     * apply transform to socket
-     * send data on socket
-     * release transform
-     * send data (expect exception)
-     */
-    @Test
-    public void testCreateTransform() throws Exception {
-        InetAddress localAddr = InetAddress.getByName(IPV4_LOOPBACK);
-        IpSecManager.SecurityParameterIndex spi =
-                mISM.allocateSecurityParameterIndex(localAddr);
-
-        IpSecTransform transform =
-                new IpSecTransform.Builder(InstrumentationRegistry.getContext())
-                        .setEncryption(new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY))
-                        .setAuthentication(
-                                new IpSecAlgorithm(
-                                        IpSecAlgorithm.AUTH_HMAC_SHA256,
-                                        AUTH_KEY,
-                                        AUTH_KEY.length * 8))
-                        .buildTransportModeTransform(localAddr, spi);
-
-        final boolean [][] applyInApplyOut = {
-                {false, false}, {false, true}, {true, false}, {true,true}};
-        final byte[] data = new String("Best test data ever!").getBytes("UTF-8");
-        final DatagramPacket outPacket = new DatagramPacket(data, 0, data.length, localAddr, 0);
-
-        byte[] in = new byte[data.length];
-        DatagramPacket inPacket = new DatagramPacket(in, in.length);
-        DatagramSocket localSocket;
-        int localPort;
-
-        for(boolean[] io : applyInApplyOut) {
-            boolean applyIn = io[0];
-            boolean applyOut = io[1];
-            // Bind localSocket to a random available port.
-            localSocket = new DatagramSocket(0);
-            localPort = localSocket.getLocalPort();
-            localSocket.setSoTimeout(200);
-            outPacket.setPort(localPort);
-            if (applyIn) {
-                mISM.applyTransportModeTransform(
-                        localSocket, IpSecManager.DIRECTION_IN, transform);
-            }
-            if (applyOut) {
-                mISM.applyTransportModeTransform(
-                        localSocket, IpSecManager.DIRECTION_OUT, transform);
-            }
-            if (applyIn == applyOut) {
-                localSocket.send(outPacket);
-                localSocket.receive(inPacket);
-                assertTrue("Encapsulated data did not match.",
-                        Arrays.equals(outPacket.getData(), inPacket.getData()));
-                mISM.removeTransportModeTransforms(localSocket);
-                localSocket.close();
-            } else {
-                try {
-                    localSocket.send(outPacket);
-                    localSocket.receive(inPacket);
-                } catch (IOException e) {
-                    continue;
-                } finally {
-                    mISM.removeTransportModeTransforms(localSocket);
-                    localSocket.close();
-                }
-                // FIXME: This check is disabled because sockets currently receive data
-                // if there is a valid SA for decryption, even when the input policy is
-                // not applied to a socket.
-                //  fail("Data IO should fail on asymmetrical transforms! + Input="
-                //          + applyIn + " Output=" + applyOut);
-            }
-        }
-        transform.close();
-    }
-
-    /** Snapshot of TrafficStats as of initStatsChecker call for later comparisons */
-    private static class StatsChecker {
-        private static final double ERROR_MARGIN_BYTES = 1.05;
-        private static final double ERROR_MARGIN_PKTS = 1.05;
-        private static final int MAX_WAIT_TIME_MILLIS = 1000;
-
-        private static long uidTxBytes;
-        private static long uidRxBytes;
-        private static long uidTxPackets;
-        private static long uidRxPackets;
-
-        private static long ifaceTxBytes;
-        private static long ifaceRxBytes;
-        private static long ifaceTxPackets;
-        private static long ifaceRxPackets;
-
-        /**
-         * This method counts the number of incoming packets, polling intermittently up to
-         * MAX_WAIT_TIME_MILLIS.
-         */
-        private static void waitForNumPackets(int numPackets) throws Exception {
-            long uidTxDelta = 0;
-            long uidRxDelta = 0;
-            for (int i = 0; i < 100; i++) {
-                uidTxDelta = TrafficStats.getUidTxPackets(Os.getuid()) - uidTxPackets;
-                uidRxDelta = TrafficStats.getUidRxPackets(Os.getuid()) - uidRxPackets;
-
-                // TODO: Check Rx packets as well once kernel security policy bug is fixed.
-                // (b/70635417)
-                if (uidTxDelta >= numPackets) {
-                    return;
-                }
-                Thread.sleep(MAX_WAIT_TIME_MILLIS / 100);
-            }
-            fail(
-                    "Not enough traffic was recorded to satisfy the provided conditions: wanted "
-                            + numPackets
-                            + ", got "
-                            + uidTxDelta
-                            + " tx and "
-                            + uidRxDelta
-                            + " rx packets");
-        }
-
-        private static void assertUidStatsDelta(
-                int expectedTxByteDelta,
-                int expectedTxPacketDelta,
-                int minRxByteDelta,
-                int maxRxByteDelta,
-                int expectedRxPacketDelta) {
-            long newUidTxBytes = TrafficStats.getUidTxBytes(Os.getuid());
-            long newUidRxBytes = TrafficStats.getUidRxBytes(Os.getuid());
-            long newUidTxPackets = TrafficStats.getUidTxPackets(Os.getuid());
-            long newUidRxPackets = TrafficStats.getUidRxPackets(Os.getuid());
-
-            assertEquals(expectedTxByteDelta, newUidTxBytes - uidTxBytes);
-            assertTrue(
-                    newUidRxBytes - uidRxBytes >= minRxByteDelta
-                            && newUidRxBytes - uidRxBytes <= maxRxByteDelta);
-            assertEquals(expectedTxPacketDelta, newUidTxPackets - uidTxPackets);
-            assertEquals(expectedRxPacketDelta, newUidRxPackets - uidRxPackets);
-        }
-
-        private static void assertIfaceStatsDelta(
-                int expectedTxByteDelta,
-                int expectedTxPacketDelta,
-                int expectedRxByteDelta,
-                int expectedRxPacketDelta)
-                throws IOException {
-            long newIfaceTxBytes = TrafficStats.getLoopbackTxBytes();
-            long newIfaceRxBytes = TrafficStats.getLoopbackRxBytes();
-            long newIfaceTxPackets = TrafficStats.getLoopbackTxPackets();
-            long newIfaceRxPackets = TrafficStats.getLoopbackRxPackets();
-
-            // Check that iface stats are within an acceptable range; data might be sent
-            // on the local interface by other apps.
-            assertApproxEquals(
-                    ifaceTxBytes, newIfaceTxBytes, expectedTxByteDelta, ERROR_MARGIN_BYTES);
-            assertApproxEquals(
-                    ifaceRxBytes, newIfaceRxBytes, expectedRxByteDelta, ERROR_MARGIN_BYTES);
-            assertApproxEquals(
-                    ifaceTxPackets, newIfaceTxPackets, expectedTxPacketDelta, ERROR_MARGIN_PKTS);
-            assertApproxEquals(
-                    ifaceRxPackets, newIfaceRxPackets, expectedRxPacketDelta, ERROR_MARGIN_PKTS);
-        }
-
-        private static void assertApproxEquals(
-                long oldStats, long newStats, int expectedDelta, double errorMargin) {
-            assertTrue(expectedDelta <= newStats - oldStats);
-            assertTrue((expectedDelta * errorMargin) > newStats - oldStats);
-        }
-
-        private static void initStatsChecker() throws Exception {
-            uidTxBytes = TrafficStats.getUidTxBytes(Os.getuid());
-            uidRxBytes = TrafficStats.getUidRxBytes(Os.getuid());
-            uidTxPackets = TrafficStats.getUidTxPackets(Os.getuid());
-            uidRxPackets = TrafficStats.getUidRxPackets(Os.getuid());
-
-            ifaceTxBytes = TrafficStats.getLoopbackTxBytes();
-            ifaceRxBytes = TrafficStats.getLoopbackRxBytes();
-            ifaceTxPackets = TrafficStats.getLoopbackTxPackets();
-            ifaceRxPackets = TrafficStats.getLoopbackRxPackets();
-        }
-    }
-
-    private int getTruncLenBits(IpSecAlgorithm authOrAead) {
-        return authOrAead == null ? 0 : authOrAead.getTruncationLengthBits();
-    }
-
-    private int getIvLen(IpSecAlgorithm cryptOrAead) {
-        if (cryptOrAead == null) { return 0; }
-
-        switch (cryptOrAead.getName()) {
-            case IpSecAlgorithm.CRYPT_AES_CBC:
-                return AES_CBC_IV_LEN;
-            case IpSecAlgorithm.AUTH_CRYPT_AES_GCM:
-                return AES_GCM_IV_LEN;
-            default:
-                throw new IllegalArgumentException(
-                        "IV length unknown for algorithm" + cryptOrAead.getName());
-        }
-    }
-
-    private int getBlkSize(IpSecAlgorithm cryptOrAead) {
-        // RFC 4303, section 2.4 states that ciphertext plus pad_len, next_header fields must
-        //     terminate on a 4-byte boundary. Thus, the minimum ciphertext block size is 4 bytes.
-        if (cryptOrAead == null) { return 4; }
-
-        switch (cryptOrAead.getName()) {
-            case IpSecAlgorithm.CRYPT_AES_CBC:
-                return AES_CBC_BLK_SIZE;
-            case IpSecAlgorithm.AUTH_CRYPT_AES_GCM:
-                return AES_GCM_BLK_SIZE;
-            default:
-                throw new IllegalArgumentException(
-                        "Blk size unknown for algorithm" + cryptOrAead.getName());
-        }
-    }
-
-    public void checkTransform(
-            int protocol,
-            String localAddress,
-            IpSecAlgorithm crypt,
-            IpSecAlgorithm auth,
-            IpSecAlgorithm aead,
-            boolean doUdpEncap,
-            int sendCount,
-            boolean useJavaSockets)
-            throws Exception {
-        StatsChecker.initStatsChecker();
-        InetAddress local = InetAddress.getByName(localAddress);
-
-        try (IpSecManager.UdpEncapsulationSocket encapSocket = mISM.openUdpEncapsulationSocket();
-                IpSecManager.SecurityParameterIndex spi =
-                        mISM.allocateSecurityParameterIndex(local)) {
-
-            IpSecTransform.Builder transformBuilder =
-                    new IpSecTransform.Builder(InstrumentationRegistry.getContext());
-            if (crypt != null) {
-                transformBuilder.setEncryption(crypt);
-            }
-            if (auth != null) {
-                transformBuilder.setAuthentication(auth);
-            }
-            if (aead != null) {
-                transformBuilder.setAuthenticatedEncryption(aead);
-            }
-
-            if (doUdpEncap) {
-                transformBuilder =
-                        transformBuilder.setIpv4Encapsulation(encapSocket, encapSocket.getPort());
-            }
-
-            int ipHdrLen = local instanceof Inet6Address ? IP6_HDRLEN : IP4_HDRLEN;
-            int transportHdrLen = 0;
-            int udpEncapLen = doUdpEncap ? UDP_HDRLEN : 0;
-
-            try (IpSecTransform transform =
-                        transformBuilder.buildTransportModeTransform(local, spi)) {
-                if (protocol == IPPROTO_TCP) {
-                    transportHdrLen = TCP_HDRLEN_WITH_TIMESTAMP_OPT;
-                    checkTcp(transform, local, sendCount, useJavaSockets);
-                } else if (protocol == IPPROTO_UDP) {
-                    transportHdrLen = UDP_HDRLEN;
-
-                    // TODO: Also check connected udp.
-                    checkUnconnectedUdp(transform, local, sendCount, useJavaSockets);
-                } else {
-                    throw new IllegalArgumentException("Invalid protocol");
-                }
-            }
-
-            checkStatsChecker(
-                    protocol,
-                    ipHdrLen,
-                    transportHdrLen,
-                    udpEncapLen,
-                    sendCount,
-                    getIvLen(crypt != null ? crypt : aead),
-                    getBlkSize(crypt != null ? crypt : aead),
-                    getTruncLenBits(auth != null ? auth : aead));
-        }
-    }
-
-    private void checkStatsChecker(
-            int protocol,
-            int ipHdrLen,
-            int transportHdrLen,
-            int udpEncapLen,
-            int sendCount,
-            int ivLen,
-            int blkSize,
-            int truncLenBits)
-            throws Exception {
-
-        int innerPacketSize = TEST_DATA.length + transportHdrLen + ipHdrLen;
-        int outerPacketSize =
-                PacketUtils.calculateEspPacketSize(
-                                TEST_DATA.length + transportHdrLen, ivLen, blkSize, truncLenBits)
-                        + udpEncapLen
-                        + ipHdrLen;
-
-        int expectedOuterBytes = outerPacketSize * sendCount;
-        int expectedInnerBytes = innerPacketSize * sendCount;
-        int expectedPackets = sendCount;
-
-        // Each run sends two packets, one in each direction.
-        sendCount *= 2;
-        expectedOuterBytes *= 2;
-        expectedInnerBytes *= 2;
-        expectedPackets *= 2;
-
-        // Add TCP ACKs for data packets
-        if (protocol == IPPROTO_TCP) {
-            int encryptedTcpPktSize =
-                    PacketUtils.calculateEspPacketSize(
-                            TCP_HDRLEN_WITH_TIMESTAMP_OPT, ivLen, blkSize, truncLenBits);
-
-            // Add data packet ACKs
-            expectedOuterBytes += (encryptedTcpPktSize + udpEncapLen + ipHdrLen) * (sendCount);
-            expectedInnerBytes += (TCP_HDRLEN_WITH_TIMESTAMP_OPT + ipHdrLen) * (sendCount);
-            expectedPackets += sendCount;
-        }
-
-        StatsChecker.waitForNumPackets(expectedPackets);
-
-        // eBPF only counts inner packets, whereas xt_qtaguid counts outer packets. Allow both
-        StatsChecker.assertUidStatsDelta(
-                expectedOuterBytes,
-                expectedPackets,
-                expectedInnerBytes,
-                expectedOuterBytes,
-                expectedPackets);
-
-        // Unreliable at low numbers due to potential interference from other processes.
-        if (sendCount >= 1000) {
-            StatsChecker.assertIfaceStatsDelta(
-                    expectedOuterBytes, expectedPackets, expectedOuterBytes, expectedPackets);
-        }
-    }
-
-    private void checkIkePacket(
-            NativeUdpSocket wrappedEncapSocket, InetAddress localAddr) throws Exception {
-        StatsChecker.initStatsChecker();
-
-        try (NativeUdpSocket remoteSocket = new NativeUdpSocket(getBoundUdpSocket(localAddr))) {
-
-            // Append IKE/ESP header - 4 bytes of SPI, 4 bytes of seq number, all zeroed out
-            // If the first four bytes are zero, assume non-ESP (IKE traffic)
-            byte[] dataWithEspHeader = new byte[TEST_DATA.length + 8];
-            System.arraycopy(TEST_DATA, 0, dataWithEspHeader, 8, TEST_DATA.length);
-
-            // Send the IKE packet from remoteSocket to wrappedEncapSocket. Since IKE packets
-            // are multiplexed over the socket, we expect them to appear on the encap socket
-            // (as opposed to being decrypted and received on the non-encap socket)
-            remoteSocket.sendTo(dataWithEspHeader, localAddr, wrappedEncapSocket.getPort());
-            byte[] in = wrappedEncapSocket.receive();
-            assertArrayEquals("Encapsulated data did not match.", dataWithEspHeader, in);
-
-            // Also test that the IKE socket can send data out.
-            wrappedEncapSocket.sendTo(dataWithEspHeader, localAddr, remoteSocket.getPort());
-            in = remoteSocket.receive();
-            assertArrayEquals("Encapsulated data did not match.", dataWithEspHeader, in);
-
-            // Calculate expected packet sizes. Always use IPv4 header, since our kernels only
-            // guarantee support of UDP encap on IPv4.
-            int expectedNumPkts = 2;
-            int expectedPacketSize =
-                    expectedNumPkts * (dataWithEspHeader.length + UDP_HDRLEN + IP4_HDRLEN);
-
-            StatsChecker.waitForNumPackets(expectedNumPkts);
-            StatsChecker.assertUidStatsDelta(
-                    expectedPacketSize,
-                    expectedNumPkts,
-                    expectedPacketSize,
-                    expectedPacketSize,
-                    expectedNumPkts);
-            StatsChecker.assertIfaceStatsDelta(
-                    expectedPacketSize, expectedNumPkts, expectedPacketSize, expectedNumPkts);
-        }
-    }
-
-    @Test
-    public void testIkeOverUdpEncapSocket() throws Exception {
-        // IPv6 not supported for UDP-encap-ESP
-        InetAddress local = InetAddress.getByName(IPV4_LOOPBACK);
-        try (IpSecManager.UdpEncapsulationSocket encapSocket = mISM.openUdpEncapsulationSocket()) {
-            NativeUdpSocket wrappedEncapSocket =
-                    new NativeUdpSocket(encapSocket.getFileDescriptor());
-            checkIkePacket(wrappedEncapSocket, local);
-
-            // Now try with a transform applied to a socket using this Encap socket
-            IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-            IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_MD5, getKey(128), 96);
-
-            try (IpSecManager.SecurityParameterIndex spi =
-                            mISM.allocateSecurityParameterIndex(local);
-                    IpSecTransform transform =
-                            new IpSecTransform.Builder(InstrumentationRegistry.getContext())
-                                    .setEncryption(crypt)
-                                    .setAuthentication(auth)
-                                    .setIpv4Encapsulation(encapSocket, encapSocket.getPort())
-                                    .buildTransportModeTransform(local, spi);
-                    JavaUdpSocket localSocket = new JavaUdpSocket(local)) {
-                applyTransformBidirectionally(mISM, transform, localSocket);
-
-                checkIkePacket(wrappedEncapSocket, local);
-            }
-        }
-    }
-
-    // TODO: Check IKE over ESP sockets (IPv4, IPv6) - does this need SOCK_RAW?
-
-    /* TODO: Re-enable these when policy matcher works for reflected packets
-     *
-     * The issue here is that A sends to B, and everything is new; therefore PREROUTING counts
-     * correctly. But it appears that the security path is not cleared afterwards, thus when A
-     * sends an ACK back to B, the policy matcher flags it as a "IPSec" packet. See b/70635417
-     */
-
-    // public void testInterfaceCountersTcp4() throws Exception {
-    //     IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-    //     IpSecAlgorithm auth = new IpSecAlgorithm(
-    //             IpSecAlgorithm.AUTH_HMAC_MD5, getKey(128), 96);
-    //     checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, auth, false, 1000);
-    // }
-
-    // public void testInterfaceCountersTcp6() throws Exception {
-    //     IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-    //     IpSecAlgorithm auth = new IpSecAlgorithm(
-    //             IpSecAlgorithm.AUTH_HMAC_MD5, getKey(128), 96);
-    //     checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, crypt, auth, false, 1000);
-    // }
-
-    // public void testInterfaceCountersTcp4UdpEncap() throws Exception {
-    //     IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-    //     IpSecAlgorithm auth =
-    //             new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_MD5, getKey(128), 96);
-    //     checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, auth, true, 1000);
-    // }
-
-    @Test
-    public void testInterfaceCountersUdp4() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_MD5, getKey(128), 96);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, auth, null, false, 1000, false);
-    }
-
-    @Test
-    public void testInterfaceCountersUdp6() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_MD5, getKey(128), 96);
-        checkTransform(IPPROTO_UDP, IPV6_LOOPBACK, crypt, auth, null, false, 1000, false);
-    }
-
-    @Test
-    public void testInterfaceCountersUdp4UdpEncap() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_MD5, getKey(128), 96);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, auth, null, true, 1000, false);
-    }
-
-    @Test
-    public void testAesCbcHmacMd5Tcp4() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_MD5, getKey(128), 96);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, auth, null, false, 1, false);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacMd5Tcp6() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_MD5, getKey(128), 96);
-        checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, crypt, auth, null, false, 1, false);
-        checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, crypt, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacMd5Udp4() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_MD5, getKey(128), 96);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, auth, null, false, 1, false);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacMd5Udp6() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_MD5, getKey(128), 96);
-        checkTransform(IPPROTO_UDP, IPV6_LOOPBACK, crypt, auth, null, false, 1, false);
-        checkTransform(IPPROTO_UDP, IPV6_LOOPBACK, crypt, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha1Tcp4() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA1, getKey(160), 96);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, auth, null, false, 1, false);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha1Tcp6() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA1, getKey(160), 96);
-        checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, crypt, auth, null, false, 1, false);
-        checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, crypt, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha1Udp4() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA1, getKey(160), 96);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, auth, null, false, 1, false);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha1Udp6() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA1, getKey(160), 96);
-        checkTransform(IPPROTO_UDP, IPV6_LOOPBACK, crypt, auth, null, false, 1, false);
-        checkTransform(IPPROTO_UDP, IPV6_LOOPBACK, crypt, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha256Tcp4() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA256, getKey(256), 128);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, auth, null, false, 1, false);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha256Tcp6() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA256, getKey(256), 128);
-        checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, crypt, auth, null, false, 1, false);
-        checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, crypt, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha256Udp4() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA256, getKey(256), 128);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, auth, null, false, 1, false);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha256Udp6() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA256, getKey(256), 128);
-        checkTransform(IPPROTO_UDP, IPV6_LOOPBACK, crypt, auth, null, false, 1, false);
-        checkTransform(IPPROTO_UDP, IPV6_LOOPBACK, crypt, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha384Tcp4() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA384, getKey(384), 192);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, auth, null, false, 1, false);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha384Tcp6() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA384, getKey(384), 192);
-        checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, crypt, auth, null, false, 1, false);
-        checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, crypt, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha384Udp4() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA384, getKey(384), 192);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, auth, null, false, 1, false);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha384Udp6() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA384, getKey(384), 192);
-        checkTransform(IPPROTO_UDP, IPV6_LOOPBACK, crypt, auth, null, false, 1, false);
-        checkTransform(IPPROTO_UDP, IPV6_LOOPBACK, crypt, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha512Tcp4() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA512, getKey(512), 256);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, auth, null, false, 1, false);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha512Tcp6() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA512, getKey(512), 256);
-        checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, crypt, auth, null, false, 1, false);
-        checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, crypt, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha512Udp4() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA512, getKey(512), 256);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, auth, null, false, 1, false);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha512Udp6() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA512, getKey(512), 256);
-        checkTransform(IPPROTO_UDP, IPV6_LOOPBACK, crypt, auth, null, false, 1, false);
-        checkTransform(IPPROTO_UDP, IPV6_LOOPBACK, crypt, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testAesGcm64Tcp4() throws Exception {
-        IpSecAlgorithm authCrypt =
-                new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 64);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, null, null, authCrypt, false, 1, false);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, null, null, authCrypt, false, 1, true);
-    }
-
-    @Test
-    public void testAesGcm64Tcp6() throws Exception {
-        IpSecAlgorithm authCrypt =
-                new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 64);
-        checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, null, null, authCrypt, false, 1, false);
-        checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, null, null, authCrypt, false, 1, true);
-    }
-
-    @Test
-    public void testAesGcm64Udp4() throws Exception {
-        IpSecAlgorithm authCrypt =
-                new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 64);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, null, null, authCrypt, false, 1, false);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, null, null, authCrypt, false, 1, true);
-    }
-
-    @Test
-    public void testAesGcm64Udp6() throws Exception {
-        IpSecAlgorithm authCrypt =
-                new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 64);
-        checkTransform(IPPROTO_UDP, IPV6_LOOPBACK, null, null, authCrypt, false, 1, false);
-        checkTransform(IPPROTO_UDP, IPV6_LOOPBACK, null, null, authCrypt, false, 1, true);
-    }
-
-    @Test
-    public void testAesGcm96Tcp4() throws Exception {
-        IpSecAlgorithm authCrypt =
-                new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 96);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, null, null, authCrypt, false, 1, false);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, null, null, authCrypt, false, 1, true);
-    }
-
-    @Test
-    public void testAesGcm96Tcp6() throws Exception {
-        IpSecAlgorithm authCrypt =
-                new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 96);
-        checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, null, null, authCrypt, false, 1, false);
-        checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, null, null, authCrypt, false, 1, true);
-    }
-
-    @Test
-    public void testAesGcm96Udp4() throws Exception {
-        IpSecAlgorithm authCrypt =
-                new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 96);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, null, null, authCrypt, false, 1, false);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, null, null, authCrypt, false, 1, true);
-    }
-
-    @Test
-    public void testAesGcm96Udp6() throws Exception {
-        IpSecAlgorithm authCrypt =
-                new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 96);
-        checkTransform(IPPROTO_UDP, IPV6_LOOPBACK, null, null, authCrypt, false, 1, false);
-        checkTransform(IPPROTO_UDP, IPV6_LOOPBACK, null, null, authCrypt, false, 1, true);
-    }
-
-    @Test
-    public void testAesGcm128Tcp4() throws Exception {
-        IpSecAlgorithm authCrypt =
-                new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 128);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, null, null, authCrypt, false, 1, false);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, null, null, authCrypt, false, 1, true);
-    }
-
-    @Test
-    public void testAesGcm128Tcp6() throws Exception {
-        IpSecAlgorithm authCrypt =
-                new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 128);
-        checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, null, null, authCrypt, false, 1, false);
-        checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, null, null, authCrypt, false, 1, true);
-    }
-
-    @Test
-    public void testAesGcm128Udp4() throws Exception {
-        IpSecAlgorithm authCrypt =
-                new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 128);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, null, null, authCrypt, false, 1, false);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, null, null, authCrypt, false, 1, true);
-    }
-
-    @Test
-    public void testAesGcm128Udp6() throws Exception {
-        IpSecAlgorithm authCrypt =
-                new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 128);
-        checkTransform(IPPROTO_UDP, IPV6_LOOPBACK, null, null, authCrypt, false, 1, false);
-        checkTransform(IPPROTO_UDP, IPV6_LOOPBACK, null, null, authCrypt, false, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacMd5Tcp4UdpEncap() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_MD5, getKey(128), 96);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, auth, null, true, 1, false);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, auth, null, true, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacMd5Udp4UdpEncap() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_MD5, getKey(128), 96);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, auth, null, true, 1, false);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, auth, null, true, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha1Tcp4UdpEncap() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA1, getKey(160), 96);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, auth, null, true, 1, false);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, auth, null, true, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha1Udp4UdpEncap() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA1, getKey(160), 96);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, auth, null, true, 1, false);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, auth, null, true, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha256Tcp4UdpEncap() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA256, getKey(256), 128);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, auth, null, true, 1, false);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, auth, null, true, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha256Udp4UdpEncap() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA256, getKey(256), 128);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, auth, null, true, 1, false);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, auth, null, true, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha384Tcp4UdpEncap() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA384, getKey(384), 192);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, auth, null, true, 1, false);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, auth, null, true, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha384Udp4UdpEncap() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA384, getKey(384), 192);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, auth, null, true, 1, false);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, auth, null, true, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha512Tcp4UdpEncap() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA512, getKey(512), 256);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, auth, null, true, 1, false);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, auth, null, true, 1, true);
-    }
-
-    @Test
-    public void testAesCbcHmacSha512Udp4UdpEncap() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA512, getKey(512), 256);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, auth, null, true, 1, false);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, auth, null, true, 1, true);
-    }
-
-    @Test
-    public void testAesGcm64Tcp4UdpEncap() throws Exception {
-        IpSecAlgorithm authCrypt =
-                new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 64);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, null, null, authCrypt, true, 1, false);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, null, null, authCrypt, true, 1, true);
-    }
-
-    @Test
-    public void testAesGcm64Udp4UdpEncap() throws Exception {
-        IpSecAlgorithm authCrypt =
-                new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 64);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, null, null, authCrypt, true, 1, false);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, null, null, authCrypt, true, 1, true);
-    }
-
-    @Test
-    public void testAesGcm96Tcp4UdpEncap() throws Exception {
-        IpSecAlgorithm authCrypt =
-                new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 96);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, null, null, authCrypt, true, 1, false);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, null, null, authCrypt, true, 1, true);
-    }
-
-    @Test
-    public void testAesGcm96Udp4UdpEncap() throws Exception {
-        IpSecAlgorithm authCrypt =
-                new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 96);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, null, null, authCrypt, true, 1, false);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, null, null, authCrypt, true, 1, true);
-    }
-
-    @Test
-    public void testAesGcm128Tcp4UdpEncap() throws Exception {
-        IpSecAlgorithm authCrypt =
-                new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 128);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, null, null, authCrypt, true, 1, false);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, null, null, authCrypt, true, 1, true);
-    }
-
-    @Test
-    public void testAesGcm128Udp4UdpEncap() throws Exception {
-        IpSecAlgorithm authCrypt =
-                new IpSecAlgorithm(IpSecAlgorithm.AUTH_CRYPT_AES_GCM, AEAD_KEY, 128);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, null, null, authCrypt, true, 1, false);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, null, null, authCrypt, true, 1, true);
-    }
-
-    @Test
-    public void testCryptUdp4() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, null, null, false, 1, false);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, null, null, false, 1, true);
-    }
-
-    @Test
-    public void testAuthUdp4() throws Exception {
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA256, getKey(256), 128);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, null, auth, null, false, 1, false);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, null, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testCryptUdp6() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        checkTransform(IPPROTO_UDP, IPV6_LOOPBACK, crypt, null, null, false, 1, false);
-        checkTransform(IPPROTO_UDP, IPV6_LOOPBACK, crypt, null, null, false, 1, true);
-    }
-
-    @Test
-    public void testAuthUdp6() throws Exception {
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA256, getKey(256), 128);
-        checkTransform(IPPROTO_UDP, IPV6_LOOPBACK, null, auth, null, false, 1, false);
-        checkTransform(IPPROTO_UDP, IPV6_LOOPBACK, null, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testCryptTcp4() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, null, null, false, 1, false);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, null, null, false, 1, true);
-    }
-
-    @Test
-    public void testAuthTcp4() throws Exception {
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA256, getKey(256), 128);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, null, auth, null, false, 1, false);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, null, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testCryptTcp6() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, crypt, null, null, false, 1, false);
-        checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, crypt, null, null, false, 1, true);
-    }
-
-    @Test
-    public void testAuthTcp6() throws Exception {
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA256, getKey(256), 128);
-        checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, null, auth, null, false, 1, false);
-        checkTransform(IPPROTO_TCP, IPV6_LOOPBACK, null, auth, null, false, 1, true);
-    }
-
-    @Test
-    public void testCryptUdp4UdpEncap() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, null, null, true, 1, false);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, crypt, null, null, true, 1, true);
-    }
-
-    @Test
-    public void testAuthUdp4UdpEncap() throws Exception {
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA256, getKey(256), 128);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, null, auth, null, true, 1, false);
-        checkTransform(IPPROTO_UDP, IPV4_LOOPBACK, null, auth, null, true, 1, true);
-    }
-
-    @Test
-    public void testCryptTcp4UdpEncap() throws Exception {
-        IpSecAlgorithm crypt = new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, null, null, true, 1, false);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, crypt, null, null, true, 1, true);
-    }
-
-    @Test
-    public void testAuthTcp4UdpEncap() throws Exception {
-        IpSecAlgorithm auth = new IpSecAlgorithm(IpSecAlgorithm.AUTH_HMAC_SHA256, getKey(256), 128);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, null, auth, null, true, 1, false);
-        checkTransform(IPPROTO_TCP, IPV4_LOOPBACK, null, auth, null, true, 1, true);
-    }
-
-    @Test
-    public void testOpenUdpEncapSocketSpecificPort() throws Exception {
-        IpSecManager.UdpEncapsulationSocket encapSocket = null;
-        int port = -1;
-        for (int i = 0; i < MAX_PORT_BIND_ATTEMPTS; i++) {
-            try {
-                port = findUnusedPort();
-                encapSocket = mISM.openUdpEncapsulationSocket(port);
-                break;
-            } catch (ErrnoException e) {
-                if (e.errno == OsConstants.EADDRINUSE) {
-                    // Someone claimed the port since we called findUnusedPort.
-                    continue;
-                }
-                throw e;
-            } finally {
-                if (encapSocket != null) {
-                    encapSocket.close();
-                }
-            }
-        }
-
-        if (encapSocket == null) {
-            fail("Failed " + MAX_PORT_BIND_ATTEMPTS + " attempts to bind to a port");
-        }
-
-        assertTrue("Returned invalid port", encapSocket.getPort() == port);
-    }
-
-    @Test
-    public void testOpenUdpEncapSocketRandomPort() throws Exception {
-        try (IpSecManager.UdpEncapsulationSocket encapSocket = mISM.openUdpEncapsulationSocket()) {
-            assertTrue("Returned invalid port", encapSocket.getPort() != 0);
-        }
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/IpSecManagerTunnelTest.java b/tests/tests/net/src/android/net/cts/IpSecManagerTunnelTest.java
deleted file mode 100644
index ae38faa..0000000
--- a/tests/tests/net/src/android/net/cts/IpSecManagerTunnelTest.java
+++ /dev/null
@@ -1,899 +0,0 @@
-/*
- * Copyright (C) 2018 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 static android.app.AppOpsManager.OP_MANAGE_IPSEC_TUNNELS;
-import static android.net.IpSecManager.UdpEncapsulationSocket;
-import static android.net.cts.PacketUtils.AES_CBC_BLK_SIZE;
-import static android.net.cts.PacketUtils.AES_CBC_IV_LEN;
-import static android.net.cts.PacketUtils.BytePayload;
-import static android.net.cts.PacketUtils.EspHeader;
-import static android.net.cts.PacketUtils.IP4_HDRLEN;
-import static android.net.cts.PacketUtils.IP6_HDRLEN;
-import static android.net.cts.PacketUtils.IpHeader;
-import static android.net.cts.PacketUtils.UDP_HDRLEN;
-import static android.net.cts.PacketUtils.UdpHeader;
-import static android.net.cts.PacketUtils.getIpHeader;
-import static android.net.cts.util.CtsNetUtils.TestNetworkCallback;
-import static android.system.OsConstants.AF_INET;
-import static android.system.OsConstants.AF_INET6;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
-
-import android.content.Context;
-import android.net.ConnectivityManager;
-import android.net.IpSecAlgorithm;
-import android.net.IpSecManager;
-import android.net.IpSecTransform;
-import android.net.LinkAddress;
-import android.net.Network;
-import android.net.TestNetworkInterface;
-import android.net.TestNetworkManager;
-import android.net.cts.PacketUtils.Payload;
-import android.net.cts.util.CtsNetUtils;
-import android.os.ParcelFileDescriptor;
-import android.platform.test.annotations.AppModeFull;
-
-import androidx.test.InstrumentationRegistry;
-import androidx.test.runner.AndroidJUnit4;
-
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.net.NetworkInterface;
-
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-@AppModeFull(reason = "MANAGE_TEST_NETWORKS permission can't be granted to instant apps")
-public class IpSecManagerTunnelTest extends IpSecBaseTest {
-    private static final String TAG = IpSecManagerTunnelTest.class.getSimpleName();
-
-    private static final InetAddress LOCAL_OUTER_4 = InetAddress.parseNumericAddress("192.0.2.1");
-    private static final InetAddress REMOTE_OUTER_4 = InetAddress.parseNumericAddress("192.0.2.2");
-    private static final InetAddress LOCAL_OUTER_6 =
-            InetAddress.parseNumericAddress("2001:db8:1::1");
-    private static final InetAddress REMOTE_OUTER_6 =
-            InetAddress.parseNumericAddress("2001:db8:1::2");
-
-    private static final InetAddress LOCAL_INNER_4 =
-            InetAddress.parseNumericAddress("198.51.100.1");
-    private static final InetAddress REMOTE_INNER_4 =
-            InetAddress.parseNumericAddress("198.51.100.2");
-    private static final InetAddress LOCAL_INNER_6 =
-            InetAddress.parseNumericAddress("2001:db8:2::1");
-    private static final InetAddress REMOTE_INNER_6 =
-            InetAddress.parseNumericAddress("2001:db8:2::2");
-
-    private static final int IP4_PREFIX_LEN = 32;
-    private static final int IP6_PREFIX_LEN = 128;
-
-    private static final int TIMEOUT_MS = 500;
-
-    // Static state to reduce setup/teardown
-    private static ConnectivityManager sCM;
-    private static TestNetworkManager sTNM;
-    private static ParcelFileDescriptor sTunFd;
-    private static TestNetworkCallback sTunNetworkCallback;
-    private static Network sTunNetwork;
-    private static TunUtils sTunUtils;
-
-    private static Context sContext = InstrumentationRegistry.getContext();
-    private static final CtsNetUtils mCtsNetUtils = new CtsNetUtils(sContext);
-
-    @BeforeClass
-    public static void setUpBeforeClass() throws Exception {
-        InstrumentationRegistry.getInstrumentation()
-                .getUiAutomation()
-                .adoptShellPermissionIdentity();
-        sCM = (ConnectivityManager) sContext.getSystemService(Context.CONNECTIVITY_SERVICE);
-        sTNM = (TestNetworkManager) sContext.getSystemService(Context.TEST_NETWORK_SERVICE);
-
-        // Under normal circumstances, the MANAGE_IPSEC_TUNNELS appop would be auto-granted, and
-        // a standard permission is insufficient. So we shell out the appop, to give us the
-        // right appop permissions.
-        mCtsNetUtils.setAppopPrivileged(OP_MANAGE_IPSEC_TUNNELS, true);
-
-        TestNetworkInterface testIface =
-                sTNM.createTunInterface(
-                        new LinkAddress[] {
-                            new LinkAddress(LOCAL_OUTER_4, IP4_PREFIX_LEN),
-                            new LinkAddress(LOCAL_OUTER_6, IP6_PREFIX_LEN)
-                        });
-
-        sTunFd = testIface.getFileDescriptor();
-        sTunNetworkCallback = mCtsNetUtils.setupAndGetTestNetwork(testIface.getInterfaceName());
-        sTunNetworkCallback.waitForAvailable();
-        sTunNetwork = sTunNetworkCallback.currentNetwork;
-
-        sTunUtils = new TunUtils(sTunFd);
-    }
-
-    @Before
-    @Override
-    public void setUp() throws Exception {
-        super.setUp();
-
-        // Set to true before every run; some tests flip this.
-        mCtsNetUtils.setAppopPrivileged(OP_MANAGE_IPSEC_TUNNELS, true);
-
-        // Clear sTunUtils state
-        sTunUtils.reset();
-    }
-
-    @AfterClass
-    public static void tearDownAfterClass() throws Exception {
-        mCtsNetUtils.setAppopPrivileged(OP_MANAGE_IPSEC_TUNNELS, false);
-
-        sCM.unregisterNetworkCallback(sTunNetworkCallback);
-
-        sTNM.teardownTestNetwork(sTunNetwork);
-        sTunFd.close();
-
-        InstrumentationRegistry.getInstrumentation()
-                .getUiAutomation()
-                .dropShellPermissionIdentity();
-    }
-
-    @Test
-    public void testSecurityExceptionCreateTunnelInterfaceWithoutAppop() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-
-        // Ensure we don't have the appop. Permission is not requested in the Manifest
-        mCtsNetUtils.setAppopPrivileged(OP_MANAGE_IPSEC_TUNNELS, false);
-
-        // Security exceptions are thrown regardless of IPv4/IPv6. Just test one
-        try {
-            mISM.createIpSecTunnelInterface(LOCAL_INNER_6, REMOTE_INNER_6, sTunNetwork);
-            fail("Did not throw SecurityException for Tunnel creation without appop");
-        } catch (SecurityException expected) {
-        }
-    }
-
-    @Test
-    public void testSecurityExceptionBuildTunnelTransformWithoutAppop() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-
-        // Ensure we don't have the appop. Permission is not requested in the Manifest
-        mCtsNetUtils.setAppopPrivileged(OP_MANAGE_IPSEC_TUNNELS, false);
-
-        // Security exceptions are thrown regardless of IPv4/IPv6. Just test one
-        try (IpSecManager.SecurityParameterIndex spi =
-                        mISM.allocateSecurityParameterIndex(LOCAL_INNER_4);
-                IpSecTransform transform =
-                        new IpSecTransform.Builder(sContext)
-                                .buildTunnelModeTransform(REMOTE_INNER_4, spi)) {
-            fail("Did not throw SecurityException for Transform creation without appop");
-        } catch (SecurityException expected) {
-        }
-    }
-
-    /* Test runnables for callbacks after IPsec tunnels are set up. */
-    private abstract class IpSecTunnelTestRunnable {
-        /**
-         * Runs the test code, and returns the inner socket port, if any.
-         *
-         * @param ipsecNetwork The IPsec Interface based Network for binding sockets on
-         * @return the integer port of the inner socket if outbound, or 0 if inbound
-         *     IpSecTunnelTestRunnable
-         * @throws Exception if any part of the test failed.
-         */
-        public abstract int run(Network ipsecNetwork) throws Exception;
-    }
-
-    private int getPacketSize(
-            int innerFamily, int outerFamily, boolean useEncap, boolean transportInTunnelMode) {
-        int expectedPacketSize = TEST_DATA.length + UDP_HDRLEN;
-
-        // Inner Transport mode packet size
-        if (transportInTunnelMode) {
-            expectedPacketSize =
-                    PacketUtils.calculateEspPacketSize(
-                            expectedPacketSize,
-                            AES_CBC_IV_LEN,
-                            AES_CBC_BLK_SIZE,
-                            AUTH_KEY.length * 4);
-        }
-
-        // Inner IP Header
-        expectedPacketSize += innerFamily == AF_INET ? IP4_HDRLEN : IP6_HDRLEN;
-
-        // Tunnel mode transform size
-        expectedPacketSize =
-                PacketUtils.calculateEspPacketSize(
-                        expectedPacketSize, AES_CBC_IV_LEN, AES_CBC_BLK_SIZE, AUTH_KEY.length * 4);
-
-        // UDP encap size
-        expectedPacketSize += useEncap ? UDP_HDRLEN : 0;
-
-        // Outer IP Header
-        expectedPacketSize += outerFamily == AF_INET ? IP4_HDRLEN : IP6_HDRLEN;
-
-        return expectedPacketSize;
-    }
-
-    private interface IpSecTunnelTestRunnableFactory {
-        IpSecTunnelTestRunnable getIpSecTunnelTestRunnable(
-                boolean transportInTunnelMode,
-                int spi,
-                InetAddress localInner,
-                InetAddress remoteInner,
-                InetAddress localOuter,
-                InetAddress remoteOuter,
-                IpSecTransform inTransportTransform,
-                IpSecTransform outTransportTransform,
-                int encapPort,
-                int innerSocketPort,
-                int expectedPacketSize)
-                throws Exception;
-    }
-
-    private class OutputIpSecTunnelTestRunnableFactory implements IpSecTunnelTestRunnableFactory {
-        public IpSecTunnelTestRunnable getIpSecTunnelTestRunnable(
-                boolean transportInTunnelMode,
-                int spi,
-                InetAddress localInner,
-                InetAddress remoteInner,
-                InetAddress localOuter,
-                InetAddress remoteOuter,
-                IpSecTransform inTransportTransform,
-                IpSecTransform outTransportTransform,
-                int encapPort,
-                int unusedInnerSocketPort,
-                int expectedPacketSize) {
-            return new IpSecTunnelTestRunnable() {
-                @Override
-                public int run(Network ipsecNetwork) throws Exception {
-                    // Build a socket and send traffic
-                    JavaUdpSocket socket = new JavaUdpSocket(localInner);
-                    ipsecNetwork.bindSocket(socket.mSocket);
-                    int innerSocketPort = socket.getPort();
-
-                    // For Transport-In-Tunnel mode, apply transform to socket
-                    if (transportInTunnelMode) {
-                        mISM.applyTransportModeTransform(
-                                socket.mSocket, IpSecManager.DIRECTION_IN, inTransportTransform);
-                        mISM.applyTransportModeTransform(
-                                socket.mSocket, IpSecManager.DIRECTION_OUT, outTransportTransform);
-                    }
-
-                    socket.sendTo(TEST_DATA, remoteInner, socket.getPort());
-
-                    // Verify that an encrypted packet is sent. As of right now, checking encrypted
-                    // body is not possible, due to the test not knowing some of the fields of the
-                    // inner IP header (flow label, flags, etc)
-                    sTunUtils.awaitEspPacketNoPlaintext(
-                            spi, TEST_DATA, encapPort != 0, expectedPacketSize);
-
-                    socket.close();
-
-                    return innerSocketPort;
-                }
-            };
-        }
-    }
-
-    private class InputReflectedIpSecTunnelTestRunnableFactory
-            implements IpSecTunnelTestRunnableFactory {
-        public IpSecTunnelTestRunnable getIpSecTunnelTestRunnable(
-                boolean transportInTunnelMode,
-                int spi,
-                InetAddress localInner,
-                InetAddress remoteInner,
-                InetAddress localOuter,
-                InetAddress remoteOuter,
-                IpSecTransform inTransportTransform,
-                IpSecTransform outTransportTransform,
-                int encapPort,
-                int innerSocketPort,
-                int expectedPacketSize)
-                throws Exception {
-            return new IpSecTunnelTestRunnable() {
-                @Override
-                public int run(Network ipsecNetwork) throws Exception {
-                    // Build a socket and receive traffic
-                    JavaUdpSocket socket = new JavaUdpSocket(localInner, innerSocketPort);
-                    ipsecNetwork.bindSocket(socket.mSocket);
-
-                    // For Transport-In-Tunnel mode, apply transform to socket
-                    if (transportInTunnelMode) {
-                        mISM.applyTransportModeTransform(
-                                socket.mSocket, IpSecManager.DIRECTION_IN, outTransportTransform);
-                        mISM.applyTransportModeTransform(
-                                socket.mSocket, IpSecManager.DIRECTION_OUT, inTransportTransform);
-                    }
-
-                    sTunUtils.reflectPackets();
-
-                    // Receive packet from socket, and validate that the payload is correct
-                    receiveAndValidatePacket(socket);
-
-                    socket.close();
-
-                    return 0;
-                }
-            };
-        }
-    }
-
-    private class InputPacketGeneratorIpSecTunnelTestRunnableFactory
-            implements IpSecTunnelTestRunnableFactory {
-        public IpSecTunnelTestRunnable getIpSecTunnelTestRunnable(
-                boolean transportInTunnelMode,
-                int spi,
-                InetAddress localInner,
-                InetAddress remoteInner,
-                InetAddress localOuter,
-                InetAddress remoteOuter,
-                IpSecTransform inTransportTransform,
-                IpSecTransform outTransportTransform,
-                int encapPort,
-                int innerSocketPort,
-                int expectedPacketSize)
-                throws Exception {
-            return new IpSecTunnelTestRunnable() {
-                @Override
-                public int run(Network ipsecNetwork) throws Exception {
-                    // Build a socket and receive traffic
-                    JavaUdpSocket socket = new JavaUdpSocket(localInner);
-                    ipsecNetwork.bindSocket(socket.mSocket);
-
-                    // For Transport-In-Tunnel mode, apply transform to socket
-                    if (transportInTunnelMode) {
-                        mISM.applyTransportModeTransform(
-                                socket.mSocket, IpSecManager.DIRECTION_IN, outTransportTransform);
-                        mISM.applyTransportModeTransform(
-                                socket.mSocket, IpSecManager.DIRECTION_OUT, inTransportTransform);
-                    }
-
-                    byte[] pkt;
-                    if (transportInTunnelMode) {
-                        pkt =
-                                getTransportInTunnelModePacket(
-                                        spi,
-                                        spi,
-                                        remoteInner,
-                                        localInner,
-                                        remoteOuter,
-                                        localOuter,
-                                        socket.getPort(),
-                                        encapPort);
-                    } else {
-                        pkt =
-                                getTunnelModePacket(
-                                        spi,
-                                        remoteInner,
-                                        localInner,
-                                        remoteOuter,
-                                        localOuter,
-                                        socket.getPort(),
-                                        encapPort);
-                    }
-                    sTunUtils.injectPacket(pkt);
-
-                    // Receive packet from socket, and validate
-                    receiveAndValidatePacket(socket);
-
-                    socket.close();
-
-                    return 0;
-                }
-            };
-        }
-    }
-
-    private void checkTunnelOutput(
-            int innerFamily, int outerFamily, boolean useEncap, boolean transportInTunnelMode)
-            throws Exception {
-        checkTunnel(
-                innerFamily,
-                outerFamily,
-                useEncap,
-                transportInTunnelMode,
-                new OutputIpSecTunnelTestRunnableFactory());
-    }
-
-    private void checkTunnelInput(
-            int innerFamily, int outerFamily, boolean useEncap, boolean transportInTunnelMode)
-            throws Exception {
-        checkTunnel(
-                innerFamily,
-                outerFamily,
-                useEncap,
-                transportInTunnelMode,
-                new InputPacketGeneratorIpSecTunnelTestRunnableFactory());
-    }
-
-    /**
-     * Validates that the kernel can talk to itself.
-     *
-     * <p>This test takes an outbound IPsec packet, reflects it (by flipping IP src/dst), and
-     * injects it back into the TUN. This test then verifies that a packet with the correct payload
-     * is found on the specified socket/port.
-     */
-    public void checkTunnelReflected(
-            int innerFamily, int outerFamily, boolean useEncap, boolean transportInTunnelMode)
-            throws Exception {
-        InetAddress localInner = innerFamily == AF_INET ? LOCAL_INNER_4 : LOCAL_INNER_6;
-        InetAddress remoteInner = innerFamily == AF_INET ? REMOTE_INNER_4 : REMOTE_INNER_6;
-
-        InetAddress localOuter = outerFamily == AF_INET ? LOCAL_OUTER_4 : LOCAL_OUTER_6;
-        InetAddress remoteOuter = outerFamily == AF_INET ? REMOTE_OUTER_4 : REMOTE_OUTER_6;
-
-        // Preselect both SPI and encap port, to be used for both inbound and outbound tunnels.
-        int spi = getRandomSpi(localOuter, remoteOuter);
-        int expectedPacketSize =
-                getPacketSize(innerFamily, outerFamily, useEncap, transportInTunnelMode);
-
-        try (IpSecManager.SecurityParameterIndex inTransportSpi =
-                        mISM.allocateSecurityParameterIndex(localInner, spi);
-                IpSecManager.SecurityParameterIndex outTransportSpi =
-                        mISM.allocateSecurityParameterIndex(remoteInner, spi);
-                IpSecTransform inTransportTransform =
-                        buildIpSecTransform(sContext, inTransportSpi, null, remoteInner);
-                IpSecTransform outTransportTransform =
-                        buildIpSecTransform(sContext, outTransportSpi, null, localInner);
-                UdpEncapsulationSocket encapSocket = mISM.openUdpEncapsulationSocket()) {
-
-            // Run output direction tests
-            IpSecTunnelTestRunnable outputIpSecTunnelTestRunnable =
-                    new OutputIpSecTunnelTestRunnableFactory()
-                            .getIpSecTunnelTestRunnable(
-                                    transportInTunnelMode,
-                                    spi,
-                                    localInner,
-                                    remoteInner,
-                                    localOuter,
-                                    remoteOuter,
-                                    inTransportTransform,
-                                    outTransportTransform,
-                                    useEncap ? encapSocket.getPort() : 0,
-                                    0,
-                                    expectedPacketSize);
-            int innerSocketPort =
-                    buildTunnelNetworkAndRunTests(
-                    localInner,
-                    remoteInner,
-                    localOuter,
-                    remoteOuter,
-                    spi,
-                    useEncap ? encapSocket : null,
-                    outputIpSecTunnelTestRunnable);
-
-            // Input direction tests, with matching inner socket ports.
-            IpSecTunnelTestRunnable inputIpSecTunnelTestRunnable =
-                    new InputReflectedIpSecTunnelTestRunnableFactory()
-                            .getIpSecTunnelTestRunnable(
-                                    transportInTunnelMode,
-                                    spi,
-                                    remoteInner,
-                                    localInner,
-                                    localOuter,
-                                    remoteOuter,
-                                    inTransportTransform,
-                                    outTransportTransform,
-                                    useEncap ? encapSocket.getPort() : 0,
-                                    innerSocketPort,
-                                    expectedPacketSize);
-            buildTunnelNetworkAndRunTests(
-                    remoteInner,
-                    localInner,
-                    localOuter,
-                    remoteOuter,
-                    spi,
-                    useEncap ? encapSocket : null,
-                    inputIpSecTunnelTestRunnable);
-        }
-    }
-
-    public void checkTunnel(
-            int innerFamily,
-            int outerFamily,
-            boolean useEncap,
-            boolean transportInTunnelMode,
-            IpSecTunnelTestRunnableFactory factory)
-            throws Exception {
-
-        InetAddress localInner = innerFamily == AF_INET ? LOCAL_INNER_4 : LOCAL_INNER_6;
-        InetAddress remoteInner = innerFamily == AF_INET ? REMOTE_INNER_4 : REMOTE_INNER_6;
-
-        InetAddress localOuter = outerFamily == AF_INET ? LOCAL_OUTER_4 : LOCAL_OUTER_6;
-        InetAddress remoteOuter = outerFamily == AF_INET ? REMOTE_OUTER_4 : REMOTE_OUTER_6;
-
-        // Preselect both SPI and encap port, to be used for both inbound and outbound tunnels.
-        // Re-uses the same SPI to ensure that even in cases of symmetric SPIs shared across tunnel
-        // and transport mode, packets are encrypted/decrypted properly based on the src/dst.
-        int spi = getRandomSpi(localOuter, remoteOuter);
-        int expectedPacketSize =
-                getPacketSize(innerFamily, outerFamily, useEncap, transportInTunnelMode);
-
-        try (IpSecManager.SecurityParameterIndex inTransportSpi =
-                        mISM.allocateSecurityParameterIndex(localInner, spi);
-                IpSecManager.SecurityParameterIndex outTransportSpi =
-                        mISM.allocateSecurityParameterIndex(remoteInner, spi);
-                IpSecTransform inTransportTransform =
-                        buildIpSecTransform(sContext, inTransportSpi, null, remoteInner);
-                IpSecTransform outTransportTransform =
-                        buildIpSecTransform(sContext, outTransportSpi, null, localInner);
-                UdpEncapsulationSocket encapSocket = mISM.openUdpEncapsulationSocket()) {
-
-            buildTunnelNetworkAndRunTests(
-                    localInner,
-                    remoteInner,
-                    localOuter,
-                    remoteOuter,
-                    spi,
-                    useEncap ? encapSocket : null,
-                    factory.getIpSecTunnelTestRunnable(
-                            transportInTunnelMode,
-                            spi,
-                            localInner,
-                            remoteInner,
-                            localOuter,
-                            remoteOuter,
-                            inTransportTransform,
-                            outTransportTransform,
-                            useEncap ? encapSocket.getPort() : 0,
-                            0,
-                            expectedPacketSize));
-        }
-    }
-
-    private int buildTunnelNetworkAndRunTests(
-            InetAddress localInner,
-            InetAddress remoteInner,
-            InetAddress localOuter,
-            InetAddress remoteOuter,
-            int spi,
-            UdpEncapsulationSocket encapSocket,
-            IpSecTunnelTestRunnable test)
-            throws Exception {
-        int innerPrefixLen = localInner instanceof Inet6Address ? IP6_PREFIX_LEN : IP4_PREFIX_LEN;
-        TestNetworkCallback testNetworkCb = null;
-        int innerSocketPort;
-
-        try (IpSecManager.SecurityParameterIndex inSpi =
-                        mISM.allocateSecurityParameterIndex(localOuter, spi);
-                IpSecManager.SecurityParameterIndex outSpi =
-                        mISM.allocateSecurityParameterIndex(remoteOuter, spi);
-                IpSecManager.IpSecTunnelInterface tunnelIface =
-                        mISM.createIpSecTunnelInterface(localOuter, remoteOuter, sTunNetwork)) {
-            // Build the test network
-            tunnelIface.addAddress(localInner, innerPrefixLen);
-            testNetworkCb = mCtsNetUtils.setupAndGetTestNetwork(tunnelIface.getInterfaceName());
-            testNetworkCb.waitForAvailable();
-            Network testNetwork = testNetworkCb.currentNetwork;
-
-            // Check interface was created
-            assertNotNull(NetworkInterface.getByName(tunnelIface.getInterfaceName()));
-
-            // Verify address was added
-            final NetworkInterface netIface = NetworkInterface.getByInetAddress(localInner);
-            assertNotNull(netIface);
-            assertEquals(tunnelIface.getInterfaceName(), netIface.getDisplayName());
-
-            // Configure Transform parameters
-            IpSecTransform.Builder transformBuilder = new IpSecTransform.Builder(sContext);
-            transformBuilder.setEncryption(
-                    new IpSecAlgorithm(IpSecAlgorithm.CRYPT_AES_CBC, CRYPT_KEY));
-            transformBuilder.setAuthentication(
-                    new IpSecAlgorithm(
-                            IpSecAlgorithm.AUTH_HMAC_SHA256, AUTH_KEY, AUTH_KEY.length * 4));
-
-            if (encapSocket != null) {
-                transformBuilder.setIpv4Encapsulation(encapSocket, encapSocket.getPort());
-            }
-
-            // Apply transform and check that traffic is properly encrypted
-            try (IpSecTransform inTransform =
-                            transformBuilder.buildTunnelModeTransform(remoteOuter, inSpi);
-                    IpSecTransform outTransform =
-                            transformBuilder.buildTunnelModeTransform(localOuter, outSpi)) {
-                mISM.applyTunnelModeTransform(tunnelIface, IpSecManager.DIRECTION_IN, inTransform);
-                mISM.applyTunnelModeTransform(
-                        tunnelIface, IpSecManager.DIRECTION_OUT, outTransform);
-
-                innerSocketPort = test.run(testNetwork);
-            }
-
-            // Teardown the test network
-            sTNM.teardownTestNetwork(testNetwork);
-
-            // Remove addresses and check that interface is still present, but fails lookup-by-addr
-            tunnelIface.removeAddress(localInner, innerPrefixLen);
-            assertNotNull(NetworkInterface.getByName(tunnelIface.getInterfaceName()));
-            assertNull(NetworkInterface.getByInetAddress(localInner));
-
-            // Check interface was cleaned up
-            tunnelIface.close();
-            assertNull(NetworkInterface.getByName(tunnelIface.getInterfaceName()));
-        } finally {
-            if (testNetworkCb != null) {
-                sCM.unregisterNetworkCallback(testNetworkCb);
-            }
-        }
-
-        return innerSocketPort;
-    }
-
-    private static void receiveAndValidatePacket(JavaUdpSocket socket) throws Exception {
-        byte[] socketResponseBytes = socket.receive();
-        assertArrayEquals(TEST_DATA, socketResponseBytes);
-    }
-
-    private int getRandomSpi(InetAddress localOuter, InetAddress remoteOuter) throws Exception {
-        // Try to allocate both in and out SPIs using the same requested SPI value.
-        try (IpSecManager.SecurityParameterIndex inSpi =
-                        mISM.allocateSecurityParameterIndex(localOuter);
-                IpSecManager.SecurityParameterIndex outSpi =
-                        mISM.allocateSecurityParameterIndex(remoteOuter, inSpi.getSpi()); ) {
-            return inSpi.getSpi();
-        }
-    }
-
-    private EspHeader buildTransportModeEspPacket(
-            int spi, InetAddress src, InetAddress dst, int port, Payload payload) throws Exception {
-        IpHeader preEspIpHeader = getIpHeader(payload.getProtocolId(), src, dst, payload);
-
-        return new EspHeader(
-                payload.getProtocolId(),
-                spi,
-                1, // sequence number
-                CRYPT_KEY, // Same key for auth and crypt
-                payload.getPacketBytes(preEspIpHeader));
-    }
-
-    private EspHeader buildTunnelModeEspPacket(
-            int spi,
-            InetAddress srcInner,
-            InetAddress dstInner,
-            InetAddress srcOuter,
-            InetAddress dstOuter,
-            int port,
-            int encapPort,
-            Payload payload)
-            throws Exception {
-        IpHeader innerIp = getIpHeader(payload.getProtocolId(), srcInner, dstInner, payload);
-        return new EspHeader(
-                innerIp.getProtocolId(),
-                spi,
-                1, // sequence number
-                CRYPT_KEY, // Same key for auth and crypt
-                innerIp.getPacketBytes());
-    }
-
-    private IpHeader maybeEncapPacket(
-            InetAddress src, InetAddress dst, int encapPort, EspHeader espPayload)
-            throws Exception {
-
-        Payload payload = espPayload;
-        if (encapPort != 0) {
-            payload = new UdpHeader(encapPort, encapPort, espPayload);
-        }
-
-        return getIpHeader(payload.getProtocolId(), src, dst, payload);
-    }
-
-    private byte[] getTunnelModePacket(
-            int spi,
-            InetAddress srcInner,
-            InetAddress dstInner,
-            InetAddress srcOuter,
-            InetAddress dstOuter,
-            int port,
-            int encapPort)
-            throws Exception {
-        UdpHeader udp = new UdpHeader(port, port, new BytePayload(TEST_DATA));
-
-        EspHeader espPayload =
-                buildTunnelModeEspPacket(
-                        spi, srcInner, dstInner, srcOuter, dstOuter, port, encapPort, udp);
-        return maybeEncapPacket(srcOuter, dstOuter, encapPort, espPayload).getPacketBytes();
-    }
-
-    private byte[] getTransportInTunnelModePacket(
-            int spiInner,
-            int spiOuter,
-            InetAddress srcInner,
-            InetAddress dstInner,
-            InetAddress srcOuter,
-            InetAddress dstOuter,
-            int port,
-            int encapPort)
-            throws Exception {
-        UdpHeader udp = new UdpHeader(port, port, new BytePayload(TEST_DATA));
-
-        EspHeader espPayload = buildTransportModeEspPacket(spiInner, srcInner, dstInner, port, udp);
-        espPayload =
-                buildTunnelModeEspPacket(
-                        spiOuter,
-                        srcInner,
-                        dstInner,
-                        srcOuter,
-                        dstOuter,
-                        port,
-                        encapPort,
-                        espPayload);
-        return maybeEncapPacket(srcOuter, dstOuter, encapPort, espPayload).getPacketBytes();
-    }
-
-    // Transport-in-Tunnel mode tests
-    @Test
-    public void testTransportInTunnelModeV4InV4() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelOutput(AF_INET, AF_INET, false, true);
-        checkTunnelInput(AF_INET, AF_INET, false, true);
-    }
-
-    @Test
-    public void testTransportInTunnelModeV4InV4Reflected() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelReflected(AF_INET, AF_INET, false, true);
-    }
-
-    @Test
-    public void testTransportInTunnelModeV4InV4UdpEncap() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelOutput(AF_INET, AF_INET, true, true);
-        checkTunnelInput(AF_INET, AF_INET, true, true);
-    }
-
-    @Test
-    public void testTransportInTunnelModeV4InV4UdpEncapReflected() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelReflected(AF_INET, AF_INET, false, true);
-    }
-
-    @Test
-    public void testTransportInTunnelModeV4InV6() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelOutput(AF_INET, AF_INET6, false, true);
-        checkTunnelInput(AF_INET, AF_INET6, false, true);
-    }
-
-    @Test
-    public void testTransportInTunnelModeV4InV6Reflected() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelReflected(AF_INET, AF_INET, false, true);
-    }
-
-    @Test
-    public void testTransportInTunnelModeV6InV4() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelOutput(AF_INET6, AF_INET, false, true);
-        checkTunnelInput(AF_INET6, AF_INET, false, true);
-    }
-
-    @Test
-    public void testTransportInTunnelModeV6InV4Reflected() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelReflected(AF_INET, AF_INET, false, true);
-    }
-
-    @Test
-    public void testTransportInTunnelModeV6InV4UdpEncap() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelOutput(AF_INET6, AF_INET, true, true);
-        checkTunnelInput(AF_INET6, AF_INET, true, true);
-    }
-
-    @Test
-    public void testTransportInTunnelModeV6InV4UdpEncapReflected() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelReflected(AF_INET, AF_INET, false, true);
-    }
-
-    @Test
-    public void testTransportInTunnelModeV6InV6() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelOutput(AF_INET, AF_INET6, false, true);
-        checkTunnelInput(AF_INET, AF_INET6, false, true);
-    }
-
-    @Test
-    public void testTransportInTunnelModeV6InV6Reflected() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelReflected(AF_INET, AF_INET, false, true);
-    }
-
-    // Tunnel mode tests
-    @Test
-    public void testTunnelV4InV4() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelOutput(AF_INET, AF_INET, false, false);
-        checkTunnelInput(AF_INET, AF_INET, false, false);
-    }
-
-    @Test
-    public void testTunnelV4InV4Reflected() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelReflected(AF_INET, AF_INET, false, false);
-    }
-
-    @Test
-    public void testTunnelV4InV4UdpEncap() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelOutput(AF_INET, AF_INET, true, false);
-        checkTunnelInput(AF_INET, AF_INET, true, false);
-    }
-
-    @Test
-    public void testTunnelV4InV4UdpEncapReflected() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelReflected(AF_INET, AF_INET, true, false);
-    }
-
-    @Test
-    public void testTunnelV4InV6() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelOutput(AF_INET, AF_INET6, false, false);
-        checkTunnelInput(AF_INET, AF_INET6, false, false);
-    }
-
-    @Test
-    public void testTunnelV4InV6Reflected() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelReflected(AF_INET, AF_INET6, false, false);
-    }
-
-    @Test
-    public void testTunnelV6InV4() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelOutput(AF_INET6, AF_INET, false, false);
-        checkTunnelInput(AF_INET6, AF_INET, false, false);
-    }
-
-    @Test
-    public void testTunnelV6InV4Reflected() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelReflected(AF_INET6, AF_INET, false, false);
-    }
-
-    @Test
-    public void testTunnelV6InV4UdpEncap() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelOutput(AF_INET6, AF_INET, true, false);
-        checkTunnelInput(AF_INET6, AF_INET, true, false);
-    }
-
-    @Test
-    public void testTunnelV6InV4UdpEncapReflected() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelReflected(AF_INET6, AF_INET, true, false);
-    }
-
-    @Test
-    public void testTunnelV6InV6() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelOutput(AF_INET6, AF_INET6, false, false);
-        checkTunnelInput(AF_INET6, AF_INET6, false, false);
-    }
-
-    @Test
-    public void testTunnelV6InV6Reflected() throws Exception {
-        assumeTrue(mCtsNetUtils.hasIpsecTunnelsFeature());
-        checkTunnelReflected(AF_INET6, AF_INET6, false, false);
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/LocalServerSocketTest.java b/tests/tests/net/src/android/net/cts/LocalServerSocketTest.java
deleted file mode 100644
index 7c5a1b3..0000000
--- a/tests/tests/net/src/android/net/cts/LocalServerSocketTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2009 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 junit.framework.TestCase;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import android.net.LocalServerSocket;
-import android.net.LocalSocket;
-import android.net.LocalSocketAddress;
-
-public class LocalServerSocketTest extends TestCase {
-
-    public void testLocalServerSocket() throws IOException {
-        String address = "com.android.net.LocalServerSocketTest_testLocalServerSocket";
-        LocalServerSocket localServerSocket = new LocalServerSocket(address);
-        assertNotNull(localServerSocket.getLocalSocketAddress());
-
-        // create client socket
-        LocalSocket clientSocket = new LocalSocket();
-
-        // establish connection between client and server
-        clientSocket.connect(new LocalSocketAddress(address));
-        LocalSocket serverSocket = localServerSocket.accept();
-
-        assertTrue(serverSocket.isConnected());
-        assertTrue(serverSocket.isBound());
-
-        // send data from client to server
-        OutputStream clientOutStream = clientSocket.getOutputStream();
-        clientOutStream.write(12);
-        InputStream serverInStream = serverSocket.getInputStream();
-        assertEquals(12, serverInStream.read());
-
-        // send data from server to client
-        OutputStream serverOutStream = serverSocket.getOutputStream();
-        serverOutStream.write(3);
-        InputStream clientInStream = clientSocket.getInputStream();
-        assertEquals(3, clientInStream.read());
-
-        // close server socket
-        assertNotNull(localServerSocket.getFileDescriptor());
-        localServerSocket.close();
-        assertNull(localServerSocket.getFileDescriptor());
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/LocalSocketAddressTest.java b/tests/tests/net/src/android/net/cts/LocalSocketAddressTest.java
deleted file mode 100644
index 6ef003b..0000000
--- a/tests/tests/net/src/android/net/cts/LocalSocketAddressTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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.net.cts;
-
-import android.net.LocalSocketAddress;
-import android.net.LocalSocketAddress.Namespace;
-import android.test.AndroidTestCase;
-
-public class LocalSocketAddressTest extends AndroidTestCase {
-
-    public void testNewLocalSocketAddressWithDefaultNamespace() {
-        // default namespace
-        LocalSocketAddress localSocketAddress = new LocalSocketAddress("name");
-        assertEquals("name", localSocketAddress.getName());
-        assertEquals(Namespace.ABSTRACT, localSocketAddress.getNamespace());
-
-        // specify the namespace
-        LocalSocketAddress localSocketAddress2 =
-                new LocalSocketAddress("name2", Namespace.ABSTRACT);
-        assertEquals("name2", localSocketAddress2.getName());
-        assertEquals(Namespace.ABSTRACT, localSocketAddress2.getNamespace());
-
-        LocalSocketAddress localSocketAddress3 =
-                new LocalSocketAddress("name3", Namespace.FILESYSTEM);
-        assertEquals("name3", localSocketAddress3.getName());
-        assertEquals(Namespace.FILESYSTEM, localSocketAddress3.getNamespace());
-
-        LocalSocketAddress localSocketAddress4 =
-                new LocalSocketAddress("name4", Namespace.RESERVED);
-        assertEquals("name4", localSocketAddress4.getName());
-        assertEquals(Namespace.RESERVED, localSocketAddress4.getNamespace());
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/LocalSocketAddress_NamespaceTest.java b/tests/tests/net/src/android/net/cts/LocalSocketAddress_NamespaceTest.java
deleted file mode 100644
index 97dfa43..0000000
--- a/tests/tests/net/src/android/net/cts/LocalSocketAddress_NamespaceTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2009 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.net.LocalSocketAddress.Namespace;
-import android.test.AndroidTestCase;
-
-public class LocalSocketAddress_NamespaceTest extends AndroidTestCase {
-
-    public void testValueOf() {
-        assertEquals(Namespace.ABSTRACT, Namespace.valueOf("ABSTRACT"));
-        assertEquals(Namespace.RESERVED, Namespace.valueOf("RESERVED"));
-        assertEquals(Namespace.FILESYSTEM, Namespace.valueOf("FILESYSTEM"));
-    }
-
-    public void testValues() {
-        Namespace[] expected = Namespace.values();
-        assertEquals(Namespace.ABSTRACT, expected[0]);
-        assertEquals(Namespace.RESERVED, expected[1]);
-        assertEquals(Namespace.FILESYSTEM, expected[2]);
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/LocalSocketTest.java b/tests/tests/net/src/android/net/cts/LocalSocketTest.java
deleted file mode 100644
index 6e61705..0000000
--- a/tests/tests/net/src/android/net/cts/LocalSocketTest.java
+++ /dev/null
@@ -1,470 +0,0 @@
-/*
- * 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.net.cts;
-
-import junit.framework.TestCase;
-
-import android.net.Credentials;
-import android.net.LocalServerSocket;
-import android.net.LocalSocket;
-import android.net.LocalSocketAddress;
-import android.system.Os;
-import android.system.OsConstants;
-
-import java.io.FileDescriptor;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.concurrent.Callable;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-
-public class LocalSocketTest extends TestCase {
-    private final static String ADDRESS_PREFIX = "com.android.net.LocalSocketTest";
-
-    public void testLocalConnections() throws IOException {
-        String address = ADDRESS_PREFIX + "_testLocalConnections";
-        // create client and server socket
-        LocalServerSocket localServerSocket = new LocalServerSocket(address);
-        LocalSocket clientSocket = new LocalSocket();
-
-        // establish connection between client and server
-        LocalSocketAddress locSockAddr = new LocalSocketAddress(address);
-        assertFalse(clientSocket.isConnected());
-        clientSocket.connect(locSockAddr);
-        assertTrue(clientSocket.isConnected());
-
-        LocalSocket serverSocket = localServerSocket.accept();
-        assertTrue(serverSocket.isConnected());
-        assertTrue(serverSocket.isBound());
-        try {
-            serverSocket.bind(localServerSocket.getLocalSocketAddress());
-            fail("Cannot bind a LocalSocket from accept()");
-        } catch (IOException expected) {
-        }
-        try {
-            serverSocket.connect(locSockAddr);
-            fail("Cannot connect a LocalSocket from accept()");
-        } catch (IOException expected) {
-        }
-
-        Credentials credent = clientSocket.getPeerCredentials();
-        assertTrue(0 != credent.getPid());
-
-        // send data from client to server
-        OutputStream clientOutStream = clientSocket.getOutputStream();
-        clientOutStream.write(12);
-        InputStream serverInStream = serverSocket.getInputStream();
-        assertEquals(12, serverInStream.read());
-
-        //send data from server to client
-        OutputStream serverOutStream = serverSocket.getOutputStream();
-        serverOutStream.write(3);
-        InputStream clientInStream = clientSocket.getInputStream();
-        assertEquals(3, clientInStream.read());
-
-        // Test sending and receiving file descriptors
-        clientSocket.setFileDescriptorsForSend(new FileDescriptor[]{FileDescriptor.in});
-        clientOutStream.write(32);
-        assertEquals(32, serverInStream.read());
-
-        FileDescriptor[] out = serverSocket.getAncillaryFileDescriptors();
-        assertEquals(1, out.length);
-        FileDescriptor fd = clientSocket.getFileDescriptor();
-        assertTrue(fd.valid());
-
-        //shutdown input stream of client
-        clientSocket.shutdownInput();
-        assertEquals(-1, clientInStream.read());
-
-        //shutdown output stream of client
-        clientSocket.shutdownOutput();
-        try {
-            clientOutStream.write(10);
-            fail("testLocalSocket shouldn't come to here");
-        } catch (IOException e) {
-            // expected
-        }
-
-        //shutdown input stream of server
-        serverSocket.shutdownInput();
-        assertEquals(-1, serverInStream.read());
-
-        //shutdown output stream of server
-        serverSocket.shutdownOutput();
-        try {
-            serverOutStream.write(10);
-            fail("testLocalSocket shouldn't come to here");
-        } catch (IOException e) {
-            // expected
-        }
-
-        //close client socket
-        clientSocket.close();
-        try {
-            clientInStream.read();
-            fail("testLocalSocket shouldn't come to here");
-        } catch (IOException e) {
-            // expected
-        }
-
-        //close server socket
-        serverSocket.close();
-        try {
-            serverInStream.read();
-            fail("testLocalSocket shouldn't come to here");
-        } catch (IOException e) {
-            // expected
-        }
-    }
-
-    public void testAccessors() throws IOException {
-        String address = ADDRESS_PREFIX + "_testAccessors";
-        LocalSocket socket = new LocalSocket();
-        LocalSocketAddress addr = new LocalSocketAddress(address);
-
-        assertFalse(socket.isBound());
-        socket.bind(addr);
-        assertTrue(socket.isBound());
-        assertEquals(addr, socket.getLocalSocketAddress());
-
-        String str = socket.toString();
-        assertTrue(str.contains("impl:android.net.LocalSocketImpl"));
-
-        socket.setReceiveBufferSize(1999);
-        assertEquals(1999 << 1, socket.getReceiveBufferSize());
-
-        socket.setSendBufferSize(3998);
-        assertEquals(3998 << 1, socket.getSendBufferSize());
-
-        assertEquals(0, socket.getSoTimeout());
-        socket.setSoTimeout(1996);
-        assertTrue(socket.getSoTimeout() > 0);
-
-        try {
-            socket.getRemoteSocketAddress();
-            fail("testLocalSocketSecondary shouldn't come to here");
-        } catch (UnsupportedOperationException e) {
-            // expected
-        }
-
-        try {
-            socket.isClosed();
-            fail("testLocalSocketSecondary shouldn't come to here");
-        } catch (UnsupportedOperationException e) {
-            // expected
-        }
-
-        try {
-            socket.isInputShutdown();
-            fail("testLocalSocketSecondary shouldn't come to here");
-        } catch (UnsupportedOperationException e) {
-            // expected
-        }
-
-        try {
-            socket.isOutputShutdown();
-            fail("testLocalSocketSecondary shouldn't come to here");
-        } catch (UnsupportedOperationException e) {
-            // expected
-        }
-
-        try {
-            socket.connect(addr, 2005);
-            fail("testLocalSocketSecondary shouldn't come to here");
-        } catch (UnsupportedOperationException e) {
-            // expected
-        }
-
-        socket.close();
-    }
-
-    // http://b/31205169
-    public void testSetSoTimeout_readTimeout() throws Exception {
-        String address = ADDRESS_PREFIX + "_testSetSoTimeout_readTimeout";
-
-        try (LocalSocketPair socketPair = LocalSocketPair.createConnectedSocketPair(address)) {
-            final LocalSocket clientSocket = socketPair.clientSocket;
-
-            // Set the timeout in millis.
-            int timeoutMillis = 1000;
-            clientSocket.setSoTimeout(timeoutMillis);
-
-            // Avoid blocking the test run if timeout doesn't happen by using a separate thread.
-            Callable<Result> reader = () -> {
-                try {
-                    clientSocket.getInputStream().read();
-                    return Result.noException("Did not block");
-                } catch (IOException e) {
-                    return Result.exception(e);
-                }
-            };
-            // Allow the configured timeout, plus some slop.
-            int allowedTime = timeoutMillis + 2000;
-            Result result = runInSeparateThread(allowedTime, reader);
-
-            // Check the message was a timeout, it's all we have to go on.
-            String expectedMessage = Os.strerror(OsConstants.EAGAIN);
-            result.assertThrewIOException(expectedMessage);
-        }
-    }
-
-    // http://b/31205169
-    public void testSetSoTimeout_writeTimeout() throws Exception {
-        String address = ADDRESS_PREFIX + "_testSetSoTimeout_writeTimeout";
-
-        try (LocalSocketPair socketPair = LocalSocketPair.createConnectedSocketPair(address)) {
-            final LocalSocket clientSocket = socketPair.clientSocket;
-
-            // Set the timeout in millis.
-            int timeoutMillis = 1000;
-            clientSocket.setSoTimeout(timeoutMillis);
-
-            // Set a small buffer size so we know we can flood it.
-            clientSocket.setSendBufferSize(100);
-            final int bufferSize = clientSocket.getSendBufferSize();
-
-            // Avoid blocking the test run if timeout doesn't happen by using a separate thread.
-            Callable<Result> writer = () -> {
-                try {
-                    byte[] toWrite = new byte[bufferSize * 2];
-                    clientSocket.getOutputStream().write(toWrite);
-                    return Result.noException("Did not block");
-                } catch (IOException e) {
-                    return Result.exception(e);
-                }
-            };
-            // Allow the configured timeout, plus some slop.
-            int allowedTime = timeoutMillis + 2000;
-
-            Result result = runInSeparateThread(allowedTime, writer);
-
-            // Check the message was a timeout, it's all we have to go on.
-            String expectedMessage = Os.strerror(OsConstants.EAGAIN);
-            result.assertThrewIOException(expectedMessage);
-        }
-    }
-
-    public void testAvailable() throws Exception {
-        String address = ADDRESS_PREFIX + "_testAvailable";
-
-        try (LocalSocketPair socketPair = LocalSocketPair.createConnectedSocketPair(address)) {
-            LocalSocket clientSocket = socketPair.clientSocket;
-            LocalSocket serverSocket = socketPair.serverSocket.accept();
-
-            OutputStream clientOutputStream = clientSocket.getOutputStream();
-            InputStream serverInputStream = serverSocket.getInputStream();
-            assertEquals(0, serverInputStream.available());
-
-            byte[] buffer = new byte[50];
-            clientOutputStream.write(buffer);
-            assertEquals(50, serverInputStream.available());
-
-            InputStream clientInputStream = clientSocket.getInputStream();
-            OutputStream serverOutputStream = serverSocket.getOutputStream();
-            assertEquals(0, clientInputStream.available());
-            serverOutputStream.write(buffer);
-            assertEquals(50, serverInputStream.available());
-
-            serverSocket.close();
-        }
-    }
-
-    // http://b/34095140
-    public void testLocalSocketCreatedFromFileDescriptor() throws Exception {
-        String address = ADDRESS_PREFIX + "_testLocalSocketCreatedFromFileDescriptor";
-
-        // Establish connection between a local client and server to get a valid client socket file
-        // descriptor.
-        try (LocalSocketPair socketPair = LocalSocketPair.createConnectedSocketPair(address)) {
-            // Extract the client FileDescriptor we can use.
-            FileDescriptor fileDescriptor = socketPair.clientSocket.getFileDescriptor();
-            assertTrue(fileDescriptor.valid());
-
-            // Create the LocalSocket we want to test.
-            LocalSocket clientSocketCreatedFromFileDescriptor =
-                    LocalSocket.createConnectedLocalSocket(fileDescriptor);
-            assertTrue(clientSocketCreatedFromFileDescriptor.isConnected());
-            assertTrue(clientSocketCreatedFromFileDescriptor.isBound());
-
-            // Test the LocalSocket can be used for communication.
-            LocalSocket serverSocket = socketPair.serverSocket.accept();
-            OutputStream clientOutputStream =
-                    clientSocketCreatedFromFileDescriptor.getOutputStream();
-            InputStream serverInputStream = serverSocket.getInputStream();
-
-            clientOutputStream.write(12);
-            assertEquals(12, serverInputStream.read());
-
-            // Closing clientSocketCreatedFromFileDescriptor does not close the file descriptor.
-            clientSocketCreatedFromFileDescriptor.close();
-            assertTrue(fileDescriptor.valid());
-
-            // .. while closing the LocalSocket that owned the file descriptor does.
-            socketPair.clientSocket.close();
-            assertFalse(fileDescriptor.valid());
-        }
-    }
-
-    public void testFlush() throws Exception {
-        String address = ADDRESS_PREFIX + "_testFlush";
-
-        try (LocalSocketPair socketPair = LocalSocketPair.createConnectedSocketPair(address)) {
-            LocalSocket clientSocket = socketPair.clientSocket;
-            LocalSocket serverSocket = socketPair.serverSocket.accept();
-
-            OutputStream clientOutputStream = clientSocket.getOutputStream();
-            InputStream serverInputStream = serverSocket.getInputStream();
-            testFlushWorks(clientOutputStream, serverInputStream);
-
-            OutputStream serverOutputStream = serverSocket.getOutputStream();
-            InputStream clientInputStream = clientSocket.getInputStream();
-            testFlushWorks(serverOutputStream, clientInputStream);
-
-            serverSocket.close();
-        }
-    }
-
-    private void testFlushWorks(OutputStream outputStream, InputStream inputStream)
-            throws Exception {
-        final int bytesToTransfer = 50;
-        StreamReader inputStreamReader = new StreamReader(inputStream, bytesToTransfer);
-
-        byte[] buffer = new byte[bytesToTransfer];
-        outputStream.write(buffer);
-        assertEquals(bytesToTransfer, inputStream.available());
-
-        // Start consuming the data.
-        inputStreamReader.start();
-
-        // This doesn't actually flush any buffers, it just polls until the reader has read all the
-        // bytes.
-        outputStream.flush();
-
-        inputStreamReader.waitForCompletion(5000);
-        inputStreamReader.assertBytesRead(bytesToTransfer);
-        assertEquals(0, inputStream.available());
-    }
-
-    private static class StreamReader extends Thread {
-        private final InputStream is;
-        private final int expectedByteCount;
-        private final CountDownLatch completeLatch = new CountDownLatch(1);
-
-        private volatile Exception exception;
-        private int bytesRead;
-
-        private StreamReader(InputStream is, int expectedByteCount) {
-            this.is = is;
-            this.expectedByteCount = expectedByteCount;
-        }
-
-        @Override
-        public void run() {
-            try {
-                byte[] buffer = new byte[10];
-                int readCount;
-                while ((readCount = is.read(buffer)) >= 0) {
-                    bytesRead += readCount;
-                    if (bytesRead >= expectedByteCount) {
-                        break;
-                    }
-                }
-            } catch (IOException e) {
-                exception = e;
-            } finally {
-                completeLatch.countDown();
-            }
-        }
-
-        public void waitForCompletion(long waitMillis) throws Exception {
-            if (!completeLatch.await(waitMillis, TimeUnit.MILLISECONDS)) {
-                fail("Timeout waiting for completion");
-            }
-            if (exception != null) {
-                throw new Exception("Read failed", exception);
-            }
-        }
-
-        public void assertBytesRead(int expected) {
-            assertEquals(expected, bytesRead);
-        }
-    }
-
-    private static class Result {
-        private final String type;
-        private final Exception e;
-
-        private Result(String type, Exception e) {
-            this.type = type;
-            this.e = e;
-        }
-
-        static Result noException(String description) {
-            return new Result(description, null);
-        }
-
-        static Result exception(Exception e) {
-            return new Result(e.getClass().getName(), e);
-        }
-
-        void assertThrewIOException(String expectedMessage) {
-            assertEquals("Unexpected result type", IOException.class.getName(), type);
-            assertEquals("Unexpected exception message", expectedMessage, e.getMessage());
-        }
-    }
-
-    private static Result runInSeparateThread(int allowedTime, final Callable<Result> callable)
-            throws Exception {
-        ExecutorService service = Executors.newSingleThreadScheduledExecutor();
-        Future<Result> future = service.submit(callable);
-        Result result = future.get(allowedTime, TimeUnit.MILLISECONDS);
-        if (!future.isDone()) {
-            fail("Worker thread appears blocked");
-        }
-        return result;
-    }
-
-    private static class LocalSocketPair implements AutoCloseable {
-        static LocalSocketPair createConnectedSocketPair(String address) throws Exception {
-            LocalServerSocket localServerSocket = new LocalServerSocket(address);
-            final LocalSocket clientSocket = new LocalSocket();
-
-            // Establish connection between client and server
-            LocalSocketAddress locSockAddr = new LocalSocketAddress(address);
-            clientSocket.connect(locSockAddr);
-            assertTrue(clientSocket.isConnected());
-            return new LocalSocketPair(localServerSocket, clientSocket);
-        }
-
-        final LocalServerSocket serverSocket;
-        final LocalSocket clientSocket;
-
-        LocalSocketPair(LocalServerSocket serverSocket, LocalSocket clientSocket) {
-            this.serverSocket = serverSocket;
-            this.clientSocket = clientSocket;
-        }
-
-        public void close() throws Exception {
-            serverSocket.close();
-            clientSocket.close();
-        }
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/MacAddressTest.java b/tests/tests/net/src/android/net/cts/MacAddressTest.java
deleted file mode 100644
index 4d25e62..0000000
--- a/tests/tests/net/src/android/net/cts/MacAddressTest.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Copyright (C) 2018 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 static android.net.MacAddress.TYPE_BROADCAST;
-import static android.net.MacAddress.TYPE_MULTICAST;
-import static android.net.MacAddress.TYPE_UNICAST;
-
-import static com.android.testutils.ParcelUtilsKt.assertParcelSane;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import android.net.MacAddress;
-
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.net.Inet6Address;
-import java.util.Arrays;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-public class MacAddressTest {
-
-    static class TestCase {
-        final String macAddress;
-        final String ouiString;
-        final int addressType;
-        final boolean isLocallyAssigned;
-
-        TestCase(String macAddress, String ouiString, int addressType, boolean isLocallyAssigned) {
-            this.macAddress = macAddress;
-            this.ouiString = ouiString;
-            this.addressType = addressType;
-            this.isLocallyAssigned = isLocallyAssigned;
-        }
-    }
-
-    static final boolean LOCALLY_ASSIGNED = true;
-    static final boolean GLOBALLY_UNIQUE = false;
-
-    static String typeToString(int addressType) {
-        switch (addressType) {
-            case TYPE_UNICAST:
-                return "TYPE_UNICAST";
-            case TYPE_BROADCAST:
-                return "TYPE_BROADCAST";
-            case TYPE_MULTICAST:
-                return "TYPE_MULTICAST";
-            default:
-                return "UNKNOWN";
-        }
-    }
-
-    static String localAssignedToString(boolean isLocallyAssigned) {
-        return isLocallyAssigned ? "LOCALLY_ASSIGNED" : "GLOBALLY_UNIQUE";
-    }
-
-    @Test
-    public void testMacAddress() {
-        TestCase[] tests = {
-            new TestCase("ff:ff:ff:ff:ff:ff", "ff:ff:ff", TYPE_BROADCAST, LOCALLY_ASSIGNED),
-            new TestCase("d2:c4:22:4d:32:a8", "d2:c4:22", TYPE_UNICAST, LOCALLY_ASSIGNED),
-            new TestCase("33:33:aa:bb:cc:dd", "33:33:aa", TYPE_MULTICAST, LOCALLY_ASSIGNED),
-            new TestCase("06:00:00:00:00:00", "06:00:00", TYPE_UNICAST, LOCALLY_ASSIGNED),
-            new TestCase("07:00:d3:56:8a:c4", "07:00:d3", TYPE_MULTICAST, LOCALLY_ASSIGNED),
-            new TestCase("00:01:44:55:66:77", "00:01:44", TYPE_UNICAST, GLOBALLY_UNIQUE),
-            new TestCase("08:00:22:33:44:55", "08:00:22", TYPE_UNICAST, GLOBALLY_UNIQUE),
-        };
-
-        for (TestCase tc : tests) {
-            MacAddress mac = MacAddress.fromString(tc.macAddress);
-
-            if (!tc.ouiString.equals(mac.toOuiString())) {
-                fail(String.format("expected OUI string %s, got %s",
-                        tc.ouiString, mac.toOuiString()));
-            }
-
-            if (tc.isLocallyAssigned != mac.isLocallyAssigned()) {
-                fail(String.format("expected %s to be %s, got %s", mac,
-                        localAssignedToString(tc.isLocallyAssigned),
-                        localAssignedToString(mac.isLocallyAssigned())));
-            }
-
-            if (tc.addressType != mac.getAddressType()) {
-                fail(String.format("expected %s address type to be %s, got %s", mac,
-                        typeToString(tc.addressType), typeToString(mac.getAddressType())));
-            }
-
-            if (!tc.macAddress.equals(mac.toString())) {
-                fail(String.format("expected toString() to return %s, got %s",
-                        tc.macAddress, mac.toString()));
-            }
-
-            if (!mac.equals(MacAddress.fromBytes(mac.toByteArray()))) {
-                byte[] bytes = mac.toByteArray();
-                fail(String.format("expected mac address from bytes %s to be %s, got %s",
-                        Arrays.toString(bytes),
-                        MacAddress.fromBytes(bytes),
-                        mac));
-            }
-        }
-    }
-
-    @Test
-    public void testConstructorInputValidation() {
-        String[] invalidStringAddresses = {
-            "",
-            "abcd",
-            "1:2:3:4:5",
-            "1:2:3:4:5:6:7",
-            "10000:2:3:4:5:6",
-        };
-
-        for (String s : invalidStringAddresses) {
-            try {
-                MacAddress mac = MacAddress.fromString(s);
-                fail("MacAddress.fromString(" + s + ") should have failed, but returned " + mac);
-            } catch (IllegalArgumentException excepted) {
-            }
-        }
-
-        try {
-            MacAddress mac = MacAddress.fromString(null);
-            fail("MacAddress.fromString(null) should have failed, but returned " + mac);
-        } catch (NullPointerException excepted) {
-        }
-
-        byte[][] invalidBytesAddresses = {
-            {},
-            {1,2,3,4,5},
-            {1,2,3,4,5,6,7},
-        };
-
-        for (byte[] b : invalidBytesAddresses) {
-            try {
-                MacAddress mac = MacAddress.fromBytes(b);
-                fail("MacAddress.fromBytes(" + Arrays.toString(b)
-                        + ") should have failed, but returned " + mac);
-            } catch (IllegalArgumentException excepted) {
-            }
-        }
-
-        try {
-            MacAddress mac = MacAddress.fromBytes(null);
-            fail("MacAddress.fromBytes(null) should have failed, but returned " + mac);
-        } catch (NullPointerException excepted) {
-        }
-    }
-
-    @Test
-    public void testMatches() {
-        // match 4 bytes prefix
-        assertTrue(MacAddress.fromString("aa:bb:cc:dd:ee:11").matches(
-                MacAddress.fromString("aa:bb:cc:dd:00:00"),
-                MacAddress.fromString("ff:ff:ff:ff:00:00")));
-
-        // match bytes 0,1,2 and 5
-        assertTrue(MacAddress.fromString("aa:bb:cc:dd:ee:11").matches(
-                MacAddress.fromString("aa:bb:cc:00:00:11"),
-                MacAddress.fromString("ff:ff:ff:00:00:ff")));
-
-        // match 34 bit prefix
-        assertTrue(MacAddress.fromString("aa:bb:cc:dd:ee:11").matches(
-                MacAddress.fromString("aa:bb:cc:dd:c0:00"),
-                MacAddress.fromString("ff:ff:ff:ff:c0:00")));
-
-        // fail to match 36 bit prefix
-        assertFalse(MacAddress.fromString("aa:bb:cc:dd:ee:11").matches(
-                MacAddress.fromString("aa:bb:cc:dd:40:00"),
-                MacAddress.fromString("ff:ff:ff:ff:f0:00")));
-
-        // match all 6 bytes
-        assertTrue(MacAddress.fromString("aa:bb:cc:dd:ee:11").matches(
-                MacAddress.fromString("aa:bb:cc:dd:ee:11"),
-                MacAddress.fromString("ff:ff:ff:ff:ff:ff")));
-
-        // match none of 6 bytes
-        assertTrue(MacAddress.fromString("aa:bb:cc:dd:ee:11").matches(
-                MacAddress.fromString("00:00:00:00:00:00"),
-                MacAddress.fromString("00:00:00:00:00:00")));
-    }
-
-    /**
-     * Tests that link-local address generation from MAC is valid.
-     */
-    @Test
-    public void testLinkLocalFromMacGeneration() {
-        final MacAddress mac = MacAddress.fromString("52:74:f2:b1:a8:7f");
-        final byte[] inet6ll = {(byte) 0xfe, (byte) 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50,
-                0x74, (byte) 0xf2, (byte) 0xff, (byte) 0xfe, (byte) 0xb1, (byte) 0xa8, 0x7f};
-        final Inet6Address llv6 = mac.getLinkLocalIpv6FromEui48Mac();
-        assertTrue(llv6.isLinkLocalAddress());
-        assertArrayEquals(inet6ll, llv6.getAddress());
-    }
-
-    @Test
-    public void testParcelMacAddress() {
-        final MacAddress mac = MacAddress.fromString("52:74:f2:b1:a8:7f");
-
-        assertParcelSane(mac, 1);
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/MailToTest.java b/tests/tests/net/src/android/net/cts/MailToTest.java
deleted file mode 100644
index e454d20..0000000
--- a/tests/tests/net/src/android/net/cts/MailToTest.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * 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.net.cts;
-
-import android.net.MailTo;
-import android.test.AndroidTestCase;
-import android.util.Log;
-
-public class MailToTest extends AndroidTestCase {
-    private static final String MAILTOURI_1 = "mailto:chris@example.com";
-    private static final String MAILTOURI_2 = "mailto:infobot@example.com?subject=current-issue";
-    private static final String MAILTOURI_3 =
-            "mailto:infobot@example.com?body=send%20current-issue";
-    private static final String MAILTOURI_4 = "mailto:infobot@example.com?body=send%20current-" +
-                                              "issue%0D%0Asend%20index";
-    private static final String MAILTOURI_5 = "mailto:joe@example.com?" +
-                                              "cc=bob@example.com&body=hello";
-    private static final String MAILTOURI_6 = "mailto:?to=joe@example.com&" +
-                                              "cc=bob@example.com&body=hello";
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-    }
-
-    public void testParseMailToURI() {
-        assertFalse(MailTo.isMailTo(null));
-        assertFalse(MailTo.isMailTo(""));
-        assertFalse(MailTo.isMailTo("http://www.google.com"));
-
-        assertTrue(MailTo.isMailTo(MAILTOURI_1));
-        MailTo mailTo_1 = MailTo.parse(MAILTOURI_1);
-        Log.d("Trace", mailTo_1.toString());
-        assertEquals("chris@example.com", mailTo_1.getTo());
-        assertEquals(1, mailTo_1.getHeaders().size());
-        assertNull(mailTo_1.getBody());
-        assertNull(mailTo_1.getCc());
-        assertNull(mailTo_1.getSubject());
-        assertEquals("mailto:?to=chris%40example.com&", mailTo_1.toString());
-
-        assertTrue(MailTo.isMailTo(MAILTOURI_2));
-        MailTo mailTo_2 = MailTo.parse(MAILTOURI_2);
-        Log.d("Trace", mailTo_2.toString());
-        assertEquals(2, mailTo_2.getHeaders().size());
-        assertEquals("infobot@example.com", mailTo_2.getTo());
-        assertEquals("current-issue", mailTo_2.getSubject());
-        assertNull(mailTo_2.getBody());
-        assertNull(mailTo_2.getCc());
-        String stringUrl = mailTo_2.toString();
-        assertTrue(stringUrl.startsWith("mailto:?"));
-        assertTrue(stringUrl.contains("to=infobot%40example.com&"));
-        assertTrue(stringUrl.contains("subject=current-issue&"));
-
-        assertTrue(MailTo.isMailTo(MAILTOURI_3));
-        MailTo mailTo_3 = MailTo.parse(MAILTOURI_3);
-        Log.d("Trace", mailTo_3.toString());
-        assertEquals(2, mailTo_3.getHeaders().size());
-        assertEquals("infobot@example.com", mailTo_3.getTo());
-        assertEquals("send current-issue", mailTo_3.getBody());
-        assertNull(mailTo_3.getCc());
-        assertNull(mailTo_3.getSubject());
-        stringUrl = mailTo_3.toString();
-        assertTrue(stringUrl.startsWith("mailto:?"));
-        assertTrue(stringUrl.contains("to=infobot%40example.com&"));
-        assertTrue(stringUrl.contains("body=send%20current-issue&"));
-
-        assertTrue(MailTo.isMailTo(MAILTOURI_4));
-        MailTo mailTo_4 = MailTo.parse(MAILTOURI_4);
-        Log.d("Trace", mailTo_4.toString() + " " + mailTo_4.getBody());
-        assertEquals(2, mailTo_4.getHeaders().size());
-        assertEquals("infobot@example.com", mailTo_4.getTo());
-        assertEquals("send current-issue\r\nsend index", mailTo_4.getBody());
-        assertNull(mailTo_4.getCc());
-        assertNull(mailTo_4.getSubject());
-        stringUrl = mailTo_4.toString();
-        assertTrue(stringUrl.startsWith("mailto:?"));
-        assertTrue(stringUrl.contains("to=infobot%40example.com&"));
-        assertTrue(stringUrl.contains("body=send%20current-issue%0D%0Asend%20index&"));
-
-
-        assertTrue(MailTo.isMailTo(MAILTOURI_5));
-        MailTo mailTo_5 = MailTo.parse(MAILTOURI_5);
-        Log.d("Trace", mailTo_5.toString() + mailTo_5.getHeaders().toString()
-                + mailTo_5.getHeaders().size());
-        assertEquals(3, mailTo_5.getHeaders().size());
-        assertEquals("joe@example.com", mailTo_5.getTo());
-        assertEquals("bob@example.com", mailTo_5.getCc());
-        assertEquals("hello", mailTo_5.getBody());
-        assertNull(mailTo_5.getSubject());
-        stringUrl = mailTo_5.toString();
-        assertTrue(stringUrl.startsWith("mailto:?"));
-        assertTrue(stringUrl.contains("cc=bob%40example.com&"));
-        assertTrue(stringUrl.contains("body=hello&"));
-        assertTrue(stringUrl.contains("to=joe%40example.com&"));
-
-        assertTrue(MailTo.isMailTo(MAILTOURI_6));
-        MailTo mailTo_6 = MailTo.parse(MAILTOURI_6);
-        Log.d("Trace", mailTo_6.toString() + mailTo_6.getHeaders().toString()
-                + mailTo_6.getHeaders().size());
-        assertEquals(3, mailTo_6.getHeaders().size());
-        assertEquals(", joe@example.com", mailTo_6.getTo());
-        assertEquals("bob@example.com", mailTo_6.getCc());
-        assertEquals("hello", mailTo_6.getBody());
-        assertNull(mailTo_6.getSubject());
-        stringUrl = mailTo_6.toString();
-        assertTrue(stringUrl.startsWith("mailto:?"));
-        assertTrue(stringUrl.contains("cc=bob%40example.com&"));
-        assertTrue(stringUrl.contains("body=hello&"));
-        assertTrue(stringUrl.contains("to=%2C%20joe%40example.com&"));
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/MultinetworkApiTest.java b/tests/tests/net/src/android/net/cts/MultinetworkApiTest.java
deleted file mode 100644
index 6d3db89..0000000
--- a/tests/tests/net/src/android/net/cts/MultinetworkApiTest.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Copyright (C) 2015 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 static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
-
-import android.content.Context;
-import android.content.ContentResolver;
-import android.net.ConnectivityManager;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.NetworkUtils;
-import android.net.cts.util.CtsNetUtils;
-import android.platform.test.annotations.AppModeFull;
-import android.provider.Settings;
-import android.system.ErrnoException;
-import android.system.OsConstants;
-import android.test.AndroidTestCase;
-
-import java.util.ArrayList;
-
-public class MultinetworkApiTest extends AndroidTestCase {
-
-    static {
-        System.loadLibrary("nativemultinetwork_jni");
-    }
-
-    private static final String TAG = "MultinetworkNativeApiTest";
-    static final String GOOGLE_PRIVATE_DNS_SERVER = "dns.google";
-
-    /**
-     * @return 0 on success
-     */
-    private static native int runGetaddrinfoCheck(long networkHandle);
-    private static native int runSetprocnetwork(long networkHandle);
-    private static native int runSetsocknetwork(long networkHandle);
-    private static native int runDatagramCheck(long networkHandle);
-    private static native void runResNapiMalformedCheck(long networkHandle);
-    private static native void runResNcancelCheck(long networkHandle);
-    private static native void runResNqueryCheck(long networkHandle);
-    private static native void runResNsendCheck(long networkHandle);
-    private static native void runResNnxDomainCheck(long networkHandle);
-
-
-    private ContentResolver mCR;
-    private ConnectivityManager mCM;
-    private CtsNetUtils mCtsNetUtils;
-    private String mOldMode;
-    private String mOldDnsSpecifier;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mCM = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
-        mCR = getContext().getContentResolver();
-        mCtsNetUtils = new CtsNetUtils(getContext());
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-    }
-
-    private Network[] getTestableNetworks() {
-        final ArrayList<Network> testableNetworks = new ArrayList<Network>();
-        for (Network network : mCM.getAllNetworks()) {
-            final NetworkCapabilities nc = mCM.getNetworkCapabilities(network);
-            if (nc != null
-                    && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
-                    && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) {
-                testableNetworks.add(network);
-            }
-        }
-
-        assertTrue(
-                "This test requires that at least one network be connected. " +
-                "Please ensure that the device is connected to a network.",
-                testableNetworks.size() >= 1);
-        return testableNetworks.toArray(new Network[0]);
-    }
-
-    public void testGetaddrinfo() throws ErrnoException {
-        for (Network network : getTestableNetworks()) {
-            int errno = runGetaddrinfoCheck(network.getNetworkHandle());
-            if (errno != 0) {
-                throw new ErrnoException(
-                        "getaddrinfo on " + mCM.getNetworkInfo(network), -errno);
-            }
-        }
-    }
-
-    public void testSetprocnetwork() throws ErrnoException {
-        // Hopefully no prior test in this process space has set a default network.
-        assertNull(mCM.getProcessDefaultNetwork());
-        assertEquals(0, NetworkUtils.getBoundNetworkForProcess());
-
-        for (Network network : getTestableNetworks()) {
-            mCM.setProcessDefaultNetwork(null);
-            assertNull(mCM.getProcessDefaultNetwork());
-
-            int errno = runSetprocnetwork(network.getNetworkHandle());
-            if (errno != 0) {
-                throw new ErrnoException(
-                        "setprocnetwork on " + mCM.getNetworkInfo(network), -errno);
-            }
-            Network processDefault = mCM.getProcessDefaultNetwork();
-            assertNotNull(processDefault);
-            assertEquals(network, processDefault);
-            // TODO: open DatagramSockets, connect them to 192.0.2.1 and 2001:db8::,
-            // and ensure that the source address is in fact on this network as
-            // determined by mCM.getLinkProperties(network).
-
-            mCM.setProcessDefaultNetwork(null);
-        }
-
-        for (Network network : getTestableNetworks()) {
-            NetworkUtils.bindProcessToNetwork(0);
-            assertNull(mCM.getBoundNetworkForProcess());
-
-            int errno = runSetprocnetwork(network.getNetworkHandle());
-            if (errno != 0) {
-                throw new ErrnoException(
-                        "setprocnetwork on " + mCM.getNetworkInfo(network), -errno);
-            }
-            assertEquals(network, new Network(mCM.getBoundNetworkForProcess()));
-            // TODO: open DatagramSockets, connect them to 192.0.2.1 and 2001:db8::,
-            // and ensure that the source address is in fact on this network as
-            // determined by mCM.getLinkProperties(network).
-
-            NetworkUtils.bindProcessToNetwork(0);
-        }
-    }
-
-    public void testSetsocknetwork() throws ErrnoException {
-        for (Network network : getTestableNetworks()) {
-            int errno = runSetsocknetwork(network.getNetworkHandle());
-            if (errno != 0) {
-                throw new ErrnoException(
-                        "setsocknetwork on " + mCM.getNetworkInfo(network), -errno);
-            }
-        }
-    }
-
-    public void testNativeDatagramTransmission() throws ErrnoException {
-        for (Network network : getTestableNetworks()) {
-            int errno = runDatagramCheck(network.getNetworkHandle());
-            if (errno != 0) {
-                throw new ErrnoException(
-                        "DatagramCheck on " + mCM.getNetworkInfo(network), -errno);
-            }
-        }
-    }
-
-    public void testNoSuchNetwork() {
-        final Network eNoNet = new Network(54321);
-        assertNull(mCM.getNetworkInfo(eNoNet));
-
-        final long eNoNetHandle = eNoNet.getNetworkHandle();
-        assertEquals(-OsConstants.ENONET, runSetsocknetwork(eNoNetHandle));
-        assertEquals(-OsConstants.ENONET, runSetprocnetwork(eNoNetHandle));
-        // TODO: correct test permissions so this call is not silently re-mapped
-        // to query on the default network.
-        // assertEquals(-OsConstants.ENONET, runGetaddrinfoCheck(eNoNetHandle));
-    }
-
-    public void testNetworkHandle() {
-        // Test Network -> NetworkHandle -> Network results in the same Network.
-        for (Network network : getTestableNetworks()) {
-            long networkHandle = network.getNetworkHandle();
-            Network newNetwork = Network.fromNetworkHandle(networkHandle);
-            assertEquals(newNetwork, network);
-        }
-
-        // Test that only obfuscated handles are allowed.
-        try {
-            Network.fromNetworkHandle(100);
-            fail();
-        } catch (IllegalArgumentException e) {}
-        try {
-            Network.fromNetworkHandle(-1);
-            fail();
-        } catch (IllegalArgumentException e) {}
-        try {
-            Network.fromNetworkHandle(0);
-            fail();
-        } catch (IllegalArgumentException e) {}
-    }
-
-    public void testResNApi() throws Exception {
-        final Network[] testNetworks = getTestableNetworks();
-
-        for (Network network : testNetworks) {
-            // Throws AssertionError directly in jni function if test fail.
-            runResNqueryCheck(network.getNetworkHandle());
-            runResNsendCheck(network.getNetworkHandle());
-            runResNcancelCheck(network.getNetworkHandle());
-            runResNapiMalformedCheck(network.getNetworkHandle());
-
-            final NetworkCapabilities nc = mCM.getNetworkCapabilities(network);
-            // Some cellular networks configure their DNS servers never to return NXDOMAIN, so don't
-            // test NXDOMAIN on these DNS servers.
-            // b/144521720
-            if (nc != null && !nc.hasTransport(TRANSPORT_CELLULAR)) {
-                runResNnxDomainCheck(network.getNetworkHandle());
-            }
-        }
-    }
-
-    @AppModeFull(reason = "WRITE_SECURE_SETTINGS permission can't be granted to instant apps")
-    public void testResNApiNXDomainPrivateDns() throws InterruptedException {
-        mCtsNetUtils.storePrivateDnsSetting();
-        // Enable private DNS strict mode and set server to dns.google before doing NxDomain test.
-        // b/144521720
-        try {
-            mCtsNetUtils.setPrivateDnsStrictMode(GOOGLE_PRIVATE_DNS_SERVER);
-            for (Network network : getTestableNetworks()) {
-              // Wait for private DNS setting to propagate.
-              mCtsNetUtils.awaitPrivateDnsSetting("NxDomain test wait private DNS setting timeout",
-                        network, GOOGLE_PRIVATE_DNS_SERVER, true);
-              runResNnxDomainCheck(network.getNetworkHandle());
-            }
-        } finally {
-            mCtsNetUtils.restorePrivateDnsSetting();
-        }
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/NetworkAgentTest.kt b/tests/tests/net/src/android/net/cts/NetworkAgentTest.kt
deleted file mode 100644
index c8e1fc3..0000000
--- a/tests/tests/net/src/android/net/cts/NetworkAgentTest.kt
+++ /dev/null
@@ -1,641 +0,0 @@
-/*
- * Copyright (C) 2020 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.app.Instrumentation
-import android.content.Context
-import android.net.ConnectivityManager
-import android.net.KeepalivePacketData
-import android.net.LinkAddress
-import android.net.LinkProperties
-import android.net.Network
-import android.net.NetworkAgent
-import android.net.NetworkAgent.CMD_ADD_KEEPALIVE_PACKET_FILTER
-import android.net.NetworkAgent.CMD_PREVENT_AUTOMATIC_RECONNECT
-import android.net.NetworkAgent.CMD_REMOVE_KEEPALIVE_PACKET_FILTER
-import android.net.NetworkAgent.CMD_REPORT_NETWORK_STATUS
-import android.net.NetworkAgent.CMD_SAVE_ACCEPT_UNVALIDATED
-import android.net.NetworkAgent.CMD_START_SOCKET_KEEPALIVE
-import android.net.NetworkAgent.CMD_STOP_SOCKET_KEEPALIVE
-import android.net.NetworkAgent.INVALID_NETWORK
-import android.net.NetworkAgent.VALID_NETWORK
-import android.net.NetworkAgentConfig
-import android.net.NetworkCapabilities
-import android.net.NetworkProvider
-import android.net.NetworkRequest
-import android.net.SocketKeepalive
-import android.net.StringNetworkSpecifier
-import android.net.Uri
-import android.os.Build
-import android.os.Bundle
-import android.os.Handler
-import android.os.HandlerThread
-import android.os.Looper
-import android.os.Message
-import android.os.Messenger
-import android.net.cts.NetworkAgentTest.TestableNetworkAgent.CallbackEntry.OnAddKeepalivePacketFilter
-import android.net.cts.NetworkAgentTest.TestableNetworkAgent.CallbackEntry.OnAutomaticReconnectDisabled
-import android.net.cts.NetworkAgentTest.TestableNetworkAgent.CallbackEntry.OnBandwidthUpdateRequested
-import android.net.cts.NetworkAgentTest.TestableNetworkAgent.CallbackEntry.OnNetworkUnwanted
-import android.net.cts.NetworkAgentTest.TestableNetworkAgent.CallbackEntry.OnRemoveKeepalivePacketFilter
-import android.net.cts.NetworkAgentTest.TestableNetworkAgent.CallbackEntry.OnSaveAcceptUnvalidated
-import android.net.cts.NetworkAgentTest.TestableNetworkAgent.CallbackEntry.OnSignalStrengthThresholdsUpdated
-import android.net.cts.NetworkAgentTest.TestableNetworkAgent.CallbackEntry.OnStartSocketKeepalive
-import android.net.cts.NetworkAgentTest.TestableNetworkAgent.CallbackEntry.OnStopSocketKeepalive
-import android.net.cts.NetworkAgentTest.TestableNetworkAgent.CallbackEntry.OnValidationStatus
-import androidx.test.InstrumentationRegistry
-import androidx.test.runner.AndroidJUnit4
-import com.android.internal.util.AsyncChannel
-import com.android.testutils.ArrayTrackRecord
-import com.android.testutils.DevSdkIgnoreRule
-import com.android.testutils.RecorderCallback.CallbackEntry.Available
-import com.android.testutils.RecorderCallback.CallbackEntry.Lost
-import com.android.testutils.TestableNetworkCallback
-import java.util.UUID
-import org.junit.After
-import org.junit.Assert.assertArrayEquals
-import org.junit.Assert.fail
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import java.net.InetAddress
-import java.time.Duration
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertFailsWith
-import kotlin.test.assertNotNull
-import kotlin.test.assertNull
-import kotlin.test.assertTrue
-
-// This test doesn't really have a constraint on how fast the methods should return. If it's
-// going to fail, it will simply wait forever, so setting a high timeout lowers the flake ratio
-// without affecting the run time of successful runs. Thus, set a very high timeout.
-private const val DEFAULT_TIMEOUT_MS = 5000L
-// When waiting for a NetworkCallback to determine there was no timeout, waiting is the
-// only possible thing (the relevant handler is the one in the real ConnectivityService,
-// and then there is the Binder call), so have a short timeout for this as it will be
-// exhausted every time.
-private const val NO_CALLBACK_TIMEOUT = 200L
-// Any legal score (0~99) for the test network would do, as it is going to be kept up by the
-// requests filed by the test and should never match normal internet requests. 70 is the default
-// score of Ethernet networks, it's as good a value as any other.
-private const val TEST_NETWORK_SCORE = 70
-private const val BETTER_NETWORK_SCORE = 75
-private const val FAKE_NET_ID = 1098
-private val instrumentation: Instrumentation
-    get() = InstrumentationRegistry.getInstrumentation()
-private val context: Context
-    get() = InstrumentationRegistry.getContext()
-private fun Message(what: Int, arg1: Int, arg2: Int, obj: Any?) = Message.obtain().also {
-    it.what = what
-    it.arg1 = arg1
-    it.arg2 = arg2
-    it.obj = obj
-}
-
-@RunWith(AndroidJUnit4::class)
-class NetworkAgentTest {
-    @Rule @JvmField
-    val ignoreRule = DevSdkIgnoreRule(ignoreClassUpTo = Build.VERSION_CODES.Q)
-
-    private val LOCAL_IPV4_ADDRESS = InetAddress.parseNumericAddress("192.0.2.1")
-    private val REMOTE_IPV4_ADDRESS = InetAddress.parseNumericAddress("192.0.2.2")
-
-    private val mCM = context.getSystemService(ConnectivityManager::class.java)
-    private val mHandlerThread = HandlerThread("${javaClass.simpleName} handler thread")
-    private val mFakeConnectivityService by lazy { FakeConnectivityService(mHandlerThread.looper) }
-
-    private class Provider(context: Context, looper: Looper) :
-            NetworkProvider(context, looper, "NetworkAgentTest NetworkProvider")
-
-    private val agentsToCleanUp = mutableListOf<NetworkAgent>()
-    private val callbacksToCleanUp = mutableListOf<TestableNetworkCallback>()
-
-    @Before
-    fun setUp() {
-        instrumentation.getUiAutomation().adoptShellPermissionIdentity()
-        mHandlerThread.start()
-    }
-
-    @After
-    fun tearDown() {
-        agentsToCleanUp.forEach { it.unregister() }
-        callbacksToCleanUp.forEach { mCM.unregisterNetworkCallback(it) }
-        mHandlerThread.quitSafely()
-        instrumentation.getUiAutomation().dropShellPermissionIdentity()
-    }
-
-    /**
-     * A fake that helps simulating ConnectivityService talking to a harnessed agent.
-     * This fake only supports speaking to one harnessed agent at a time because it
-     * only keeps track of one async channel.
-     */
-    private class FakeConnectivityService(looper: Looper) {
-        private val CMD_EXPECT_DISCONNECT = 1
-        private var disconnectExpected = false
-        private val msgHistory = ArrayTrackRecord<Message>().newReadHead()
-        private val asyncChannel = AsyncChannel()
-        private val handler = object : Handler(looper) {
-            override fun handleMessage(msg: Message) {
-                msgHistory.add(Message.obtain(msg)) // make a copy as the original will be recycled
-                when (msg.what) {
-                    CMD_EXPECT_DISCONNECT -> disconnectExpected = true
-                    AsyncChannel.CMD_CHANNEL_HALF_CONNECTED ->
-                        asyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION)
-                    AsyncChannel.CMD_CHANNEL_DISCONNECTED ->
-                        if (!disconnectExpected) {
-                            fail("Agent unexpectedly disconnected")
-                        } else {
-                            disconnectExpected = false
-                        }
-                }
-            }
-        }
-
-        fun connect(agentMsngr: Messenger) = asyncChannel.connect(context, handler, agentMsngr)
-
-        fun disconnect() = asyncChannel.disconnect()
-
-        fun sendMessage(what: Int, arg1: Int = 0, arg2: Int = 0, obj: Any? = null) =
-            asyncChannel.sendMessage(Message(what, arg1, arg2, obj))
-
-        fun expectMessage(what: Int) =
-            assertNotNull(msgHistory.poll(DEFAULT_TIMEOUT_MS) { it.what == what })
-
-        fun willExpectDisconnectOnce() = handler.sendEmptyMessage(CMD_EXPECT_DISCONNECT)
-    }
-
-    private open class TestableNetworkAgent(
-        looper: Looper,
-        val nc: NetworkCapabilities,
-        val lp: LinkProperties,
-        conf: NetworkAgentConfig
-    ) : NetworkAgent(context, looper, TestableNetworkAgent::class.java.simpleName /* tag */,
-            nc, lp, TEST_NETWORK_SCORE, conf, Provider(context, looper)) {
-        private val history = ArrayTrackRecord<CallbackEntry>().newReadHead()
-
-        sealed class CallbackEntry {
-            object OnBandwidthUpdateRequested : CallbackEntry()
-            object OnNetworkUnwanted : CallbackEntry()
-            data class OnAddKeepalivePacketFilter(
-                val slot: Int,
-                val packet: KeepalivePacketData
-            ) : CallbackEntry()
-            data class OnRemoveKeepalivePacketFilter(val slot: Int) : CallbackEntry()
-            data class OnStartSocketKeepalive(
-                val slot: Int,
-                val interval: Int,
-                val packet: KeepalivePacketData
-            ) : CallbackEntry()
-            data class OnStopSocketKeepalive(val slot: Int) : CallbackEntry()
-            data class OnSaveAcceptUnvalidated(val accept: Boolean) : CallbackEntry()
-            object OnAutomaticReconnectDisabled : CallbackEntry()
-            data class OnValidationStatus(val status: Int, val uri: Uri?) : CallbackEntry()
-            data class OnSignalStrengthThresholdsUpdated(val thresholds: IntArray) : CallbackEntry()
-        }
-
-        fun getName(): String? = (nc.getNetworkSpecifier() as? StringNetworkSpecifier)?.specifier
-
-        override fun onBandwidthUpdateRequested() {
-            history.add(OnBandwidthUpdateRequested)
-        }
-
-        override fun onNetworkUnwanted() {
-            history.add(OnNetworkUnwanted)
-        }
-
-        override fun onAddKeepalivePacketFilter(slot: Int, packet: KeepalivePacketData) {
-            history.add(OnAddKeepalivePacketFilter(slot, packet))
-        }
-
-        override fun onRemoveKeepalivePacketFilter(slot: Int) {
-            history.add(OnRemoveKeepalivePacketFilter(slot))
-        }
-
-        override fun onStartSocketKeepalive(
-            slot: Int,
-            interval: Duration,
-            packet: KeepalivePacketData
-        ) {
-            history.add(OnStartSocketKeepalive(slot, interval.seconds.toInt(), packet))
-        }
-
-        override fun onStopSocketKeepalive(slot: Int) {
-            history.add(OnStopSocketKeepalive(slot))
-        }
-
-        override fun onSaveAcceptUnvalidated(accept: Boolean) {
-            history.add(OnSaveAcceptUnvalidated(accept))
-        }
-
-        override fun onAutomaticReconnectDisabled() {
-            history.add(OnAutomaticReconnectDisabled)
-        }
-
-        override fun onSignalStrengthThresholdsUpdated(thresholds: IntArray) {
-            history.add(OnSignalStrengthThresholdsUpdated(thresholds))
-        }
-
-        fun expectEmptySignalStrengths() {
-            expectCallback<OnSignalStrengthThresholdsUpdated>().let {
-                // intArrayOf() without arguments makes an empty array
-                assertArrayEquals(intArrayOf(), it.thresholds)
-            }
-        }
-
-        override fun onValidationStatus(status: Int, uri: Uri?) {
-            history.add(OnValidationStatus(status, uri))
-        }
-
-        // Expects the initial validation event that always occurs immediately after registering
-        // a NetworkAgent whose network does not require validation (which test networks do
-        // not, since they lack the INTERNET capability). It always contains the default argument
-        // for the URI.
-        fun expectNoInternetValidationStatus() = expectCallback<OnValidationStatus>().let {
-            assertEquals(it.status, VALID_NETWORK)
-            // The returned Uri is parsed from the empty string, which means it's an
-            // instance of the (private) Uri.StringUri. There are no real good ways
-            // to check this, the least bad is to just convert it to a string and
-            // make sure it's empty.
-            assertEquals("", it.uri.toString())
-        }
-
-        inline fun <reified T : CallbackEntry> expectCallback(): T {
-            val foundCallback = history.poll(DEFAULT_TIMEOUT_MS)
-            assertTrue(foundCallback is T, "Expected ${T::class} but found $foundCallback")
-            return foundCallback
-        }
-
-        fun assertNoCallback() {
-            assertTrue(waitForIdle(DEFAULT_TIMEOUT_MS),
-                    "Handler didn't became idle after ${DEFAULT_TIMEOUT_MS}ms")
-            assertNull(history.peek())
-        }
-    }
-
-    private fun requestNetwork(request: NetworkRequest, callback: TestableNetworkCallback) {
-        mCM.requestNetwork(request, callback)
-        callbacksToCleanUp.add(callback)
-    }
-
-    private fun registerNetworkCallback(
-        request: NetworkRequest,
-        callback: TestableNetworkCallback
-    ) {
-        mCM.registerNetworkCallback(request, callback)
-        callbacksToCleanUp.add(callback)
-    }
-
-    private fun createNetworkAgent(name: String? = null): TestableNetworkAgent {
-        val nc = NetworkCapabilities().apply {
-            addTransportType(NetworkCapabilities.TRANSPORT_TEST)
-            removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
-            removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
-            addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED)
-            addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING)
-            addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
-            if (null != name) {
-                setNetworkSpecifier(StringNetworkSpecifier(name))
-            }
-        }
-        val lp = LinkProperties().apply {
-            addLinkAddress(LinkAddress(LOCAL_IPV4_ADDRESS, 0))
-        }
-        val config = NetworkAgentConfig.Builder().build()
-        return TestableNetworkAgent(mHandlerThread.looper, nc, lp, config).also {
-            agentsToCleanUp.add(it)
-        }
-    }
-
-    private fun createConnectedNetworkAgent(name: String? = null):
-            Pair<TestableNetworkAgent, TestableNetworkCallback> {
-        val request: NetworkRequest = NetworkRequest.Builder()
-                .clearCapabilities()
-                .addTransportType(NetworkCapabilities.TRANSPORT_TEST)
-                .build()
-        val callback = TestableNetworkCallback(timeoutMs = DEFAULT_TIMEOUT_MS)
-        requestNetwork(request, callback)
-        val agent = createNetworkAgent(name)
-        agent.register()
-        agent.markConnected()
-        return agent to callback
-    }
-
-    private fun createNetworkAgentWithFakeCS() = createNetworkAgent().also {
-        mFakeConnectivityService.connect(it.registerForTest(Network(FAKE_NET_ID)))
-    }
-
-    @Test
-    fun testConnectAndUnregister() {
-        val (agent, callback) = createConnectedNetworkAgent()
-        callback.expectAvailableThenValidatedCallbacks(agent.network)
-        agent.expectEmptySignalStrengths()
-        agent.expectNoInternetValidationStatus()
-        agent.unregister()
-        callback.expectCallback<Lost>(agent.network)
-        agent.expectCallback<OnNetworkUnwanted>()
-        assertFailsWith<IllegalStateException>("Must not be able to register an agent twice") {
-            agent.register()
-        }
-    }
-
-    @Test
-    fun testOnBandwidthUpdateRequested() {
-        val (agent, callback) = createConnectedNetworkAgent()
-        callback.expectAvailableThenValidatedCallbacks(agent.network)
-        agent.expectEmptySignalStrengths()
-        agent.expectNoInternetValidationStatus()
-        mCM.requestBandwidthUpdate(agent.network)
-        agent.expectCallback<OnBandwidthUpdateRequested>()
-        agent.unregister()
-    }
-
-    @Test
-    fun testSignalStrengthThresholds() {
-        val thresholds = intArrayOf(30, 50, 65)
-        val callbacks = thresholds.map { strength ->
-            val request = NetworkRequest.Builder()
-                    .clearCapabilities()
-                    .addTransportType(NetworkCapabilities.TRANSPORT_TEST)
-                    .setSignalStrength(strength)
-                    .build()
-            TestableNetworkCallback(DEFAULT_TIMEOUT_MS).also {
-                registerNetworkCallback(request, it)
-            }
-        }
-        createConnectedNetworkAgent().let { (agent, callback) ->
-            callback.expectAvailableThenValidatedCallbacks(agent.network)
-            agent.expectCallback<OnSignalStrengthThresholdsUpdated>().let {
-                assertArrayEquals(it.thresholds, thresholds)
-            }
-            agent.expectNoInternetValidationStatus()
-
-            // Send signal strength and check that the callbacks are called appropriately.
-            val nc = NetworkCapabilities(agent.nc)
-            nc.setSignalStrength(20)
-            agent.sendNetworkCapabilities(nc)
-            callbacks.forEach { it.assertNoCallback(NO_CALLBACK_TIMEOUT) }
-
-            nc.setSignalStrength(40)
-            agent.sendNetworkCapabilities(nc)
-            callbacks[0].expectAvailableCallbacks(agent.network)
-            callbacks[1].assertNoCallback(NO_CALLBACK_TIMEOUT)
-            callbacks[2].assertNoCallback(NO_CALLBACK_TIMEOUT)
-
-            nc.setSignalStrength(80)
-            agent.sendNetworkCapabilities(nc)
-            callbacks[0].expectCapabilitiesThat(agent.network) { it.signalStrength == 80 }
-            callbacks[1].expectAvailableCallbacks(agent.network)
-            callbacks[2].expectAvailableCallbacks(agent.network)
-
-            nc.setSignalStrength(55)
-            agent.sendNetworkCapabilities(nc)
-            callbacks[0].expectCapabilitiesThat(agent.network) { it.signalStrength == 55 }
-            callbacks[1].expectCapabilitiesThat(agent.network) { it.signalStrength == 55 }
-            callbacks[2].expectCallback<Lost>(agent.network)
-        }
-        callbacks.forEach {
-            mCM.unregisterNetworkCallback(it)
-        }
-    }
-
-    @Test
-    fun testSocketKeepalive(): Unit = createNetworkAgentWithFakeCS().let { agent ->
-        val packet = object : KeepalivePacketData(
-                LOCAL_IPV4_ADDRESS /* srcAddress */, 1234 /* srcPort */,
-                REMOTE_IPV4_ADDRESS /* dstAddress */, 4567 /* dstPort */,
-                ByteArray(100 /* size */) { it.toByte() /* init */ }) {}
-        val slot = 4
-        val interval = 37
-
-        mFakeConnectivityService.sendMessage(CMD_ADD_KEEPALIVE_PACKET_FILTER,
-                arg1 = slot, obj = packet)
-        mFakeConnectivityService.sendMessage(CMD_START_SOCKET_KEEPALIVE,
-                arg1 = slot, arg2 = interval, obj = packet)
-
-        agent.expectCallback<OnAddKeepalivePacketFilter>().let {
-            assertEquals(it.slot, slot)
-            assertEquals(it.packet, packet)
-        }
-        agent.expectCallback<OnStartSocketKeepalive>().let {
-            assertEquals(it.slot, slot)
-            assertEquals(it.interval, interval)
-            assertEquals(it.packet, packet)
-        }
-
-        agent.assertNoCallback()
-
-        // Check that when the agent sends a keepalive event, ConnectivityService receives the
-        // expected message.
-        agent.sendSocketKeepaliveEvent(slot, SocketKeepalive.ERROR_UNSUPPORTED)
-        mFakeConnectivityService.expectMessage(NetworkAgent.EVENT_SOCKET_KEEPALIVE).let() {
-            assertEquals(slot, it.arg1)
-            assertEquals(SocketKeepalive.ERROR_UNSUPPORTED, it.arg2)
-        }
-
-        mFakeConnectivityService.sendMessage(CMD_STOP_SOCKET_KEEPALIVE, arg1 = slot)
-        mFakeConnectivityService.sendMessage(CMD_REMOVE_KEEPALIVE_PACKET_FILTER, arg1 = slot)
-        agent.expectCallback<OnStopSocketKeepalive>().let {
-            assertEquals(it.slot, slot)
-        }
-        agent.expectCallback<OnRemoveKeepalivePacketFilter>().let {
-            assertEquals(it.slot, slot)
-        }
-    }
-
-    @Test
-    fun testSendUpdates(): Unit = createConnectedNetworkAgent().let { (agent, callback) ->
-        callback.expectAvailableThenValidatedCallbacks(agent.network)
-        agent.expectEmptySignalStrengths()
-        agent.expectNoInternetValidationStatus()
-        val ifaceName = "adhocIface"
-        val lp = LinkProperties(agent.lp)
-        lp.setInterfaceName(ifaceName)
-        agent.sendLinkProperties(lp)
-        callback.expectLinkPropertiesThat(agent.network) {
-            it.getInterfaceName() == ifaceName
-        }
-        val nc = NetworkCapabilities(agent.nc)
-        nc.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
-        agent.sendNetworkCapabilities(nc)
-        callback.expectCapabilitiesThat(agent.network) {
-            it.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
-        }
-    }
-
-    @Test
-    fun testSendScore() {
-        // This test will create two networks and check that the one with the stronger
-        // score wins out for a request that matches them both.
-        // First create requests to make sure both networks are kept up, using the
-        // specifier so they are specific to each network
-        val name1 = UUID.randomUUID().toString()
-        val name2 = UUID.randomUUID().toString()
-        val request1 = NetworkRequest.Builder()
-                .clearCapabilities()
-                .addTransportType(NetworkCapabilities.TRANSPORT_TEST)
-                .setNetworkSpecifier(StringNetworkSpecifier(name1))
-                .build()
-        val request2 = NetworkRequest.Builder()
-                .clearCapabilities()
-                .addTransportType(NetworkCapabilities.TRANSPORT_TEST)
-                .setNetworkSpecifier(StringNetworkSpecifier(name2))
-                .build()
-        val callback1 = TestableNetworkCallback(timeoutMs = DEFAULT_TIMEOUT_MS)
-        val callback2 = TestableNetworkCallback(timeoutMs = DEFAULT_TIMEOUT_MS)
-        requestNetwork(request1, callback1)
-        requestNetwork(request2, callback2)
-
-        // Then file the interesting request
-        val request = NetworkRequest.Builder()
-                .clearCapabilities()
-                .addTransportType(NetworkCapabilities.TRANSPORT_TEST)
-                .build()
-        val callback = TestableNetworkCallback(timeoutMs = DEFAULT_TIMEOUT_MS)
-        requestNetwork(request, callback)
-
-        // Connect the first Network
-        createConnectedNetworkAgent(name1).let { (agent1, _) ->
-            callback.expectAvailableThenValidatedCallbacks(agent1.network)
-            // Upgrade agent1 to a better score so that there is no ambiguity when
-            // agent2 connects that agent1 is still better
-            agent1.sendNetworkScore(BETTER_NETWORK_SCORE - 1)
-            // Connect the second agent
-            createConnectedNetworkAgent(name2).let { (agent2, _) ->
-                agent2.markConnected()
-                // The callback should not see anything yet
-                callback.assertNoCallback(NO_CALLBACK_TIMEOUT)
-                // Now update the score and expect the callback now prefers agent2
-                agent2.sendNetworkScore(BETTER_NETWORK_SCORE)
-                callback.expectCallback<Available>(agent2.network)
-            }
-        }
-
-        // tearDown() will unregister the requests and agents
-    }
-
-    @Test
-    fun testSetAcceptUnvalidated() {
-        createNetworkAgentWithFakeCS().let { agent ->
-            mFakeConnectivityService.sendMessage(CMD_SAVE_ACCEPT_UNVALIDATED, 1)
-            agent.expectCallback<OnSaveAcceptUnvalidated>().let {
-                assertTrue(it.accept)
-            }
-            agent.assertNoCallback()
-        }
-    }
-
-    @Test
-    fun testSetAcceptUnvalidatedPreventAutomaticReconnect() {
-        createNetworkAgentWithFakeCS().let { agent ->
-            mFakeConnectivityService.sendMessage(CMD_SAVE_ACCEPT_UNVALIDATED, 0)
-            mFakeConnectivityService.sendMessage(CMD_PREVENT_AUTOMATIC_RECONNECT)
-            agent.expectCallback<OnSaveAcceptUnvalidated>().let {
-                assertFalse(it.accept)
-            }
-            agent.expectCallback<OnAutomaticReconnectDisabled>()
-            agent.assertNoCallback()
-            // When automatic reconnect is turned off, the network is torn down and
-            // ConnectivityService sends a disconnect. This in turn causes the agent
-            // to send a DISCONNECTED message to CS.
-            mFakeConnectivityService.willExpectDisconnectOnce()
-            mFakeConnectivityService.disconnect()
-            mFakeConnectivityService.expectMessage(AsyncChannel.CMD_CHANNEL_DISCONNECTED)
-            agent.expectCallback<OnNetworkUnwanted>()
-        }
-    }
-
-    @Test
-    fun testPreventAutomaticReconnect() {
-        createNetworkAgentWithFakeCS().let { agent ->
-            mFakeConnectivityService.sendMessage(CMD_PREVENT_AUTOMATIC_RECONNECT)
-            agent.expectCallback<OnAutomaticReconnectDisabled>()
-            agent.assertNoCallback()
-            mFakeConnectivityService.willExpectDisconnectOnce()
-            mFakeConnectivityService.disconnect()
-            mFakeConnectivityService.expectMessage(AsyncChannel.CMD_CHANNEL_DISCONNECTED)
-            agent.expectCallback<OnNetworkUnwanted>()
-        }
-    }
-
-    @Test
-    fun testValidationStatus() = createNetworkAgentWithFakeCS().let { agent ->
-        val uri = Uri.parse("http://www.google.com")
-        val bundle = Bundle().apply {
-            putString(NetworkAgent.REDIRECT_URL_KEY, uri.toString())
-        }
-        mFakeConnectivityService.sendMessage(CMD_REPORT_NETWORK_STATUS,
-                arg1 = VALID_NETWORK, obj = bundle)
-        agent.expectCallback<OnValidationStatus>().let {
-            assertEquals(it.status, VALID_NETWORK)
-            assertEquals(it.uri, uri)
-        }
-
-        mFakeConnectivityService.sendMessage(CMD_REPORT_NETWORK_STATUS,
-                arg1 = INVALID_NETWORK, obj = Bundle())
-        agent.expectCallback<OnValidationStatus>().let {
-            assertEquals(it.status, INVALID_NETWORK)
-            assertNull(it.uri)
-        }
-    }
-
-    @Test
-    fun testTemporarilyUnmeteredCapability() {
-        // This test will create a networks with/without NET_CAPABILITY_TEMPORARILY_NOT_METERED
-        // and check that the callback reflects the capability changes.
-        // First create a request to make sure the network is kept up
-        val request1 = NetworkRequest.Builder()
-                .clearCapabilities()
-                .addTransportType(NetworkCapabilities.TRANSPORT_TEST)
-                .build()
-        val callback1 = TestableNetworkCallback(timeoutMs = DEFAULT_TIMEOUT_MS).also {
-            registerNetworkCallback(request1, it)
-        }
-        requestNetwork(request1, callback1)
-
-        // Then file the interesting request
-        val request = NetworkRequest.Builder()
-                .clearCapabilities()
-                .addTransportType(NetworkCapabilities.TRANSPORT_TEST)
-                .build()
-        val callback = TestableNetworkCallback(timeoutMs = DEFAULT_TIMEOUT_MS)
-        requestNetwork(request, callback)
-
-        // Connect the network
-        createConnectedNetworkAgent().let { (agent, _) ->
-            callback.expectAvailableThenValidatedCallbacks(agent.network)
-
-            // Send TEMP_NOT_METERED and check that the callback is called appropriately.
-            val nc1 = NetworkCapabilities(agent.nc)
-                    .addCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED)
-            agent.sendNetworkCapabilities(nc1)
-            callback.expectCapabilitiesThat(agent.network) {
-                it.hasCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED)
-            }
-
-            // Remove TEMP_NOT_METERED and check that the callback is called appropriately.
-            val nc2 = NetworkCapabilities(agent.nc)
-                    .removeCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED)
-            agent.sendNetworkCapabilities(nc2)
-            callback.expectCapabilitiesThat(agent.network) {
-                !it.hasCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED)
-            }
-        }
-
-        // tearDown() will unregister the requests and agents
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/NetworkInfoTest.kt b/tests/tests/net/src/android/net/cts/NetworkInfoTest.kt
deleted file mode 100644
index fa15e8f..0000000
--- a/tests/tests/net/src/android/net/cts/NetworkInfoTest.kt
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2020 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.os.Build
-import android.content.Context
-import android.net.ConnectivityManager
-import android.net.NetworkInfo
-import android.net.NetworkInfo.DetailedState
-import android.net.NetworkInfo.State
-import android.telephony.TelephonyManager
-import androidx.test.filters.SmallTest
-import androidx.test.platform.app.InstrumentationRegistry
-import androidx.test.runner.AndroidJUnit4
-import com.android.testutils.DevSdkIgnoreRule
-import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo
-import org.junit.Assert.assertEquals
-import org.junit.Assert.assertNotNull
-import org.junit.Assert.assertNull
-import org.junit.Assert.assertTrue
-import org.junit.Assert.fail
-import org.junit.Rule
-import org.junit.runner.RunWith
-import org.junit.Test
-
-const val TYPE_MOBILE = ConnectivityManager.TYPE_MOBILE
-const val TYPE_WIFI = ConnectivityManager.TYPE_WIFI
-const val MOBILE_TYPE_NAME = "mobile"
-const val WIFI_TYPE_NAME = "WIFI"
-const val LTE_SUBTYPE_NAME = "LTE"
-
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class NetworkInfoTest {
-    @Rule @JvmField
-    val ignoreRule = DevSdkIgnoreRule()
-
-    @Test
-    fun testAccessNetworkInfoProperties() {
-        val cm = InstrumentationRegistry.getInstrumentation().context
-                .getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
-        val ni = cm.getAllNetworkInfo()
-        assertTrue(ni.isNotEmpty())
-
-        for (netInfo in ni) {
-            when (netInfo.getType()) {
-                TYPE_MOBILE -> assertNetworkInfo(netInfo, MOBILE_TYPE_NAME)
-                TYPE_WIFI -> assertNetworkInfo(netInfo, WIFI_TYPE_NAME)
-                // TODO: Add BLUETOOTH_TETHER testing
-            }
-        }
-    }
-
-    private fun assertNetworkInfo(netInfo: NetworkInfo, expectedTypeName: String) {
-        assertTrue(expectedTypeName.equals(netInfo.getTypeName(), ignoreCase = true))
-        assertNotNull(netInfo.toString())
-
-        if (!netInfo.isConnectedOrConnecting()) return
-
-        assertTrue(netInfo.isAvailable())
-        if (State.CONNECTED == netInfo.getState()) {
-            assertTrue(netInfo.isConnected())
-        }
-        assertTrue(State.CONNECTING == netInfo.getState() ||
-                State.CONNECTED == netInfo.getState())
-        assertTrue(DetailedState.SCANNING == netInfo.getDetailedState() ||
-                DetailedState.CONNECTING == netInfo.getDetailedState() ||
-                DetailedState.AUTHENTICATING == netInfo.getDetailedState() ||
-                DetailedState.CONNECTED == netInfo.getDetailedState())
-    }
-
-    @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
-    fun testConstructor() {
-        val networkInfo = NetworkInfo(TYPE_MOBILE, TelephonyManager.NETWORK_TYPE_LTE,
-                MOBILE_TYPE_NAME, LTE_SUBTYPE_NAME)
-
-        assertEquals(TYPE_MOBILE, networkInfo.type)
-        assertEquals(TelephonyManager.NETWORK_TYPE_LTE, networkInfo.subtype)
-        assertEquals(MOBILE_TYPE_NAME, networkInfo.typeName)
-        assertEquals(LTE_SUBTYPE_NAME, networkInfo.subtypeName)
-        assertEquals(DetailedState.IDLE, networkInfo.detailedState)
-        assertEquals(State.UNKNOWN, networkInfo.state)
-        assertNull(networkInfo.reason)
-        assertNull(networkInfo.extraInfo)
-
-        try {
-            NetworkInfo(ConnectivityManager.MAX_NETWORK_TYPE + 1,
-                    TelephonyManager.NETWORK_TYPE_LTE, MOBILE_TYPE_NAME, LTE_SUBTYPE_NAME)
-            fail("Unexpected behavior. Network type is invalid.")
-        } catch (e: IllegalArgumentException) {
-            // Expected behavior.
-        }
-    }
-
-    @Test
-    fun testSetDetailedState() {
-        val networkInfo = NetworkInfo(TYPE_MOBILE, TelephonyManager.NETWORK_TYPE_LTE,
-                MOBILE_TYPE_NAME, LTE_SUBTYPE_NAME)
-        val reason = "TestNetworkInfo"
-        val extraReason = "setDetailedState test"
-
-        networkInfo.setDetailedState(DetailedState.CONNECTED, reason, extraReason)
-        assertEquals(DetailedState.CONNECTED, networkInfo.detailedState)
-        assertEquals(State.CONNECTED, networkInfo.state)
-        assertEquals(reason, networkInfo.reason)
-        assertEquals(extraReason, networkInfo.extraInfo)
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/NetworkInfo_DetailedStateTest.java b/tests/tests/net/src/android/net/cts/NetworkInfo_DetailedStateTest.java
deleted file mode 100644
index 590ce89..0000000
--- a/tests/tests/net/src/android/net/cts/NetworkInfo_DetailedStateTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2009 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.net.NetworkInfo.DetailedState;
-import android.test.AndroidTestCase;
-
-public class NetworkInfo_DetailedStateTest extends AndroidTestCase {
-
-    public void testValueOf() {
-        assertEquals(DetailedState.AUTHENTICATING, DetailedState.valueOf("AUTHENTICATING"));
-        assertEquals(DetailedState.CONNECTED, DetailedState.valueOf("CONNECTED"));
-        assertEquals(DetailedState.CONNECTING, DetailedState.valueOf("CONNECTING"));
-        assertEquals(DetailedState.DISCONNECTED, DetailedState.valueOf("DISCONNECTED"));
-        assertEquals(DetailedState.DISCONNECTING, DetailedState.valueOf("DISCONNECTING"));
-        assertEquals(DetailedState.FAILED, DetailedState.valueOf("FAILED"));
-        assertEquals(DetailedState.IDLE, DetailedState.valueOf("IDLE"));
-        assertEquals(DetailedState.OBTAINING_IPADDR, DetailedState.valueOf("OBTAINING_IPADDR"));
-        assertEquals(DetailedState.SCANNING, DetailedState.valueOf("SCANNING"));
-        assertEquals(DetailedState.SUSPENDED, DetailedState.valueOf("SUSPENDED"));
-    }
-
-    public void testValues() {
-        DetailedState[] expected = DetailedState.values();
-        assertEquals(13, expected.length);
-        assertEquals(DetailedState.IDLE, expected[0]);
-        assertEquals(DetailedState.SCANNING, expected[1]);
-        assertEquals(DetailedState.CONNECTING, expected[2]);
-        assertEquals(DetailedState.AUTHENTICATING, expected[3]);
-        assertEquals(DetailedState.OBTAINING_IPADDR, expected[4]);
-        assertEquals(DetailedState.CONNECTED, expected[5]);
-        assertEquals(DetailedState.SUSPENDED, expected[6]);
-        assertEquals(DetailedState.DISCONNECTING, expected[7]);
-        assertEquals(DetailedState.DISCONNECTED, expected[8]);
-        assertEquals(DetailedState.FAILED, expected[9]);
-        assertEquals(DetailedState.BLOCKED, expected[10]);
-        assertEquals(DetailedState.VERIFYING_POOR_LINK, expected[11]);
-        assertEquals(DetailedState.CAPTIVE_PORTAL_CHECK, expected[12]);
-    }
-
-}
diff --git a/tests/tests/net/src/android/net/cts/NetworkInfo_StateTest.java b/tests/tests/net/src/android/net/cts/NetworkInfo_StateTest.java
deleted file mode 100644
index 5303ef1..0000000
--- a/tests/tests/net/src/android/net/cts/NetworkInfo_StateTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2009 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.net.NetworkInfo.State;
-import android.test.AndroidTestCase;
-
-public class NetworkInfo_StateTest extends AndroidTestCase {
-
-    public void testValueOf() {
-        assertEquals(State.CONNECTED, State.valueOf("CONNECTED"));
-        assertEquals(State.CONNECTING, State.valueOf("CONNECTING"));
-        assertEquals(State.DISCONNECTED, State.valueOf("DISCONNECTED"));
-        assertEquals(State.DISCONNECTING, State.valueOf("DISCONNECTING"));
-        assertEquals(State.SUSPENDED, State.valueOf("SUSPENDED"));
-        assertEquals(State.UNKNOWN, State.valueOf("UNKNOWN"));
-    }
-
-    public void testValues() {
-        State[] expected = State.values();
-        assertEquals(6, expected.length);
-        assertEquals(State.CONNECTING, expected[0]);
-        assertEquals(State.CONNECTED, expected[1]);
-        assertEquals(State.SUSPENDED, expected[2]);
-        assertEquals(State.DISCONNECTING, expected[3]);
-        assertEquals(State.DISCONNECTED, expected[4]);
-        assertEquals(State.UNKNOWN, expected[5]);
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/NetworkRequestTest.java b/tests/tests/net/src/android/net/cts/NetworkRequestTest.java
deleted file mode 100644
index d118c8a..0000000
--- a/tests/tests/net/src/android/net/cts/NetworkRequestTest.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Copyright (C) 2018 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 static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_MMS;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED;
-import static android.net.NetworkCapabilities.TRANSPORT_BLUETOOTH;
-import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
-import static android.net.NetworkCapabilities.TRANSPORT_VPN;
-import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import android.net.MacAddress;
-import android.net.MatchAllNetworkSpecifier;
-import android.net.NetworkCapabilities;
-import android.net.NetworkRequest;
-import android.net.NetworkSpecifier;
-import android.net.UidRange;
-import android.net.wifi.WifiNetworkSpecifier;
-import android.os.Build;
-import android.os.PatternMatcher;
-import android.os.Process;
-import android.util.ArraySet;
-
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.testutils.DevSdkIgnoreRule;
-import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class NetworkRequestTest {
-    @Rule
-    public final DevSdkIgnoreRule ignoreRule = new DevSdkIgnoreRule();
-
-    private static final String TEST_SSID = "TestSSID";
-    private static final String OTHER_SSID = "OtherSSID";
-    private static final int TEST_UID = 2097;
-    private static final String TEST_PACKAGE_NAME = "test.package.name";
-    private static final MacAddress ARBITRARY_ADDRESS = MacAddress.fromString("3:5:8:12:9:2");
-
-    private class LocalNetworkSpecifier extends NetworkSpecifier {
-        private final int mId;
-
-        LocalNetworkSpecifier(int id) {
-            mId = id;
-        }
-
-        @Override
-        public boolean canBeSatisfiedBy(NetworkSpecifier other) {
-            return other instanceof LocalNetworkSpecifier
-                && mId == ((LocalNetworkSpecifier) other).mId;
-        }
-    }
-
-    @Test
-    public void testCapabilities() {
-        assertTrue(new NetworkRequest.Builder().addCapability(NET_CAPABILITY_MMS).build()
-                .hasCapability(NET_CAPABILITY_MMS));
-        assertFalse(new NetworkRequest.Builder().removeCapability(NET_CAPABILITY_MMS).build()
-                .hasCapability(NET_CAPABILITY_MMS));
-
-        final NetworkRequest nr = new NetworkRequest.Builder().clearCapabilities().build();
-        // Verify request has no capabilities
-        verifyNoCapabilities(nr);
-    }
-
-    @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
-    public void testTemporarilyNotMeteredCapability() {
-        assertTrue(new NetworkRequest.Builder()
-                .addCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED).build()
-                .hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED));
-        assertFalse(new NetworkRequest.Builder()
-                .removeCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED).build()
-                .hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED));
-    }
-
-    private void verifyNoCapabilities(NetworkRequest nr) {
-        // NetworkCapabilities.mNetworkCapabilities is defined as type long
-        final int MAX_POSSIBLE_CAPABILITY = Long.SIZE;
-        for(int bit = 0; bit < MAX_POSSIBLE_CAPABILITY; bit++) {
-            assertFalse(nr.hasCapability(bit));
-        }
-    }
-
-    @Test
-    public void testTransports() {
-        assertTrue(new NetworkRequest.Builder().addTransportType(TRANSPORT_BLUETOOTH).build()
-                .hasTransport(TRANSPORT_BLUETOOTH));
-        assertFalse(new NetworkRequest.Builder().removeTransportType(TRANSPORT_BLUETOOTH).build()
-                .hasTransport(TRANSPORT_BLUETOOTH));
-    }
-
-    @Test
-    @IgnoreUpTo(Build.VERSION_CODES.Q)
-    public void testSpecifier() {
-        assertNull(new NetworkRequest.Builder().build().getNetworkSpecifier());
-        final WifiNetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
-                .setSsidPattern(new PatternMatcher(TEST_SSID, PatternMatcher.PATTERN_LITERAL))
-                .setBssidPattern(ARBITRARY_ADDRESS, ARBITRARY_ADDRESS)
-                .build();
-        final NetworkSpecifier obtainedSpecifier = new NetworkRequest.Builder()
-                .addTransportType(TRANSPORT_WIFI)
-                .setNetworkSpecifier(specifier)
-                .build()
-                .getNetworkSpecifier();
-        assertEquals(obtainedSpecifier, specifier);
-
-        assertNull(new NetworkRequest.Builder()
-                .clearCapabilities()
-                .build()
-                .getNetworkSpecifier());
-    }
-
-    @Test
-    @IgnoreUpTo(Build.VERSION_CODES.Q)
-    public void testRequestorPackageName() {
-        assertNull(new NetworkRequest.Builder().build().getRequestorPackageName());
-        final String pkgName = "android.net.test";
-        final NetworkCapabilities nc = new NetworkCapabilities.Builder()
-                .setRequestorPackageName(pkgName)
-                .build();
-        final NetworkRequest nr = new NetworkRequest.Builder()
-                .setCapabilities(nc)
-                .build();
-        assertEquals(pkgName, nr.getRequestorPackageName());
-        assertNull(new NetworkRequest.Builder()
-                .clearCapabilities()
-                .build()
-                .getRequestorPackageName());
-    }
-
-    @Test
-    @IgnoreUpTo(Build.VERSION_CODES.Q)
-    public void testCanBeSatisfiedBy() {
-        final LocalNetworkSpecifier specifier1 = new LocalNetworkSpecifier(1234 /* id */);
-        final LocalNetworkSpecifier specifier2 = new LocalNetworkSpecifier(5678 /* id */);
-
-        final NetworkCapabilities capCellularMmsInternet = new NetworkCapabilities()
-                .addTransportType(TRANSPORT_CELLULAR)
-                .addCapability(NET_CAPABILITY_MMS)
-                .addCapability(NET_CAPABILITY_INTERNET);
-        final NetworkCapabilities capCellularVpnMmsInternet =
-                new NetworkCapabilities(capCellularMmsInternet).addTransportType(TRANSPORT_VPN);
-        final NetworkCapabilities capCellularMmsInternetSpecifier1 =
-                new NetworkCapabilities(capCellularMmsInternet).setNetworkSpecifier(specifier1);
-        final NetworkCapabilities capVpnInternetSpecifier1 = new NetworkCapabilities()
-                .addCapability(NET_CAPABILITY_INTERNET)
-                .addTransportType(TRANSPORT_VPN)
-                .setNetworkSpecifier(specifier1);
-        final NetworkCapabilities capCellularMmsInternetMatchallspecifier =
-                new NetworkCapabilities(capCellularMmsInternet)
-                    .setNetworkSpecifier(new MatchAllNetworkSpecifier());
-        final NetworkCapabilities capCellularMmsInternetSpecifier2 =
-                new NetworkCapabilities(capCellularMmsInternet).setNetworkSpecifier(specifier2);
-
-        final NetworkRequest requestCellularInternetSpecifier1 = new NetworkRequest.Builder()
-                .addTransportType(TRANSPORT_CELLULAR)
-                .addCapability(NET_CAPABILITY_INTERNET)
-                .setNetworkSpecifier(specifier1)
-                .build();
-        assertFalse(requestCellularInternetSpecifier1.canBeSatisfiedBy(null));
-        assertFalse(requestCellularInternetSpecifier1.canBeSatisfiedBy(new NetworkCapabilities()));
-        assertTrue(requestCellularInternetSpecifier1.canBeSatisfiedBy(
-                capCellularMmsInternetMatchallspecifier));
-        assertFalse(requestCellularInternetSpecifier1.canBeSatisfiedBy(capCellularMmsInternet));
-        assertTrue(requestCellularInternetSpecifier1.canBeSatisfiedBy(
-                capCellularMmsInternetSpecifier1));
-        assertFalse(requestCellularInternetSpecifier1.canBeSatisfiedBy(capCellularVpnMmsInternet));
-        assertFalse(requestCellularInternetSpecifier1.canBeSatisfiedBy(
-                capCellularMmsInternetSpecifier2));
-
-        final NetworkRequest requestCellularInternet = new NetworkRequest.Builder()
-                .addTransportType(TRANSPORT_CELLULAR)
-                .addCapability(NET_CAPABILITY_INTERNET)
-                .build();
-        assertTrue(requestCellularInternet.canBeSatisfiedBy(capCellularMmsInternet));
-        assertTrue(requestCellularInternet.canBeSatisfiedBy(capCellularMmsInternetSpecifier1));
-        assertTrue(requestCellularInternet.canBeSatisfiedBy(capCellularMmsInternetSpecifier2));
-        assertFalse(requestCellularInternet.canBeSatisfiedBy(capVpnInternetSpecifier1));
-        assertTrue(requestCellularInternet.canBeSatisfiedBy(capCellularVpnMmsInternet));
-    }
-
-    @Test
-    @IgnoreUpTo(Build.VERSION_CODES.Q)
-    public void testInvariantInCanBeSatisfiedBy() {
-        // Test invariant that result of NetworkRequest.canBeSatisfiedBy() should be the same with
-        // NetworkCapabilities.satisfiedByNetworkCapabilities().
-        final LocalNetworkSpecifier specifier1 = new LocalNetworkSpecifier(1234 /* id */);
-        final int uid = Process.myUid();
-        final ArraySet<UidRange> ranges = new ArraySet<>();
-        ranges.add(new UidRange(uid, uid));
-        final NetworkRequest requestCombination = new NetworkRequest.Builder()
-                .addTransportType(TRANSPORT_CELLULAR)
-                .addCapability(NET_CAPABILITY_INTERNET)
-                .setLinkUpstreamBandwidthKbps(1000)
-                .setNetworkSpecifier(specifier1)
-                .setSignalStrength(-123)
-                .setUids(ranges).build();
-        final NetworkCapabilities capCell = new NetworkCapabilities.Builder()
-                .addTransportType(TRANSPORT_CELLULAR).build();
-        assertCorrectlySatisfies(false, requestCombination, capCell);
-
-        final NetworkCapabilities capCellInternet = new NetworkCapabilities.Builder(capCell)
-                .addCapability(NET_CAPABILITY_INTERNET).build();
-        assertCorrectlySatisfies(false, requestCombination, capCellInternet);
-
-        final NetworkCapabilities capCellInternetBW =
-                new NetworkCapabilities.Builder(capCellInternet)
-                    .setLinkUpstreamBandwidthKbps(1024).build();
-        assertCorrectlySatisfies(false, requestCombination, capCellInternetBW);
-
-        final NetworkCapabilities capCellInternetBWSpecifier1 =
-                new NetworkCapabilities.Builder(capCellInternetBW)
-                    .setNetworkSpecifier(specifier1).build();
-        assertCorrectlySatisfies(false, requestCombination, capCellInternetBWSpecifier1);
-
-        final NetworkCapabilities capCellInternetBWSpecifier1Signal =
-                new NetworkCapabilities.Builder(capCellInternetBWSpecifier1)
-                    .setSignalStrength(-123).build();
-        assertCorrectlySatisfies(true, requestCombination,
-                capCellInternetBWSpecifier1Signal);
-
-        final NetworkCapabilities capCellInternetBWSpecifier1SignalUid =
-                new NetworkCapabilities.Builder(capCellInternetBWSpecifier1Signal)
-                    .setOwnerUid(uid)
-                    .setAdministratorUids(new int [] {uid}).build();
-        assertCorrectlySatisfies(true, requestCombination,
-                capCellInternetBWSpecifier1SignalUid);
-    }
-
-    private void assertCorrectlySatisfies(boolean expect, NetworkRequest request,
-            NetworkCapabilities nc) {
-        assertEquals(expect, request.canBeSatisfiedBy(nc));
-        assertEquals(
-                request.canBeSatisfiedBy(nc),
-                request.networkCapabilities.satisfiedByNetworkCapabilities(nc));
-    }
-
-    @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
-    public void testRequestorUid() {
-        final NetworkCapabilities nc = new NetworkCapabilities();
-        // Verify default value is INVALID_UID
-        assertEquals(Process.INVALID_UID, new NetworkRequest.Builder()
-                 .setCapabilities(nc).build().getRequestorUid());
-
-        nc.setRequestorUid(1314);
-        final NetworkRequest nr = new NetworkRequest.Builder().setCapabilities(nc).build();
-        assertEquals(1314, nr.getRequestorUid());
-
-        assertEquals(Process.INVALID_UID, new NetworkRequest.Builder()
-                .clearCapabilities().build().getRequestorUid());
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/NetworkStatsBinderTest.java b/tests/tests/net/src/android/net/cts/NetworkStatsBinderTest.java
deleted file mode 100644
index 1a48983..0000000
--- a/tests/tests/net/src/android/net/cts/NetworkStatsBinderTest.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (C) 2020 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 static android.os.Process.INVALID_UID;
-
-import static org.junit.Assert.assertEquals;
-
-import android.annotation.NonNull;
-import android.content.Context;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.net.INetworkStatsService;
-import android.net.TrafficStats;
-import android.os.Build;
-import android.os.IBinder;
-import android.os.Process;
-import android.os.RemoteException;
-import android.test.AndroidTestCase;
-import android.util.SparseArray;
-
-import androidx.test.InstrumentationRegistry;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.internal.util.CollectionUtils;
-import com.android.testutils.DevSdkIgnoreRule;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.Function;
-import java.util.function.Predicate;
-
-@RunWith(AndroidJUnit4.class)
-public class NetworkStatsBinderTest {
-    // NOTE: These are shamelessly copied from TrafficStats.
-    private static final int TYPE_RX_BYTES = 0;
-    private static final int TYPE_RX_PACKETS = 1;
-    private static final int TYPE_TX_BYTES = 2;
-    private static final int TYPE_TX_PACKETS = 3;
-
-    @Rule
-    public DevSdkIgnoreRule mIgnoreRule = new DevSdkIgnoreRule(
-            Build.VERSION_CODES.Q /* ignoreClassUpTo */);
-
-    private final SparseArray<Function<Integer, Long>> mUidStatsQueryOpArray = new SparseArray<>();
-
-    @Before
-    public void setUp() throws Exception {
-        mUidStatsQueryOpArray.put(TYPE_RX_BYTES, uid -> TrafficStats.getUidRxBytes(uid));
-        mUidStatsQueryOpArray.put(TYPE_RX_PACKETS, uid -> TrafficStats.getUidRxPackets(uid));
-        mUidStatsQueryOpArray.put(TYPE_TX_BYTES, uid -> TrafficStats.getUidTxBytes(uid));
-        mUidStatsQueryOpArray.put(TYPE_TX_PACKETS, uid -> TrafficStats.getUidTxPackets(uid));
-    }
-
-    private long getUidStatsFromBinder(int uid, int type) throws Exception {
-        Method getServiceMethod = Class.forName("android.os.ServiceManager")
-                .getDeclaredMethod("getService", new Class[]{String.class});
-        IBinder binder = (IBinder) getServiceMethod.invoke(null, Context.NETWORK_STATS_SERVICE);
-        INetworkStatsService nss = INetworkStatsService.Stub.asInterface(binder);
-        return nss.getUidStats(uid, type);
-    }
-
-    private int getFirstAppUidThat(@NonNull Predicate<Integer> predicate) {
-        PackageManager pm = InstrumentationRegistry.getContext().getPackageManager();
-        List<PackageInfo> apps = pm.getInstalledPackages(0 /* flags */);
-        final PackageInfo match = CollectionUtils.find(apps,
-                it -> it.applicationInfo != null && predicate.test(it.applicationInfo.uid));
-        if (match != null) return match.applicationInfo.uid;
-        return INVALID_UID;
-    }
-
-    @Test
-    public void testAccessUidStatsFromBinder() throws Exception {
-        final int myUid = Process.myUid();
-        final List<Integer> testUidList = new ArrayList<>();
-
-        // Prepare uid list for testing.
-        testUidList.add(INVALID_UID);
-        testUidList.add(Process.ROOT_UID);
-        testUidList.add(Process.SYSTEM_UID);
-        testUidList.add(myUid);
-        testUidList.add(Process.LAST_APPLICATION_UID);
-        testUidList.add(Process.LAST_APPLICATION_UID + 1);
-        // If available, pick another existing uid for testing that is not already contained
-        // in the list above.
-        final int notMyUid = getFirstAppUidThat(uid -> uid >= 0 && !testUidList.contains(uid));
-        if (notMyUid != INVALID_UID) testUidList.add(notMyUid);
-
-        for (final int uid : testUidList) {
-            for (int i = 0; i < mUidStatsQueryOpArray.size(); i++) {
-                final int type = mUidStatsQueryOpArray.keyAt(i);
-                try {
-                    final long uidStatsFromBinder = getUidStatsFromBinder(uid, type);
-                    final long uidTrafficStats = mUidStatsQueryOpArray.get(type).apply(uid);
-
-                    // Verify that UNSUPPORTED is returned if the uid is not current app uid.
-                    if (uid != myUid) {
-                        assertEquals(uidStatsFromBinder, TrafficStats.UNSUPPORTED);
-                    }
-                    // Verify that returned result is the same with the result get from
-                    // TrafficStats.
-                    // TODO: If the test is flaky then it should instead assert that the values
-                    //  are approximately similar.
-                    assertEquals("uidStats is not matched for query type " + type
-                                    + ", uid=" + uid + ", myUid=" + myUid, uidTrafficStats,
-                            uidStatsFromBinder);
-                } catch (IllegalAccessException e) {
-                    /* Java language access prevents exploitation. */
-                    return;
-                } catch (InvocationTargetException e) {
-                    /* Underlying method has been changed. */
-                    return;
-                } catch (ClassNotFoundException e) {
-                    /* not vulnerable if hidden API no longer available */
-                    return;
-                } catch (NoSuchMethodException e) {
-                    /* not vulnerable if hidden API no longer available */
-                    return;
-                } catch (RemoteException e) {
-                    return;
-                }
-            }
-        }
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/NetworkWatchlistTest.java b/tests/tests/net/src/android/net/cts/NetworkWatchlistTest.java
deleted file mode 100644
index 81a9e30..0000000
--- a/tests/tests/net/src/android/net/cts/NetworkWatchlistTest.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright (C) 2018 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 static com.google.common.truth.Truth.assertThat;
-
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assume.assumeTrue;
-
-import android.content.Context;
-import android.net.ConnectivityManager;
-import android.platform.test.annotations.AppModeFull;
-import android.os.FileUtils;
-import android.os.ParcelFileDescriptor;
-
-import androidx.test.InstrumentationRegistry;
-import androidx.test.filters.SmallTest;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.compatibility.common.util.ApiLevelUtil;
-import com.android.compatibility.common.util.SystemUtil;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Formatter;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-public class NetworkWatchlistTest {
-
-    private static final String TEST_WATCHLIST_XML = "assets/network_watchlist_config_for_test.xml";
-    private static final String TEST_EMPTY_WATCHLIST_XML =
-            "assets/network_watchlist_config_empty_for_test.xml";
-    private static final String TMP_CONFIG_PATH =
-            "/data/local/tmp/network_watchlist_config_for_test.xml";
-    // Generated from sha256sum network_watchlist_config_for_test.xml
-    private static final String TEST_WATCHLIST_CONFIG_HASH =
-            "B5FC4636994180D54E1E912F78178AB1D8BD2BE71D90CA9F5BBC3284E4D04ED4";
-
-    private ConnectivityManager mConnectivityManager;
-    private boolean mHasFeature;
-
-    @Before
-    public void setUp() throws Exception {
-        mHasFeature = isAtLeastP();
-        mConnectivityManager =
-                (ConnectivityManager) InstrumentationRegistry.getContext().getSystemService(
-                        Context.CONNECTIVITY_SERVICE);
-        assumeTrue(mHasFeature);
-        // Set empty watchlist test config before testing
-        setWatchlistConfig(TEST_EMPTY_WATCHLIST_XML);
-        // Verify test watchlist config is not set before testing
-        byte[] result = mConnectivityManager.getNetworkWatchlistConfigHash();
-        assertNotNull("Watchlist config does not exist", result);
-        assertNotEquals(TEST_WATCHLIST_CONFIG_HASH, byteArrayToHexString(result));
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        if (mHasFeature) {
-            // Set empty watchlist test config after testing
-            setWatchlistConfig(TEST_EMPTY_WATCHLIST_XML);
-        }
-    }
-
-    private void cleanup() throws IOException {
-        runCommand("rm " + TMP_CONFIG_PATH);
-    }
-
-    private boolean isAtLeastP() throws Exception {
-        // TODO: replace with ApiLevelUtil.isAtLeast(Build.VERSION_CODES.P) when the P API level
-        // constant is defined.
-        return ApiLevelUtil.getCodename().compareToIgnoreCase("P") >= 0;
-    }
-
-    /**
-     * Test if ConnectivityManager.getNetworkWatchlistConfigHash() correctly
-     * returns the hash of config we set.
-     */
-    @Test
-    @AppModeFull(reason = "Cannot access resource file in instant app mode")
-    public void testGetWatchlistConfigHash() throws Exception {
-        // Set watchlist config file for test
-        setWatchlistConfig(TEST_WATCHLIST_XML);
-        // Test if watchlist config hash value is correct
-        byte[] result = mConnectivityManager.getNetworkWatchlistConfigHash();
-        Assert.assertEquals(TEST_WATCHLIST_CONFIG_HASH, byteArrayToHexString(result));
-    }
-
-    private static String byteArrayToHexString(byte[] bytes) {
-        Formatter formatter = new Formatter();
-        for (byte b : bytes) {
-            formatter.format("%02X", b);
-        }
-        return formatter.toString();
-    }
-
-    private void saveResourceToFile(String res, String filePath) throws IOException {
-        // App can't access /data/local/tmp directly, so we pipe resource to file through stdin.
-        ParcelFileDescriptor stdin = pipeFromStdin(filePath);
-        pipeResourceToFileDescriptor(res, stdin);
-    }
-
-    /* Pipe stdin to a file in filePath. Returns PFD for stdin. */
-    private ParcelFileDescriptor pipeFromStdin(String filePath) {
-        // Not all devices have symlink for /dev/stdin, so use /proc/self/fd/0 directly.
-        // /dev/stdin maps to /proc/self/fd/0.
-        return runRwCommand("cp /proc/self/fd/0 " + filePath)[1];
-    }
-
-    private void pipeResourceToFileDescriptor(String res, ParcelFileDescriptor pfd)
-            throws IOException {
-        InputStream resStream = getClass().getClassLoader().getResourceAsStream(res);
-        FileOutputStream fdStream = new ParcelFileDescriptor.AutoCloseOutputStream(pfd);
-
-        FileUtils.copy(resStream, fdStream);
-
-        try {
-            fdStream.close();
-        } catch (IOException e) {
-        }
-    }
-
-    private static String runCommand(String command) throws IOException {
-        return SystemUtil.runShellCommand(InstrumentationRegistry.getInstrumentation(), command);
-    }
-
-    private static ParcelFileDescriptor[] runRwCommand(String command) {
-        return InstrumentationRegistry.getInstrumentation()
-                .getUiAutomation().executeShellCommandRw(command);
-    }
-
-    private void setWatchlistConfig(String watchlistConfigFile) throws Exception {
-        cleanup();
-        saveResourceToFile(watchlistConfigFile, TMP_CONFIG_PATH);
-        final String cmdResult = runCommand(
-                "cmd network_watchlist set-test-config " + TMP_CONFIG_PATH).trim();
-        assertThat(cmdResult).contains("Success");
-        cleanup();
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/PacketUtils.java b/tests/tests/net/src/android/net/cts/PacketUtils.java
deleted file mode 100644
index 0aedecb..0000000
--- a/tests/tests/net/src/android/net/cts/PacketUtils.java
+++ /dev/null
@@ -1,474 +0,0 @@
-/*
- * Copyright (C) 2018 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 static android.system.OsConstants.IPPROTO_IPV6;
-import static android.system.OsConstants.IPPROTO_UDP;
-
-import java.net.Inet4Address;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.nio.ByteBuffer;
-import java.nio.ShortBuffer;
-import java.security.GeneralSecurityException;
-import java.security.SecureRandom;
-import java.util.Arrays;
-
-import javax.crypto.Cipher;
-import javax.crypto.Mac;
-import javax.crypto.spec.IvParameterSpec;
-import javax.crypto.spec.SecretKeySpec;
-
-public class PacketUtils {
-    private static final String TAG = PacketUtils.class.getSimpleName();
-
-    private static final int DATA_BUFFER_LEN = 4096;
-
-    static final int IP4_HDRLEN = 20;
-    static final int IP6_HDRLEN = 40;
-    static final int UDP_HDRLEN = 8;
-    static final int TCP_HDRLEN = 20;
-    static final int TCP_HDRLEN_WITH_TIMESTAMP_OPT = TCP_HDRLEN + 12;
-
-    // Not defined in OsConstants
-    static final int IPPROTO_IPV4 = 4;
-    static final int IPPROTO_ESP = 50;
-
-    // Encryption parameters
-    static final int AES_GCM_IV_LEN = 8;
-    static final int AES_CBC_IV_LEN = 16;
-    static final int AES_GCM_BLK_SIZE = 4;
-    static final int AES_CBC_BLK_SIZE = 16;
-
-    // Encryption algorithms
-    static final String AES = "AES";
-    static final String AES_CBC = "AES/CBC/NoPadding";
-    static final String HMAC_SHA_256 = "HmacSHA256";
-
-    public interface Payload {
-        byte[] getPacketBytes(IpHeader header) throws Exception;
-
-        void addPacketBytes(IpHeader header, ByteBuffer resultBuffer) throws Exception;
-
-        short length();
-
-        int getProtocolId();
-    }
-
-    public abstract static class IpHeader {
-
-        public final byte proto;
-        public final InetAddress srcAddr;
-        public final InetAddress dstAddr;
-        public final Payload payload;
-
-        public IpHeader(int proto, InetAddress src, InetAddress dst, Payload payload) {
-            this.proto = (byte) proto;
-            this.srcAddr = src;
-            this.dstAddr = dst;
-            this.payload = payload;
-        }
-
-        public abstract byte[] getPacketBytes() throws Exception;
-
-        public abstract int getProtocolId();
-    }
-
-    public static class Ip4Header extends IpHeader {
-        private short checksum;
-
-        public Ip4Header(int proto, Inet4Address src, Inet4Address dst, Payload payload) {
-            super(proto, src, dst, payload);
-        }
-
-        public byte[] getPacketBytes() throws Exception {
-            ByteBuffer resultBuffer = buildHeader();
-            payload.addPacketBytes(this, resultBuffer);
-
-            return getByteArrayFromBuffer(resultBuffer);
-        }
-
-        public ByteBuffer buildHeader() {
-            ByteBuffer bb = ByteBuffer.allocate(DATA_BUFFER_LEN);
-
-            // Version, IHL
-            bb.put((byte) (0x45));
-
-            // DCSP, ECN
-            bb.put((byte) 0);
-
-            // Total Length
-            bb.putShort((short) (IP4_HDRLEN + payload.length()));
-
-            // Empty for Identification, Flags and Fragment Offset
-            bb.putShort((short) 0);
-            bb.put((byte) 0x40);
-            bb.put((byte) 0x00);
-
-            // TTL
-            bb.put((byte) 64);
-
-            // Protocol
-            bb.put(proto);
-
-            // Header Checksum
-            final int ipChecksumOffset = bb.position();
-            bb.putShort((short) 0);
-
-            // Src/Dst addresses
-            bb.put(srcAddr.getAddress());
-            bb.put(dstAddr.getAddress());
-
-            bb.putShort(ipChecksumOffset, calculateChecksum(bb));
-
-            return bb;
-        }
-
-        private short calculateChecksum(ByteBuffer bb) {
-            int checksum = 0;
-
-            // Calculate sum of 16-bit values, excluding checksum. IPv4 headers are always 32-bit
-            // aligned, so no special cases needed for unaligned values.
-            ShortBuffer shortBuffer = ByteBuffer.wrap(getByteArrayFromBuffer(bb)).asShortBuffer();
-            while (shortBuffer.hasRemaining()) {
-                short val = shortBuffer.get();
-
-                // Wrap as needed
-                checksum = addAndWrapForChecksum(checksum, val);
-            }
-
-            return onesComplement(checksum);
-        }
-
-        public int getProtocolId() {
-            return IPPROTO_IPV4;
-        }
-    }
-
-    public static class Ip6Header extends IpHeader {
-        public Ip6Header(int nextHeader, Inet6Address src, Inet6Address dst, Payload payload) {
-            super(nextHeader, src, dst, payload);
-        }
-
-        public byte[] getPacketBytes() throws Exception {
-            ByteBuffer bb = ByteBuffer.allocate(DATA_BUFFER_LEN);
-
-            // Version | Traffic Class (First 4 bits)
-            bb.put((byte) 0x60);
-
-            // Traffic class (Last 4 bits), Flow Label
-            bb.put((byte) 0);
-            bb.put((byte) 0);
-            bb.put((byte) 0);
-
-            // Payload Length
-            bb.putShort((short) payload.length());
-
-            // Next Header
-            bb.put(proto);
-
-            // Hop Limit
-            bb.put((byte) 64);
-
-            // Src/Dst addresses
-            bb.put(srcAddr.getAddress());
-            bb.put(dstAddr.getAddress());
-
-            // Payload
-            payload.addPacketBytes(this, bb);
-
-            return getByteArrayFromBuffer(bb);
-        }
-
-        public int getProtocolId() {
-            return IPPROTO_IPV6;
-        }
-    }
-
-    public static class BytePayload implements Payload {
-        public final byte[] payload;
-
-        public BytePayload(byte[] payload) {
-            this.payload = payload;
-        }
-
-        public int getProtocolId() {
-            return -1;
-        }
-
-        public byte[] getPacketBytes(IpHeader header) {
-            ByteBuffer bb = ByteBuffer.allocate(DATA_BUFFER_LEN);
-
-            addPacketBytes(header, bb);
-            return getByteArrayFromBuffer(bb);
-        }
-
-        public void addPacketBytes(IpHeader header, ByteBuffer resultBuffer) {
-            resultBuffer.put(payload);
-        }
-
-        public short length() {
-            return (short) payload.length;
-        }
-    }
-
-    public static class UdpHeader implements Payload {
-
-        public final short srcPort;
-        public final short dstPort;
-        public final Payload payload;
-
-        public UdpHeader(int srcPort, int dstPort, Payload payload) {
-            this.srcPort = (short) srcPort;
-            this.dstPort = (short) dstPort;
-            this.payload = payload;
-        }
-
-        public int getProtocolId() {
-            return IPPROTO_UDP;
-        }
-
-        public short length() {
-            return (short) (payload.length() + 8);
-        }
-
-        public byte[] getPacketBytes(IpHeader header) throws Exception {
-            ByteBuffer bb = ByteBuffer.allocate(DATA_BUFFER_LEN);
-
-            addPacketBytes(header, bb);
-            return getByteArrayFromBuffer(bb);
-        }
-
-        public void addPacketBytes(IpHeader header, ByteBuffer resultBuffer) throws Exception {
-            // Source, Destination port
-            resultBuffer.putShort(srcPort);
-            resultBuffer.putShort(dstPort);
-
-            // Payload Length
-            resultBuffer.putShort(length());
-
-            // Get payload bytes for checksum + payload
-            ByteBuffer payloadBuffer = ByteBuffer.allocate(DATA_BUFFER_LEN);
-            payload.addPacketBytes(header, payloadBuffer);
-            byte[] payloadBytes = getByteArrayFromBuffer(payloadBuffer);
-
-            // Checksum
-            resultBuffer.putShort(calculateChecksum(header, payloadBytes));
-
-            // Payload
-            resultBuffer.put(payloadBytes);
-        }
-
-        private short calculateChecksum(IpHeader header, byte[] payloadBytes) throws Exception {
-            int newChecksum = 0;
-            ShortBuffer srcBuffer = ByteBuffer.wrap(header.srcAddr.getAddress()).asShortBuffer();
-            ShortBuffer dstBuffer = ByteBuffer.wrap(header.dstAddr.getAddress()).asShortBuffer();
-
-            while (srcBuffer.hasRemaining() || dstBuffer.hasRemaining()) {
-                short val = srcBuffer.hasRemaining() ? srcBuffer.get() : dstBuffer.get();
-
-                // Wrap as needed
-                newChecksum = addAndWrapForChecksum(newChecksum, val);
-            }
-
-            // Add pseudo-header values. Proto is 0-padded, so just use the byte.
-            newChecksum = addAndWrapForChecksum(newChecksum, header.proto);
-            newChecksum = addAndWrapForChecksum(newChecksum, length());
-            newChecksum = addAndWrapForChecksum(newChecksum, srcPort);
-            newChecksum = addAndWrapForChecksum(newChecksum, dstPort);
-            newChecksum = addAndWrapForChecksum(newChecksum, length());
-
-            ShortBuffer payloadShortBuffer = ByteBuffer.wrap(payloadBytes).asShortBuffer();
-            while (payloadShortBuffer.hasRemaining()) {
-                newChecksum = addAndWrapForChecksum(newChecksum, payloadShortBuffer.get());
-            }
-            if (payload.length() % 2 != 0) {
-                newChecksum =
-                        addAndWrapForChecksum(
-                                newChecksum, (payloadBytes[payloadBytes.length - 1] << 8));
-            }
-
-            return onesComplement(newChecksum);
-        }
-    }
-
-    public static class EspHeader implements Payload {
-        public final int nextHeader;
-        public final int spi;
-        public final int seqNum;
-        public final byte[] key;
-        public final byte[] payload;
-
-        /**
-         * Generic constructor for ESP headers.
-         *
-         * <p>For Tunnel mode, payload will be a full IP header + attached payloads
-         *
-         * <p>For Transport mode, payload will be only the attached payloads, but with the checksum
-         * calculated using the pre-encryption IP header
-         */
-        public EspHeader(int nextHeader, int spi, int seqNum, byte[] key, byte[] payload) {
-            this.nextHeader = nextHeader;
-            this.spi = spi;
-            this.seqNum = seqNum;
-            this.key = key;
-            this.payload = payload;
-        }
-
-        public int getProtocolId() {
-            return IPPROTO_ESP;
-        }
-
-        public short length() {
-            // ALWAYS uses AES-CBC, HMAC-SHA256 (128b trunc len)
-            return (short)
-                    calculateEspPacketSize(payload.length, AES_CBC_IV_LEN, AES_CBC_BLK_SIZE, 128);
-        }
-
-        public byte[] getPacketBytes(IpHeader header) throws Exception {
-            ByteBuffer bb = ByteBuffer.allocate(DATA_BUFFER_LEN);
-
-            addPacketBytes(header, bb);
-            return getByteArrayFromBuffer(bb);
-        }
-
-        public void addPacketBytes(IpHeader header, ByteBuffer resultBuffer) throws Exception {
-            ByteBuffer espPayloadBuffer = ByteBuffer.allocate(DATA_BUFFER_LEN);
-            espPayloadBuffer.putInt(spi);
-            espPayloadBuffer.putInt(seqNum);
-            espPayloadBuffer.put(getCiphertext(key));
-
-            espPayloadBuffer.put(getIcv(getByteArrayFromBuffer(espPayloadBuffer)), 0, 16);
-            resultBuffer.put(getByteArrayFromBuffer(espPayloadBuffer));
-        }
-
-        private byte[] getIcv(byte[] authenticatedSection) throws GeneralSecurityException {
-            Mac sha256HMAC = Mac.getInstance(HMAC_SHA_256);
-            SecretKeySpec authKey = new SecretKeySpec(key, HMAC_SHA_256);
-            sha256HMAC.init(authKey);
-
-            return sha256HMAC.doFinal(authenticatedSection);
-        }
-
-        /**
-         * Encrypts and builds ciphertext block. Includes the IV, Padding and Next-Header blocks
-         *
-         * <p>The ciphertext does NOT include the SPI/Sequence numbers, or the ICV.
-         */
-        private byte[] getCiphertext(byte[] key) throws GeneralSecurityException {
-            int paddedLen = calculateEspEncryptedLength(payload.length, AES_CBC_BLK_SIZE);
-            ByteBuffer paddedPayload = ByteBuffer.allocate(paddedLen);
-            paddedPayload.put(payload);
-
-            // Add padding - consecutive integers from 0x01
-            int pad = 1;
-            while (paddedPayload.position() < paddedPayload.limit()) {
-                paddedPayload.put((byte) pad++);
-            }
-
-            paddedPayload.position(paddedPayload.limit() - 2);
-            paddedPayload.put((byte) (paddedLen - 2 - payload.length)); // Pad length
-            paddedPayload.put((byte) nextHeader);
-
-            // Generate Initialization Vector
-            byte[] iv = new byte[AES_CBC_IV_LEN];
-            new SecureRandom().nextBytes(iv);
-            IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
-            SecretKeySpec secretKeySpec = new SecretKeySpec(key, AES);
-
-            // Encrypt payload
-            Cipher cipher = Cipher.getInstance(AES_CBC);
-            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
-            byte[] encrypted = cipher.doFinal(getByteArrayFromBuffer(paddedPayload));
-
-            // Build ciphertext
-            ByteBuffer cipherText = ByteBuffer.allocate(AES_CBC_IV_LEN + encrypted.length);
-            cipherText.put(iv);
-            cipherText.put(encrypted);
-
-            return getByteArrayFromBuffer(cipherText);
-        }
-    }
-
-    private static int addAndWrapForChecksum(int currentChecksum, int value) {
-        currentChecksum += value & 0x0000ffff;
-
-        // Wrap anything beyond the first 16 bits, and add to lower order bits
-        return (currentChecksum >>> 16) + (currentChecksum & 0x0000ffff);
-    }
-
-    private static short onesComplement(int val) {
-        val = (val >>> 16) + (val & 0xffff);
-
-        if (val == 0) return 0;
-        return (short) ((~val) & 0xffff);
-    }
-
-    public static int calculateEspPacketSize(
-            int payloadLen, int cryptIvLength, int cryptBlockSize, int authTruncLen) {
-        final int ESP_HDRLEN = 4 + 4; // SPI + Seq#
-        final int ICV_LEN = authTruncLen / 8; // Auth trailer; based on truncation length
-        payloadLen += cryptIvLength; // Initialization Vector
-
-        // Align to block size of encryption algorithm
-        payloadLen = calculateEspEncryptedLength(payloadLen, cryptBlockSize);
-        return payloadLen + ESP_HDRLEN + ICV_LEN;
-    }
-
-    private static int calculateEspEncryptedLength(int payloadLen, int cryptBlockSize) {
-        payloadLen += 2; // ESP trailer
-
-        // Align to block size of encryption algorithm
-        return payloadLen + calculateEspPadLen(payloadLen, cryptBlockSize);
-    }
-
-    private static int calculateEspPadLen(int payloadLen, int cryptBlockSize) {
-        return (cryptBlockSize - (payloadLen % cryptBlockSize)) % cryptBlockSize;
-    }
-
-    private static byte[] getByteArrayFromBuffer(ByteBuffer buffer) {
-        return Arrays.copyOfRange(buffer.array(), 0, buffer.position());
-    }
-
-    public static IpHeader getIpHeader(
-            int protocol, InetAddress src, InetAddress dst, Payload payload) {
-        if ((src instanceof Inet6Address) != (dst instanceof Inet6Address)) {
-            throw new IllegalArgumentException("Invalid src/dst address combination");
-        }
-
-        if (src instanceof Inet6Address) {
-            return new Ip6Header(protocol, (Inet6Address) src, (Inet6Address) dst, payload);
-        } else {
-            return new Ip4Header(protocol, (Inet4Address) src, (Inet4Address) dst, payload);
-        }
-    }
-
-    /*
-     * Debug printing
-     */
-    private static final char[] hexArray = "0123456789ABCDEF".toCharArray();
-
-    public static String bytesToHex(byte[] bytes) {
-        StringBuilder sb = new StringBuilder();
-        for (byte b : bytes) {
-            sb.append(hexArray[b >>> 4]);
-            sb.append(hexArray[b & 0x0F]);
-            sb.append(' ');
-        }
-        return sb.toString();
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/ProxyInfoTest.java b/tests/tests/net/src/android/net/cts/ProxyInfoTest.java
deleted file mode 100644
index 1c5624c..0000000
--- a/tests/tests/net/src/android/net/cts/ProxyInfoTest.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2019 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 static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import android.net.ProxyInfo;
-import android.net.Uri;
-import android.os.Build;
-
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.testutils.DevSdkIgnoreRule;
-import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
-@RunWith(AndroidJUnit4.class)
-public final class ProxyInfoTest {
-    private static final String TEST_HOST = "test.example.com";
-    private static final int TEST_PORT = 5566;
-    private static final Uri TEST_URI = Uri.parse("https://test.example.com");
-    // This matches android.net.ProxyInfo#LOCAL_EXCL_LIST
-    private static final String LOCAL_EXCL_LIST = "";
-    // This matches android.net.ProxyInfo#LOCAL_HOST
-    private static final String LOCAL_HOST = "localhost";
-    // This matches android.net.ProxyInfo#LOCAL_PORT
-    private static final int LOCAL_PORT = -1;
-
-    @Rule
-    public final DevSdkIgnoreRule ignoreRule = new DevSdkIgnoreRule();
-
-    @Test
-    public void testConstructor() {
-        final ProxyInfo proxy = new ProxyInfo((ProxyInfo) null);
-        checkEmpty(proxy);
-
-        assertEquals(proxy, new ProxyInfo(proxy));
-    }
-
-    @Test
-    public void testBuildDirectProxy() {
-        final ProxyInfo proxy1 = ProxyInfo.buildDirectProxy(TEST_HOST, TEST_PORT);
-
-        assertEquals(TEST_HOST, proxy1.getHost());
-        assertEquals(TEST_PORT, proxy1.getPort());
-        assertArrayEquals(new String[0], proxy1.getExclusionList());
-        assertEquals(Uri.EMPTY, proxy1.getPacFileUrl());
-
-        final List<String> exclList = new ArrayList<>();
-        exclList.add("localhost");
-        exclList.add("*.exclusion.com");
-        final ProxyInfo proxy2 = ProxyInfo.buildDirectProxy(TEST_HOST, TEST_PORT, exclList);
-
-        assertEquals(TEST_HOST, proxy2.getHost());
-        assertEquals(TEST_PORT, proxy2.getPort());
-        assertArrayEquals(exclList.toArray(new String[0]), proxy2.getExclusionList());
-        assertEquals(Uri.EMPTY, proxy2.getPacFileUrl());
-    }
-
-    @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
-    public void testBuildPacProxy() {
-        final ProxyInfo proxy1 = ProxyInfo.buildPacProxy(TEST_URI);
-
-        assertEquals(LOCAL_HOST, proxy1.getHost());
-        assertEquals(LOCAL_PORT, proxy1.getPort());
-        assertArrayEquals(LOCAL_EXCL_LIST.toLowerCase(Locale.ROOT).split(","),
-                proxy1.getExclusionList());
-        assertEquals(TEST_URI, proxy1.getPacFileUrl());
-
-        final ProxyInfo proxy2 = ProxyInfo.buildPacProxy(TEST_URI, TEST_PORT);
-
-        assertEquals(LOCAL_HOST, proxy2.getHost());
-        assertEquals(TEST_PORT, proxy2.getPort());
-        assertArrayEquals(LOCAL_EXCL_LIST.toLowerCase(Locale.ROOT).split(","),
-                proxy2.getExclusionList());
-        assertEquals(TEST_URI, proxy2.getPacFileUrl());
-    }
-
-    @Test
-    public void testIsValid() {
-        final ProxyInfo proxy1 = ProxyInfo.buildDirectProxy(TEST_HOST, TEST_PORT);
-        assertTrue(proxy1.isValid());
-
-        // Given empty host
-        final ProxyInfo proxy2 = ProxyInfo.buildDirectProxy("", TEST_PORT);
-        assertFalse(proxy2.isValid());
-        // Given invalid host
-        final ProxyInfo proxy3 = ProxyInfo.buildDirectProxy(".invalid.com", TEST_PORT);
-        assertFalse(proxy3.isValid());
-        // Given invalid port.
-        final ProxyInfo proxy4 = ProxyInfo.buildDirectProxy(TEST_HOST, 0);
-        assertFalse(proxy4.isValid());
-        // Given another invalid port
-        final ProxyInfo proxy5 = ProxyInfo.buildDirectProxy(TEST_HOST, 65536);
-        assertFalse(proxy5.isValid());
-        // Given invalid exclusion list
-        final List<String> exclList = new ArrayList<>();
-        exclList.add(".invalid.com");
-        exclList.add("%.test.net");
-        final ProxyInfo proxy6 = ProxyInfo.buildDirectProxy(TEST_HOST, TEST_PORT, exclList);
-        assertFalse(proxy6.isValid());
-    }
-
-    private void checkEmpty(ProxyInfo proxy) {
-        assertNull(proxy.getHost());
-        assertEquals(0, proxy.getPort());
-        assertNull(proxy.getExclusionList());
-        assertEquals(Uri.EMPTY, proxy.getPacFileUrl());
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/ProxyTest.java b/tests/tests/net/src/android/net/cts/ProxyTest.java
deleted file mode 100644
index 467d12f..0000000
--- a/tests/tests/net/src/android/net/cts/ProxyTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2009 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.net.Proxy;
-import android.test.AndroidTestCase;
-
-public class ProxyTest extends AndroidTestCase {
-
-    public void testConstructor() {
-        new Proxy();
-    }
-
-    public void testAccessProperties() {
-        final int minValidPort = 0;
-        final int maxValidPort = 65535;
-        int defaultPort = Proxy.getDefaultPort();
-        if(null == Proxy.getDefaultHost()) {
-            assertEquals(-1, defaultPort);
-        } else {
-            assertTrue(defaultPort >= minValidPort && defaultPort <= maxValidPort);
-        }
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/RssiCurveTest.java b/tests/tests/net/src/android/net/cts/RssiCurveTest.java
deleted file mode 100644
index d651b71..0000000
--- a/tests/tests/net/src/android/net/cts/RssiCurveTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2020 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 static com.google.common.truth.Truth.assertThat;
-
-import android.net.RssiCurve;
-
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/** CTS tests for {@link RssiCurve}. */
-@RunWith(AndroidJUnit4.class)
-public class RssiCurveTest {
-
-    @Test
-    public void lookupScore_constantCurve() {
-        // One bucket from rssi=-100 to 100 with score 10.
-        RssiCurve curve = new RssiCurve(-100, 200, new byte[] { 10 });
-        assertThat(curve.lookupScore(-200)).isEqualTo(10);
-        assertThat(curve.lookupScore(-100)).isEqualTo(10);
-        assertThat(curve.lookupScore(0)).isEqualTo(10);
-        assertThat(curve.lookupScore(100)).isEqualTo(10);
-        assertThat(curve.lookupScore(200)).isEqualTo(10);
-    }
-
-    @Test
-    public void lookupScore_changingCurve() {
-        // One bucket from -100 to 0 with score -10, and one bucket from 0 to 100 with score 10.
-        RssiCurve curve = new RssiCurve(-100, 100, new byte[] { -10, 10 });
-        assertThat(curve.lookupScore(-200)).isEqualTo(-10);
-        assertThat(curve.lookupScore(-100)).isEqualTo(-10);
-        assertThat(curve.lookupScore(-50)).isEqualTo(-10);
-        assertThat(curve.lookupScore(0)).isEqualTo(10);
-        assertThat(curve.lookupScore(50)).isEqualTo(10);
-        assertThat(curve.lookupScore(100)).isEqualTo(10);
-        assertThat(curve.lookupScore(200)).isEqualTo(10);
-    }
-
-    @Test
-    public void lookupScore_linearCurve() {
-        // Curve starting at -110, with 15 buckets of width 10 whose scores increases by 10 with
-        // each bucket. The current active network gets a boost of 15 to its RSSI.
-        RssiCurve curve = new RssiCurve(
-                -110,
-                10,
-                new byte[] { -20, -10, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120 },
-                15);
-
-        assertThat(curve.lookupScore(-120)).isEqualTo(-20);
-        assertThat(curve.lookupScore(-120, false)).isEqualTo(-20);
-        assertThat(curve.lookupScore(-120, true)).isEqualTo(-20);
-
-        assertThat(curve.lookupScore(-111)).isEqualTo(-20);
-        assertThat(curve.lookupScore(-111, false)).isEqualTo(-20);
-        assertThat(curve.lookupScore(-111, true)).isEqualTo(-10);
-
-        assertThat(curve.lookupScore(-110)).isEqualTo(-20);
-        assertThat(curve.lookupScore(-110, false)).isEqualTo(-20);
-        assertThat(curve.lookupScore(-110, true)).isEqualTo(-10);
-
-        assertThat(curve.lookupScore(-105)).isEqualTo(-20);
-        assertThat(curve.lookupScore(-105, false)).isEqualTo(-20);
-        assertThat(curve.lookupScore(-105, true)).isEqualTo(0);
-
-        assertThat(curve.lookupScore(-100)).isEqualTo(-10);
-        assertThat(curve.lookupScore(-100, false)).isEqualTo(-10);
-        assertThat(curve.lookupScore(-100, true)).isEqualTo(0);
-
-        assertThat(curve.lookupScore(-50)).isEqualTo(40);
-        assertThat(curve.lookupScore(-50, false)).isEqualTo(40);
-        assertThat(curve.lookupScore(-50, true)).isEqualTo(50);
-
-        assertThat(curve.lookupScore(0)).isEqualTo(90);
-        assertThat(curve.lookupScore(0, false)).isEqualTo(90);
-        assertThat(curve.lookupScore(0, true)).isEqualTo(100);
-
-        assertThat(curve.lookupScore(30)).isEqualTo(120);
-        assertThat(curve.lookupScore(30, false)).isEqualTo(120);
-        assertThat(curve.lookupScore(30, true)).isEqualTo(120);
-
-        assertThat(curve.lookupScore(40)).isEqualTo(120);
-        assertThat(curve.lookupScore(40, false)).isEqualTo(120);
-        assertThat(curve.lookupScore(40, true)).isEqualTo(120);
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/SSLCertificateSocketFactoryTest.java b/tests/tests/net/src/android/net/cts/SSLCertificateSocketFactoryTest.java
deleted file mode 100644
index cbe54f8..0000000
--- a/tests/tests/net/src/android/net/cts/SSLCertificateSocketFactoryTest.java
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- * 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.net.cts;
-
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import android.net.SSLCertificateSocketFactory;
-import android.platform.test.annotations.AppModeFull;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import java.net.SocketAddress;
-import java.net.UnknownHostException;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-import javax.net.ssl.HostnameVerifier;
-import javax.net.ssl.HttpsURLConnection;
-import javax.net.ssl.SSLPeerUnverifiedException;
-import javax.net.ssl.SSLSession;
-import libcore.javax.net.ssl.SSLConfigurationAsserts;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@RunWith(JUnit4.class)
-public class SSLCertificateSocketFactoryTest {
-    // TEST_HOST should point to a web server with a valid TLS certificate.
-    private static final String TEST_HOST = "www.google.com";
-    private static final int HTTPS_PORT = 443;
-    private HostnameVerifier mDefaultVerifier;
-    private SSLCertificateSocketFactory mSocketFactory;
-    private InetAddress mLocalAddress;
-    // InetAddress obtained by resolving TEST_HOST.
-    private InetAddress mTestHostAddress;
-    // SocketAddress combining mTestHostAddress and HTTPS_PORT.
-    private List<SocketAddress> mTestSocketAddresses;
-
-    @Before
-    public void setUp() {
-        // Expected state before each test method is that
-        // HttpsURLConnection.getDefaultHostnameVerifier() will return the system default.
-        mDefaultVerifier = HttpsURLConnection.getDefaultHostnameVerifier();
-        mSocketFactory = (SSLCertificateSocketFactory)
-            SSLCertificateSocketFactory.getDefault(1000 /* handshakeTimeoutMillis */);
-        assertNotNull(mSocketFactory);
-        InetAddress[] addresses;
-        try {
-            addresses = InetAddress.getAllByName(TEST_HOST);
-            mTestHostAddress = addresses[0];
-        } catch (UnknownHostException uhe) {
-            throw new AssertionError(
-                "Unable to test SSLCertificateSocketFactory: cannot resolve " + TEST_HOST, uhe);
-        }
-
-        mTestSocketAddresses = Arrays.stream(addresses)
-            .map(addr -> new InetSocketAddress(addr, HTTPS_PORT))
-            .collect(Collectors.toList());
-
-        // Find the local IP address which will be used to connect to TEST_HOST.
-        try {
-            Socket testSocket = new Socket(TEST_HOST, HTTPS_PORT);
-            mLocalAddress = testSocket.getLocalAddress();
-            testSocket.close();
-        } catch (IOException ioe) {
-            throw new AssertionError(""
-                + "Unable to test SSLCertificateSocketFactory: cannot connect to "
-                + TEST_HOST, ioe);
-        }
-    }
-
-    // Restore the system default hostname verifier after each test.
-    @After
-    public void restoreDefaultHostnameVerifier() {
-        HttpsURLConnection.setDefaultHostnameVerifier(mDefaultVerifier);
-    }
-
-    @Test
-    public void testDefaultConfiguration() throws Exception {
-        SSLConfigurationAsserts.assertSSLSocketFactoryDefaultConfiguration(mSocketFactory);
-    }
-
-    @Test
-    public void testAccessProperties() {
-        mSocketFactory.getSupportedCipherSuites();
-        mSocketFactory.getDefaultCipherSuites();
-    }
-
-    /**
-     * Tests the {@code createSocket()} cases which are expected to fail with {@code IOException}.
-     */
-    @Test
-    @AppModeFull(reason = "Socket cannot bind in instant app mode")
-    public void createSocket_io_error_expected() {
-        // Connect to the localhost HTTPS port. Should result in connection refused IOException
-        // because no service should be listening on that port.
-        InetAddress localhostAddress = InetAddress.getLoopbackAddress();
-        try {
-            mSocketFactory.createSocket(localhostAddress, HTTPS_PORT);
-            fail();
-        } catch (IOException e) {
-            // expected
-        }
-
-        // Same, but also binding to a local address.
-        try {
-            mSocketFactory.createSocket(localhostAddress, HTTPS_PORT, localhostAddress, 0);
-            fail();
-        } catch (IOException e) {
-            // expected
-        }
-
-        // Same, wrapping an existing plain socket which is in an unconnected state.
-        try {
-            Socket socket = new Socket();
-            mSocketFactory.createSocket(socket, "localhost", HTTPS_PORT, true);
-            fail();
-        } catch (IOException e) {
-            // expected
-        }
-    }
-
-    /**
-     * Tests hostname verification for
-     * {@link SSLCertificateSocketFactory#createSocket(String, int)}.
-     *
-     * <p>This method should return a socket which is fully connected (i.e. TLS handshake complete)
-     * and whose peer TLS certificate has been verified to have the correct hostname.
-     *
-     * <p>{@link SSLCertificateSocketFactory} is documented to verify hostnames using
-     * the {@link HostnameVerifier} returned by
-     * {@link HttpsURLConnection#getDefaultHostnameVerifier}, so this test connects twice,
-     * once with the system default {@link HostnameVerifier} which is expected to succeed,
-     * and once after installing a {@link NegativeHostnameVerifier} which will cause
-     * {@link SSLCertificateSocketFactory#verifyHostname} to throw a
-     * {@link SSLPeerUnverifiedException}.
-     *
-     * <p>These tests only test the hostname verification logic in SSLCertificateSocketFactory,
-     * other TLS failure modes and the default HostnameVerifier are tested elsewhere, see
-     * {@link com.squareup.okhttp.internal.tls.HostnameVerifierTest} and
-     * https://android.googlesource.com/platform/external/boringssl/+/refs/heads/master/src/ssl/test
-     *
-     * <p>Tests the following behaviour:-
-     * <ul>
-     * <li>TEST_SERVER is available and has a valid TLS certificate
-     * <li>{@code createSocket()} verifies the remote hostname is correct using
-     *     {@link HttpsURLConnection#getDefaultHostnameVerifier}
-     * <li>{@link SSLPeerUnverifiedException} is thrown when the remote hostname is invalid
-     * </ul>
-     *
-     * <p>See also http://b/2807618.
-     */
-    @Test
-    public void createSocket_simple_with_hostname_verification() throws Exception {
-        Socket socket = mSocketFactory.createSocket(TEST_HOST, HTTPS_PORT);
-        assertConnectedSocket(socket);
-        socket.close();
-
-        HttpsURLConnection.setDefaultHostnameVerifier(new NegativeHostnameVerifier());
-        try {
-            mSocketFactory.createSocket(TEST_HOST, HTTPS_PORT);
-            fail();
-        } catch (SSLPeerUnverifiedException expected) {
-            // expected
-        }
-    }
-
-    /**
-     * Tests hostname verification for
-     * {@link SSLCertificateSocketFactory#createSocket(Socket, String, int, boolean)}.
-     *
-     * <p>This method should return a socket which is fully connected (i.e. TLS handshake complete)
-     * and whose peer TLS certificate has been verified to have the correct hostname.
-     *
-     * <p>The TLS socket returned is wrapped around the plain socket passed into
-     * {@code createSocket()}.
-     *
-     * <p>See {@link #createSocket_simple_with_hostname_verification()} for test methodology.
-     */
-    @Test
-    public void createSocket_wrapped_with_hostname_verification() throws Exception {
-        Socket underlying = new Socket(TEST_HOST, HTTPS_PORT);
-        Socket socket = mSocketFactory.createSocket(underlying, TEST_HOST, HTTPS_PORT, true);
-        assertConnectedSocket(socket);
-        socket.close();
-
-        HttpsURLConnection.setDefaultHostnameVerifier(new NegativeHostnameVerifier());
-        try {
-            underlying = new Socket(TEST_HOST, HTTPS_PORT);
-            mSocketFactory.createSocket(underlying, TEST_HOST, HTTPS_PORT, true);
-            fail();
-        } catch (SSLPeerUnverifiedException expected) {
-            // expected
-        }
-    }
-
-    /**
-     * Tests hostname verification for
-     * {@link SSLCertificateSocketFactory#createSocket(String, int, InetAddress, int)}.
-     *
-     * <p>This method should return a socket which is fully connected (i.e. TLS handshake complete)
-     * and whose peer TLS certificate has been verified to have the correct hostname.
-     *
-     * <p>The TLS socket returned is also bound to the local address determined in {@link #setUp} to
-     * be used for connections to TEST_HOST, and a wildcard port.
-     *
-     * <p>See {@link #createSocket_simple_with_hostname_verification()} for test methodology.
-     */
-    @Test
-    @AppModeFull(reason = "Socket cannot bind in instant app mode")
-    public void createSocket_bound_with_hostname_verification() throws Exception {
-        Socket socket = mSocketFactory.createSocket(TEST_HOST, HTTPS_PORT, mLocalAddress, 0);
-        assertConnectedSocket(socket);
-        socket.close();
-
-        HttpsURLConnection.setDefaultHostnameVerifier(new NegativeHostnameVerifier());
-        try {
-            mSocketFactory.createSocket(TEST_HOST, HTTPS_PORT, mLocalAddress, 0);
-            fail();
-        } catch (SSLPeerUnverifiedException expected) {
-            // expected
-        }
-    }
-
-    /**
-     * Tests hostname verification for
-     * {@link SSLCertificateSocketFactory#createSocket(InetAddress, int)}.
-     *
-     * <p>This method should return a socket which the documentation describes as "unconnected",
-     * which actually means that the socket is fully connected at the TCP layer but TLS handshaking
-     * and hostname verification have not yet taken place.
-     *
-     * <p>Behaviour is tested by installing a {@link NegativeHostnameVerifier} and by calling
-     * {@link #assertConnectedSocket} to ensure TLS handshaking but no hostname verification takes
-     * place.  Next, {@link SSLCertificateSocketFactory#verifyHostname} is called to ensure
-     * that hostname verification is using the {@link HostnameVerifier} returned by
-     * {@link HttpsURLConnection#getDefaultHostnameVerifier} as documented.
-     *
-     * <p>Tests the following behaviour:-
-     * <ul>
-     * <li>TEST_SERVER is available and has a valid TLS certificate
-     * <li>{@code createSocket()} does not verify the remote hostname
-     * <li>Calling {@link SSLCertificateSocketFactory#verifyHostname} on the returned socket
-     *     throws {@link SSLPeerUnverifiedException} if the remote hostname is invalid
-     * </ul>
-     */
-    @Test
-    public void createSocket_simple_no_hostname_verification() throws Exception{
-        HttpsURLConnection.setDefaultHostnameVerifier(new NegativeHostnameVerifier());
-        Socket socket = mSocketFactory.createSocket(mTestHostAddress, HTTPS_PORT);
-        // Need to provide the expected hostname here or the TLS handshake will
-        // be unable to supply SNI to the remote host.
-        mSocketFactory.setHostname(socket, TEST_HOST);
-        assertConnectedSocket(socket);
-        try {
-          SSLCertificateSocketFactory.verifyHostname(socket, TEST_HOST);
-          fail();
-        } catch (SSLPeerUnverifiedException expected) {
-            // expected
-        }
-        HttpsURLConnection.setDefaultHostnameVerifier(mDefaultVerifier);
-        SSLCertificateSocketFactory.verifyHostname(socket, TEST_HOST);
-        socket.close();
-    }
-
-    /**
-     * Tests hostname verification for
-     * {@link SSLCertificateSocketFactory#createSocket(InetAddress, int, InetAddress, int)}.
-     *
-     * <p>This method should return a socket which the documentation describes as "unconnected",
-     * which actually means that the socket is fully connected at the TCP layer but TLS handshaking
-     * and hostname verification have not yet taken place.
-     *
-     * <p>The TLS socket returned is also bound to the local address determined in {@link #setUp} to
-     * be used for connections to TEST_HOST, and a wildcard port.
-     *
-     * <p>See {@link #createSocket_simple_no_hostname_verification()} for test methodology.
-     */
-    @Test
-    @AppModeFull(reason = "Socket cannot bind in instant app mode")
-    public void createSocket_bound_no_hostname_verification() throws Exception{
-        HttpsURLConnection.setDefaultHostnameVerifier(new NegativeHostnameVerifier());
-        Socket socket =
-            mSocketFactory.createSocket(mTestHostAddress, HTTPS_PORT, mLocalAddress, 0);
-        // Need to provide the expected hostname here or the TLS handshake will
-        // be unable to supply SNI to the peer.
-        mSocketFactory.setHostname(socket, TEST_HOST);
-        assertConnectedSocket(socket);
-        try {
-          SSLCertificateSocketFactory.verifyHostname(socket, TEST_HOST);
-          fail();
-        } catch (SSLPeerUnverifiedException expected) {
-            // expected
-        }
-        HttpsURLConnection.setDefaultHostnameVerifier(mDefaultVerifier);
-        SSLCertificateSocketFactory.verifyHostname(socket, TEST_HOST);
-        socket.close();
-    }
-
-    /**
-     * Asserts a socket is fully connected to the expected peer.
-     *
-     * <p>For the variants of createSocket which verify the remote hostname,
-     * {@code socket} should already be fully connected.
-     *
-     * <p>For the non-verifying variants, retrieving the input stream will trigger a TLS handshake
-     * and so may throw an exception, for example if the peer's certificate is invalid.
-     *
-     * <p>Does no hostname verification.
-     */
-    private void assertConnectedSocket(Socket socket) throws Exception {
-        assertNotNull(socket);
-        assertTrue(socket.isConnected());
-        assertNotNull(socket.getInputStream());
-        assertNotNull(socket.getOutputStream());
-        assertTrue(mTestSocketAddresses.contains(socket.getRemoteSocketAddress()));
-    }
-
-    /**
-     * A HostnameVerifier which always returns false to simulate a server returning a
-     * certificate which does not match the expected hostname.
-     */
-    private static class NegativeHostnameVerifier implements HostnameVerifier {
-        @Override
-        public boolean verify(String hostname, SSLSession sslSession) {
-            return false;
-        }
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/TheaterModeTest.java b/tests/tests/net/src/android/net/cts/TheaterModeTest.java
deleted file mode 100644
index d1ddeaa..0000000
--- a/tests/tests/net/src/android/net/cts/TheaterModeTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * 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.platform.test.annotations.AppModeFull;
-import android.provider.Settings;
-import android.test.AndroidTestCase;
-import android.util.Log;
-
-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));
-    }
-
-    @AppModeFull(reason = "WRITE_SECURE_SETTINGS permission can't be granted to instant apps")
-    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/net/src/android/net/cts/TrafficStatsTest.java b/tests/tests/net/src/android/net/cts/TrafficStatsTest.java
deleted file mode 100755
index 37bdd44..0000000
--- a/tests/tests/net/src/android/net/cts/TrafficStatsTest.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * Copyright (C) 2010 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.net.NetworkStats;
-import android.net.TrafficStats;
-import android.os.Process;
-import android.platform.test.annotations.AppModeFull;
-import android.test.AndroidTestCase;
-import android.util.Log;
-import android.util.Range;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-public class TrafficStatsTest extends AndroidTestCase {
-    private static final String LOG_TAG = "TrafficStatsTest";
-
-    /** Verify the given value is in range [lower, upper] */
-    private void assertInRange(String tag, long value, long lower, long upper) {
-        final Range range = new Range(lower, upper);
-        assertTrue(tag + ": " + value + " is not within range [" + lower + ", " + upper + "]",
-                range.contains(value));
-    }
-
-    public void testValidMobileStats() {
-        // We can't assume a mobile network is even present in this test, so
-        // we simply assert that a valid value is returned.
-
-        assertTrue(TrafficStats.getMobileTxPackets() >= 0);
-        assertTrue(TrafficStats.getMobileRxPackets() >= 0);
-        assertTrue(TrafficStats.getMobileTxBytes() >= 0);
-        assertTrue(TrafficStats.getMobileRxBytes() >= 0);
-    }
-
-    public void testValidTotalStats() {
-        assertTrue(TrafficStats.getTotalTxPackets() >= 0);
-        assertTrue(TrafficStats.getTotalRxPackets() >= 0);
-        assertTrue(TrafficStats.getTotalTxBytes() >= 0);
-        assertTrue(TrafficStats.getTotalRxBytes() >= 0);
-    }
-
-    public void testValidPacketStats() {
-        assertTrue(TrafficStats.getTxPackets("lo") >= 0);
-        assertTrue(TrafficStats.getRxPackets("lo") >= 0);
-    }
-
-    public void testThreadStatsTag() throws Exception {
-        TrafficStats.setThreadStatsTag(0xf00d);
-        assertTrue("Tag didn't stick", TrafficStats.getThreadStatsTag() == 0xf00d);
-
-        final CountDownLatch latch = new CountDownLatch(1);
-
-        new Thread("TrafficStatsTest.testThreadStatsTag") {
-            @Override
-            public void run() {
-                assertTrue("Tag leaked", TrafficStats.getThreadStatsTag() != 0xf00d);
-                TrafficStats.setThreadStatsTag(0xcafe);
-                assertTrue("Tag didn't stick", TrafficStats.getThreadStatsTag() == 0xcafe);
-                latch.countDown();
-            }
-        }.start();
-
-        latch.await(5, TimeUnit.SECONDS);
-        assertTrue("Tag lost", TrafficStats.getThreadStatsTag() == 0xf00d);
-
-        TrafficStats.clearThreadStatsTag();
-        assertTrue("Tag not cleared", TrafficStats.getThreadStatsTag() != 0xf00d);
-    }
-
-    long tcpPacketToIpBytes(long packetCount, long bytes) {
-        // ip header + tcp header + data.
-        // Tcp header is mostly 32. Syn has different tcp options -> 40. Don't care.
-        return packetCount * (20 + 32 + bytes);
-    }
-
-    @AppModeFull(reason = "Socket cannot bind in instant app mode")
-    public void testTrafficStatsForLocalhost() throws IOException {
-        final long mobileTxPacketsBefore = TrafficStats.getMobileTxPackets();
-        final long mobileRxPacketsBefore = TrafficStats.getMobileRxPackets();
-        final long mobileTxBytesBefore = TrafficStats.getMobileTxBytes();
-        final long mobileRxBytesBefore = TrafficStats.getMobileRxBytes();
-        final long totalTxPacketsBefore = TrafficStats.getTotalTxPackets();
-        final long totalRxPacketsBefore = TrafficStats.getTotalRxPackets();
-        final long totalTxBytesBefore = TrafficStats.getTotalTxBytes();
-        final long totalRxBytesBefore = TrafficStats.getTotalRxBytes();
-        final long uidTxBytesBefore = TrafficStats.getUidTxBytes(Process.myUid());
-        final long uidRxBytesBefore = TrafficStats.getUidRxBytes(Process.myUid());
-        final long uidTxPacketsBefore = TrafficStats.getUidTxPackets(Process.myUid());
-        final long uidRxPacketsBefore = TrafficStats.getUidRxPackets(Process.myUid());
-        final long ifaceTxPacketsBefore = TrafficStats.getTxPackets("lo");
-        final long ifaceRxPacketsBefore = TrafficStats.getRxPackets("lo");
-
-        // Transfer 1MB of data across an explicitly localhost socket.
-        final int byteCount = 1024;
-        final int packetCount = 1024;
-
-        TrafficStats.startDataProfiling(null);
-        final ServerSocket server = new ServerSocket(0);
-        new Thread("TrafficStatsTest.testTrafficStatsForLocalhost") {
-            @Override
-            public void run() {
-                try {
-                    final Socket socket = new Socket("localhost", server.getLocalPort());
-                    // Make sure that each write()+flush() turns into a packet:
-                    // disable Nagle.
-                    socket.setTcpNoDelay(true);
-                    final OutputStream out = socket.getOutputStream();
-                    final byte[] buf = new byte[byteCount];
-                    TrafficStats.setThreadStatsTag(0x42);
-                    TrafficStats.tagSocket(socket);
-                    for (int i = 0; i < packetCount; i++) {
-                        out.write(buf);
-                        out.flush();
-                        try {
-                            // Bug: 10668088, Even with Nagle disabled, and flushing the 1024 bytes
-                            // the kernel still regroups data into a larger packet.
-                            Thread.sleep(5);
-                        } catch (InterruptedException e) {
-                        }
-                    }
-                    out.close();
-                    socket.close();
-                } catch (IOException e) {
-                    Log.i(LOG_TAG, "Badness during writes to socket: " + e);
-                }
-            }
-        }.start();
-
-        int read = 0;
-        try {
-            final Socket socket = server.accept();
-            socket.setTcpNoDelay(true);
-            TrafficStats.setThreadStatsTag(0x43);
-            TrafficStats.tagSocket(socket);
-            final InputStream in = socket.getInputStream();
-            final byte[] buf = new byte[byteCount];
-            while (read < byteCount * packetCount) {
-                int n = in.read(buf);
-                assertTrue("Unexpected EOF", n > 0);
-                read += n;
-            }
-        } finally {
-            server.close();
-        }
-        assertTrue("Not all data read back", read >= byteCount * packetCount);
-
-        // It's too fast to call getUidTxBytes function.
-        try {
-            Thread.sleep(1000);
-        } catch (InterruptedException e) {
-        }
-        final NetworkStats testStats = TrafficStats.stopDataProfiling(null);
-
-        final long mobileTxPacketsAfter = TrafficStats.getMobileTxPackets();
-        final long mobileRxPacketsAfter = TrafficStats.getMobileRxPackets();
-        final long mobileTxBytesAfter = TrafficStats.getMobileTxBytes();
-        final long mobileRxBytesAfter = TrafficStats.getMobileRxBytes();
-        final long totalTxPacketsAfter = TrafficStats.getTotalTxPackets();
-        final long totalRxPacketsAfter = TrafficStats.getTotalRxPackets();
-        final long totalTxBytesAfter = TrafficStats.getTotalTxBytes();
-        final long totalRxBytesAfter = TrafficStats.getTotalRxBytes();
-        final long uidTxBytesAfter = TrafficStats.getUidTxBytes(Process.myUid());
-        final long uidRxBytesAfter = TrafficStats.getUidRxBytes(Process.myUid());
-        final long uidTxPacketsAfter = TrafficStats.getUidTxPackets(Process.myUid());
-        final long uidRxPacketsAfter = TrafficStats.getUidRxPackets(Process.myUid());
-        final long uidTxDeltaBytes = uidTxBytesAfter - uidTxBytesBefore;
-        final long uidTxDeltaPackets = uidTxPacketsAfter - uidTxPacketsBefore;
-        final long uidRxDeltaBytes = uidRxBytesAfter - uidRxBytesBefore;
-        final long uidRxDeltaPackets = uidRxPacketsAfter - uidRxPacketsBefore;
-        final long ifaceTxPacketsAfter = TrafficStats.getTxPackets("lo");
-        final long ifaceRxPacketsAfter = TrafficStats.getRxPackets("lo");
-        final long ifaceTxDeltaPackets = ifaceTxPacketsAfter - ifaceTxPacketsBefore;
-        final long ifaceRxDeltaPackets = ifaceRxPacketsAfter - ifaceRxPacketsBefore;
-
-        // Localhost traffic *does* count against per-UID stats.
-        /*
-         * Calculations:
-         *  - bytes
-         *   bytes is approx: packets * data + packets * acks;
-         *   but sometimes there are less acks than packets, so we set a lower
-         *   limit of 1 ack.
-         *  - setup/teardown
-         *   + 7 approx.: syn, syn-ack, ack, fin-ack, ack, fin-ack, ack;
-         *   but sometimes the last find-acks just vanish, so we set a lower limit of +5.
-         */
-        final int maxExpectedExtraPackets = 7;
-        final int minExpectedExtraPackets = 5;
-
-        // Some other tests don't cleanup connections correctly.
-        // They have the same UID, so we discount their lingering traffic
-        // which happens only on non-localhost, such as TCP FIN retranmission packets
-        final long deltaTxOtherPackets = (totalTxPacketsAfter - totalTxPacketsBefore)
-                - uidTxDeltaPackets;
-        final long deltaRxOtherPackets = (totalRxPacketsAfter - totalRxPacketsBefore)
-                - uidRxDeltaPackets;
-        if (deltaTxOtherPackets > 0 || deltaRxOtherPackets > 0) {
-            Log.i(LOG_TAG, "lingering traffic data: " + deltaTxOtherPackets + "/"
-                    + deltaRxOtherPackets);
-        }
-
-        // Check that the per-uid stats obtained from data profiling contain the expected values.
-        // The data profiling snapshot is generated from the readNetworkStatsDetail() method in
-        // networkStatsService, so it's possible to verify that the detailed stats for a given
-        // uid are correct.
-        final NetworkStats.Entry entry = testStats.getTotal(null, Process.myUid());
-        final long pktBytes = tcpPacketToIpBytes(packetCount, byteCount);
-        final long pktWithNoDataBytes = tcpPacketToIpBytes(packetCount, 0);
-        final long minExpExtraPktBytes = tcpPacketToIpBytes(minExpectedExtraPackets, 0);
-        final long maxExpExtraPktBytes = tcpPacketToIpBytes(maxExpectedExtraPackets, 0);
-        final long deltaTxOtherPktBytes = tcpPacketToIpBytes(deltaTxOtherPackets, 0);
-        final long deltaRxOtherPktBytes  = tcpPacketToIpBytes(deltaRxOtherPackets, 0);
-        assertInRange("txPackets detail", entry.txPackets, packetCount + minExpectedExtraPackets,
-                uidTxDeltaPackets);
-        assertInRange("rxPackets detail", entry.rxPackets, packetCount + minExpectedExtraPackets,
-                uidRxDeltaPackets);
-        assertInRange("txBytes detail", entry.txBytes, pktBytes + minExpExtraPktBytes,
-                uidTxDeltaBytes);
-        assertInRange("rxBytes detail", entry.rxBytes, pktBytes + minExpExtraPktBytes,
-                uidRxDeltaBytes);
-        assertInRange("uidtxp", uidTxDeltaPackets, packetCount + minExpectedExtraPackets,
-                packetCount + packetCount + maxExpectedExtraPackets + deltaTxOtherPackets);
-        assertInRange("uidrxp", uidRxDeltaPackets, packetCount + minExpectedExtraPackets,
-                packetCount + packetCount + maxExpectedExtraPackets + deltaRxOtherPackets);
-        assertInRange("uidtxb", uidTxDeltaBytes, pktBytes + minExpExtraPktBytes,
-                pktBytes + pktWithNoDataBytes + maxExpExtraPktBytes + deltaTxOtherPktBytes);
-        assertInRange("uidrxb", uidRxDeltaBytes, pktBytes + minExpExtraPktBytes,
-                pktBytes + pktWithNoDataBytes + maxExpExtraPktBytes + deltaRxOtherPktBytes);
-        assertInRange("iftxp", ifaceTxDeltaPackets, packetCount + minExpectedExtraPackets,
-                packetCount + packetCount + maxExpectedExtraPackets + deltaTxOtherPackets);
-        assertInRange("ifrxp", ifaceRxDeltaPackets, packetCount + minExpectedExtraPackets,
-                packetCount + packetCount + maxExpectedExtraPackets + deltaRxOtherPackets);
-
-        // Localhost traffic *does* count against total stats.
-        // Check the total stats increased after test data transfer over localhost has been made.
-        assertTrue("ttxp: " + totalTxPacketsBefore + " -> " + totalTxPacketsAfter,
-                totalTxPacketsAfter >= totalTxPacketsBefore + uidTxDeltaPackets);
-        assertTrue("trxp: " + totalRxPacketsBefore + " -> " + totalRxPacketsAfter,
-                totalRxPacketsAfter >= totalRxPacketsBefore + uidRxDeltaPackets);
-        assertTrue("ttxb: " + totalTxBytesBefore + " -> " + totalTxBytesAfter,
-                totalTxBytesAfter >= totalTxBytesBefore + uidTxDeltaBytes);
-        assertTrue("trxb: " + totalRxBytesBefore + " -> " + totalRxBytesAfter,
-                totalRxBytesAfter >= totalRxBytesBefore + uidRxDeltaBytes);
-        assertTrue("iftxp: " + ifaceTxPacketsBefore + " -> " + ifaceTxPacketsAfter,
-                totalTxPacketsAfter >= totalTxPacketsBefore + ifaceTxDeltaPackets);
-        assertTrue("ifrxp: " + ifaceRxPacketsBefore + " -> " + ifaceRxPacketsAfter,
-                totalRxPacketsAfter >= totalRxPacketsBefore + ifaceRxDeltaPackets);
-
-        // Localhost traffic should *not* count against mobile stats,
-        // There might be some other traffic, but nowhere near 1MB.
-        assertInRange("mtxp", mobileTxPacketsAfter, mobileTxPacketsBefore,
-                mobileTxPacketsBefore + 500);
-        assertInRange("mrxp", mobileRxPacketsAfter, mobileRxPacketsBefore,
-                mobileRxPacketsBefore + 500);
-        assertInRange("mtxb", mobileTxBytesAfter, mobileTxBytesBefore,
-                mobileTxBytesBefore + 200000);
-        assertInRange("mrxb", mobileRxBytesAfter, mobileRxBytesBefore,
-                mobileRxBytesBefore + 200000);
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/TunUtils.java b/tests/tests/net/src/android/net/cts/TunUtils.java
deleted file mode 100644
index adaba9d..0000000
--- a/tests/tests/net/src/android/net/cts/TunUtils.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * Copyright (C) 2018 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 static android.net.cts.PacketUtils.IP4_HDRLEN;
-import static android.net.cts.PacketUtils.IP6_HDRLEN;
-import static android.net.cts.PacketUtils.IPPROTO_ESP;
-import static android.net.cts.PacketUtils.UDP_HDRLEN;
-import static android.system.OsConstants.IPPROTO_UDP;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import android.os.ParcelFileDescriptor;
-
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.function.Predicate;
-
-public class TunUtils {
-    private static final String TAG = TunUtils.class.getSimpleName();
-
-    protected static final int IP4_ADDR_OFFSET = 12;
-    protected static final int IP4_ADDR_LEN = 4;
-    protected static final int IP6_ADDR_OFFSET = 8;
-    protected static final int IP6_ADDR_LEN = 16;
-    protected static final int IP4_PROTO_OFFSET = 9;
-    protected static final int IP6_PROTO_OFFSET = 6;
-
-    private static final int DATA_BUFFER_LEN = 4096;
-    private static final int TIMEOUT = 1000;
-
-    private final List<byte[]> mPackets = new ArrayList<>();
-    private final ParcelFileDescriptor mTunFd;
-    private final Thread mReaderThread;
-
-    public TunUtils(ParcelFileDescriptor tunFd) {
-        mTunFd = tunFd;
-
-        // Start background reader thread
-        mReaderThread =
-                new Thread(
-                        () -> {
-                            try {
-                                // Loop will exit and thread will quit when tunFd is closed.
-                                // Receiving either EOF or an exception will exit this reader loop.
-                                // FileInputStream in uninterruptable, so there's no good way to
-                                // ensure that this thread shuts down except upon FD closure.
-                                while (true) {
-                                    byte[] intercepted = receiveFromTun();
-                                    if (intercepted == null) {
-                                        // Exit once we've hit EOF
-                                        return;
-                                    } else if (intercepted.length > 0) {
-                                        // Only save packet if we've received any bytes.
-                                        synchronized (mPackets) {
-                                            mPackets.add(intercepted);
-                                            mPackets.notifyAll();
-                                        }
-                                    }
-                                }
-                            } catch (IOException ignored) {
-                                // Simply exit this reader thread
-                                return;
-                            }
-                        });
-        mReaderThread.start();
-    }
-
-    private byte[] receiveFromTun() throws IOException {
-        FileInputStream in = new FileInputStream(mTunFd.getFileDescriptor());
-        byte[] inBytes = new byte[DATA_BUFFER_LEN];
-        int bytesRead = in.read(inBytes);
-
-        if (bytesRead < 0) {
-            return null; // return null for EOF
-        } else if (bytesRead >= DATA_BUFFER_LEN) {
-            throw new IllegalStateException("Too big packet. Fragmentation unsupported");
-        }
-        return Arrays.copyOf(inBytes, bytesRead);
-    }
-
-    private byte[] getFirstMatchingPacket(Predicate<byte[]> verifier, int startIndex) {
-        synchronized (mPackets) {
-            for (int i = startIndex; i < mPackets.size(); i++) {
-                byte[] pkt = mPackets.get(i);
-                if (verifier.test(pkt)) {
-                    return pkt;
-                }
-            }
-        }
-        return null;
-    }
-
-    protected byte[] awaitPacket(Predicate<byte[]> verifier) throws Exception {
-        long endTime = System.currentTimeMillis() + TIMEOUT;
-        int startIndex = 0;
-
-        synchronized (mPackets) {
-            while (System.currentTimeMillis() < endTime) {
-                final byte[] pkt = getFirstMatchingPacket(verifier, startIndex);
-                if (pkt != null) {
-                    return pkt; // We've found the packet we're looking for.
-                }
-
-                startIndex = mPackets.size();
-
-                // Try to prevent waiting too long. If waitTimeout <= 0, we've already hit timeout
-                long waitTimeout = endTime - System.currentTimeMillis();
-                if (waitTimeout > 0) {
-                    mPackets.wait(waitTimeout);
-                }
-            }
-        }
-
-        fail("No packet found matching verifier");
-        throw new IllegalStateException("Impossible condition; should have thrown in fail()");
-    }
-
-    public byte[] awaitEspPacketNoPlaintext(
-            int spi, byte[] plaintext, boolean useEncap, int expectedPacketSize) throws Exception {
-        final byte[] espPkt = awaitPacket(
-                (pkt) -> isEspFailIfSpecifiedPlaintextFound(pkt, spi, useEncap, plaintext));
-
-        // Validate packet size
-        assertEquals(expectedPacketSize, espPkt.length);
-
-        return espPkt; // We've found the packet we're looking for.
-    }
-
-    private static boolean isSpiEqual(byte[] pkt, int espOffset, int spi) {
-        // Check SPI byte by byte.
-        return pkt[espOffset] == (byte) ((spi >>> 24) & 0xff)
-                && pkt[espOffset + 1] == (byte) ((spi >>> 16) & 0xff)
-                && pkt[espOffset + 2] == (byte) ((spi >>> 8) & 0xff)
-                && pkt[espOffset + 3] == (byte) (spi & 0xff);
-    }
-
-    /**
-     * Variant of isEsp that also fails the test if the provided plaintext is found
-     *
-     * @param pkt the packet bytes to verify
-     * @param spi the expected SPI to look for
-     * @param encap whether encap was enabled, and the packet has a UDP header
-     * @param plaintext the plaintext packet before outbound encryption, which MUST not appear in
-     *     the provided packet.
-     */
-    private static boolean isEspFailIfSpecifiedPlaintextFound(
-            byte[] pkt, int spi, boolean encap, byte[] plaintext) {
-        if (Collections.indexOfSubList(Arrays.asList(pkt), Arrays.asList(plaintext)) != -1) {
-            fail("Banned plaintext packet found");
-        }
-
-        return isEsp(pkt, spi, encap);
-    }
-
-    private static boolean isEsp(byte[] pkt, int spi, boolean encap) {
-        if (isIpv6(pkt)) {
-            // IPv6 UDP encap not supported by kernels; assume non-encap.
-            return pkt[IP6_PROTO_OFFSET] == IPPROTO_ESP && isSpiEqual(pkt, IP6_HDRLEN, spi);
-        } else {
-            // Use default IPv4 header length (assuming no options)
-            if (encap) {
-                return pkt[IP4_PROTO_OFFSET] == IPPROTO_UDP
-                        && isSpiEqual(pkt, IP4_HDRLEN + UDP_HDRLEN, spi);
-            } else {
-                return pkt[IP4_PROTO_OFFSET] == IPPROTO_ESP && isSpiEqual(pkt, IP4_HDRLEN, spi);
-            }
-        }
-    }
-
-    public static boolean isIpv6(byte[] pkt) {
-        // First nibble shows IP version. 0x60 for IPv6
-        return (pkt[0] & (byte) 0xF0) == (byte) 0x60;
-    }
-
-    private static byte[] getReflectedPacket(byte[] pkt) {
-        byte[] reflected = Arrays.copyOf(pkt, pkt.length);
-
-        if (isIpv6(pkt)) {
-            // Set reflected packet's dst to that of the original's src
-            System.arraycopy(
-                    pkt, // src
-                    IP6_ADDR_OFFSET + IP6_ADDR_LEN, // src offset
-                    reflected, // dst
-                    IP6_ADDR_OFFSET, // dst offset
-                    IP6_ADDR_LEN); // len
-            // Set reflected packet's src IP to that of the original's dst IP
-            System.arraycopy(
-                    pkt, // src
-                    IP6_ADDR_OFFSET, // src offset
-                    reflected, // dst
-                    IP6_ADDR_OFFSET + IP6_ADDR_LEN, // dst offset
-                    IP6_ADDR_LEN); // len
-        } else {
-            // Set reflected packet's dst to that of the original's src
-            System.arraycopy(
-                    pkt, // src
-                    IP4_ADDR_OFFSET + IP4_ADDR_LEN, // src offset
-                    reflected, // dst
-                    IP4_ADDR_OFFSET, // dst offset
-                    IP4_ADDR_LEN); // len
-            // Set reflected packet's src IP to that of the original's dst IP
-            System.arraycopy(
-                    pkt, // src
-                    IP4_ADDR_OFFSET, // src offset
-                    reflected, // dst
-                    IP4_ADDR_OFFSET + IP4_ADDR_LEN, // dst offset
-                    IP4_ADDR_LEN); // len
-        }
-        return reflected;
-    }
-
-    /** Takes all captured packets, flips the src/dst, and re-injects them. */
-    public void reflectPackets() throws IOException {
-        synchronized (mPackets) {
-            for (byte[] pkt : mPackets) {
-                injectPacket(getReflectedPacket(pkt));
-            }
-        }
-    }
-
-    public void injectPacket(byte[] pkt) throws IOException {
-        FileOutputStream out = new FileOutputStream(mTunFd.getFileDescriptor());
-        out.write(pkt);
-        out.flush();
-    }
-
-    /** Resets the intercepted packets. */
-    public void reset() throws IOException {
-        synchronized (mPackets) {
-            mPackets.clear();
-        }
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/UriTest.java b/tests/tests/net/src/android/net/cts/UriTest.java
deleted file mode 100644
index 40b8fb7..0000000
--- a/tests/tests/net/src/android/net/cts/UriTest.java
+++ /dev/null
@@ -1,590 +0,0 @@
-/*
- * 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.net.cts;
-
-import android.content.ContentUris;
-import android.net.Uri;
-import android.os.Parcel;
-import android.test.AndroidTestCase;
-import java.io.File;
-import java.util.Arrays;
-import java.util.ArrayList;
-
-public class UriTest extends AndroidTestCase {
-    public void testParcelling() {
-        parcelAndUnparcel(Uri.parse("foo:bob%20lee"));
-        parcelAndUnparcel(Uri.fromParts("foo", "bob lee", "fragment"));
-        parcelAndUnparcel(new Uri.Builder()
-             .scheme("http")
-            .authority("crazybob.org")
-            .path("/rss/")
-            .encodedQuery("a=b")
-            .fragment("foo")
-            .build());
-     }
-
-    private void parcelAndUnparcel(Uri u) {
-        Parcel p = Parcel.obtain();
-        Uri.writeToParcel(p, u);
-        p.setDataPosition(0);
-        assertEquals(u, Uri.CREATOR.createFromParcel(p));
-
-        p.setDataPosition(0);
-        u = u.buildUpon().build();
-        Uri.writeToParcel(p, u);
-        p.setDataPosition(0);
-        assertEquals(u, Uri.CREATOR.createFromParcel(p));
-    }
-
-    public void testBuildUpon() {
-        Uri u = Uri.parse("bob:lee").buildUpon().scheme("robert").build();
-        assertEquals("robert", u.getScheme());
-        assertEquals("lee", u.getEncodedSchemeSpecificPart());
-        assertEquals("lee", u.getSchemeSpecificPart());
-        assertNull(u.getQuery());
-        assertNull(u.getPath());
-        assertNull(u.getAuthority());
-        assertNull(u.getHost());
-
-        Uri a = Uri.fromParts("foo", "bar", "tee");
-        Uri b = a.buildUpon().fragment("new").build();
-        assertEquals("new", b.getFragment());
-        assertEquals("bar", b.getSchemeSpecificPart());
-        assertEquals("foo", b.getScheme());
-        a = new Uri.Builder()
-                .scheme("foo")
-                .encodedOpaquePart("bar")
-                .fragment("tee")
-                .build();
-        b = a.buildUpon().fragment("new").build();
-        assertEquals("new", b.getFragment());
-        assertEquals("bar", b.getSchemeSpecificPart());
-        assertEquals("foo", b.getScheme());
-
-        a = Uri.fromParts("scheme", "[2001:db8::dead:e1f]/foo", "bar");
-        b = a.buildUpon().fragment("qux").build();
-        assertEquals("qux", b.getFragment());
-        assertEquals("[2001:db8::dead:e1f]/foo", b.getSchemeSpecificPart());
-        assertEquals("scheme", b.getScheme());
-    }
-
-    public void testStringUri() {
-        assertEquals("bob lee",
-                Uri.parse("foo:bob%20lee").getSchemeSpecificPart());
-        assertEquals("bob%20lee",
-                Uri.parse("foo:bob%20lee").getEncodedSchemeSpecificPart());
-
-        assertEquals("/bob%20lee",
-                Uri.parse("foo:/bob%20lee").getEncodedPath());
-        assertNull(Uri.parse("foo:bob%20lee").getPath());
-
-        assertEquals("bob%20lee",
-                Uri.parse("foo:?bob%20lee").getEncodedQuery());
-        assertNull(Uri.parse("foo:bob%20lee").getEncodedQuery());
-        assertNull(Uri.parse("foo:bar#?bob%20lee").getQuery());
-
-        assertEquals("bob%20lee",
-                Uri.parse("foo:#bob%20lee").getEncodedFragment());
-
-        Uri uri = Uri.parse("http://localhost:42");
-        assertEquals("localhost", uri.getHost());
-        assertEquals(42, uri.getPort());
-
-        uri = Uri.parse("http://bob@localhost:42");
-        assertEquals("bob", uri.getUserInfo());
-        assertEquals("localhost", uri.getHost());
-        assertEquals(42, uri.getPort());
-
-        uri = Uri.parse("http://bob%20lee@localhost:42");
-        assertEquals("bob lee", uri.getUserInfo());
-        assertEquals("bob%20lee", uri.getEncodedUserInfo());
-
-        uri = Uri.parse("http://localhost");
-        assertEquals("localhost", uri.getHost());
-        assertEquals(-1, uri.getPort());
-
-        uri = Uri.parse("http://a:a@example.com:a@example2.com/path");
-        assertEquals("a:a@example.com:a@example2.com", uri.getAuthority());
-        assertEquals("example2.com", uri.getHost());
-        assertEquals(-1, uri.getPort());
-        assertEquals("/path", uri.getPath());
-
-        uri = Uri.parse("http://a.foo.com\\.example.com/path");
-        assertEquals("a.foo.com", uri.getHost());
-        assertEquals(-1, uri.getPort());
-        assertEquals("\\.example.com/path", uri.getPath());
-
-        uri = Uri.parse("https://[2001:db8::dead:e1f]/foo");
-        assertEquals("[2001:db8::dead:e1f]", uri.getAuthority());
-        assertNull(uri.getUserInfo());
-        assertEquals("[2001:db8::dead:e1f]", uri.getHost());
-        assertEquals(-1, uri.getPort());
-        assertEquals("/foo", uri.getPath());
-        assertEquals(null, uri.getFragment());
-        assertEquals("//[2001:db8::dead:e1f]/foo", uri.getSchemeSpecificPart());
-
-        uri = Uri.parse("https://[2001:db8::dead:e1f]/#foo");
-        assertEquals("[2001:db8::dead:e1f]", uri.getAuthority());
-        assertNull(uri.getUserInfo());
-        assertEquals("[2001:db8::dead:e1f]", uri.getHost());
-        assertEquals(-1, uri.getPort());
-        assertEquals("/", uri.getPath());
-        assertEquals("foo", uri.getFragment());
-        assertEquals("//[2001:db8::dead:e1f]/", uri.getSchemeSpecificPart());
-
-        uri = Uri.parse(
-                "https://some:user@[2001:db8::dead:e1f]:1234/foo?corge=thud&corge=garp#bar");
-        assertEquals("some:user@[2001:db8::dead:e1f]:1234", uri.getAuthority());
-        assertEquals("some:user", uri.getUserInfo());
-        assertEquals("[2001:db8::dead:e1f]", uri.getHost());
-        assertEquals(1234, uri.getPort());
-        assertEquals("/foo", uri.getPath());
-        assertEquals("bar", uri.getFragment());
-        assertEquals("//some:user@[2001:db8::dead:e1f]:1234/foo?corge=thud&corge=garp",
-                uri.getSchemeSpecificPart());
-        assertEquals("corge=thud&corge=garp", uri.getQuery());
-        assertEquals("thud", uri.getQueryParameter("corge"));
-        assertEquals(Arrays.asList("thud", "garp"), uri.getQueryParameters("corge"));
-    }
-
-    public void testCompareTo() {
-        Uri a = Uri.parse("foo:a");
-        Uri b = Uri.parse("foo:b");
-        Uri b2 = Uri.parse("foo:b");
-
-        assertTrue(a.compareTo(b) < 0);
-        assertTrue(b.compareTo(a) > 0);
-        assertEquals(0, b.compareTo(b2));
-    }
-
-    public void testEqualsAndHashCode() {
-        Uri a = Uri.parse("http://crazybob.org/test/?foo=bar#tee");
-
-        Uri b = new Uri.Builder()
-                .scheme("http")
-                .authority("crazybob.org")
-                .path("/test/")
-                .encodedQuery("foo=bar")
-                .fragment("tee")
-                .build();
-
-        // Try alternate builder methods.
-        Uri c = new Uri.Builder()
-                .scheme("http")
-                .encodedAuthority("crazybob.org")
-                .encodedPath("/test/")
-                .encodedQuery("foo=bar")
-                .encodedFragment("tee")
-                .build();
-
-        assertFalse(Uri.EMPTY.equals(null));
-        assertEquals(a, b);
-        assertEquals(b, c);
-        assertEquals(c, a);
-        assertEquals(a.hashCode(), b.hashCode());
-        assertEquals(b.hashCode(), c.hashCode());
-    }
-
-    public void testEncodeAndDecode() {
-        String encoded = Uri.encode("Bob:/", "/");
-        assertEquals(-1, encoded.indexOf(':'));
-        assertTrue(encoded.indexOf('/') > -1);
-        assertEncodeDecodeRoundtripExact(null);
-        assertEncodeDecodeRoundtripExact("");
-        assertEncodeDecodeRoundtripExact("Bob");
-        assertEncodeDecodeRoundtripExact(":Bob");
-        assertEncodeDecodeRoundtripExact("::Bob");
-        assertEncodeDecodeRoundtripExact("Bob::Lee");
-        assertEncodeDecodeRoundtripExact("Bob:Lee");
-        assertEncodeDecodeRoundtripExact("Bob::");
-        assertEncodeDecodeRoundtripExact("Bob:");
-        assertEncodeDecodeRoundtripExact("::Bob::");
-        assertEncodeDecodeRoundtripExact("https:/some:user@[2001:db8::dead:e1f]:1234/foo#bar");
-    }
-
-    private static void assertEncodeDecodeRoundtripExact(String s) {
-        assertEquals(s, Uri.decode(Uri.encode(s, null)));
-    }
-
-    public void testDecode_emptyString_returnsEmptyString() {
-        assertEquals("", Uri.decode(""));
-    }
-
-    public void testDecode_null_returnsNull() {
-        assertNull(Uri.decode(null));
-    }
-
-    public void testDecode_wrongHexDigit() {
-        // %p in the end.
-        assertEquals("ab/$\u0102%\u0840\uFFFD\u0000", Uri.decode("ab%2f$%C4%82%25%e0%a1%80%p"));
-    }
-
-    public void testDecode_secondHexDigitWrong() {
-        // %1p in the end.
-        assertEquals("ab/$\u0102%\u0840\uFFFD\u0001", Uri.decode("ab%2f$%c4%82%25%e0%a1%80%1p"));
-    }
-
-    public void testDecode_endsWithPercent_appendsUnknownCharacter() {
-        // % in the end.
-        assertEquals("ab/$\u0102%\u0840\uFFFD", Uri.decode("ab%2f$%c4%82%25%e0%a1%80%"));
-    }
-
-    public void testDecode_plusNotConverted() {
-        assertEquals("ab/$\u0102%+\u0840", Uri.decode("ab%2f$%c4%82%25+%e0%a1%80"));
-    }
-
-    // Last character needs decoding (make sure we are flushing the buffer with chars to decode).
-    public void testDecode_lastCharacter() {
-        assertEquals("ab/$\u0102%\u0840", Uri.decode("ab%2f$%c4%82%25%e0%a1%80"));
-    }
-
-    // Check that a second row of encoded characters is decoded properly (internal buffers are
-    // reset properly).
-    public void testDecode_secondRowOfEncoded() {
-        assertEquals("ab/$\u0102%\u0840aa\u0840",
-                Uri.decode("ab%2f$%c4%82%25%e0%a1%80aa%e0%a1%80"));
-    }
-
-    public void testFromFile() {
-        File f = new File("/tmp/bob");
-        Uri uri = Uri.fromFile(f);
-        assertEquals("file:///tmp/bob", uri.toString());
-        try {
-            Uri.fromFile(null);
-            fail("testFile fail");
-            } catch (NullPointerException e) {}
-    }
-
-    public void testQueryParameters() {
-        Uri uri = Uri.parse("content://user");
-        assertEquals(null, uri.getQueryParameter("a"));
-
-        uri = uri.buildUpon().appendQueryParameter("a", "b").build();
-        assertEquals("b", uri.getQueryParameter("a"));
-
-        uri = uri.buildUpon().appendQueryParameter("a", "b2").build();
-        assertEquals(Arrays.asList("b", "b2"), uri.getQueryParameters("a"));
-
-        uri = uri.buildUpon().appendQueryParameter("c", "d").build();
-        assertEquals(Arrays.asList("b", "b2"), uri.getQueryParameters("a"));
-        assertEquals("d", uri.getQueryParameter("c"));
-    }
-
-    public void testPathOperations() {
-        Uri uri = Uri.parse("content://user/a/b");
-
-        assertEquals(2, uri.getPathSegments().size());
-        assertEquals("a", uri.getPathSegments().get(0));
-        assertEquals("b", uri.getPathSegments().get(1));
-        assertEquals("b", uri.getLastPathSegment());
-
-        Uri first = uri;
-        uri = uri.buildUpon().appendPath("c").build();
-        assertEquals(3, uri.getPathSegments().size());
-        assertEquals("c", uri.getPathSegments().get(2));
-        assertEquals("c", uri.getLastPathSegment());
-        assertEquals("content://user/a/b/c", uri.toString());
-
-        uri = ContentUris.withAppendedId(uri, 100);
-        assertEquals(4, uri.getPathSegments().size());
-        assertEquals("100", uri.getPathSegments().get(3));
-        assertEquals("100", uri.getLastPathSegment());
-        assertEquals(100, ContentUris.parseId(uri));
-        assertEquals("content://user/a/b/c/100", uri.toString());
-
-        // Make sure the original URI is still intact.
-        assertEquals(2, first.getPathSegments().size());
-        assertEquals("b", first.getLastPathSegment());
-
-        try {
-        first.getPathSegments().get(2);
-        fail("test path operations");
-        } catch (IndexOutOfBoundsException e) {}
-
-        assertEquals(null, Uri.EMPTY.getLastPathSegment());
-
-        Uri withC = Uri.parse("foo:/a/b/").buildUpon().appendPath("c").build();
-        assertEquals("/a/b/c", withC.getPath());
-    }
-
-    public void testOpaqueUri() {
-        Uri uri = Uri.parse("mailto:nobody");
-        testOpaqueUri(uri);
-
-        uri = uri.buildUpon().build();
-        testOpaqueUri(uri);
-
-        uri = Uri.fromParts("mailto", "nobody", null);
-        testOpaqueUri(uri);
-
-        uri = uri.buildUpon().build();
-        testOpaqueUri(uri);
-
-        uri = new Uri.Builder()
-                .scheme("mailto")
-                .opaquePart("nobody")
-                .build();
-        testOpaqueUri(uri);
-
-        uri = uri.buildUpon().build();
-        testOpaqueUri(uri);
-    }
-
-    private void testOpaqueUri(Uri uri) {
-        assertEquals("mailto", uri.getScheme());
-        assertEquals("nobody", uri.getSchemeSpecificPart());
-        assertEquals("nobody", uri.getEncodedSchemeSpecificPart());
-
-        assertNull(uri.getFragment());
-        assertTrue(uri.isAbsolute());
-        assertTrue(uri.isOpaque());
-        assertFalse(uri.isRelative());
-        assertFalse(uri.isHierarchical());
-
-        assertNull(uri.getAuthority());
-        assertNull(uri.getEncodedAuthority());
-        assertNull(uri.getPath());
-        assertNull(uri.getEncodedPath());
-        assertNull(uri.getUserInfo());
-        assertNull(uri.getEncodedUserInfo());
-        assertNull(uri.getQuery());
-        assertNull(uri.getEncodedQuery());
-        assertNull(uri.getHost());
-        assertEquals(-1, uri.getPort());
-
-        assertTrue(uri.getPathSegments().isEmpty());
-        assertNull(uri.getLastPathSegment());
-
-        assertEquals("mailto:nobody", uri.toString());
-
-        Uri withFragment = uri.buildUpon().fragment("top").build();
-        assertEquals("mailto:nobody#top", withFragment.toString());
-    }
-
-    public void testHierarchicalUris() {
-        testHierarchical("http", "google.com", "/p1/p2", "query", "fragment");
-        testHierarchical("file", null, "/p1/p2", null, null);
-        testHierarchical("content", "contact", "/p1/p2", null, null);
-        testHierarchical("http", "google.com", "/p1/p2", null, "fragment");
-        testHierarchical("http", "google.com", "", null, "fragment");
-        testHierarchical("http", "google.com", "", "query", "fragment");
-        testHierarchical("http", "google.com", "", "query", null);
-        testHierarchical("http", null, "/", "query", null);
-    }
-
-    private static void testHierarchical(String scheme, String authority,
-        String path, String query, String fragment) {
-        StringBuilder sb = new StringBuilder();
-
-        if (authority != null) {
-            sb.append("//").append(authority);
-        }
-        if (path != null) {
-            sb.append(path);
-        }
-        if (query != null) {
-            sb.append('?').append(query);
-        }
-
-        String ssp = sb.toString();
-
-        if (scheme != null) {
-            sb.insert(0, scheme + ":");
-        }
-        if (fragment != null) {
-            sb.append('#').append(fragment);
-        }
-
-        String uriString = sb.toString();
-
-        Uri uri = Uri.parse(uriString);
-
-        // Run these twice to test caching.
-        compareHierarchical(
-        uriString, ssp, uri, scheme, authority, path, query, fragment);
-        compareHierarchical(
-        uriString, ssp, uri, scheme, authority, path, query, fragment);
-
-        // Test rebuilt version.
-        uri = uri.buildUpon().build();
-
-        // Run these twice to test caching.
-        compareHierarchical(
-                uriString, ssp, uri, scheme, authority, path, query, fragment);
-        compareHierarchical(
-                uriString, ssp, uri, scheme, authority, path, query, fragment);
-
-        // The decoded and encoded versions of the inputs are all the same.
-        // We'll test the actual encoding decoding separately.
-
-        // Test building with encoded versions.
-        Uri built = new Uri.Builder()
-            .scheme(scheme)
-                .encodedAuthority(authority)
-                .encodedPath(path)
-                .encodedQuery(query)
-                .encodedFragment(fragment)
-                .build();
-
-        compareHierarchical(
-                uriString, ssp, built, scheme, authority, path, query, fragment);
-        compareHierarchical(
-                uriString, ssp, built, scheme, authority, path, query, fragment);
-
-        // Test building with decoded versions.
-        built = new Uri.Builder()
-                .scheme(scheme)
-                .authority(authority)
-                .path(path)
-                .query(query)
-                .fragment(fragment)
-                .build();
-
-        compareHierarchical(
-                uriString, ssp, built, scheme, authority, path, query, fragment);
-        compareHierarchical(
-                uriString, ssp, built, scheme, authority, path, query, fragment);
-
-        // Rebuild.
-        built = built.buildUpon().build();
-
-        compareHierarchical(
-                uriString, ssp, built, scheme, authority, path, query, fragment);
-        compareHierarchical(
-                uriString, ssp, built, scheme, authority, path, query, fragment);
-    }
-
-    private static void compareHierarchical(String uriString, String ssp,
-        Uri uri,
-        String scheme, String authority, String path, String query,
-        String fragment) {
-        assertEquals(scheme, uri.getScheme());
-        assertEquals(authority, uri.getAuthority());
-        assertEquals(authority, uri.getEncodedAuthority());
-        assertEquals(path, uri.getPath());
-        assertEquals(path, uri.getEncodedPath());
-        assertEquals(query, uri.getQuery());
-        assertEquals(query, uri.getEncodedQuery());
-        assertEquals(fragment, uri.getFragment());
-        assertEquals(fragment, uri.getEncodedFragment());
-        assertEquals(ssp, uri.getSchemeSpecificPart());
-
-        if (scheme != null) {
-            assertTrue(uri.isAbsolute());
-            assertFalse(uri.isRelative());
-        } else {
-            assertFalse(uri.isAbsolute());
-            assertTrue(uri.isRelative());
-        }
-
-        assertFalse(uri.isOpaque());
-        assertTrue(uri.isHierarchical());
-        assertEquals(uriString, uri.toString());
-    }
-
-    public void testNormalizeScheme() {
-        assertEquals(Uri.parse(""), Uri.parse("").normalizeScheme());
-        assertEquals(Uri.parse("http://www.android.com"),
-                Uri.parse("http://www.android.com").normalizeScheme());
-        assertEquals(Uri.parse("http://USER@WWW.ANDROID.COM:100/ABOUT?foo=blah@bar=bleh#c"),
-                Uri.parse("HTTP://USER@WWW.ANDROID.COM:100/ABOUT?foo=blah@bar=bleh#c")
-                        .normalizeScheme());
-    }
-
-    public void testToSafeString_tel() {
-        checkToSafeString("tel:xxxxxx", "tel:Google");
-        checkToSafeString("tel:xxxxxxxxxx", "tel:1234567890");
-        checkToSafeString("tEl:xxx.xxx-xxxx", "tEl:123.456-7890");
-    }
-
-    public void testToSafeString_sip() {
-        checkToSafeString("sip:xxxxxxx@xxxxxxx.xxxxxxxx", "sip:android@android.com:1234");
-        checkToSafeString("sIp:xxxxxxx@xxxxxxx.xxx", "sIp:android@android.com");
-    }
-
-    public void testToSafeString_sms() {
-        checkToSafeString("sms:xxxxxx", "sms:123abc");
-        checkToSafeString("smS:xxx.xxx-xxxx", "smS:123.456-7890");
-    }
-
-    public void testToSafeString_smsto() {
-        checkToSafeString("smsto:xxxxxx", "smsto:123abc");
-        checkToSafeString("SMSTo:xxx.xxx-xxxx", "SMSTo:123.456-7890");
-    }
-
-    public void testToSafeString_mailto() {
-        checkToSafeString("mailto:xxxxxxx@xxxxxxx.xxx", "mailto:android@android.com");
-        checkToSafeString("Mailto:xxxxxxx@xxxxxxx.xxxxxxxxxx",
-                "Mailto:android@android.com/secret");
-    }
-
-    public void testToSafeString_nfc() {
-        checkToSafeString("nfc:xxxxxx", "nfc:123abc");
-        checkToSafeString("nfc:xxx.xxx-xxxx", "nfc:123.456-7890");
-        checkToSafeString("nfc:xxxxxxx@xxxxxxx.xxx", "nfc:android@android.com");
-    }
-
-    public void testToSafeString_http() {
-        checkToSafeString("http://www.android.com/...", "http://www.android.com");
-        checkToSafeString("HTTP://www.android.com/...", "HTTP://www.android.com");
-        checkToSafeString("http://www.android.com/...", "http://www.android.com/");
-        checkToSafeString("http://www.android.com/...", "http://www.android.com/secretUrl?param");
-        checkToSafeString("http://www.android.com/...",
-                "http://user:pwd@www.android.com/secretUrl?param");
-        checkToSafeString("http://www.android.com/...",
-                "http://user@www.android.com/secretUrl?param");
-        checkToSafeString("http://www.android.com/...", "http://www.android.com/secretUrl?param");
-        checkToSafeString("http:///...", "http:///path?param");
-        checkToSafeString("http:///...", "http://");
-        checkToSafeString("http://:12345/...", "http://:12345/");
-    }
-
-    public void testToSafeString_https() {
-        checkToSafeString("https://www.android.com/...", "https://www.android.com/secretUrl?param");
-        checkToSafeString("https://www.android.com:8443/...",
-                "https://user:pwd@www.android.com:8443/secretUrl?param");
-        checkToSafeString("https://www.android.com/...", "https://user:pwd@www.android.com");
-        checkToSafeString("Https://www.android.com/...", "Https://user:pwd@www.android.com");
-    }
-
-    public void testToSafeString_ftp() {
-        checkToSafeString("ftp://ftp.android.com/...", "ftp://ftp.android.com/");
-        checkToSafeString("ftP://ftp.android.com/...", "ftP://anonymous@ftp.android.com/");
-        checkToSafeString("ftp://ftp.android.com:2121/...",
-                "ftp://root:love@ftp.android.com:2121/");
-    }
-
-    public void testToSafeString_rtsp() {
-        checkToSafeString("rtsp://rtsp.android.com/...", "rtsp://rtsp.android.com/");
-        checkToSafeString("rtsp://rtsp.android.com/...", "rtsp://rtsp.android.com/video.mov");
-        checkToSafeString("rtsp://rtsp.android.com/...", "rtsp://rtsp.android.com/video.mov?param");
-        checkToSafeString("RtsP://rtsp.android.com/...", "RtsP://anonymous@rtsp.android.com/");
-        checkToSafeString("rtsp://rtsp.android.com:2121/...",
-                "rtsp://username:password@rtsp.android.com:2121/");
-    }
-
-    public void testToSafeString_notSupport() {
-        checkToSafeString("unsupported://ajkakjah/askdha/secret?secret",
-                "unsupported://ajkakjah/askdha/secret?secret");
-        checkToSafeString("unsupported:ajkakjah/askdha/secret?secret",
-                "unsupported:ajkakjah/askdha/secret?secret");
-    }
-
-    private void checkToSafeString(String expectedSafeString, String original) {
-        assertEquals(expectedSafeString, Uri.parse(original).toSafeString());
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/Uri_BuilderTest.java b/tests/tests/net/src/android/net/cts/Uri_BuilderTest.java
deleted file mode 100644
index 4088d82..0000000
--- a/tests/tests/net/src/android/net/cts/Uri_BuilderTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * 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.net.cts;
-
-import junit.framework.TestCase;
-import android.net.Uri.Builder;
-import android.net.Uri;
-
-public class Uri_BuilderTest extends TestCase {
-    public void testBuilderOperations() {
-        Uri uri = Uri.parse("http://google.com/p1?query#fragment");
-        Builder builder = uri.buildUpon();
-        uri = builder.appendPath("p2").build();
-        assertEquals("http", uri.getScheme());
-        assertEquals("google.com", uri.getAuthority());
-        assertEquals("/p1/p2", uri.getPath());
-        assertEquals("query", uri.getQuery());
-        assertEquals("fragment", uri.getFragment());
-        assertEquals(uri.toString(), builder.toString());
-
-        uri = Uri.parse("mailto:nobody");
-        builder = uri.buildUpon();
-        uri = builder.build();
-        assertEquals("mailto", uri.getScheme());
-        assertEquals("nobody", uri.getSchemeSpecificPart());
-        assertEquals(uri.toString(), builder.toString());
-
-        uri = new Uri.Builder()
-                .scheme("http")
-                .encodedAuthority("google.com")
-                .encodedPath("/p1")
-                .appendEncodedPath("p2")
-                .encodedQuery("query")
-                .appendQueryParameter("query2", null)
-                .encodedFragment("fragment")
-                .build();
-        assertEquals("http", uri.getScheme());
-        assertEquals("google.com", uri.getEncodedAuthority());
-        assertEquals("/p1/p2", uri.getEncodedPath());
-        assertEquals("query&query2=null", uri.getEncodedQuery());
-        assertEquals("fragment", uri.getEncodedFragment());
-
-        uri = new Uri.Builder()
-                .scheme("mailto")
-                .encodedOpaquePart("nobody")
-                .build();
-        assertEquals("mailto", uri.getScheme());
-        assertEquals("nobody", uri.getEncodedSchemeSpecificPart());
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/UrlQuerySanitizerTest.java b/tests/tests/net/src/android/net/cts/UrlQuerySanitizerTest.java
deleted file mode 100644
index 5a70928..0000000
--- a/tests/tests/net/src/android/net/cts/UrlQuerySanitizerTest.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- * Copyright (C) 2009 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 static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import android.net.UrlQuerySanitizer;
-import android.net.UrlQuerySanitizer.IllegalCharacterValueSanitizer;
-import android.net.UrlQuerySanitizer.ParameterValuePair;
-import android.net.UrlQuerySanitizer.ValueSanitizer;
-import android.os.Build;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import com.android.testutils.DevSdkIgnoreRule;
-import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.List;
-import java.util.Set;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-public class UrlQuerySanitizerTest {
-    @Rule
-    public final DevSdkIgnoreRule mIgnoreRule = new DevSdkIgnoreRule();
-
-    private static final int ALL_OK = IllegalCharacterValueSanitizer.ALL_OK;
-
-    // URL for test.
-    private static final String TEST_URL = "http://example.com/?name=Joe+User&age=20&height=175";
-
-    // Default sanitizer's change when "+".
-    private static final String EXPECTED_UNDERLINE_NAME = "Joe_User";
-
-    // IllegalCharacterValueSanitizer sanitizer's change when "+".
-    private static final String EXPECTED_SPACE_NAME = "Joe User";
-    private static final String EXPECTED_AGE = "20";
-    private static final String EXPECTED_HEIGHT = "175";
-    private static final String NAME = "name";
-    private static final String AGE = "age";
-    private static final String HEIGHT = "height";
-
-    @Test
-    public void testUrlQuerySanitizer() {
-        MockUrlQuerySanitizer uqs = new MockUrlQuerySanitizer();
-        assertFalse(uqs.getAllowUnregisteredParamaters());
-
-        final String query = "book=thinking in java&price=108";
-        final String book = "book";
-        final String bookName = "thinking in java";
-        final String price = "price";
-        final String bookPrice = "108";
-        final String notExistPar = "notExistParameter";
-        uqs.registerParameters(new String[]{book, price}, UrlQuerySanitizer.getSpaceLegal());
-        uqs.parseQuery(query);
-        assertTrue(uqs.hasParameter(book));
-        assertTrue(uqs.hasParameter(price));
-        assertFalse(uqs.hasParameter(notExistPar));
-        assertEquals(bookName, uqs.getValue(book));
-        assertEquals(bookPrice, uqs.getValue(price));
-        assertNull(uqs.getValue(notExistPar));
-        uqs.clear();
-        assertFalse(uqs.hasParameter(book));
-        assertFalse(uqs.hasParameter(price));
-
-        uqs.parseEntry(book, bookName);
-        assertTrue(uqs.hasParameter(book));
-        assertEquals(bookName, uqs.getValue(book));
-        uqs.parseEntry(price, bookPrice);
-        assertTrue(uqs.hasParameter(price));
-        assertEquals(bookPrice, uqs.getValue(price));
-        assertFalse(uqs.hasParameter(notExistPar));
-        assertNull(uqs.getValue(notExistPar));
-
-        uqs = new MockUrlQuerySanitizer(TEST_URL);
-        assertTrue(uqs.getAllowUnregisteredParamaters());
-
-        assertTrue(uqs.hasParameter(NAME));
-        assertTrue(uqs.hasParameter(AGE));
-        assertTrue(uqs.hasParameter(HEIGHT));
-        assertFalse(uqs.hasParameter(notExistPar));
-
-        assertEquals(EXPECTED_UNDERLINE_NAME, uqs.getValue(NAME));
-        assertEquals(EXPECTED_AGE, uqs.getValue(AGE));
-        assertEquals(EXPECTED_HEIGHT, uqs.getValue(HEIGHT));
-        assertNull(uqs.getValue(notExistPar));
-
-        final int ContainerLen = 3;
-        Set<String> urlSet = uqs.getParameterSet();
-        assertEquals(ContainerLen, urlSet.size());
-        assertTrue(urlSet.contains(NAME));
-        assertTrue(urlSet.contains(AGE));
-        assertTrue(urlSet.contains(HEIGHT));
-        assertFalse(urlSet.contains(notExistPar));
-
-        List<ParameterValuePair> urlList = uqs.getParameterList();
-        assertEquals(ContainerLen, urlList.size());
-        ParameterValuePair pvp = urlList.get(0);
-        assertEquals(NAME, pvp.mParameter);
-        assertEquals(EXPECTED_UNDERLINE_NAME, pvp.mValue);
-        pvp = urlList.get(1);
-        assertEquals(AGE, pvp.mParameter);
-        assertEquals(EXPECTED_AGE, pvp.mValue);
-        pvp = urlList.get(2);
-        assertEquals(HEIGHT, pvp.mParameter);
-        assertEquals(EXPECTED_HEIGHT, pvp.mValue);
-
-        assertFalse(uqs.getPreferFirstRepeatedParameter());
-        uqs.addSanitizedEntry(HEIGHT, EXPECTED_HEIGHT + 1);
-        assertEquals(ContainerLen, urlSet.size());
-        assertEquals(ContainerLen + 1, urlList.size());
-        assertEquals(EXPECTED_HEIGHT + 1, uqs.getValue(HEIGHT));
-
-        uqs.setPreferFirstRepeatedParameter(true);
-        assertTrue(uqs.getPreferFirstRepeatedParameter());
-        uqs.addSanitizedEntry(HEIGHT, EXPECTED_HEIGHT);
-        assertEquals(ContainerLen, urlSet.size());
-        assertEquals(ContainerLen + 2, urlList.size());
-        assertEquals(EXPECTED_HEIGHT + 1, uqs.getValue(HEIGHT));
-
-        uqs.registerParameter(NAME, null);
-        assertNull(uqs.getValueSanitizer(NAME));
-        assertNotNull(uqs.getEffectiveValueSanitizer(NAME));
-
-        uqs.setAllowUnregisteredParamaters(false);
-        assertFalse(uqs.getAllowUnregisteredParamaters());
-        uqs.registerParameter(NAME, null);
-        assertNull(uqs.getEffectiveValueSanitizer(NAME));
-
-        ValueSanitizer vs = new IllegalCharacterValueSanitizer(ALL_OK);
-        uqs.registerParameter(NAME, vs);
-        uqs.parseUrl(TEST_URL);
-        assertEquals(EXPECTED_SPACE_NAME, uqs.getValue(NAME));
-        assertNotSame(EXPECTED_AGE, uqs.getValue(AGE));
-
-        String[] register = {NAME, AGE};
-        uqs.registerParameters(register, vs);
-        uqs.parseUrl(TEST_URL);
-        assertEquals(EXPECTED_SPACE_NAME, uqs.getValue(NAME));
-        assertEquals(EXPECTED_AGE, uqs.getValue(AGE));
-        assertNotSame(EXPECTED_HEIGHT, uqs.getValue(HEIGHT));
-
-        uqs.setUnregisteredParameterValueSanitizer(vs);
-        assertEquals(vs, uqs.getUnregisteredParameterValueSanitizer());
-
-        vs = UrlQuerySanitizer.getAllIllegal();
-        assertEquals("Joe_User", vs.sanitize("Joe<User"));
-        vs = UrlQuerySanitizer.getAllButNulAndAngleBracketsLegal();
-        assertEquals("Joe   User", vs.sanitize("Joe<>\0User"));
-        vs = UrlQuerySanitizer.getAllButNulLegal();
-        assertEquals("Joe User", vs.sanitize("Joe\0User"));
-        vs = UrlQuerySanitizer.getAllButWhitespaceLegal();
-        assertEquals("Joe_User", vs.sanitize("Joe User"));
-        vs = UrlQuerySanitizer.getAmpAndSpaceLegal();
-        assertEquals("Joe User&", vs.sanitize("Joe User&"));
-        vs = UrlQuerySanitizer.getAmpLegal();
-        assertEquals("Joe_User&", vs.sanitize("Joe User&"));
-        vs = UrlQuerySanitizer.getSpaceLegal();
-        assertEquals("Joe User ", vs.sanitize("Joe User&"));
-        vs = UrlQuerySanitizer.getUrlAndSpaceLegal();
-        assertEquals("Joe User&Smith%B5'\'", vs.sanitize("Joe User&Smith%B5'\'"));
-        vs = UrlQuerySanitizer.getUrlLegal();
-        assertEquals("Joe_User&Smith%B5'\'", vs.sanitize("Joe User&Smith%B5'\'"));
-
-        String escape = "Joe";
-        assertEquals(escape, uqs.unescape(escape));
-        String expectedPlus = "Joe User";
-        String expectedPercentSignHex = "title=" + Character.toString((char)181);
-        String initialPlus = "Joe+User";
-        String initialPercentSign = "title=%B5";
-        assertEquals(expectedPlus, uqs.unescape(initialPlus));
-        assertEquals(expectedPercentSignHex, uqs.unescape(initialPercentSign));
-        String expectedPlusThenPercentSign = "Joe Random, User";
-        String plusThenPercentSign = "Joe+Random%2C%20User";
-        assertEquals(expectedPlusThenPercentSign, uqs.unescape(plusThenPercentSign));
-        String expectedPercentSignThenPlus = "Joe, Random User";
-        String percentSignThenPlus = "Joe%2C+Random+User";
-        assertEquals(expectedPercentSignThenPlus, uqs.unescape(percentSignThenPlus));
-
-        assertTrue(uqs.decodeHexDigit('0') >= 0);
-        assertTrue(uqs.decodeHexDigit('b') >= 0);
-        assertTrue(uqs.decodeHexDigit('F') >= 0);
-        assertTrue(uqs.decodeHexDigit('$') < 0);
-
-        assertTrue(uqs.isHexDigit('0'));
-        assertTrue(uqs.isHexDigit('b'));
-        assertTrue(uqs.isHexDigit('F'));
-        assertFalse(uqs.isHexDigit('$'));
-
-        uqs.clear();
-        assertEquals(0, urlSet.size());
-        assertEquals(0, urlList.size());
-
-        uqs.setPreferFirstRepeatedParameter(true);
-        assertTrue(uqs.getPreferFirstRepeatedParameter());
-        uqs.setPreferFirstRepeatedParameter(false);
-        assertFalse(uqs.getPreferFirstRepeatedParameter());
-
-        UrlQuerySanitizer uq = new UrlQuerySanitizer();
-        uq.setPreferFirstRepeatedParameter(true);
-        final String PARA_ANSWER = "answer";
-        uq.registerParameter(PARA_ANSWER, new MockValueSanitizer());
-        uq.parseUrl("http://www.google.com/question?answer=13&answer=42");
-        assertEquals("13", uq.getValue(PARA_ANSWER));
-
-        uq.setPreferFirstRepeatedParameter(false);
-        uq.parseQuery("http://www.google.com/question?answer=13&answer=42");
-        assertEquals("42", uq.getValue(PARA_ANSWER));
-
-    }
-
-    @Test @IgnoreUpTo(Build.VERSION_CODES.Q) // Only fixed in R
-    public void testScriptUrlOk_73822755() {
-        ValueSanitizer sanitizer = new UrlQuerySanitizer.IllegalCharacterValueSanitizer(
-                UrlQuerySanitizer.IllegalCharacterValueSanitizer.SCRIPT_URL_OK);
-        assertEquals("javascript:alert()", sanitizer.sanitize("javascript:alert()"));
-    }
-
-    @Test @IgnoreUpTo(Build.VERSION_CODES.Q) // Only fixed in R
-    public void testScriptUrlBlocked_73822755() {
-        ValueSanitizer sanitizer = UrlQuerySanitizer.getUrlAndSpaceLegal();
-        assertEquals("", sanitizer.sanitize("javascript:alert()"));
-    }
-
-    private static class MockValueSanitizer implements ValueSanitizer{
-
-        public String sanitize(String value) {
-            return value;
-        }
-    }
-
-    class MockUrlQuerySanitizer extends UrlQuerySanitizer {
-        public MockUrlQuerySanitizer() {
-            super();
-        }
-
-        public MockUrlQuerySanitizer(String url) {
-            super(url);
-        }
-
-        @Override
-        protected void addSanitizedEntry(String parameter, String value) {
-            super.addSanitizedEntry(parameter, value);
-        }
-
-        @Override
-        protected void clear() {
-            super.clear();
-        }
-
-        @Override
-        protected int decodeHexDigit(char c) {
-            return super.decodeHexDigit(c);
-        }
-
-        @Override
-        protected boolean isHexDigit(char c) {
-            return super.isHexDigit(c);
-        }
-
-        @Override
-        protected void parseEntry(String parameter, String value) {
-            super.parseEntry(parameter, value);
-        }
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/UrlQuerySanitizer_IllegalCharacterValueSanitizerTest.java b/tests/tests/net/src/android/net/cts/UrlQuerySanitizer_IllegalCharacterValueSanitizerTest.java
deleted file mode 100644
index f86af31..0000000
--- a/tests/tests/net/src/android/net/cts/UrlQuerySanitizer_IllegalCharacterValueSanitizerTest.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2009 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.net.UrlQuerySanitizer;
-import android.net.UrlQuerySanitizer.IllegalCharacterValueSanitizer;
-import android.test.AndroidTestCase;
-
-public class UrlQuerySanitizer_IllegalCharacterValueSanitizerTest extends AndroidTestCase {
-    static final int SPACE_OK = IllegalCharacterValueSanitizer.SPACE_OK;
-    public void testSanitize() {
-        IllegalCharacterValueSanitizer sanitizer =  new IllegalCharacterValueSanitizer(SPACE_OK);
-        assertEquals("Joe User", sanitizer.sanitize("Joe<User"));
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/UrlQuerySanitizer_ParameterValuePairTest.java b/tests/tests/net/src/android/net/cts/UrlQuerySanitizer_ParameterValuePairTest.java
deleted file mode 100644
index 077cdaf..0000000
--- a/tests/tests/net/src/android/net/cts/UrlQuerySanitizer_ParameterValuePairTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2009 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.net.UrlQuerySanitizer;
-import android.net.UrlQuerySanitizer.ParameterValuePair;
-import android.test.AndroidTestCase;
-
-public class UrlQuerySanitizer_ParameterValuePairTest extends AndroidTestCase {
-    public void testConstructor() {
-        final String parameter = "name";
-        final String vaule = "Joe_user";
-
-        UrlQuerySanitizer uqs = new UrlQuerySanitizer();
-        ParameterValuePair parameterValuePair = uqs.new ParameterValuePair(parameter, vaule);
-        assertEquals(parameter, parameterValuePair.mParameter);
-        assertEquals(vaule, parameterValuePair.mValue);
-    }
-}
diff --git a/tests/tests/net/src/android/net/cts/VpnServiceTest.java b/tests/tests/net/src/android/net/cts/VpnServiceTest.java
deleted file mode 100644
index 15af23c..0000000
--- a/tests/tests/net/src/android/net/cts/VpnServiceTest.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2012 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.Intent;
-import android.net.VpnService;
-import android.os.ParcelFileDescriptor;
-import android.platform.test.annotations.AppModeFull;
-import android.test.AndroidTestCase;
-
-import java.io.File;
-import java.net.DatagramSocket;
-import java.net.Socket;
-
-/**
- * VpnService API is built with security in mind. However, its security also
- * blocks us from writing tests for positive cases. For now we only test for
- * negative cases, and we will try to cover the rest in the future.
- */
-public class VpnServiceTest extends AndroidTestCase {
-
-    private static final String TAG = VpnServiceTest.class.getSimpleName();
-
-    private VpnService mVpnService = new VpnService();
-
-    @AppModeFull(reason = "PackageManager#queryIntentActivities cannot access in instant app mode")
-    public void testPrepare() throws Exception {
-        // Should never return null since we are not prepared.
-        Intent intent = VpnService.prepare(mContext);
-        assertNotNull(intent);
-
-        // Should be always resolved by only one activity.
-        int count = mContext.getPackageManager().queryIntentActivities(intent, 0).size();
-        assertEquals(1, count);
-    }
-
-    public void testEstablish() throws Exception {
-        ParcelFileDescriptor descriptor = null;
-        try {
-            // Should always return null since we are not prepared.
-            descriptor = mVpnService.new Builder().addAddress("8.8.8.8", 30).establish();
-            assertNull(descriptor);
-        } finally {
-            try {
-                descriptor.close();
-            } catch (Exception e) {
-                // ignore
-            }
-        }
-    }
-
-    @AppModeFull(reason = "Socket cannot bind in instant app mode")
-    public void testProtect_DatagramSocket() throws Exception {
-        DatagramSocket socket = new DatagramSocket();
-        try {
-            // Should always return false since we are not prepared.
-            assertFalse(mVpnService.protect(socket));
-        } finally {
-            try {
-                socket.close();
-            } catch (Exception e) {
-                // ignore
-            }
-        }
-    }
-
-    public void testProtect_Socket() throws Exception {
-        Socket socket = new Socket();
-        try {
-            // Should always return false since we are not prepared.
-            assertFalse(mVpnService.protect(socket));
-        } finally {
-            try {
-                socket.close();
-            } catch (Exception e) {
-                // ignore
-            }
-        }
-    }
-
-    @AppModeFull(reason = "Socket cannot bind in instant app mode")
-    public void testProtect_int() throws Exception {
-        DatagramSocket socket = new DatagramSocket();
-        ParcelFileDescriptor descriptor = ParcelFileDescriptor.fromDatagramSocket(socket);
-        try {
-            // Should always return false since we are not prepared.
-            assertFalse(mVpnService.protect(descriptor.getFd()));
-        } finally {
-            try {
-                descriptor.close();
-            } catch (Exception e) {
-                // ignore
-            }
-            try {
-                socket.close();
-            } catch (Exception e) {
-                // ignore
-            }
-        }
-    }
-
-    public void testTunDevice() throws Exception {
-        File file = new File("/dev/tun");
-        assertTrue(file.exists());
-        assertFalse(file.isFile());
-        assertFalse(file.isDirectory());
-        assertFalse(file.canExecute());
-        assertFalse(file.canRead());
-        assertFalse(file.canWrite());
-    }
-}
diff --git a/tests/tests/net/src/android/net/ipv6/cts/PingTest.java b/tests/tests/net/src/android/net/ipv6/cts/PingTest.java
deleted file mode 100644
index 146fd83..0000000
--- a/tests/tests/net/src/android/net/ipv6/cts/PingTest.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (C) 2013 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.ipv6.cts;
-
-import android.test.AndroidTestCase;
-import android.util.Log;
-
-import android.system.ErrnoException;
-import android.system.Os;
-import android.system.StructTimeval;
-import static android.system.OsConstants.*;
-
-import java.io.FileDescriptor;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.Inet6Address;
-import java.net.InetSocketAddress;
-import java.net.UnknownHostException;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.Random;
-
-/**
- * Checks that the device has kernel support for the IPv6 ping socket. This allows ping6 to work
- * without root privileges. The necessary kernel code is in Linux 3.11 or above, or the
- * <code>common/android-3.x</code> kernel trees. If you are not running one of these kernels, the
- * functionality can be obtained by cherry-picking the following patches from David Miller's
- * <code>net-next</code> tree:
- * <ul>
- * <li>6d0bfe2 net: ipv6: Add IPv6 support to the ping socket.
- * <li>c26d6b4 ping: always initialize ->sin6_scope_id and ->sin6_flowinfo
- * <li>fbfe80c net: ipv6: fix wrong ping_v6_sendmsg return value
- * <li>a1bdc45 net: ipv6: add missing lock in ping_v6_sendmsg
- * <li>cf970c0 ping: prevent NULL pointer dereference on write to msg_name
- * </ul>
- * or the equivalent backports to the <code>common/android-3.x</code> trees.
- */
-public class PingTest extends AndroidTestCase {
-    /** Maximum size of the packets we're using to test. */
-    private static final int MAX_SIZE = 4096;
-
-    /** Size of the ICMPv6 header. */
-    private static final int ICMP_HEADER_SIZE = 8;
-
-    /** Number of packets to test. */
-    private static final int NUM_PACKETS = 10;
-
-    /** The beginning of an ICMPv6 echo request: type, code, and uninitialized checksum. */
-    private static final byte[] PING_HEADER = new byte[] {
-        (byte) ICMP6_ECHO_REQUEST, (byte) 0x00, (byte) 0x00, (byte) 0x00
-    };
-
-    /**
-     * Returns a byte array containing an ICMPv6 echo request with the specified payload length.
-     */
-    private byte[] pingPacket(int payloadLength) {
-        byte[] packet = new byte[payloadLength + ICMP_HEADER_SIZE];
-        new Random().nextBytes(packet);
-        System.arraycopy(PING_HEADER, 0, packet, 0, PING_HEADER.length);
-        return packet;
-    }
-
-    /**
-     * Checks that the first length bytes of two byte arrays are equal.
-     */
-    private void assertArrayBytesEqual(byte[] expected, byte[] actual, int length) {
-        for (int i = 0; i < length; i++) {
-            assertEquals("Arrays differ at index " + i + ":", expected[i], actual[i]);
-        }
-    }
-
-    /**
-     * Creates an IPv6 ping socket and sets a receive timeout of 100ms.
-     */
-    private FileDescriptor createPingSocket() throws ErrnoException {
-        FileDescriptor s = Os.socket(AF_INET6, SOCK_DGRAM, IPPROTO_ICMPV6);
-        Os.setsockoptTimeval(s, SOL_SOCKET, SO_RCVTIMEO, StructTimeval.fromMillis(100));
-        return s;
-    }
-
-    /**
-     * Sends a ping packet to a random port on the specified address on the specified socket.
-     */
-    private void sendPing(FileDescriptor s,
-            InetAddress address, byte[] packet) throws ErrnoException, IOException {
-        // Pick a random port. Choose a range that gives a reasonable chance of picking a low port.
-        int port = (int) (Math.random() * 2048);
-
-        // Send the packet.
-        int ret = Os.sendto(s, ByteBuffer.wrap(packet), 0, address, port);
-        assertEquals(packet.length, ret);
-    }
-
-    /**
-     * Checks that a socket has received a response appropriate to the specified packet.
-     */
-    private void checkResponse(FileDescriptor s, InetAddress dest,
-            byte[] sent, boolean useRecvfrom) throws ErrnoException, IOException {
-        ByteBuffer responseBuffer = ByteBuffer.allocate(MAX_SIZE);
-        int bytesRead;
-
-        // Receive the response.
-        if (useRecvfrom) {
-            InetSocketAddress from = new InetSocketAddress();
-            bytesRead = Os.recvfrom(s, responseBuffer, 0, from);
-
-            // Check the source address and scope ID.
-            assertTrue(from.getAddress() instanceof Inet6Address);
-            Inet6Address fromAddress = (Inet6Address) from.getAddress();
-            assertEquals(0, fromAddress.getScopeId());
-            assertNull(fromAddress.getScopedInterface());
-            assertEquals(dest.getHostAddress(), fromAddress.getHostAddress());
-        } else {
-            bytesRead = Os.read(s, responseBuffer);
-        }
-
-        // Check the packet length.
-        assertEquals(sent.length, bytesRead);
-
-        // Check the response is an echo reply.
-        byte[] response = new byte[bytesRead];
-        responseBuffer.flip();
-        responseBuffer.get(response, 0, bytesRead);
-        assertEquals((byte) ICMP6_ECHO_REPLY, response[0]);
-
-        // Find out what ICMP ID was used in the packet that was sent.
-        int id = ((InetSocketAddress) Os.getsockname(s)).getPort();
-        sent[4] = (byte) (id / 256);
-        sent[5] = (byte) (id % 256);
-
-        // Ensure the response is the same as the packet, except for the type (which is 0x81)
-        // and the ID and checksum,  which are set by the kernel.
-        response[0] = (byte) 0x80;                 // Type.
-        response[2] = response[3] = (byte) 0x00;   // Checksum.
-        assertArrayBytesEqual(response, sent, bytesRead);
-    }
-
-    /**
-     * Sends NUM_PACKETS random ping packets to ::1 and checks the replies.
-     */
-    public void testLoopbackPing() throws ErrnoException, IOException {
-        // Generate a random ping packet and send it to localhost.
-        InetAddress ipv6Loopback = InetAddress.getByName(null);
-        assertEquals("::1", ipv6Loopback.getHostAddress());
-
-        for (int i = 0; i < NUM_PACKETS; i++) {
-            byte[] packet = pingPacket((int) (Math.random() * (MAX_SIZE - ICMP_HEADER_SIZE)));
-            FileDescriptor s = createPingSocket();
-            // Use both recvfrom and read().
-            sendPing(s, ipv6Loopback, packet);
-            checkResponse(s, ipv6Loopback, packet, true);
-            sendPing(s, ipv6Loopback, packet);
-            checkResponse(s, ipv6Loopback, packet, false);
-            // Check closing the socket doesn't raise an exception.
-            Os.close(s);
-        }
-    }
-}
diff --git a/tests/tests/net/src/android/net/rtp/cts/AudioCodecTest.java b/tests/tests/net/src/android/net/rtp/cts/AudioCodecTest.java
deleted file mode 100644
index 412498c..0000000
--- a/tests/tests/net/src/android/net/rtp/cts/AudioCodecTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2012 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.rtp.cts;
-
-import android.net.rtp.AudioCodec;
-import android.test.AndroidTestCase;
-
-public class AudioCodecTest extends AndroidTestCase {
-
-    private void assertEquals(AudioCodec codec, int type, String rtpmap, String fmtp) {
-        if (type >= 0) {
-            assertEquals(codec.type, type);
-        } else {
-            assertTrue(codec.type >= 96 && codec.type <= 127);
-        }
-        assertEquals(codec.rtpmap.compareToIgnoreCase(rtpmap), 0);
-        assertEquals(codec.fmtp, fmtp);
-    }
-
-    public void testConstants() throws Exception {
-        assertEquals(AudioCodec.PCMU, 0, "PCMU/8000", null);
-        assertEquals(AudioCodec.PCMA, 8, "PCMA/8000", null);
-        assertEquals(AudioCodec.GSM, 3, "GSM/8000", null);
-        assertEquals(AudioCodec.GSM_EFR, -1, "GSM-EFR/8000", null);
-        assertEquals(AudioCodec.AMR, -1, "AMR/8000", null);
-
-        assertFalse(AudioCodec.AMR.type == AudioCodec.GSM_EFR.type);
-    }
-
-    public void testGetCodec() throws Exception {
-        // Bad types.
-        assertNull(AudioCodec.getCodec(128, "PCMU/8000", null));
-        assertNull(AudioCodec.getCodec(-1, "PCMU/8000", null));
-        assertNull(AudioCodec.getCodec(96, null, null));
-
-        // Fixed types.
-        assertEquals(AudioCodec.getCodec(0, null, null), 0, "PCMU/8000", null);
-        assertEquals(AudioCodec.getCodec(8, null, null), 8, "PCMA/8000", null);
-        assertEquals(AudioCodec.getCodec(3, null, null), 3, "GSM/8000", null);
-
-        // Dynamic types.
-        assertEquals(AudioCodec.getCodec(96, "pcmu/8000", null), 96, "PCMU/8000", null);
-        assertEquals(AudioCodec.getCodec(97, "pcma/8000", null), 97, "PCMA/8000", null);
-        assertEquals(AudioCodec.getCodec(98, "gsm/8000", null), 98, "GSM/8000", null);
-        assertEquals(AudioCodec.getCodec(99, "gsm-efr/8000", null), 99, "GSM-EFR/8000", null);
-        assertEquals(AudioCodec.getCodec(100, "amr/8000", null), 100, "AMR/8000", null);
-    }
-
-    public void testGetCodecs() throws Exception {
-        AudioCodec[] codecs = AudioCodec.getCodecs();
-        assertTrue(codecs.length >= 5);
-
-        // The types of the codecs should be different.
-        boolean[] types = new boolean[128];
-        for (AudioCodec codec : codecs) {
-            assertFalse(types[codec.type]);
-            types[codec.type] = true;
-        }
-    }
-}
diff --git a/tests/tests/net/src/android/net/rtp/cts/AudioGroupTest.java b/tests/tests/net/src/android/net/rtp/cts/AudioGroupTest.java
deleted file mode 100644
index fc78e96..0000000
--- a/tests/tests/net/src/android/net/rtp/cts/AudioGroupTest.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Copyright (C) 2012 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.rtp.cts;
-
-import android.content.Context;
-import android.media.AudioManager;
-import android.net.rtp.AudioCodec;
-import android.net.rtp.AudioGroup;
-import android.net.rtp.AudioStream;
-import android.net.rtp.RtpStream;
-import android.os.Build;
-import android.platform.test.annotations.AppModeFull;
-import android.test.AndroidTestCase;
-
-import androidx.core.os.BuildCompat;
-
-import java.net.DatagramPacket;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-
-@AppModeFull(reason = "RtpStream cannot create in instant app mode")
-public class AudioGroupTest extends AndroidTestCase {
-
-    private static final String TAG = AudioGroupTest.class.getSimpleName();
-
-    private AudioManager mAudioManager;
-
-    private AudioStream mStreamA;
-    private DatagramSocket mSocketA;
-    private AudioStream mStreamB;
-    private DatagramSocket mSocketB;
-    private AudioGroup mGroup;
-
-    @Override
-    public void setUp() throws Exception {
-        mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
-        mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
-
-        InetAddress local = InetAddress.getByName("::1");
-
-        mStreamA = new AudioStream(local);
-        mStreamA.setMode(RtpStream.MODE_NORMAL);
-        mStreamA.setCodec(AudioCodec.PCMU);
-        mSocketA = new DatagramSocket();
-        mSocketA.connect(mStreamA.getLocalAddress(), mStreamA.getLocalPort());
-        mStreamA.associate(mSocketA.getLocalAddress(), mSocketA.getLocalPort());
-
-        mStreamB = new AudioStream(local);
-        mStreamB.setMode(RtpStream.MODE_NORMAL);
-        mStreamB.setCodec(AudioCodec.PCMU);
-        mSocketB = new DatagramSocket();
-        mSocketB.connect(mStreamB.getLocalAddress(), mStreamB.getLocalPort());
-        mStreamB.associate(mSocketB.getLocalAddress(), mSocketB.getLocalPort());
-
-        // BuildCompat.isAtLeastR is documented to return false on release SDKs (including R)
-        mGroup = Build.VERSION.SDK_INT > Build.VERSION_CODES.Q || BuildCompat.isAtLeastR()
-                ? new AudioGroup(mContext)
-                : new AudioGroup(); // Constructor with context argument was introduced in R
-    }
-
-    @Override
-    public void tearDown() throws Exception {
-        mGroup.clear();
-        mStreamA.release();
-        mSocketA.close();
-        mStreamB.release();
-        mSocketB.close();
-        mAudioManager.setMode(AudioManager.MODE_NORMAL);
-    }
-
-    private void assertPacket(DatagramSocket socket, int length) throws Exception {
-        DatagramPacket packet = new DatagramPacket(new byte[length + 1], length + 1);
-        socket.setSoTimeout(3000);
-        socket.receive(packet);
-        assertEquals(packet.getLength(), length);
-    }
-
-    private void drain(DatagramSocket socket) throws Exception {
-        DatagramPacket packet = new DatagramPacket(new byte[1], 1);
-        socket.setSoTimeout(1);
-        try {
-            // Drain the socket by retrieving all the packets queued on it.
-            // A SocketTimeoutException will be thrown when it becomes empty.
-            while (true) {
-                socket.receive(packet);
-            }
-        } catch (Exception e) {
-            // ignore.
-        }
-    }
-
-    public void testTraffic() throws Exception {
-        mStreamA.join(mGroup);
-        assertPacket(mSocketA, 12 + 160);
-
-        mStreamB.join(mGroup);
-        assertPacket(mSocketB, 12 + 160);
-
-        mStreamA.join(null);
-        drain(mSocketA);
-
-        drain(mSocketB);
-        assertPacket(mSocketB, 12 + 160);
-
-        mStreamA.join(mGroup);
-        assertPacket(mSocketA, 12 + 160);
-    }
-
-    public void testSetMode() throws Exception {
-        mGroup.setMode(AudioGroup.MODE_NORMAL);
-        assertEquals(mGroup.getMode(), AudioGroup.MODE_NORMAL);
-
-        mGroup.setMode(AudioGroup.MODE_MUTED);
-        assertEquals(mGroup.getMode(), AudioGroup.MODE_MUTED);
-
-        mStreamA.join(mGroup);
-        mStreamB.join(mGroup);
-
-        mGroup.setMode(AudioGroup.MODE_NORMAL);
-        assertEquals(mGroup.getMode(), AudioGroup.MODE_NORMAL);
-
-        mGroup.setMode(AudioGroup.MODE_MUTED);
-        assertEquals(mGroup.getMode(), AudioGroup.MODE_MUTED);
-    }
-
-    public void testAdd() throws Exception {
-        mStreamA.join(mGroup);
-        assertEquals(mGroup.getStreams().length, 1);
-
-        mStreamB.join(mGroup);
-        assertEquals(mGroup.getStreams().length, 2);
-
-        mStreamA.join(mGroup);
-        assertEquals(mGroup.getStreams().length, 2);
-    }
-
-    public void testRemove() throws Exception {
-        mStreamA.join(mGroup);
-        assertEquals(mGroup.getStreams().length, 1);
-
-        mStreamA.join(null);
-        assertEquals(mGroup.getStreams().length, 0);
-
-        mStreamA.join(mGroup);
-        assertEquals(mGroup.getStreams().length, 1);
-    }
-
-    public void testClear() throws Exception {
-        mStreamA.join(mGroup);
-        mStreamB.join(mGroup);
-        mGroup.clear();
-
-        assertEquals(mGroup.getStreams().length, 0);
-        assertFalse(mStreamA.isBusy());
-        assertFalse(mStreamB.isBusy());
-    }
-
-    public void testDoubleClear() throws Exception {
-        mStreamA.join(mGroup);
-        mStreamB.join(mGroup);
-        mGroup.clear();
-        mGroup.clear();
-    }
-}
diff --git a/tests/tests/net/src/android/net/rtp/cts/AudioStreamTest.java b/tests/tests/net/src/android/net/rtp/cts/AudioStreamTest.java
deleted file mode 100644
index f2db6ee..0000000
--- a/tests/tests/net/src/android/net/rtp/cts/AudioStreamTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2012 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.rtp.cts;
-
-import android.net.rtp.AudioCodec;
-import android.net.rtp.AudioStream;
-import android.platform.test.annotations.AppModeFull;
-import android.test.AndroidTestCase;
-
-import java.net.InetAddress;
-
-@AppModeFull(reason = "RtpStream cannot create in instant app mode")
-public class AudioStreamTest extends AndroidTestCase {
-
-    private void testRtpStream(InetAddress address) throws Exception {
-        AudioStream stream = new AudioStream(address);
-        assertEquals(stream.getLocalAddress(), address);
-        assertEquals(stream.getLocalPort() % 2, 0);
-
-        assertNull(stream.getRemoteAddress());
-        assertEquals(stream.getRemotePort(), -1);
-        stream.associate(address, 1000);
-        assertEquals(stream.getRemoteAddress(), address);
-        assertEquals(stream.getRemotePort(), 1000);
-
-        assertFalse(stream.isBusy());
-        stream.release();
-    }
-
-    public void testV4Stream() throws Exception {
-        testRtpStream(InetAddress.getByName("127.0.0.1"));
-    }
-
-    public void testV6Stream() throws Exception {
-        testRtpStream(InetAddress.getByName("::1"));
-    }
-
-    public void testSetDtmfType() throws Exception {
-        AudioStream stream = new AudioStream(InetAddress.getByName("::1"));
-
-        assertEquals(stream.getDtmfType(), -1);
-        try {
-            stream.setDtmfType(0);
-            fail("Expecting IllegalArgumentException");
-        } catch (IllegalArgumentException e) {
-            // ignore
-        }
-        stream.setDtmfType(96);
-        assertEquals(stream.getDtmfType(), 96);
-
-        stream.setCodec(AudioCodec.getCodec(97, "PCMU/8000", null));
-        try {
-            stream.setDtmfType(97);
-            fail("Expecting IllegalArgumentException");
-        } catch (IllegalArgumentException e) {
-            // ignore
-        }
-        stream.release();
-    }
-
-    public void testSetCodec() throws Exception {
-        AudioStream stream = new AudioStream(InetAddress.getByName("::1"));
-
-        assertNull(stream.getCodec());
-        stream.setCodec(AudioCodec.getCodec(97, "PCMU/8000", null));
-        assertNotNull(stream.getCodec());
-
-        stream.setDtmfType(96);
-        try {
-            stream.setCodec(AudioCodec.getCodec(96, "PCMU/8000", null));
-            fail("Expecting IllegalArgumentException");
-        } catch (IllegalArgumentException e) {
-            // ignore
-        }
-        stream.release();
-    }
-
-    public void testDoubleRelease() throws Exception {
-        AudioStream stream = new AudioStream(InetAddress.getByName("::1"));
-        stream.release();
-        stream.release();
-    }
-}
diff --git a/tests/tests/net/util/Android.bp b/tests/tests/net/util/Android.bp
deleted file mode 100644
index 1f94613..0000000
--- a/tests/tests/net/util/Android.bp
+++ /dev/null
@@ -1,25 +0,0 @@
-//
-// Copyright (C) 2019 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.
-//
-
-// Common utilities for cts net tests.
-java_library {
-    name: "cts-net-utils",
-    srcs: ["java/**/*.java", "java/**/*.kt"],
-    static_libs: [
-        "compatibility-device-util-axt",
-        "junit",
-    ],
-}
\ No newline at end of file
diff --git a/tests/tests/net/util/java/android/net/cts/util/CtsNetUtils.java b/tests/tests/net/util/java/android/net/cts/util/CtsNetUtils.java
deleted file mode 100644
index f1bc130..0000000
--- a/tests/tests/net/util/java/android/net/cts/util/CtsNetUtils.java
+++ /dev/null
@@ -1,672 +0,0 @@
-/*
- * Copyright (C) 2019 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.util;
-
-import static android.Manifest.permission.NETWORK_SETTINGS;
-import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
-import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
-import static android.net.NetworkCapabilities.TRANSPORT_TEST;
-import static android.net.wifi.WifiManager.SCAN_RESULTS_AVAILABLE_ACTION;
-
-import static com.android.compatibility.common.util.ShellIdentityUtils.invokeWithShellPermissions;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import android.annotation.NonNull;
-import android.app.AppOpsManager;
-import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.PackageManager;
-import android.net.ConnectivityManager;
-import android.net.ConnectivityManager.NetworkCallback;
-import android.net.LinkProperties;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.NetworkInfo;
-import android.net.NetworkInfo.State;
-import android.net.NetworkRequest;
-import android.net.TestNetworkManager;
-import android.net.wifi.ScanResult;
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiManager;
-import android.os.Binder;
-import android.os.Build;
-import android.os.IBinder;
-import android.os.SystemProperties;
-import android.provider.Settings;
-import android.system.Os;
-import android.system.OsConstants;
-import android.util.Log;
-
-import com.android.compatibility.common.util.SystemUtil;
-
-import junit.framework.AssertionFailedError;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Optional;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-public final class CtsNetUtils {
-    private static final String TAG = CtsNetUtils.class.getSimpleName();
-    private static final int DURATION = 10000;
-    private static final int SOCKET_TIMEOUT_MS = 2000;
-    private static final int PRIVATE_DNS_PROBE_MS = 1_000;
-
-    private static final int PRIVATE_DNS_SETTING_TIMEOUT_MS = 6_000;
-    private static final int CONNECTIVITY_CHANGE_TIMEOUT_SECS = 30;
-    public static final int HTTP_PORT = 80;
-    public static final String TEST_HOST = "connectivitycheck.gstatic.com";
-    public static final String HTTP_REQUEST =
-            "GET /generate_204 HTTP/1.0\r\n" +
-                    "Host: " + TEST_HOST + "\r\n" +
-                    "Connection: keep-alive\r\n\r\n";
-    // Action sent to ConnectivityActionReceiver when a network callback is sent via PendingIntent.
-    public static final String NETWORK_CALLBACK_ACTION =
-            "ConnectivityManagerTest.NetworkCallbackAction";
-
-    private final IBinder mBinder = new Binder();
-    private final Context mContext;
-    private final ConnectivityManager mCm;
-    private final ContentResolver mCR;
-    private final WifiManager mWifiManager;
-    private TestNetworkCallback mCellNetworkCallback;
-    private String mOldPrivateDnsMode;
-    private String mOldPrivateDnsSpecifier;
-
-    public CtsNetUtils(Context context) {
-        mContext = context;
-        mCm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
-        mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
-        mCR = context.getContentResolver();
-    }
-
-    /** Checks if FEATURE_IPSEC_TUNNELS is enabled on the device */
-    public boolean hasIpsecTunnelsFeature() {
-        return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_IPSEC_TUNNELS)
-                || SystemProperties.getInt("ro.product.first_api_level", 0)
-                        >= Build.VERSION_CODES.Q;
-    }
-
-    /**
-     * Sets the given appop using shell commands
-     *
-     * <p>Expects caller to hold the shell permission identity.
-     */
-    public void setAppopPrivileged(int appop, boolean allow) {
-        final String opName = AppOpsManager.opToName(appop);
-        for (final String pkg : new String[] {"com.android.shell", mContext.getPackageName()}) {
-            final String cmd =
-                    String.format(
-                            "appops set %s %s %s",
-                            pkg, // Package name
-                            opName, // Appop
-                            (allow ? "allow" : "deny")); // Action
-            SystemUtil.runShellCommand(cmd);
-        }
-    }
-
-    /** Sets up a test network using the provided interface name */
-    public TestNetworkCallback setupAndGetTestNetwork(String ifname) throws Exception {
-        // Build a network request
-        final NetworkRequest nr =
-                new NetworkRequest.Builder()
-                        .clearCapabilities()
-                        .addTransportType(TRANSPORT_TEST)
-                        .setNetworkSpecifier(ifname)
-                        .build();
-
-        final TestNetworkCallback cb = new TestNetworkCallback();
-        mCm.requestNetwork(nr, cb);
-
-        // Setup the test network after network request is filed to prevent Network from being
-        // reaped due to no requests matching it.
-        mContext.getSystemService(TestNetworkManager.class).setupTestNetwork(ifname, mBinder);
-
-        return cb;
-    }
-
-    // Toggle WiFi twice, leaving it in the state it started in
-    public void toggleWifi() {
-        if (mWifiManager.isWifiEnabled()) {
-            Network wifiNetwork = getWifiNetwork();
-            disconnectFromWifi(wifiNetwork);
-            connectToWifi();
-        } else {
-            connectToWifi();
-            Network wifiNetwork = getWifiNetwork();
-            disconnectFromWifi(wifiNetwork);
-        }
-    }
-
-    /**
-     * Enable WiFi and wait for it to become connected to a network.
-     *
-     * This method expects to receive a legacy broadcast on connect, which may not be sent if the
-     * network does not become default or if it is not the first network.
-     */
-    public Network connectToWifi() {
-        return connectToWifi(true /* expectLegacyBroadcast */);
-    }
-
-    /**
-     * Enable WiFi and wait for it to become connected to a network.
-     *
-     * A network is considered connected when a {@link NetworkRequest} with TRANSPORT_WIFI
-     * receives a {@link NetworkCallback#onAvailable(Network)} callback.
-     */
-    public Network ensureWifiConnected() {
-        return connectToWifi(false /* expectLegacyBroadcast */);
-    }
-
-    /**
-     * Enable WiFi and wait for it to become connected to a network.
-     *
-     * @param expectLegacyBroadcast Whether to check for a legacy CONNECTIVITY_ACTION connected
-     *                              broadcast. The broadcast is typically not sent if the network
-     *                              does not become the default network, and is not the first
-     *                              network to appear.
-     * @return The network that was newly connected.
-     */
-    private Network connectToWifi(boolean expectLegacyBroadcast) {
-        final TestNetworkCallback callback = new TestNetworkCallback();
-        mCm.registerNetworkCallback(makeWifiNetworkRequest(), callback);
-        Network wifiNetwork = null;
-
-        ConnectivityActionReceiver receiver = new ConnectivityActionReceiver(
-                mCm, ConnectivityManager.TYPE_WIFI, NetworkInfo.State.CONNECTED);
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
-        mContext.registerReceiver(receiver, filter);
-
-        boolean connected = false;
-        final String err = "Wifi must be configured to connect to an access point for this test.";
-        try {
-            clearWifiBlacklist();
-            SystemUtil.runShellCommand("svc wifi enable");
-            final WifiConfiguration config = maybeAddVirtualWifiConfiguration();
-            if (config == null) {
-                // TODO: this may not clear the BSSID blacklist, as opposed to
-                // mWifiManager.connect(config)
-                SystemUtil.runWithShellPermissionIdentity(() -> mWifiManager.reconnect(),
-                        NETWORK_SETTINGS);
-            } else {
-                // When running CTS, devices are expected to have wifi networks pre-configured.
-                // This condition is only hit on virtual devices.
-                SystemUtil.runWithShellPermissionIdentity(
-                        () -> mWifiManager.connect(config, null /* listener */), NETWORK_SETTINGS);
-            }
-            // Ensure we get an onAvailable callback and possibly a CONNECTIVITY_ACTION.
-            wifiNetwork = callback.waitForAvailable();
-            assertNotNull(err, wifiNetwork);
-            connected = !expectLegacyBroadcast || receiver.waitForState();
-        } catch (InterruptedException ex) {
-            fail("connectToWifi was interrupted");
-        } finally {
-            mCm.unregisterNetworkCallback(callback);
-            mContext.unregisterReceiver(receiver);
-        }
-
-        assertTrue(err, connected);
-        return wifiNetwork;
-    }
-
-    private WifiConfiguration maybeAddVirtualWifiConfiguration() {
-        final List<WifiConfiguration> configs = invokeWithShellPermissions(
-                mWifiManager::getConfiguredNetworks);
-        // If no network is configured, add a config for virtual access points if applicable
-        if (configs.size() == 0) {
-            final List<ScanResult> scanResults = getWifiScanResults();
-            final WifiConfiguration virtualConfig = maybeConfigureVirtualNetwork(scanResults);
-            assertNotNull("The device has no configured wifi network", virtualConfig);
-
-            return virtualConfig;
-        }
-        // No need to add a configuration: there is already one
-        return null;
-    }
-
-    private List<ScanResult> getWifiScanResults() {
-        final CompletableFuture<List<ScanResult>> scanResultsFuture = new CompletableFuture<>();
-        SystemUtil.runWithShellPermissionIdentity(() -> {
-            final BroadcastReceiver receiver = new BroadcastReceiver() {
-                @Override
-                public void onReceive(Context context, Intent intent) {
-                    scanResultsFuture.complete(mWifiManager.getScanResults());
-                }
-            };
-            mContext.registerReceiver(receiver, new IntentFilter(SCAN_RESULTS_AVAILABLE_ACTION));
-            mWifiManager.startScan();
-        });
-
-        try {
-            return scanResultsFuture.get(CONNECTIVITY_CHANGE_TIMEOUT_SECS, TimeUnit.SECONDS);
-        } catch (ExecutionException | InterruptedException | TimeoutException e) {
-            throw new AssertionFailedError("Wifi scan results not received within timeout");
-        }
-    }
-
-    /**
-     * If a virtual wifi network is detected, add a configuration for that network.
-     * TODO(b/158150376): have the test infrastructure add virtual wifi networks when appropriate.
-     */
-    private WifiConfiguration maybeConfigureVirtualNetwork(List<ScanResult> scanResults) {
-        // Virtual wifi networks used on the emulator and cloud testing infrastructure
-        final List<String> virtualSsids = Arrays.asList("VirtWifi", "AndroidWifi");
-        Log.d(TAG, "Wifi scan results: " + scanResults);
-        final ScanResult virtualScanResult = scanResults.stream().filter(
-                s -> virtualSsids.contains(s.SSID)).findFirst().orElse(null);
-
-        // Only add the virtual configuration if the virtual AP is detected in scans
-        if (virtualScanResult == null) return null;
-
-        final WifiConfiguration virtualConfig = new WifiConfiguration();
-        // ASCII SSIDs need to be surrounded by double quotes
-        virtualConfig.SSID = "\"" + virtualScanResult.SSID + "\"";
-        virtualConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-
-        SystemUtil.runWithShellPermissionIdentity(() -> {
-            final int networkId = mWifiManager.addNetwork(virtualConfig);
-            assertTrue(networkId >= 0);
-            assertTrue(mWifiManager.enableNetwork(networkId, false /* attemptConnect */));
-        });
-        return virtualConfig;
-    }
-
-    /**
-     * Re-enable wifi networks that were blacklisted, typically because no internet connection was
-     * detected the last time they were connected. This is necessary to make sure wifi can reconnect
-     * to them.
-     */
-    private void clearWifiBlacklist() {
-        SystemUtil.runWithShellPermissionIdentity(() -> {
-            for (WifiConfiguration cfg : mWifiManager.getConfiguredNetworks()) {
-                assertTrue(mWifiManager.enableNetwork(cfg.networkId, false /* attemptConnect */));
-            }
-        });
-    }
-
-    /**
-     * Disable WiFi and wait for it to become disconnected from the network.
-     *
-     * This method expects to receive a legacy broadcast on disconnect, which may not be sent if the
-     * network was not default, or was not the first network.
-     *
-     * @param wifiNetworkToCheck If non-null, a network that should be disconnected. This network
-     *                           is expected to be able to establish a TCP connection to a remote
-     *                           server before disconnecting, and to have that connection closed in
-     *                           the process.
-     */
-    public void disconnectFromWifi(Network wifiNetworkToCheck) {
-        disconnectFromWifi(wifiNetworkToCheck, true /* expectLegacyBroadcast */);
-    }
-
-    /**
-     * Disable WiFi and wait for it to become disconnected from the network.
-     *
-     * @param wifiNetworkToCheck If non-null, a network that should be disconnected. This network
-     *                           is expected to be able to establish a TCP connection to a remote
-     *                           server before disconnecting, and to have that connection closed in
-     *                           the process.
-     */
-    public void ensureWifiDisconnected(Network wifiNetworkToCheck) {
-        disconnectFromWifi(wifiNetworkToCheck, false /* expectLegacyBroadcast */);
-    }
-
-    /**
-     * Disable WiFi and wait for it to become disconnected from the network.
-     *
-     * @param wifiNetworkToCheck If non-null, a network that should be disconnected. This network
-     *                           is expected to be able to establish a TCP connection to a remote
-     *                           server before disconnecting, and to have that connection closed in
-     *                           the process.
-     * @param expectLegacyBroadcast Whether to check for a legacy CONNECTIVITY_ACTION disconnected
-     *                              broadcast. The broadcast is typically not sent if the network
-     *                              was not the default network and not the first network to appear.
-     *                              The check will always be skipped if the device was not connected
-     *                              to wifi in the first place.
-     */
-    private void disconnectFromWifi(Network wifiNetworkToCheck, boolean expectLegacyBroadcast) {
-        final TestNetworkCallback callback = new TestNetworkCallback();
-        mCm.registerNetworkCallback(makeWifiNetworkRequest(), callback);
-
-        ConnectivityActionReceiver receiver = new ConnectivityActionReceiver(
-                mCm, ConnectivityManager.TYPE_WIFI, NetworkInfo.State.DISCONNECTED);
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
-        mContext.registerReceiver(receiver, filter);
-
-        final WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
-        final boolean wasWifiConnected = wifiInfo != null && wifiInfo.getNetworkId() != -1;
-        // Assert that we can establish a TCP connection on wifi.
-        Socket wifiBoundSocket = null;
-        if (wifiNetworkToCheck != null) {
-            assertTrue("Cannot check network " + wifiNetworkToCheck + ": wifi is not connected",
-                    wasWifiConnected);
-            final NetworkCapabilities nc = mCm.getNetworkCapabilities(wifiNetworkToCheck);
-            assertNotNull("Network " + wifiNetworkToCheck + " is not connected", nc);
-            try {
-                wifiBoundSocket = getBoundSocket(wifiNetworkToCheck, TEST_HOST, HTTP_PORT);
-                testHttpRequest(wifiBoundSocket);
-            } catch (IOException e) {
-                fail("HTTP request before wifi disconnected failed with: " + e);
-            }
-        }
-
-        try {
-            SystemUtil.runShellCommand("svc wifi disable");
-            if (wasWifiConnected) {
-                // Ensure we get both an onLost callback and a CONNECTIVITY_ACTION.
-                assertNotNull("Did not receive onLost callback after disabling wifi",
-                        callback.waitForLost());
-            }
-            if (wasWifiConnected && expectLegacyBroadcast) {
-                assertTrue("Wifi failed to reach DISCONNECTED state.", receiver.waitForState());
-            }
-        } catch (InterruptedException ex) {
-            fail("disconnectFromWifi was interrupted");
-        } finally {
-            mCm.unregisterNetworkCallback(callback);
-            mContext.unregisterReceiver(receiver);
-        }
-
-        // Check that the socket is closed when wifi disconnects.
-        if (wifiBoundSocket != null) {
-            try {
-                testHttpRequest(wifiBoundSocket);
-                fail("HTTP request should not succeed after wifi disconnects");
-            } catch (IOException expected) {
-                assertEquals(Os.strerror(OsConstants.ECONNABORTED), expected.getMessage());
-            }
-        }
-    }
-
-    public Network getWifiNetwork() {
-        TestNetworkCallback callback = new TestNetworkCallback();
-        mCm.registerNetworkCallback(makeWifiNetworkRequest(), callback);
-        Network network = null;
-        try {
-            network = callback.waitForAvailable();
-        } catch (InterruptedException e) {
-            fail("NetworkCallback wait was interrupted.");
-        } finally {
-            mCm.unregisterNetworkCallback(callback);
-        }
-        assertNotNull("Cannot find Network for wifi. Is wifi connected?", network);
-        return network;
-    }
-
-    public Network connectToCell() throws InterruptedException {
-        if (cellConnectAttempted()) {
-            throw new IllegalStateException("Already connected");
-        }
-        NetworkRequest cellRequest = new NetworkRequest.Builder()
-                .addTransportType(TRANSPORT_CELLULAR)
-                .addCapability(NET_CAPABILITY_INTERNET)
-                .build();
-        mCellNetworkCallback = new TestNetworkCallback();
-        mCm.requestNetwork(cellRequest, mCellNetworkCallback);
-        final Network cellNetwork = mCellNetworkCallback.waitForAvailable();
-        assertNotNull("Cell network not available. " +
-                "Please ensure the device has working mobile data.", cellNetwork);
-        return cellNetwork;
-    }
-
-    public void disconnectFromCell() {
-        if (!cellConnectAttempted()) {
-            throw new IllegalStateException("Cell connection not attempted");
-        }
-        mCm.unregisterNetworkCallback(mCellNetworkCallback);
-        mCellNetworkCallback = null;
-    }
-
-    public boolean cellConnectAttempted() {
-        return mCellNetworkCallback != null;
-    }
-
-    private NetworkRequest makeWifiNetworkRequest() {
-        return new NetworkRequest.Builder()
-                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
-                .build();
-    }
-
-    private void testHttpRequest(Socket s) throws IOException {
-        OutputStream out = s.getOutputStream();
-        InputStream in = s.getInputStream();
-
-        final byte[] requestBytes = HTTP_REQUEST.getBytes("UTF-8");
-        byte[] responseBytes = new byte[4096];
-        out.write(requestBytes);
-        in.read(responseBytes);
-        assertTrue(new String(responseBytes, "UTF-8").startsWith("HTTP/1.0 204 No Content\r\n"));
-    }
-
-    private Socket getBoundSocket(Network network, String host, int port) throws IOException {
-        InetSocketAddress addr = new InetSocketAddress(host, port);
-        Socket s = network.getSocketFactory().createSocket();
-        try {
-            s.setSoTimeout(SOCKET_TIMEOUT_MS);
-            s.connect(addr, SOCKET_TIMEOUT_MS);
-        } catch (IOException e) {
-            s.close();
-            throw e;
-        }
-        return s;
-    }
-
-    public void storePrivateDnsSetting() {
-        // Store private DNS setting
-        mOldPrivateDnsMode = Settings.Global.getString(mCR, Settings.Global.PRIVATE_DNS_MODE);
-        mOldPrivateDnsSpecifier = Settings.Global.getString(mCR,
-                Settings.Global.PRIVATE_DNS_SPECIFIER);
-        // It's possible that there is no private DNS default value in Settings.
-        // Give it a proper default mode which is opportunistic mode.
-        if (mOldPrivateDnsMode == null) {
-            mOldPrivateDnsSpecifier = "";
-            mOldPrivateDnsMode = PRIVATE_DNS_MODE_OPPORTUNISTIC;
-            Settings.Global.putString(mCR,
-                    Settings.Global.PRIVATE_DNS_SPECIFIER, mOldPrivateDnsSpecifier);
-            Settings.Global.putString(mCR, Settings.Global.PRIVATE_DNS_MODE, mOldPrivateDnsMode);
-        }
-    }
-
-    public void restorePrivateDnsSetting() throws InterruptedException {
-        if (mOldPrivateDnsMode == null || mOldPrivateDnsSpecifier == null) {
-            return;
-        }
-        // restore private DNS setting
-        if ("hostname".equals(mOldPrivateDnsMode)) {
-            setPrivateDnsStrictMode(mOldPrivateDnsSpecifier);
-            awaitPrivateDnsSetting("restorePrivateDnsSetting timeout",
-                    mCm.getActiveNetwork(),
-                    mOldPrivateDnsSpecifier, true);
-        } else {
-            Settings.Global.putString(mCR, Settings.Global.PRIVATE_DNS_MODE, mOldPrivateDnsMode);
-        }
-    }
-
-    public void setPrivateDnsStrictMode(String server) {
-        // To reduce flake rate, set PRIVATE_DNS_SPECIFIER before PRIVATE_DNS_MODE. This ensures
-        // that if the previous private DNS mode was not "hostname", the system only sees one
-        // EVENT_PRIVATE_DNS_SETTINGS_CHANGED event instead of two.
-        Settings.Global.putString(mCR, Settings.Global.PRIVATE_DNS_SPECIFIER, server);
-        final String mode = Settings.Global.getString(mCR, Settings.Global.PRIVATE_DNS_MODE);
-        // If current private DNS mode is "hostname", we only need to set PRIVATE_DNS_SPECIFIER.
-        if (!"hostname".equals(mode)) {
-            Settings.Global.putString(mCR, Settings.Global.PRIVATE_DNS_MODE, "hostname");
-        }
-    }
-
-    public void awaitPrivateDnsSetting(@NonNull String msg, @NonNull Network network,
-            @NonNull String server, boolean requiresValidatedServers) throws InterruptedException {
-        CountDownLatch latch = new CountDownLatch(1);
-        NetworkRequest request = new NetworkRequest.Builder().clearCapabilities().build();
-        NetworkCallback callback = new NetworkCallback() {
-            @Override
-            public void onLinkPropertiesChanged(Network n, LinkProperties lp) {
-                if (requiresValidatedServers && lp.getValidatedPrivateDnsServers().isEmpty()) {
-                    return;
-                }
-                if (network.equals(n) && server.equals(lp.getPrivateDnsServerName())) {
-                    latch.countDown();
-                }
-            }
-        };
-        mCm.registerNetworkCallback(request, callback);
-        assertTrue(msg, latch.await(PRIVATE_DNS_SETTING_TIMEOUT_MS, TimeUnit.MILLISECONDS));
-        mCm.unregisterNetworkCallback(callback);
-        // Wait some time for NetworkMonitor's private DNS probe to complete. If we do not do
-        // this, then the test could complete before the NetworkMonitor private DNS probe
-        // completes. This would result in tearDown disabling private DNS, and the NetworkMonitor
-        // private DNS probe getting stuck because there are no longer any private DNS servers to
-        // query. This then results in the next test not being able to change the private DNS
-        // setting within the timeout, because the NetworkMonitor thread is blocked in the
-        // private DNS probe. There is no way to know when the probe has completed: because the
-        // network is likely already validated, there is no callback that we can listen to, so
-        // just sleep.
-        if (requiresValidatedServers) {
-            Thread.sleep(PRIVATE_DNS_PROBE_MS);
-        }
-    }
-
-    /**
-     * Receiver that captures the last connectivity change's network type and state. Recognizes
-     * both {@code CONNECTIVITY_ACTION} and {@code NETWORK_CALLBACK_ACTION} intents.
-     */
-    public static class ConnectivityActionReceiver extends BroadcastReceiver {
-
-        private final CountDownLatch mReceiveLatch = new CountDownLatch(1);
-
-        private final int mNetworkType;
-        private final NetworkInfo.State mNetState;
-        private final ConnectivityManager mCm;
-
-        public ConnectivityActionReceiver(ConnectivityManager cm, int networkType,
-                NetworkInfo.State netState) {
-            this.mCm = cm;
-            mNetworkType = networkType;
-            mNetState = netState;
-        }
-
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            NetworkInfo networkInfo = null;
-
-            // When receiving ConnectivityManager.CONNECTIVITY_ACTION, the NetworkInfo parcelable
-            // is stored in EXTRA_NETWORK_INFO. With a NETWORK_CALLBACK_ACTION, the Network is
-            // sent in EXTRA_NETWORK and we need to ask the ConnectivityManager for the NetworkInfo.
-            if (ConnectivityManager.CONNECTIVITY_ACTION.equals(action)) {
-                networkInfo = intent.getExtras()
-                        .getParcelable(ConnectivityManager.EXTRA_NETWORK_INFO);
-                assertNotNull("ConnectivityActionReceiver expected EXTRA_NETWORK_INFO",
-                        networkInfo);
-            } else if (NETWORK_CALLBACK_ACTION.equals(action)) {
-                Network network = intent.getExtras()
-                        .getParcelable(ConnectivityManager.EXTRA_NETWORK);
-                assertNotNull("ConnectivityActionReceiver expected EXTRA_NETWORK", network);
-                networkInfo = this.mCm.getNetworkInfo(network);
-                if (networkInfo == null) {
-                    // When disconnecting, it seems like we get an intent sent with an invalid
-                    // Network; that is, by the time we call ConnectivityManager.getNetworkInfo(),
-                    // it is invalid. Ignore these.
-                    Log.i(TAG, "ConnectivityActionReceiver NETWORK_CALLBACK_ACTION ignoring "
-                            + "invalid network");
-                    return;
-                }
-            } else {
-                fail("ConnectivityActionReceiver received unxpected intent action: " + action);
-            }
-
-            assertNotNull("ConnectivityActionReceiver didn't find NetworkInfo", networkInfo);
-            int networkType = networkInfo.getType();
-            State networkState = networkInfo.getState();
-            Log.i(TAG, "Network type: " + networkType + " state: " + networkState);
-            if (networkType == mNetworkType && networkInfo.getState() == mNetState) {
-                mReceiveLatch.countDown();
-            }
-        }
-
-        public boolean waitForState() throws InterruptedException {
-            return mReceiveLatch.await(CONNECTIVITY_CHANGE_TIMEOUT_SECS, TimeUnit.SECONDS);
-        }
-    }
-
-    /**
-     * Callback used in testRegisterNetworkCallback that allows caller to block on
-     * {@code onAvailable}.
-     */
-    public static class TestNetworkCallback extends ConnectivityManager.NetworkCallback {
-        private final CountDownLatch mAvailableLatch = new CountDownLatch(1);
-        private final CountDownLatch mLostLatch = new CountDownLatch(1);
-        private final CountDownLatch mUnavailableLatch = new CountDownLatch(1);
-
-        public Network currentNetwork;
-        public Network lastLostNetwork;
-
-        public Network waitForAvailable() throws InterruptedException {
-            return mAvailableLatch.await(CONNECTIVITY_CHANGE_TIMEOUT_SECS, TimeUnit.SECONDS)
-                    ? currentNetwork : null;
-        }
-
-        public Network waitForLost() throws InterruptedException {
-            return mLostLatch.await(CONNECTIVITY_CHANGE_TIMEOUT_SECS, TimeUnit.SECONDS)
-                    ? lastLostNetwork : null;
-        }
-
-        public boolean waitForUnavailable() throws InterruptedException {
-            return mUnavailableLatch.await(2, TimeUnit.SECONDS);
-        }
-
-
-        @Override
-        public void onAvailable(Network network) {
-            currentNetwork = network;
-            mAvailableLatch.countDown();
-        }
-
-        @Override
-        public void onLost(Network network) {
-            lastLostNetwork = network;
-            if (network.equals(currentNetwork)) {
-                currentNetwork = null;
-            }
-            mLostLatch.countDown();
-        }
-
-        @Override
-        public void onUnavailable() {
-            mUnavailableLatch.countDown();
-        }
-    }
-}
diff --git a/tests/tests/netpermission/internetpermission/Android.bp b/tests/tests/netpermission/internetpermission/Android.bp
index 98a167e..196c2bb 100644
--- a/tests/tests/netpermission/internetpermission/Android.bp
+++ b/tests/tests/netpermission/internetpermission/Android.bp
@@ -23,7 +23,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/tests/tests/netpermission/updatestatspermission/Android.bp b/tests/tests/netpermission/updatestatspermission/Android.bp
index b1c3f0f..bc4f4de 100644
--- a/tests/tests/netpermission/updatestatspermission/Android.bp
+++ b/tests/tests/netpermission/updatestatspermission/Android.bp
@@ -23,7 +23,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/tests/tests/netsecpolicy/usescleartexttraffic-false/Android.bp b/tests/tests/netsecpolicy/usescleartexttraffic-false/Android.bp
index c8f3ad0..b6aa133 100644
--- a/tests/tests/netsecpolicy/usescleartexttraffic-false/Android.bp
+++ b/tests/tests/netsecpolicy/usescleartexttraffic-false/Android.bp
@@ -21,7 +21,7 @@
     ],
     libs: [
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     srcs: [
         "src/**/*.java",
@@ -31,7 +31,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/tests/tests/netsecpolicy/usescleartexttraffic-true/Android.bp b/tests/tests/netsecpolicy/usescleartexttraffic-true/Android.bp
index 8583500..8386fec 100644
--- a/tests/tests/netsecpolicy/usescleartexttraffic-true/Android.bp
+++ b/tests/tests/netsecpolicy/usescleartexttraffic-true/Android.bp
@@ -21,7 +21,7 @@
     ],
     libs: [
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     srcs: [
         "src/**/*.java",
@@ -31,7 +31,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/tests/tests/netsecpolicy/usescleartexttraffic-unspecified/Android.bp b/tests/tests/netsecpolicy/usescleartexttraffic-unspecified/Android.bp
index f1b2c32..da1d9b9 100644
--- a/tests/tests/netsecpolicy/usescleartexttraffic-unspecified/Android.bp
+++ b/tests/tests/netsecpolicy/usescleartexttraffic-unspecified/Android.bp
@@ -21,7 +21,7 @@
     ],
     libs: [
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     srcs: [
         "src/**/*.java",
@@ -31,7 +31,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "current",
diff --git a/tests/tests/networksecurityconfig/Android.bp b/tests/tests/networksecurityconfig/Android.bp
index df15d2b..deaa4b0 100644
--- a/tests/tests/networksecurityconfig/Android.bp
+++ b/tests/tests/networksecurityconfig/Android.bp
@@ -20,6 +20,6 @@
     libs: [
         "compatibility-device-util-axt",
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
 }
diff --git a/tests/tests/networksecurityconfig/networksecurityconfig-attributes/Android.bp b/tests/tests/networksecurityconfig/networksecurityconfig-attributes/Android.bp
index b63cca2..356a02f 100644
--- a/tests/tests/networksecurityconfig/networksecurityconfig-attributes/Android.bp
+++ b/tests/tests/networksecurityconfig/networksecurityconfig-attributes/Android.bp
@@ -24,14 +24,13 @@
     ],
     libs: [
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     resource_dirs: ["res/"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/networksecurityconfig/networksecurityconfig-basic-domain/Android.bp b/tests/tests/networksecurityconfig/networksecurityconfig-basic-domain/Android.bp
index ce76f0b..83c2d44 100644
--- a/tests/tests/networksecurityconfig/networksecurityconfig-basic-domain/Android.bp
+++ b/tests/tests/networksecurityconfig/networksecurityconfig-basic-domain/Android.bp
@@ -24,14 +24,13 @@
     ],
     libs: [
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     resource_dirs: ["res/"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/networksecurityconfig/networksecurityconfig-cleartext-pre-P/Android.bp b/tests/tests/networksecurityconfig/networksecurityconfig-cleartext-pre-P/Android.bp
index 061d4c2..a684e69 100644
--- a/tests/tests/networksecurityconfig/networksecurityconfig-cleartext-pre-P/Android.bp
+++ b/tests/tests/networksecurityconfig/networksecurityconfig-cleartext-pre-P/Android.bp
@@ -24,14 +24,13 @@
     ],
     libs: [
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     resource_dirs: ["res/"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/networksecurityconfig/networksecurityconfig-cleartext/Android.bp b/tests/tests/networksecurityconfig/networksecurityconfig-cleartext/Android.bp
index efd4a0b..c72adb0 100644
--- a/tests/tests/networksecurityconfig/networksecurityconfig-cleartext/Android.bp
+++ b/tests/tests/networksecurityconfig/networksecurityconfig-cleartext/Android.bp
@@ -24,14 +24,13 @@
     ],
     libs: [
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     resource_dirs: ["res/"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/networksecurityconfig/networksecurityconfig-debug-basic-disabled/Android.bp b/tests/tests/networksecurityconfig/networksecurityconfig-debug-basic-disabled/Android.bp
index 70f17d6..7eb9401 100644
--- a/tests/tests/networksecurityconfig/networksecurityconfig-debug-basic-disabled/Android.bp
+++ b/tests/tests/networksecurityconfig/networksecurityconfig-debug-basic-disabled/Android.bp
@@ -24,14 +24,13 @@
     ],
     libs: [
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     resource_dirs: ["res/"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/networksecurityconfig/networksecurityconfig-debug-basic-enabled/Android.bp b/tests/tests/networksecurityconfig/networksecurityconfig-debug-basic-enabled/Android.bp
index ebc1118..4ae4b5b 100644
--- a/tests/tests/networksecurityconfig/networksecurityconfig-debug-basic-enabled/Android.bp
+++ b/tests/tests/networksecurityconfig/networksecurityconfig-debug-basic-enabled/Android.bp
@@ -24,14 +24,13 @@
     ],
     libs: [
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     resource_dirs: ["res/"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/networksecurityconfig/networksecurityconfig-downloadmanager/Android.bp b/tests/tests/networksecurityconfig/networksecurityconfig-downloadmanager/Android.bp
index d4495e2..a0841a3 100644
--- a/tests/tests/networksecurityconfig/networksecurityconfig-downloadmanager/Android.bp
+++ b/tests/tests/networksecurityconfig/networksecurityconfig-downloadmanager/Android.bp
@@ -24,14 +24,13 @@
     ],
     libs: [
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     resource_dirs: ["res/"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/networksecurityconfig/networksecurityconfig-invalid-pin/Android.bp b/tests/tests/networksecurityconfig/networksecurityconfig-invalid-pin/Android.bp
index 01057d7..d5599c0 100644
--- a/tests/tests/networksecurityconfig/networksecurityconfig-invalid-pin/Android.bp
+++ b/tests/tests/networksecurityconfig/networksecurityconfig-invalid-pin/Android.bp
@@ -24,14 +24,13 @@
     ],
     libs: [
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     resource_dirs: ["res/"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/networksecurityconfig/networksecurityconfig-nested-domains/Android.bp b/tests/tests/networksecurityconfig/networksecurityconfig-nested-domains/Android.bp
index bbe0b8a..5ff160c 100644
--- a/tests/tests/networksecurityconfig/networksecurityconfig-nested-domains/Android.bp
+++ b/tests/tests/networksecurityconfig/networksecurityconfig-nested-domains/Android.bp
@@ -24,14 +24,13 @@
     ],
     libs: [
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     resource_dirs: ["res/"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/networksecurityconfig/networksecurityconfig-resourcesrc/Android.bp b/tests/tests/networksecurityconfig/networksecurityconfig-resourcesrc/Android.bp
index 59cd30d..1e553ab 100644
--- a/tests/tests/networksecurityconfig/networksecurityconfig-resourcesrc/Android.bp
+++ b/tests/tests/networksecurityconfig/networksecurityconfig-resourcesrc/Android.bp
@@ -24,15 +24,14 @@
     ],
     libs: [
         "org.apache.http.legacy",
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     resource_dirs: ["res/"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/neuralnetworks/Android.mk b/tests/tests/neuralnetworks/Android.mk
index 9928e08..9e285b5 100644
--- a/tests/tests/neuralnetworks/Android.mk
+++ b/tests/tests/neuralnetworks/Android.mk
@@ -32,7 +32,7 @@
 LOCAL_CTS_TEST_PACKAGE := android.neuralnetworks
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 mts general-tests
+LOCAL_COMPATIBILITY_SUITE := cts mts general-tests
 
 LOCAL_SDK_VERSION := current
 LOCAL_NDK_STL_VARIANT := c++_static
diff --git a/tests/tests/neuralnetworks/benchmark/Android.mk b/tests/tests/neuralnetworks/benchmark/Android.mk
index 9df9c98..dd69c5e 100644
--- a/tests/tests/neuralnetworks/benchmark/Android.mk
+++ b/tests/tests/neuralnetworks/benchmark/Android.mk
@@ -27,7 +27,7 @@
 LOCAL_MULTILIB := both
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 mts
+LOCAL_COMPATIBILITY_SUITE := cts general-tests mts
 
 LOCAL_STATIC_JAVA_LIBRARIES := androidx.test.rules \
     compatibility-device-util-axt ctstestrunner-axt junit NeuralNetworksApiBenchmark_Lib
diff --git a/tests/tests/neuralnetworks/benchmark/AndroidTest.xml b/tests/tests/neuralnetworks/benchmark/AndroidTest.xml
index e122f67..3ca1791 100644
--- a/tests/tests/neuralnetworks/benchmark/AndroidTest.xml
+++ b/tests/tests/neuralnetworks/benchmark/AndroidTest.xml
@@ -26,6 +26,8 @@
 
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="com.android.nn.benchmark.cts" />
+        <!-- test-timeout unit is ms, value = 15 min -->
+        <option name="test-timeout" value="900000" />
     </test>
 
     <object type="module_controller" class="com.android.tradefed.testtype.suite.module.MainlineTestModuleController">
diff --git a/tests/tests/neuralnetworks/tflite_delegate/Android.mk b/tests/tests/neuralnetworks/tflite_delegate/Android.mk
index 091a070..11f23c4 100644
--- a/tests/tests/neuralnetworks/tflite_delegate/Android.mk
+++ b/tests/tests/neuralnetworks/tflite_delegate/Android.mk
@@ -66,7 +66,7 @@
 LOCAL_CTS_TEST_PACKAGE := android.neuralnetworks
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 mts general-tests
+LOCAL_COMPATIBILITY_SUITE := cts mts general-tests
 
 LOCAL_SDK_VERSION := current
 LOCAL_NDK_STL_VARIANT := c++_static
diff --git a/tests/tests/notificationlegacy/notificationlegacy20/Android.bp b/tests/tests/notificationlegacy/notificationlegacy20/Android.bp
index 7cd6b53..9ca0411 100644
--- a/tests/tests/notificationlegacy/notificationlegacy20/Android.bp
+++ b/tests/tests/notificationlegacy/notificationlegacy20/Android.bp
@@ -23,14 +23,13 @@
         "junit",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     min_sdk_version: "20",
diff --git a/tests/tests/notificationlegacy/notificationlegacy27/Android.bp b/tests/tests/notificationlegacy/notificationlegacy27/Android.bp
index ca63011..4aca949 100644
--- a/tests/tests/notificationlegacy/notificationlegacy27/Android.bp
+++ b/tests/tests/notificationlegacy/notificationlegacy27/Android.bp
@@ -23,14 +23,13 @@
         "junit",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     min_sdk_version: "27",
diff --git a/tests/tests/notificationlegacy/notificationlegacy28/Android.bp b/tests/tests/notificationlegacy/notificationlegacy28/Android.bp
index 5fe581a..fb8375e 100644
--- a/tests/tests/notificationlegacy/notificationlegacy28/Android.bp
+++ b/tests/tests/notificationlegacy/notificationlegacy28/Android.bp
@@ -23,14 +23,13 @@
         "junit",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     min_sdk_version: "28",
diff --git a/tests/tests/notificationlegacy/notificationlegacy29/Android.bp b/tests/tests/notificationlegacy/notificationlegacy29/Android.bp
index aabff61..5003597 100644
--- a/tests/tests/notificationlegacy/notificationlegacy29/Android.bp
+++ b/tests/tests/notificationlegacy/notificationlegacy29/Android.bp
@@ -22,14 +22,13 @@
         "junit",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "mts"
     ],
diff --git a/tests/tests/opengl/Android.bp b/tests/tests/opengl/Android.bp
index 6b48d10..6737c30 100644
--- a/tests/tests/opengl/Android.bp
+++ b/tests/tests/opengl/Android.bp
@@ -39,8 +39,8 @@
         "compatibility-device-util-axt",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     // Using EGL_RECORDABLE_ANDROID requires latest
@@ -48,7 +48,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/opengl/libopengltest/Android.bp b/tests/tests/opengl/libopengltest/Android.bp
index bdff5f0..b7cf454 100644
--- a/tests/tests/opengl/libopengltest/Android.bp
+++ b/tests/tests/opengl/libopengltest/Android.bp
@@ -36,6 +36,7 @@
     ],
     sdk_version: "current",
     stl: "none",
+    header_libs: ["jni_headers"],
     shared_libs: [
         "libGLESv2",
         "liblog",
diff --git a/tests/tests/opengl/src/android/opengl/cts/ByteBufferTest.java b/tests/tests/opengl/src/android/opengl/cts/ByteBufferTest.java
index 80aaf00..a6a858a 100644
--- a/tests/tests/opengl/src/android/opengl/cts/ByteBufferTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/ByteBufferTest.java
@@ -16,36 +16,60 @@
 
 package android.opengl.cts;
 
+import static android.opengl.GLES30.GL_ARRAY_BUFFER;
 import static android.opengl.GLES30.GL_BUFFER_MAP_POINTER;
+import static android.opengl.GLES30.GL_COLOR_ATTACHMENT0;
 import static android.opengl.GLES30.GL_DYNAMIC_READ;
+import static android.opengl.GLES30.GL_FRAMEBUFFER;
+import static android.opengl.GLES30.GL_FRAMEBUFFER_COMPLETE;
 import static android.opengl.GLES30.GL_MAP_READ_BIT;
+import static android.opengl.GLES30.GL_NO_ERROR;
+import static android.opengl.GLES30.GL_R8;
+import static android.opengl.GLES30.GL_RED;
+import static android.opengl.GLES30.GL_RGBA;
+import static android.opengl.GLES30.GL_STATIC_DRAW;
+import static android.opengl.GLES30.GL_TEXTURE_2D;
 import static android.opengl.GLES30.GL_UNIFORM_BUFFER;
+import static android.opengl.GLES30.GL_UNSIGNED_BYTE;
 import static android.opengl.GLES30.glBindBuffer;
+import static android.opengl.GLES30.glBindFramebuffer;
+import static android.opengl.GLES30.glBindTexture;
 import static android.opengl.GLES30.glBufferData;
+import static android.opengl.GLES30.glCheckFramebufferStatus;
 import static android.opengl.GLES30.glDeleteBuffers;
+import static android.opengl.GLES30.glDeleteTextures;
+import static android.opengl.GLES30.glFramebufferTexture2D;
 import static android.opengl.GLES30.glGenBuffers;
+import static android.opengl.GLES30.glGenFramebuffers;
+import static android.opengl.GLES30.glGenTextures;
 import static android.opengl.GLES30.glGetBufferPointerv;
+import static android.opengl.GLES30.glGetError;
 import static android.opengl.GLES30.glMapBufferRange;
+import static android.opengl.GLES30.glReadPixels;
+import static android.opengl.GLES30.glTexImage2D;
 import static android.opengl.GLES30.glUnmapBuffer;
-
+import static android.opengl.GLES30.glViewport;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import androidx.test.filters.SmallTest;
-
+import java.nio.Buffer;
+import java.nio.ByteBuffer;
+import java.nio.IntBuffer;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.BlockJUnit4ClassRunner;
 
-import java.nio.Buffer;
-import java.nio.ByteBuffer;
-
 /**
- * Tests for functions that return a ByteBuffer.
+ * Tests for functions that return a ByteBuffer or accept a ByteBuffer as an argument
  */
 @SmallTest
 @RunWith(BlockJUnit4ClassRunner.class) // DO NOT USE AndroidJUnit4, it messes up threading
 public class ByteBufferTest extends GlTestBase {
+
+    private static final byte[] byteArray = {0, 63, 127, 127, 15};
+
     @Test
     public void testMapBufferRange() {
         // Always pass on ES 2.0
@@ -70,4 +94,63 @@
             glDeleteBuffers(1, buffer, 0);
         }
     }
+
+    @Test
+    public void testArrayBackedTexImage2d() throws Throwable {
+        IntBuffer textureHandles = IntBuffer.allocate(1);
+        ByteBuffer texelData = ByteBuffer.wrap(byteArray);
+        // Setting position to 1 will cause problems if the bindings don't
+        // correctly handle the buffer offset when releasing the pointer
+        texelData.position(1);
+        glGenTextures(1, textureHandles);
+        int textureHandle = textureHandles.get(0);
+        glBindTexture(GL_TEXTURE_2D, textureHandle);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, 2, 2, 0, GL_RED, GL_UNSIGNED_BYTE, texelData);
+        assertEquals(glGetError(), GL_NO_ERROR);
+        glDeleteTextures(1, textureHandles);
+    }
+
+    @Test
+    public void testArrayBackedBufferData() throws Throwable {
+        IntBuffer bufferHandles = IntBuffer.allocate(1);
+        ByteBuffer bufferData = ByteBuffer.wrap(byteArray);
+        // Setting position to 1 will cause problems if the bindings don't
+        // correctly handle the buffer offset when releasing the pointer
+        bufferData.position(1);
+        glGenBuffers(1, bufferHandles);
+        int bufferHandle = bufferHandles.get(0);
+        glBindBuffer(GL_ARRAY_BUFFER, bufferHandle);
+        glBufferData(GL_ARRAY_BUFFER, 4, bufferData, GL_STATIC_DRAW);
+        assertEquals(glGetError(), GL_NO_ERROR);
+        glDeleteBuffers(1, bufferHandles);
+    }
+
+    @Test
+    public void testArraybackedFBTextureReadPixels() throws Throwable {
+        IntBuffer textureHandles = IntBuffer.allocate(1);
+        IntBuffer fboHandles = IntBuffer.allocate(1);
+        ByteBuffer texelData = ByteBuffer.wrap(byteArray);
+        ByteBuffer readBuffer = ByteBuffer.allocate(byteArray.length);
+        // Setting position to 1 will cause problems if the bindings don't
+        // correctly handle the buffer offset when releasing the pointer
+        texelData.position(1);
+        readBuffer.position(1);
+        glGenTextures(1, textureHandles);
+        int textureHandle = textureHandles.get(0);
+        glBindTexture(GL_TEXTURE_2D, textureHandle);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, texelData);
+        glGenFramebuffers(1, fboHandles);
+        int fbHandle = fboHandles.get(0);
+        glBindFramebuffer(GL_FRAMEBUFFER, fbHandle);
+        glViewport(0, 0, 1, 1);
+        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureHandle, 0);
+        assertEquals(glCheckFramebufferStatus(GL_FRAMEBUFFER), GL_FRAMEBUFFER_COMPLETE);
+        glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, readBuffer);
+        assertEquals(glGetError(), GL_NO_ERROR);
+        for (int i = 0; i < 4; i++) {
+            assertEquals(
+                texelData.get(i + texelData.position()), readBuffer.get(i + readBuffer.position()));
+        }
+        glDeleteTextures(1, textureHandles);
+    }
 }
diff --git a/tests/tests/openglperf/Android.bp b/tests/tests/openglperf/Android.bp
index a55c39a..1da66cd 100644
--- a/tests/tests/openglperf/Android.bp
+++ b/tests/tests/openglperf/Android.bp
@@ -22,8 +22,8 @@
         "compatibility-device-util-axt",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     jni_libs: [
         "libctsopenglperf_jni",
@@ -35,7 +35,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/openglperf/jni/Android.bp b/tests/tests/openglperf/jni/Android.bp
index 6b9987d..2b8936c 100644
--- a/tests/tests/openglperf/jni/Android.bp
+++ b/tests/tests/openglperf/jni/Android.bp
@@ -17,9 +17,9 @@
     name: "libctsopenglperf_jni",
     srcs: ["OpenGlPerfNativeJni.cpp"],
     include_dirs: [
-        "system/core/include",
         "frameworks/native/opengl/include",
     ],
+    header_libs: ["liblog_headers"],
     shared_libs: [
         "libnativehelper_compat_libc++",
         "liblog",
diff --git a/tests/tests/openglperf/jni/OpenGlPerfNativeJni.cpp b/tests/tests/openglperf/jni/OpenGlPerfNativeJni.cpp
index a1cd16f..f6ba4ab 100644
--- a/tests/tests/openglperf/jni/OpenGlPerfNativeJni.cpp
+++ b/tests/tests/openglperf/jni/OpenGlPerfNativeJni.cpp
@@ -17,7 +17,7 @@
 #include <EGL/egl.h>
 #define EGL_EGLEXT_PROTOTYPES // for egl*Sync*
 #include <EGL/eglext.h>
-#include <cutils/log.h>
+#include <log/log.h>
 #include <jni.h>
 #include <stdlib.h>
 #include <string.h>
diff --git a/tests/tests/os/Android.bp b/tests/tests/os/Android.bp
index e04630b..c3592a7 100644
--- a/tests/tests/os/Android.bp
+++ b/tests/tests/os/Android.bp
@@ -49,13 +49,12 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     // Do not compress minijail policy files.
     aaptflags: ["-0 .policy"],
diff --git a/tests/tests/os/Android.mk b/tests/tests/os/Android.mk
index af8767f..043578a2 100644
--- a/tests/tests/os/Android.mk
+++ b/tests/tests/os/Android.mk
@@ -23,7 +23,7 @@
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 cts_platform_version_path := cts/tests/tests/os/assets/platform_versions.txt
 cts_platform_version_string := $(shell cat $(cts_platform_version_path))
diff --git a/tests/tests/os/AutoRevokeDummyApp/Android.bp b/tests/tests/os/AutoRevokeDummyApp/Android.bp
index 6b38e38..d4abfc0 100644
--- a/tests/tests/os/AutoRevokeDummyApp/Android.bp
+++ b/tests/tests/os/AutoRevokeDummyApp/Android.bp
@@ -22,7 +22,6 @@
     test_suites: [
         "cts",
         "vts",
-        "vts10",
         "mts",
         "general-tests",
     ],
diff --git a/tests/tests/os/assets/platform_versions.txt b/tests/tests/os/assets/platform_versions.txt
index b4de394..3762249 100644
--- a/tests/tests/os/assets/platform_versions.txt
+++ b/tests/tests/os/assets/platform_versions.txt
@@ -1 +1 @@
-11
+S
diff --git a/tests/tests/os/jni/android_os_cts_CpuInstructions.cpp b/tests/tests/os/jni/android_os_cts_CpuInstructions.cpp
index 15006f0..c8cf735 100644
--- a/tests/tests/os/jni/android_os_cts_CpuInstructions.cpp
+++ b/tests/tests/os/jni/android_os_cts_CpuInstructions.cpp
@@ -28,11 +28,6 @@
     siglongjmp(jmpenv, 1);
 }
 
-static int do_sigsetjmp()
-{
-    return sigsetjmp(jmpenv, 1);
-}
-
 static jboolean test_instruction(void (*func)())
 {
     struct sigaction sigill_act;
@@ -49,7 +44,7 @@
         goto err_sigaction;
     }
 
-    if (do_sigsetjmp()) {
+    if (sigsetjmp(jmpenv, 1)) {
         ret = false;
         goto err_segill;
     }
diff --git a/tests/tests/os/src/android/os/cts/BuildTest.java b/tests/tests/os/src/android/os/cts/BuildTest.java
index 00cb97d..ca0f84a 100644
--- a/tests/tests/os/src/android/os/cts/BuildTest.java
+++ b/tests/tests/os/src/android/os/cts/BuildTest.java
@@ -223,6 +223,8 @@
         Pattern.compile("^([0-9A-Za-z._-]+)$");
     private static final Pattern SERIAL_NUMBER_PATTERN =
         Pattern.compile("^([0-9A-Za-z]{6,20})$");
+    private static final Pattern SKU_PATTERN =
+        Pattern.compile("^([0-9A-Za-z.,_-]+)$");
     private static final Pattern TAGS_PATTERN =
         Pattern.compile("^([0-9A-Za-z.,_-]+)$");
     private static final Pattern TYPE_PATTERN =
@@ -254,6 +256,8 @@
 
         assertTrue(SERIAL_NUMBER_PATTERN.matcher(Build.SERIAL).matches());
 
+        assertTrue(SKU_PATTERN.matcher(Build.SKU).matches());
+
         assertTrue(TAGS_PATTERN.matcher(Build.TAGS).matches());
 
         // No format requirements stated in CDD for Build.TIME
diff --git a/tests/tests/os/src/android/os/cts/EnvironmentTest.java b/tests/tests/os/src/android/os/cts/EnvironmentTest.java
index 4f934fb..2ce40fe 100644
--- a/tests/tests/os/src/android/os/cts/EnvironmentTest.java
+++ b/tests/tests/os/src/android/os/cts/EnvironmentTest.java
@@ -85,8 +85,9 @@
                 final String source = fields[0];
                 final String options = fields[3];
 
-                if (source.equals("proc") && !options.contains("hidepid=2")) {
-                    fail("proc filesystem mounted without hidepid=2");
+                if (source.equals("proc") && !options.contains("hidepid=2")
+                        && !options.contains("hidepid=invisible")) {
+                    fail("proc filesystem mounted without hidepid=2 or hidepid=invisible");
                 }
             }
         }
diff --git a/tests/tests/os/src/android/os/cts/FileObserverLegacyPathTest.java b/tests/tests/os/src/android/os/cts/FileObserverLegacyPathTest.java
new file mode 100644
index 0000000..c779f8a
--- /dev/null
+++ b/tests/tests/os/src/android/os/cts/FileObserverLegacyPathTest.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright (C) 2020 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.os.cts;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.net.Uri;
+import android.os.ConditionVariable;
+import android.os.FileObserver;
+import android.provider.MediaStore;
+import android.test.AndroidTestCase;
+import java.io.File;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+
+public class FileObserverLegacyPathTest extends AndroidTestCase {
+    ConditionVariable mCond;
+    Context mContext;
+    File mTestDir;
+
+    @Override
+    protected void setUp() throws Exception {
+        mContext = getContext();
+        mCond = new ConditionVariable();
+
+        mTestDir = new File("/sdcard/DCIM/testdir");
+        mTestDir.delete();
+        mTestDir.mkdirs();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mTestDir.delete();
+    }
+
+    /* This test creates a jpg image file and write some test data to that
+     * file.
+     * It verifies that FileObserver is able to catch the CREATE, OPEN and
+     * MODIFY events on that file, ensuring that, in the case of a FUSE mounted
+     * file system, changes applied to the lower file system will be detected
+     * by a monitored FUSE folder.
+     * Instead of checking if the set of generated events if exactly the same
+     * as the set of expected events, the test checks if the set of generated
+     * events contains CREATE, OPEN and MODIFY. This because there may be other
+     * services (e.g., file indexing) that may access the newly created file,
+     * generating spurious events that this test doesn't care of and filters
+     * them out. */
+    public void testCreateFile() throws Exception {
+        String imageName = "image" + System.currentTimeMillis() + ".jpg";
+
+        final Integer eventsMask = FileObserver.OPEN | FileObserver.CREATE | FileObserver.MODIFY;
+        PathFileObserver fileObserver =
+                new PathFileObserver(mTestDir, eventsMask, mCond, Map.of(imageName, eventsMask));
+        fileObserver.startWatching();
+
+        ContentValues cv = new ContentValues();
+        cv.put(MediaStore.Files.FileColumns.DISPLAY_NAME, imageName);
+        cv.put(MediaStore.Files.FileColumns.RELATIVE_PATH, "DCIM/testdir");
+        cv.put(MediaStore.Files.FileColumns.MIME_TYPE, "image/jpg");
+
+        Uri imageUri = MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL);
+
+        Uri fileUri = mContext.getContentResolver().insert(imageUri, cv);
+
+        OutputStream os = mContext.getContentResolver().openOutputStream(fileUri);
+        os.write("TEST".getBytes("UTF-8"));
+        os.close();
+
+        /* Wait for for the inotify events to be catched. A timeout occurs
+         * after 2 seconds. */
+        mCond.block(2000);
+
+        int detectedEvents = fileObserver.getEvents().getOrDefault(imageName, 0);
+
+        /* Verify if the received events correspond to the ones that were requested */
+        assertEquals("Uncatched some of the events", PathFileObserver.eventsToSet(eventsMask),
+                PathFileObserver.eventsToSet(detectedEvents & eventsMask));
+
+        fileObserver.stopWatching();
+    }
+
+    static public class PathFileObserver extends FileObserver {
+        Map<String, Integer> mGeneratedEventsMap;
+        Map<String, Integer> mMonitoredEventsMap;
+        final ConditionVariable mCond;
+        final int mEventsMask;
+
+        public PathFileObserver(final File root, final int mask, ConditionVariable condition,
+                Map<String, Integer> monitoredFiles) {
+            super(root, FileObserver.ALL_EVENTS);
+
+            mEventsMask = mask;
+            mCond = condition;
+            mGeneratedEventsMap = new HashMap<>();
+            mMonitoredEventsMap = monitoredFiles;
+        }
+
+        public Map<String, Integer> getEvents() { return mGeneratedEventsMap; }
+
+        public void onEvent(final int event, final String path) {
+            /* There might be some extra flags introduced by inotify.h.  Remove
+             * them. */
+            final int filteredEvent = event & FileObserver.ALL_EVENTS;
+            if (filteredEvent == 0)
+                return;
+
+            /* Update the event bitmap of the associated file. */
+            mGeneratedEventsMap.put(
+                    path, filteredEvent | mGeneratedEventsMap.getOrDefault(path, 0));
+
+            /* Release the condition variable only if at least all the matching
+             * events have been catched for every monitored file. */
+            for (String file : mMonitoredEventsMap.keySet()) {
+                int monitoredEvents = mMonitoredEventsMap.getOrDefault(file, 0);
+                int generatedEvents = mGeneratedEventsMap.getOrDefault(file, 0);
+
+                if ((generatedEvents & monitoredEvents) != monitoredEvents)
+                    return;
+            }
+
+            mCond.open();
+        }
+
+        static public HashSet<String> eventsToSet(int events) {
+            HashSet<String> set = new HashSet<String>();
+            while (events != 0) {
+                int lowestEvent = Integer.lowestOneBit(events);
+
+                set.add(event2str(lowestEvent));
+                events &= ~lowestEvent;
+            }
+            return set;
+        }
+
+        static public String event2str(int event) {
+            switch (event) {
+                case FileObserver.ACCESS:
+                    return "ACCESS";
+                case FileObserver.ATTRIB:
+                    return "ATTRIB";
+                case FileObserver.CLOSE_NOWRITE:
+                    return "CLOSE_NOWRITE";
+                case FileObserver.CLOSE_WRITE:
+                    return "CLOSE_WRITE";
+                case FileObserver.CREATE:
+                    return "CREATE";
+                case FileObserver.DELETE:
+                    return "DELETE";
+                case FileObserver.DELETE_SELF:
+                    return "DELETE_SELF";
+                case FileObserver.MODIFY:
+                    return "MODIFY";
+                case FileObserver.MOVED_FROM:
+                    return "MOVED_FROM";
+                case FileObserver.MOVED_TO:
+                    return "MOVED_TO";
+                case FileObserver.MOVE_SELF:
+                    return "MOVE_SELF";
+                case FileObserver.OPEN:
+                    return "OPEN";
+                default:
+                    return "???";
+            }
+        }
+    }
+}
diff --git a/tests/tests/os/src/android/os/cts/ParcelTest.java b/tests/tests/os/src/android/os/cts/ParcelTest.java
index bb7b41a..270c938 100644
--- a/tests/tests/os/src/android/os/cts/ParcelTest.java
+++ b/tests/tests/os/src/android/os/cts/ParcelTest.java
@@ -126,7 +126,7 @@
         int dC1 = p.dataCapacity();
         p.writeDouble(2.19);
         int dC2 = p.dataCapacity();
-        assertTrue(dC2 > dC1);
+        assertTrue(dC2 >= dC1);
         p.recycle();
     }
 
diff --git a/tests/tests/os/src/android/os/cts/StrictModeTest.java b/tests/tests/os/src/android/os/cts/StrictModeTest.java
index a50fd5a..562fc5e 100644
--- a/tests/tests/os/src/android/os/cts/StrictModeTest.java
+++ b/tests/tests/os/src/android/os/cts/StrictModeTest.java
@@ -192,6 +192,10 @@
 
     @Test
     public void testUnclosedCloseable() throws Exception {
+        //clean before test
+        System.gc();
+        System.runFinalization();
+
         StrictMode.setVmPolicy(
                 new StrictMode.VmPolicy.Builder().detectLeakedClosableObjects().build());
 
diff --git a/tests/tests/os/src/android/os/storage/cts/StorageCrateTest.java b/tests/tests/os/src/android/os/storage/cts/StorageCrateTest.java
index 99ea30c..c1172ff 100644
--- a/tests/tests/os/src/android/os/storage/cts/StorageCrateTest.java
+++ b/tests/tests/os/src/android/os/storage/cts/StorageCrateTest.java
@@ -314,7 +314,7 @@
         }
 
         String[] newChildDir = mCratesRoot.toFile().list();
-        assertThat(newChildDir).asList().containsAllIn(expectedCrates);
+        assertThat(newChildDir).asList().containsAtLeastElementsIn(expectedCrates);
     }
 
     @Test
diff --git a/tests/tests/os/src/android/os/storage/cts/StorageStatsManagerTest.java b/tests/tests/os/src/android/os/storage/cts/StorageStatsManagerTest.java
index 60ede8b..226bb7a 100644
--- a/tests/tests/os/src/android/os/storage/cts/StorageStatsManagerTest.java
+++ b/tests/tests/os/src/android/os/storage/cts/StorageStatsManagerTest.java
@@ -380,17 +380,10 @@
         assertThat(newCollection.size()).isEqualTo(oldCollection.size() - 1);
     }
 
-    Correspondence<CrateInfo, String> mCorrespondenceByLabel = new Correspondence<>() {
-        @Override
-        public boolean compare(CrateInfo crateInfo, String expect) {
+    Correspondence<CrateInfo, String> mCorrespondenceByLabel =
+        Correspondence.from((CrateInfo crateInfo, String expect) -> {
             return TextUtils.equals(crateInfo.getLabel(), expect);
-        }
-
-        @Override
-        public String toString() {
-            return "It should be the crated folder name";
-        }
-    };
+        }, "It should be the crated folder name");
 
     @Test
     public void queryCratesForUid_createDeepPath_shouldCreateOneCrate()
diff --git a/tests/tests/packageinstaller/adminpackageinstaller/Android.bp b/tests/tests/packageinstaller/adminpackageinstaller/Android.bp
index aae76bd..465d614 100644
--- a/tests/tests/packageinstaller/adminpackageinstaller/Android.bp
+++ b/tests/tests/packageinstaller/adminpackageinstaller/Android.bp
@@ -22,12 +22,11 @@
         "androidx.test.rules",
         "androidx.legacy_legacy-support-v4",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     sdk_version: "test_current",
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/packageinstaller/adminpackageinstaller/src/android/packageinstaller/admin/cts/SessionCommitBroadcastTest.java b/tests/tests/packageinstaller/adminpackageinstaller/src/android/packageinstaller/admin/cts/SessionCommitBroadcastTest.java
index 17f97fe..8d8d19e 100644
--- a/tests/tests/packageinstaller/adminpackageinstaller/src/android/packageinstaller/admin/cts/SessionCommitBroadcastTest.java
+++ b/tests/tests/packageinstaller/adminpackageinstaller/src/android/packageinstaller/admin/cts/SessionCommitBroadcastTest.java
@@ -41,12 +41,19 @@
 
     private ComponentName mDefaultLauncher;
     private ComponentName mThisAppLauncher;
+    private SessionCommitReceiver mReceiver;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         mDefaultLauncher = ComponentName.unflattenFromString(getDefaultLauncher());
         mThisAppLauncher = new ComponentName(mContext, LauncherActivity.class);
+        mReceiver = new SessionCommitReceiver();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mContext.unregisterReceiver(mReceiver);
     }
 
     public void testBroadcastNotReceivedForDifferentLauncher() throws Exception {
@@ -69,11 +76,10 @@
         }
 
         assertFalse("No default launcher found", mDefaultLauncher.equals(mThisAppLauncher));
-        SessionCommitReceiver receiver = new SessionCommitReceiver();
         // install the app
         assertInstallPackage();
         // Broadcast not received
-        assertNull(receiver.blockingGetIntent());
+        assertNull(mReceiver.blockingGetIntent());
 
         tryUninstallPackage();
     }
@@ -91,16 +97,15 @@
         }
         setLauncher(mThisAppLauncher.flattenToString());
 
-        SessionCommitReceiver receiver = new SessionCommitReceiver();
         // install the app
         assertInstallPackage();
 
-        verifySessionIntent(receiver.blockingGetIntent());
-
+        verifySessionIntent(mReceiver.blockingGetIntent());
+        mContext.unregisterReceiver(mReceiver);
         forceUninstall();
-        receiver = new SessionCommitReceiver();
+        mReceiver = new SessionCommitReceiver();
         assertInstallPackage();
-        verifySessionIntent(receiver.blockingGetIntent());
+        verifySessionIntent(mReceiver.blockingGetIntent());
 
         tryUninstallPackage();
         // Revert to default launcher
@@ -127,10 +132,9 @@
                 .toLowerCase().contains("success"));
 
         // Enable the app for this user
-        SessionCommitReceiver receiver = new SessionCommitReceiver();
         runShellCommand("cmd package install-existing --user " +
                 Process.myUserHandle().getIdentifier() + "  " + TEST_APP_PKG);
-        verifySessionIntent(receiver.blockingGetIntent());
+        verifySessionIntent(mReceiver.blockingGetIntent());
 
         // Cleanup
         setLauncher(mDefaultLauncher.flattenToString());
@@ -173,7 +177,6 @@
 
         public Intent blockingGetIntent() throws Exception {
             mLatch.await(BROADCAST_TIMEOUT_SECS, TimeUnit.SECONDS);
-            mContext.unregisterReceiver(this);
             return mIntent;
         }
     }
diff --git a/tests/tests/packageinstaller/atomicinstall/Android.bp b/tests/tests/packageinstaller/atomicinstall/Android.bp
index 3cef0d4..f6c767f 100644
--- a/tests/tests/packageinstaller/atomicinstall/Android.bp
+++ b/tests/tests/packageinstaller/atomicinstall/Android.bp
@@ -28,7 +28,6 @@
     sdk_version: "test_current",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "mts",
     ],
diff --git a/tests/tests/packageinstaller/atomicinstall/OWNERS b/tests/tests/packageinstaller/atomicinstall/OWNERS
deleted file mode 100644
index 25775b8..0000000
--- a/tests/tests/packageinstaller/atomicinstall/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-# Bug component: 36137
-include /hostsidetests/stagedinstall/OWNERS
diff --git a/tests/tests/packageinstaller/emptytestapp/Android.bp b/tests/tests/packageinstaller/emptytestapp/Android.bp
index 3c8939b..dafd4e9 100644
--- a/tests/tests/packageinstaller/emptytestapp/Android.bp
+++ b/tests/tests/packageinstaller/emptytestapp/Android.bp
@@ -21,7 +21,6 @@
     test_suites: [
         "arcts",
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/packageinstaller/install/Android.bp b/tests/tests/packageinstaller/install/Android.bp
index 350b8b3..fc0bf63 100644
--- a/tests/tests/packageinstaller/install/Android.bp
+++ b/tests/tests/packageinstaller/install/Android.bp
@@ -34,7 +34,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/packageinstaller/nopermission/Android.bp b/tests/tests/packageinstaller/nopermission/Android.bp
index c1c3c66..b3a57a4 100644
--- a/tests/tests/packageinstaller/nopermission/Android.bp
+++ b/tests/tests/packageinstaller/nopermission/Android.bp
@@ -37,7 +37,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/packageinstaller/nopermission25/Android.bp b/tests/tests/packageinstaller/nopermission25/Android.bp
index 4bfbc02..5a1921c 100644
--- a/tests/tests/packageinstaller/nopermission25/Android.bp
+++ b/tests/tests/packageinstaller/nopermission25/Android.bp
@@ -22,7 +22,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/packageinstaller/tapjacking/Android.bp b/tests/tests/packageinstaller/tapjacking/Android.bp
index 014b6bb..67a1af6 100644
--- a/tests/tests/packageinstaller/tapjacking/Android.bp
+++ b/tests/tests/packageinstaller/tapjacking/Android.bp
@@ -27,7 +27,6 @@
     // Tag this module as test artifact for cts
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/packageinstaller/uninstall/Android.bp b/tests/tests/packageinstaller/uninstall/Android.bp
index 50d1a52..b00c9a6 100644
--- a/tests/tests/packageinstaller/uninstall/Android.bp
+++ b/tests/tests/packageinstaller/uninstall/Android.bp
@@ -28,7 +28,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/packagewatchdog/Android.bp b/tests/tests/packagewatchdog/Android.bp
index 8773e4a..32fa31a 100644
--- a/tests/tests/packagewatchdog/Android.bp
+++ b/tests/tests/packagewatchdog/Android.bp
@@ -21,11 +21,10 @@
     test_suites: [
         "cts",
         "vts",
-        "vts10",
         "general-tests",
         "mts"
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     static_libs: [
         "compatibility-device-util-axt",
         "ctstestrunner-axt",
diff --git a/tests/tests/permission/Android.bp b/tests/tests/permission/Android.bp
index 6c42051..7c8c56b 100644
--- a/tests/tests/permission/Android.bp
+++ b/tests/tests/permission/Android.bp
@@ -19,7 +19,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "sts",
     ],
@@ -46,7 +45,7 @@
     ],
     sdk_version: "test_current",
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
 }
diff --git a/tests/tests/permission/AndroidTest.xml b/tests/tests/permission/AndroidTest.xml
index 5277c9a..ef2a09f 100644
--- a/tests/tests/permission/AndroidTest.xml
+++ b/tests/tests/permission/AndroidTest.xml
@@ -18,6 +18,7 @@
     <option name="config-descriptor:metadata" key="component" value="framework" />
     <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
     <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
+    <option name="config-descriptor:metadata" key="token" value="SIM_CARD" />
 
     <object type="module_controller" class="com.android.tradefed.testtype.suite.module.Sdk30ModuleController" />
 
diff --git a/tests/tests/permission/AppThatAccessesCalendarContactsBodySensorCustomPermission/Android.bp b/tests/tests/permission/AppThatAccessesCalendarContactsBodySensorCustomPermission/Android.bp
index 331551f..1645e8d 100644
--- a/tests/tests/permission/AppThatAccessesCalendarContactsBodySensorCustomPermission/Android.bp
+++ b/tests/tests/permission/AppThatAccessesCalendarContactsBodySensorCustomPermission/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/permission/AppThatAccessesLocationOnCommand/Android.bp b/tests/tests/permission/AppThatAccessesLocationOnCommand/Android.bp
index 6d56a9a..9aa6735 100644
--- a/tests/tests/permission/AppThatAccessesLocationOnCommand/Android.bp
+++ b/tests/tests/permission/AppThatAccessesLocationOnCommand/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "sts",
     ],
diff --git a/tests/tests/permission/AppThatDefinesUndefinedPermissionGroupElement/Android.bp b/tests/tests/permission/AppThatDefinesUndefinedPermissionGroupElement/Android.bp
index c8fd250..fdff4ae 100644
--- a/tests/tests/permission/AppThatDefinesUndefinedPermissionGroupElement/Android.bp
+++ b/tests/tests/permission/AppThatDefinesUndefinedPermissionGroupElement/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src/**/*.kt"],
diff --git a/tests/tests/permission/AppThatDoesNotHaveBgLocationAccess/Android.bp b/tests/tests/permission/AppThatDoesNotHaveBgLocationAccess/Android.bp
index dc04e1c..1dec34f 100644
--- a/tests/tests/permission/AppThatDoesNotHaveBgLocationAccess/Android.bp
+++ b/tests/tests/permission/AppThatDoesNotHaveBgLocationAccess/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "sts",
     ],
diff --git a/tests/tests/permission/AppThatRequestContactsAndCallLogPermission16/Android.bp b/tests/tests/permission/AppThatRequestContactsAndCallLogPermission16/Android.bp
index 2e3a777..f1a436b 100644
--- a/tests/tests/permission/AppThatRequestContactsAndCallLogPermission16/Android.bp
+++ b/tests/tests/permission/AppThatRequestContactsAndCallLogPermission16/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/permission/AppThatRequestContactsPermission15/Android.bp b/tests/tests/permission/AppThatRequestContactsPermission15/Android.bp
index 3e1af1d..f443c41 100644
--- a/tests/tests/permission/AppThatRequestContactsPermission15/Android.bp
+++ b/tests/tests/permission/AppThatRequestContactsPermission15/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/permission/AppThatRequestContactsPermission16/Android.bp b/tests/tests/permission/AppThatRequestContactsPermission16/Android.bp
index 17dd3ba..3716cd2 100644
--- a/tests/tests/permission/AppThatRequestContactsPermission16/Android.bp
+++ b/tests/tests/permission/AppThatRequestContactsPermission16/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/permission/AppThatRequestLocationAndBackgroundPermission29/Android.bp b/tests/tests/permission/AppThatRequestLocationAndBackgroundPermission29/Android.bp
index 0146b6c..9902790 100644
--- a/tests/tests/permission/AppThatRequestLocationAndBackgroundPermission29/Android.bp
+++ b/tests/tests/permission/AppThatRequestLocationAndBackgroundPermission29/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/permission/AppThatRequestLocationPermission22/Android.bp b/tests/tests/permission/AppThatRequestLocationPermission22/Android.bp
index 1383819..c9187eb 100644
--- a/tests/tests/permission/AppThatRequestLocationPermission22/Android.bp
+++ b/tests/tests/permission/AppThatRequestLocationPermission22/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/permission/AppThatRequestLocationPermission28/Android.bp b/tests/tests/permission/AppThatRequestLocationPermission28/Android.bp
index 5ed80ec..dd5dbc4 100644
--- a/tests/tests/permission/AppThatRequestLocationPermission28/Android.bp
+++ b/tests/tests/permission/AppThatRequestLocationPermission28/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/permission/AppThatRequestLocationPermission29/Android.bp b/tests/tests/permission/AppThatRequestLocationPermission29/Android.bp
index 9546523..95b1b76 100644
--- a/tests/tests/permission/AppThatRequestLocationPermission29/Android.bp
+++ b/tests/tests/permission/AppThatRequestLocationPermission29/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/permission/AppThatRequestLocationPermission29v4/Android.bp b/tests/tests/permission/AppThatRequestLocationPermission29v4/Android.bp
index 10d2a66..d21fa19 100644
--- a/tests/tests/permission/AppThatRequestLocationPermission29v4/Android.bp
+++ b/tests/tests/permission/AppThatRequestLocationPermission29v4/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/permission/AppThatRequestOneTimePermission/Android.bp b/tests/tests/permission/AppThatRequestOneTimePermission/Android.bp
index 01de19b..1f8a50a 100644
--- a/tests/tests/permission/AppThatRequestOneTimePermission/Android.bp
+++ b/tests/tests/permission/AppThatRequestOneTimePermission/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "mts",
         "general-tests",
     ],
diff --git a/tests/tests/permission/AppThatRequestPermissionAandB/Android.bp b/tests/tests/permission/AppThatRequestPermissionAandB/Android.bp
index 498ba83..5e5a1c7 100644
--- a/tests/tests/permission/AppThatRequestPermissionAandB/Android.bp
+++ b/tests/tests/permission/AppThatRequestPermissionAandB/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "sts",
     ],
diff --git a/tests/tests/permission/AppThatRequestPermissionAandC/Android.bp b/tests/tests/permission/AppThatRequestPermissionAandC/Android.bp
index d38273c..d6cff70 100644
--- a/tests/tests/permission/AppThatRequestPermissionAandC/Android.bp
+++ b/tests/tests/permission/AppThatRequestPermissionAandC/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "sts",
     ],
diff --git a/tests/tests/permission/AppThatRequestStoragePermission28/Android.bp b/tests/tests/permission/AppThatRequestStoragePermission28/Android.bp
index cdc8bb0..f791a10 100644
--- a/tests/tests/permission/AppThatRequestStoragePermission28/Android.bp
+++ b/tests/tests/permission/AppThatRequestStoragePermission28/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/permission/AppThatRequestStoragePermission29/Android.bp b/tests/tests/permission/AppThatRequestStoragePermission29/Android.bp
index d2a4897..82f29e5 100644
--- a/tests/tests/permission/AppThatRequestStoragePermission29/Android.bp
+++ b/tests/tests/permission/AppThatRequestStoragePermission29/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/permission/AppThatRunsRationaleTests/Android.bp b/tests/tests/permission/AppThatRunsRationaleTests/Android.bp
index 9555499..a4e98ce 100644
--- a/tests/tests/permission/AppThatRunsRationaleTests/Android.bp
+++ b/tests/tests/permission/AppThatRunsRationaleTests/Android.bp
@@ -23,7 +23,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/tests/tests/permission/AppWithSharedUidThatRequestLocationPermission28/Android.bp b/tests/tests/permission/AppWithSharedUidThatRequestLocationPermission28/Android.bp
index 688651e..9fe607e 100644
--- a/tests/tests/permission/AppWithSharedUidThatRequestLocationPermission28/Android.bp
+++ b/tests/tests/permission/AppWithSharedUidThatRequestLocationPermission28/Android.bp
@@ -23,7 +23,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/permission/AppWithSharedUidThatRequestLocationPermission29/Android.bp b/tests/tests/permission/AppWithSharedUidThatRequestLocationPermission29/Android.bp
index b8b258e..366fc75 100644
--- a/tests/tests/permission/AppWithSharedUidThatRequestLocationPermission29/Android.bp
+++ b/tests/tests/permission/AppWithSharedUidThatRequestLocationPermission29/Android.bp
@@ -23,7 +23,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/permission/AppWithSharedUidThatRequestsNoPermissions/Android.bp b/tests/tests/permission/AppWithSharedUidThatRequestsNoPermissions/Android.bp
index c9a4b93..36d164b 100644
--- a/tests/tests/permission/AppWithSharedUidThatRequestsNoPermissions/Android.bp
+++ b/tests/tests/permission/AppWithSharedUidThatRequestsNoPermissions/Android.bp
@@ -20,7 +20,6 @@
     sdk_version: "current",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/permission/AppWithSharedUidThatRequestsPermissions/Android.bp b/tests/tests/permission/AppWithSharedUidThatRequestsPermissions/Android.bp
index fc8d9ee..bc6072c 100644
--- a/tests/tests/permission/AppWithSharedUidThatRequestsPermissions/Android.bp
+++ b/tests/tests/permission/AppWithSharedUidThatRequestsPermissions/Android.bp
@@ -20,7 +20,6 @@
     sdk_version: "current",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/permission/sdk28/Android.bp b/tests/tests/permission/sdk28/Android.bp
index 856bbd1..d742ed8 100644
--- a/tests/tests/permission/sdk28/Android.bp
+++ b/tests/tests/permission/sdk28/Android.bp
@@ -23,7 +23,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/permission/src/android/permission/cts/BackgroundPermissionsTest.java b/tests/tests/permission/src/android/permission/cts/BackgroundPermissionsTest.java
index 6077b21..a535bb0 100644
--- a/tests/tests/permission/src/android/permission/cts/BackgroundPermissionsTest.java
+++ b/tests/tests/permission/src/android/permission/cts/BackgroundPermissionsTest.java
@@ -30,7 +30,7 @@
 
 import static com.android.compatibility.common.util.SystemUtil.eventually;
 
-import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
@@ -126,8 +126,8 @@
 
         install(APK_LOCATION_29v4);
 
-        eventually(() -> assertThat(getAppOp(APP_PKG, ACCESS_COARSE_LOCATION)).named(
-                "foreground app-op").isEqualTo(MODE_FOREGROUND));
+        eventually(() -> assertWithMessage("foreground app-op").that(
+                getAppOp(APP_PKG, ACCESS_COARSE_LOCATION)).isEqualTo(MODE_FOREGROUND));
     }
 
     /**
@@ -141,8 +141,8 @@
         install(APK_LOCATION_BACKGROUND_29);
 
         // Wait until the system sets the app-op automatically
-        eventually(() -> assertThat(getAppOp(APP_PKG, ACCESS_COARSE_LOCATION)).named(
-                "loc app-op").isEqualTo(MODE_IGNORED));
+        eventually(() -> assertWithMessage("loc app-op").that(
+                getAppOp(APP_PKG, ACCESS_COARSE_LOCATION)).isEqualTo(MODE_IGNORED));
     }
 
     /**
@@ -157,8 +157,8 @@
         sUiAutomation.grantRuntimePermission(APP_PKG, ACCESS_COARSE_LOCATION);
 
         // Wait until the system sets the app-op automatically
-        eventually(() -> assertThat(getAppOp(APP_PKG, ACCESS_COARSE_LOCATION)).named(
-                "loc app-op").isEqualTo(MODE_FOREGROUND));
+        eventually(() -> assertWithMessage("loc app-op").that(
+                getAppOp(APP_PKG, ACCESS_COARSE_LOCATION)).isEqualTo(MODE_FOREGROUND));
     }
 
     /**
@@ -174,8 +174,8 @@
         sUiAutomation.grantRuntimePermission(APP_PKG, ACCESS_BACKGROUND_LOCATION);
 
         // Wait until the system sets the app-op automatically
-        eventually(() -> assertThat(getAppOp(APP_PKG, ACCESS_COARSE_LOCATION)).named(
-                "loc app-op").isEqualTo(MODE_ALLOWED));
+        eventually(() -> assertWithMessage("loc app-op").that(
+                getAppOp(APP_PKG, ACCESS_COARSE_LOCATION)).isEqualTo(MODE_ALLOWED));
     }
 
     /**
@@ -191,8 +191,8 @@
 
         // Wait until the system sets the app-op automatically
         // Fine location uses background location to limit access
-        eventually(() -> assertThat(getAppOp(APP_PKG, ACCESS_COARSE_LOCATION)).named(
-                "loc app-op").isEqualTo(MODE_FOREGROUND));
+        eventually(() -> assertWithMessage("loc app-op").that(
+                getAppOp(APP_PKG, ACCESS_COARSE_LOCATION)).isEqualTo(MODE_FOREGROUND));
     }
 
     /**
@@ -208,8 +208,8 @@
         sUiAutomation.grantRuntimePermission(APP_PKG, ACCESS_BACKGROUND_LOCATION);
 
         // Wait until the system sets the app-op automatically
-        eventually(() -> assertThat(getAppOp(APP_PKG, ACCESS_COARSE_LOCATION)).named(
-                "loc app-op").isEqualTo(MODE_ALLOWED));
+        eventually(() -> assertWithMessage("loc app-op").that(
+                getAppOp(APP_PKG, ACCESS_COARSE_LOCATION)).isEqualTo(MODE_ALLOWED));
     }
 
     /**
@@ -225,8 +225,8 @@
         sUiAutomation.grantRuntimePermission(APP_PKG, ACCESS_COARSE_LOCATION);
 
         // Wait until the system sets the app-op automatically
-        eventually(() -> assertThat(getAppOp(APP_PKG, ACCESS_COARSE_LOCATION)).named(
-                "loc app-op").isEqualTo(MODE_FOREGROUND));
+        eventually(() -> assertWithMessage("loc app-op").that(
+                getAppOp(APP_PKG, ACCESS_COARSE_LOCATION)).isEqualTo(MODE_FOREGROUND));
     }
 
     /**
@@ -244,7 +244,7 @@
         sUiAutomation.grantRuntimePermission(APP_PKG, ACCESS_BACKGROUND_LOCATION);
 
         // Wait until the system sets the app-op automatically
-        eventually(() -> assertThat(getAppOp(APP_PKG, ACCESS_COARSE_LOCATION)).named(
-                "loc app-op").isEqualTo(MODE_ALLOWED));
+        eventually(() -> assertWithMessage("loc app-op").that(
+                getAppOp(APP_PKG, ACCESS_COARSE_LOCATION)).isEqualTo(MODE_ALLOWED));
     }
 }
diff --git a/tests/tests/permission/src/android/permission/cts/NoAudioPermissionTest.java b/tests/tests/permission/src/android/permission/cts/NoAudioPermissionTest.java
index fbd6043..0ab5ff0 100644
--- a/tests/tests/permission/src/android/permission/cts/NoAudioPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/NoAudioPermissionTest.java
@@ -47,8 +47,9 @@
         boolean muteState = mAudioManager.isMicrophoneMute();
         int originalMode = mAudioManager.getMode();
         // If there is no permission of MODIFY_AUDIO_SETTINGS, setMicrophoneMute does nothing.
-        if (!muteState) {
+        if (muteState) {
             Log.w(TAG, "Mic seems muted by hardware! Please unmute and rerrun the test.");
+        } else {
             mAudioManager.setMicrophoneMute(!muteState);
             assertEquals(muteState, mAudioManager.isMicrophoneMute());
         }
diff --git a/tests/tests/permission/src/android/permission/cts/PermissionManagerTest.java b/tests/tests/permission/src/android/permission/cts/PermissionManagerTest.java
new file mode 100644
index 0000000..6fa940a
--- /dev/null
+++ b/tests/tests/permission/src/android/permission/cts/PermissionManagerTest.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2020 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.permission.cts;
+
+import static com.android.compatibility.common.util.SystemUtil.callWithShellPermissionIdentity;
+import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.permission.PermissionManager;
+import android.platform.test.annotations.AppModeFull;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Test {@link PermissionManager}
+ */
+@RunWith(AndroidJUnit4.class)
+@AppModeFull(reason = "Instant apps cannot talk to permission manager")
+public class PermissionManagerTest {
+    private final Context mContext = InstrumentationRegistry.getTargetContext();
+
+    @Test
+    public void testRuntimePermissionsVersion() throws Exception {
+        final PermissionManager permissionManager =
+                mContext.getSystemService(PermissionManager.class);
+        final int version = callWithShellPermissionIdentity(() ->
+                permissionManager.getRuntimePermissionsVersion());
+        assertThat(version).isAtLeast(0);
+        runWithShellPermissionIdentity(() ->
+                permissionManager.setRuntimePermissionsVersion(version));
+    }
+}
diff --git a/tests/tests/permission/src/android/permission/cts/ProviderPermissionTest.java b/tests/tests/permission/src/android/permission/cts/ProviderPermissionTest.java
index fd72e77..6df8963 100644
--- a/tests/tests/permission/src/android/permission/cts/ProviderPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/ProviderPermissionTest.java
@@ -189,8 +189,8 @@
 
     /**
      * Verify that the {@link android.Manifest.permission#MANAGE_DOCUMENTS}
-     * permission is only held by exactly one package: whoever handles the
-     * {@link android.content.Intent#ACTION_OPEN_DOCUMENT} intent.
+     * permission is only held by up to one package: whoever handles the
+     * {@link android.content.Intent#ACTION_OPEN_DOCUMENT} intent, if any.
      * <p>
      * No other apps should <em>ever</em> attempt to acquire this permission,
      * since it would give those apps extremely broad access to all storage
@@ -207,16 +207,19 @@
         intent.addCategory(Intent.CATEGORY_OPENABLE);
         intent.setType("*/*");
         final ResolveInfo ri = pm.resolveActivity(intent, 0);
-        final String validPkg = ri.activityInfo.packageName;
 
-        final List<PackageInfo> holding = pm.getPackagesHoldingPermissions(new String[] {
-                android.Manifest.permission.MANAGE_DOCUMENTS
-        }, PackageManager.MATCH_UNINSTALLED_PACKAGES);
-        for (PackageInfo pi : holding) {
-            if (!Objects.equals(pi.packageName, validPkg)) {
-                fail("Exactly one package (must be " + validPkg
-                        + ") can request the MANAGE_DOCUMENTS permission; found package "
-                        + pi.packageName + " which must be revoked for security reasons");
+        if (ri != null) {
+            final String validPkg = ri.activityInfo.packageName;
+
+            final List<PackageInfo> holding = pm.getPackagesHoldingPermissions(new String[] {
+                    android.Manifest.permission.MANAGE_DOCUMENTS
+                    }, PackageManager.MATCH_UNINSTALLED_PACKAGES);
+            for (PackageInfo pi : holding) {
+                if (!Objects.equals(pi.packageName, validPkg)) {
+                    fail("Exactly one package (must be " + validPkg
+                            + ") can request the MANAGE_DOCUMENTS permission; found package "
+                            + pi.packageName + " which must be revoked for security reasons");
+                }
             }
         }
     }
@@ -237,10 +240,12 @@
     public void testWriteMediaStorage() throws Exception {
         final UiAutomation ui = InstrumentationRegistry.getInstrumentation().getUiAutomation();
         final PackageManager pm = getContext().getPackageManager();
+        final UserHandle userHandle = getContext().getUser();
         final List<PackageInfo> pkgs = pm.getInstalledPackages(
                 PackageManager.MATCH_UNINSTALLED_PACKAGES | PackageManager.GET_PERMISSIONS);
         for (PackageInfo pkg : pkgs) {
-            final boolean isSystem = pkg.applicationInfo.uid == android.os.Process.SYSTEM_UID;
+            final int appUid = userHandle.getAppId(pkg.applicationInfo.uid);
+            final boolean isSystem = appUid == android.os.Process.SYSTEM_UID;
             final boolean hasFrontDoor = pm.getLaunchIntentForPackage(pkg.packageName) != null;
             final boolean grantedMedia = pm.checkPermission(WRITE_MEDIA_STORAGE,
                     pkg.packageName) == PackageManager.PERMISSION_GRANTED;
diff --git a/tests/tests/permission/src/android/permission/cts/SecureElementPermissionTest.java b/tests/tests/permission/src/android/permission/cts/SecureElementPermissionTest.java
index 0940d5f..1f04b1c 100644
--- a/tests/tests/permission/src/android/permission/cts/SecureElementPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/SecureElementPermissionTest.java
@@ -59,8 +59,8 @@
                 .collect(Collectors.toList());
 
         if (nonSpecialPackages.size() > 1) {
-            fail("Only one app on the device is allowed to hold the "
-                    + "SECURE_ELEMENT_PRIVILEGED_OPERATION permission.");
+            fail("Only one app on the device is allowed to hold the " +
+                 "SECURE_ELEMENT_PRIVILEGED_OPERATION permission.");
         }
     }
 }
diff --git a/tests/tests/permission/src/android/permission/cts/SplitPermissionTest.java b/tests/tests/permission/src/android/permission/cts/SplitPermissionTest.java
index b53bf6a..b837976 100644
--- a/tests/tests/permission/src/android/permission/cts/SplitPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/SplitPermissionTest.java
@@ -37,6 +37,7 @@
 import static com.android.compatibility.common.util.SystemUtil.eventually;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import static org.junit.Assert.assertEquals;
 
@@ -118,7 +119,8 @@
      * @param permName The permission that needs to be granted
      */
     private void assertPermissionGranted(@NonNull String permName) throws Exception {
-        eventually(() -> assertThat(isGranted(APP_PKG, permName)).named(permName + " is granted").isTrue());
+        eventually(() -> assertWithMessage(permName + " is granted").that(
+                isGranted(APP_PKG, permName)).isTrue());
     }
 
     /**
@@ -127,7 +129,7 @@
      * @param permName The permission that should not be granted
      */
     private void assertPermissionRevoked(@NonNull String permName) throws Exception {
-        assertThat(isGranted(APP_PKG, permName)).named(permName + " is granted").isFalse();
+        assertWithMessage(permName + " is granted").that(isGranted(APP_PKG, permName)).isFalse();
     }
 
     /**
@@ -477,8 +479,8 @@
 
         install(APK_LOCATION_BACKGROUND_29);
 
-        eventually(() -> assertThat(getAppOp(APP_PKG, ACCESS_COARSE_LOCATION)).named("foreground app-op")
-                .isEqualTo(MODE_FOREGROUND));
+        eventually(() -> assertWithMessage("foreground app-op").that(
+                getAppOp(APP_PKG, ACCESS_COARSE_LOCATION)).isEqualTo(MODE_FOREGROUND));
     }
 
     /**
diff --git a/tests/tests/permission/src/android/permission/cts/SplitPermissionsSystemTest.java b/tests/tests/permission/src/android/permission/cts/SplitPermissionsSystemTest.java
index 99fdadb..7de6be5 100755
--- a/tests/tests/permission/src/android/permission/cts/SplitPermissionsSystemTest.java
+++ b/tests/tests/permission/src/android/permission/cts/SplitPermissionsSystemTest.java
@@ -24,6 +24,7 @@
 import static android.Manifest.permission.READ_CONTACTS;
 import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
 import static android.Manifest.permission.READ_PHONE_STATE;
+import static android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE;
 import static android.Manifest.permission.WRITE_CALL_LOG;
 import static android.Manifest.permission.WRITE_CONTACTS;
 import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
@@ -56,10 +57,6 @@
 
     private static final int NO_TARGET = Build.VERSION_CODES.CUR_DEVELOPMENT + 1;
 
-    // Redefined here since it's only present in the system API surface.
-    private static final String READ_PRIVILEGED_PHONE_STATE =
-            "android.permission.READ_PRIVILEGED_PHONE_STATE";
-
     private List<SplitPermissionInfo> mSplitPermissions;
 
     @Before
diff --git a/tests/tests/permission/telephony/Android.bp b/tests/tests/permission/telephony/Android.bp
index c5388ea..89ca269 100644
--- a/tests/tests/permission/telephony/Android.bp
+++ b/tests/tests/permission/telephony/Android.bp
@@ -20,7 +20,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     // Include both the 32 and 64 bit versions
diff --git a/tests/tests/permission/telephony/src/android/permission/cts/telephony/TelephonyManagerPermissionTest.java b/tests/tests/permission/telephony/src/android/permission/cts/telephony/TelephonyManagerPermissionTest.java
index b13a00a..53fb783 100644
--- a/tests/tests/permission/telephony/src/android/permission/cts/telephony/TelephonyManagerPermissionTest.java
+++ b/tests/tests/permission/telephony/src/android/permission/cts/telephony/TelephonyManagerPermissionTest.java
@@ -181,25 +181,6 @@
         assertEquals(audioMode, mAudioManager.getMode());
     }
 
-    /**
-     * Verify that TelephonyManager.setDataEnabled requires Permission.
-     * <p>
-     * Requires Permission:
-     * {@link android.Manifest.permission#MODIFY_PHONE_STATE}.
-     */
-    @Test
-    public void testSetDataEnabled() {
-        if (!mHasTelephony) {
-            return;
-        }
-        try {
-            mTelephonyManager.setDataEnabled(false);
-            fail("Able to set data enabled");
-        } catch (SecurityException e) {
-            // expected
-        }
-    }
-
      /**
      * Tests that isManualNetworkSelectionAllowed requires permission
      * Expects a security exception since the caller does not have carrier privileges.
diff --git a/tests/tests/permission/testapps/RevokePermissionWhenRemoved/AdversarialPermissionDefinerApp/Android.bp b/tests/tests/permission/testapps/RevokePermissionWhenRemoved/AdversarialPermissionDefinerApp/Android.bp
index d0f09e3..cfb2836 100644
--- a/tests/tests/permission/testapps/RevokePermissionWhenRemoved/AdversarialPermissionDefinerApp/Android.bp
+++ b/tests/tests/permission/testapps/RevokePermissionWhenRemoved/AdversarialPermissionDefinerApp/Android.bp
@@ -20,7 +20,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "sts",
     ],
diff --git a/tests/tests/permission/testapps/RevokePermissionWhenRemoved/AdversarialPermissionUserApp/Android.bp b/tests/tests/permission/testapps/RevokePermissionWhenRemoved/AdversarialPermissionUserApp/Android.bp
index 0eeccc7..6915076 100644
--- a/tests/tests/permission/testapps/RevokePermissionWhenRemoved/AdversarialPermissionUserApp/Android.bp
+++ b/tests/tests/permission/testapps/RevokePermissionWhenRemoved/AdversarialPermissionUserApp/Android.bp
@@ -20,7 +20,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "sts",
     ],
diff --git a/tests/tests/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionDefinerApp/Android.bp b/tests/tests/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionDefinerApp/Android.bp
index 0679b6a..857e429 100644
--- a/tests/tests/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionDefinerApp/Android.bp
+++ b/tests/tests/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionDefinerApp/Android.bp
@@ -20,7 +20,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     certificate: ":cts-testkey1",
diff --git a/tests/tests/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionEscalatorApp/Android.bp b/tests/tests/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionEscalatorApp/Android.bp
index 3f560de..409b8f0 100644
--- a/tests/tests/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionEscalatorApp/Android.bp
+++ b/tests/tests/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionEscalatorApp/Android.bp
@@ -20,7 +20,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     certificate: ":cts-testkey1",
diff --git a/tests/tests/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionUserApp/Android.bp b/tests/tests/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionUserApp/Android.bp
index c75d64b..40343be 100644
--- a/tests/tests/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionUserApp/Android.bp
+++ b/tests/tests/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionUserApp/Android.bp
@@ -20,7 +20,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     certificate: ":cts-testkey2",
diff --git a/tests/tests/permission/testapps/RevokePermissionWhenRemoved/InstalltimePermissionUserApp/AndroidManifest.xml b/tests/tests/permission/testapps/RevokePermissionWhenRemoved/InstalltimePermissionUserApp/AndroidManifest.xml
new file mode 100644
index 0000000..7a0e405
--- /dev/null
+++ b/tests/tests/permission/testapps/RevokePermissionWhenRemoved/InstalltimePermissionUserApp/AndroidManifest.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2019 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.permission.cts.revokepermissionwhenremoved.installtimepermissionuserapp">
+
+    <uses-permission android:name="android.permission.cts.revokepermissionwhenremoved.TestInstalltimePermission" />
+
+    <application>
+    </application>
+</manifest>
diff --git a/tests/tests/permission/testapps/RevokePermissionWhenRemoved/RuntimePermissionDefinerApp/Android.bp b/tests/tests/permission/testapps/RevokePermissionWhenRemoved/RuntimePermissionDefinerApp/Android.bp
index dfe1440..0fc7142 100644
--- a/tests/tests/permission/testapps/RevokePermissionWhenRemoved/RuntimePermissionDefinerApp/Android.bp
+++ b/tests/tests/permission/testapps/RevokePermissionWhenRemoved/RuntimePermissionDefinerApp/Android.bp
@@ -20,7 +20,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     certificate: ":cts-testkey1",
diff --git a/tests/tests/permission/testapps/RevokePermissionWhenRemoved/RuntimePermissionUserApp/Android.bp b/tests/tests/permission/testapps/RevokePermissionWhenRemoved/RuntimePermissionUserApp/Android.bp
index 6fc9fbf..f076640 100644
--- a/tests/tests/permission/testapps/RevokePermissionWhenRemoved/RuntimePermissionUserApp/Android.bp
+++ b/tests/tests/permission/testapps/RevokePermissionWhenRemoved/RuntimePermissionUserApp/Android.bp
@@ -20,7 +20,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     certificate: ":cts-testkey2",
diff --git a/tests/tests/permission/testapps/RevokePermissionWhenRemoved/VictimPermissionDefinerApp/Android.bp b/tests/tests/permission/testapps/RevokePermissionWhenRemoved/VictimPermissionDefinerApp/Android.bp
index 4f2b93c..dc10abd 100644
--- a/tests/tests/permission/testapps/RevokePermissionWhenRemoved/VictimPermissionDefinerApp/Android.bp
+++ b/tests/tests/permission/testapps/RevokePermissionWhenRemoved/VictimPermissionDefinerApp/Android.bp
@@ -20,7 +20,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "sts",
     ],
diff --git a/tests/tests/permission2/Android.bp b/tests/tests/permission2/Android.bp
index 4b56651..37b9e94 100644
--- a/tests/tests/permission2/Android.bp
+++ b/tests/tests/permission2/Android.bp
@@ -20,10 +20,9 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     static_libs: [
         "androidx.test.core",
         "compatibility-device-util-axt",
diff --git a/tests/tests/permission2/AndroidManifest.xml b/tests/tests/permission2/AndroidManifest.xml
index 50dba1f..475499e 100755
--- a/tests/tests/permission2/AndroidManifest.xml
+++ b/tests/tests/permission2/AndroidManifest.xml
@@ -41,9 +41,6 @@
     <!--  need app that has CALL_PHONE but not PROCESS_OUTGOING_CALL -->
     <uses-permission android:name="android.permission.CALL_PHONE"/>
 
-
-    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
-
     <!-- need app that has RECORD_AUDIO but not CAPTURE_AUDIO_OUTPUT -->
     <uses-permission android:name="android.permission.RECORD_AUDIO"/>
 
diff --git a/tests/tests/permission2/res/raw/android_manifest.xml b/tests/tests/permission2/res/raw/android_manifest.xml
index 4acb83f..37805dc 100644
--- a/tests/tests/permission2/res/raw/android_manifest.xml
+++ b/tests/tests/permission2/res/raw/android_manifest.xml
@@ -504,6 +504,7 @@
     <protected-broadcast android:name="android.telecom.action.NUISANCE_CALL_STATUS_CHANGED" />
     <protected-broadcast android:name="android.telecom.action.PHONE_ACCOUNT_REGISTERED" />
     <protected-broadcast android:name="android.telecom.action.PHONE_ACCOUNT_UNREGISTERED" />
+    <protected-broadcast android:name="android.telecom.action.POST_CALL" />
     <protected-broadcast android:name="android.telecom.action.SHOW_MISSED_CALLS_NOTIFICATION" />
     <protected-broadcast android:name="android.telephony.action.CARRIER_CONFIG_CHANGED" />
     <protected-broadcast android:name="android.telephony.action.DEFAULT_SUBSCRIPTION_CHANGED" />
@@ -2171,6 +2172,11 @@
     <permission android:name="android.permission.BIND_INCALL_SERVICE"
         android:protectionLevel="signature|privileged" />
 
+    <!-- Allows to query ongoing call details and manage ongoing calls
+        <p>Protection level: signature|appop -->
+    <permission android:name="android.permission.MANAGE_ONGOING_CALLS"
+        android:protectionLevel="signature|appop" />
+
     <!-- Allows the app to request network scans from telephony.
          <p>Not for use by third-party applications.
          @SystemApi @hide-->
@@ -2661,6 +2667,14 @@
     <permission android:name="android.permission.SUGGEST_MANUAL_TIME_AND_ZONE"
         android:protectionLevel="signature" />
 
+    <!-- Allows applications like settings to manage configuration associated with automatic time
+         and time zone detection.
+         <p>Not for use by third-party applications.
+         @hide
+    -->
+    <permission android:name="android.permission.MANAGE_TIME_AND_ZONE_DETECTION"
+        android:protectionLevel="signature|privileged" />
+
     <!-- ==================================================== -->
     <!-- Permissions related to changing status bar   -->
     <!-- ==================================================== -->
@@ -3876,6 +3890,14 @@
     <permission android:name="android.permission.CONTROL_DISPLAY_BRIGHTNESS"
         android:protectionLevel="signature" />
 
+    <!-- Allows an application to override the display mode requests
+         so the app requested mode will be selected and user settings and display
+         policies will be ignored.
+         @hide
+         @TestApi -->
+    <permission android:name="android.permission.OVERRIDE_DISPLAY_MODE_REQUESTS"
+        android:protectionLevel="signature" />
+
     <!-- @SystemApi Allows an application to control VPN.
          <p>Not for use by third-party applications.</p>
          @hide -->
diff --git a/tests/tests/permission2/src/android/permission2/cts/PermissionPolicyTest.java b/tests/tests/permission2/src/android/permission2/cts/PermissionPolicyTest.java
index 1140cfb..bb48193 100644
--- a/tests/tests/permission2/src/android/permission2/cts/PermissionPolicyTest.java
+++ b/tests/tests/permission2/src/android/permission2/cts/PermissionPolicyTest.java
@@ -20,7 +20,7 @@
 import static android.content.pm.PermissionInfo.PROTECTION_MASK_BASE;
 import static android.os.Build.VERSION.SECURITY_PATCH;
 
-import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import android.content.Context;
 import android.content.pm.PackageInfo;
@@ -235,7 +235,7 @@
         }
 
         // Fail on any offending item
-        assertThat(offendingList).named("list of offending permissions").isEmpty();
+        assertWithMessage("list of offending permissions").that(offendingList).isEmpty();
     }
 
     private List<ExpectedPermissionInfo> loadExpectedPermissions(int resourceId) throws Exception {
diff --git a/tests/tests/permission2/src/android/permission2/cts/PrivappPermissionsTest.java b/tests/tests/permission2/src/android/permission2/cts/PrivappPermissionsTest.java
index 5743b27..5a11331 100755
--- a/tests/tests/permission2/src/android/permission2/cts/PrivappPermissionsTest.java
+++ b/tests/tests/permission2/src/android/permission2/cts/PrivappPermissionsTest.java
@@ -108,6 +108,12 @@
                 continue;
             }
 
+            // Exempt apk-in-apex as there is currently no way to get the PackageInfo of the
+            // preinstalled APK
+            if (pkg.applicationInfo.sourceDir.startsWith("/apex")) {
+                continue;
+            }
+
             PackageInfo factoryPkg = pm
                     .getPackageInfo(packageName, MATCH_FACTORY_ONLY | GET_PERMISSIONS
                         | MATCH_UNINSTALLED_PACKAGES);
diff --git a/tests/tests/permission2/src/android/permission2/cts/RestrictedPermissionsTest.java b/tests/tests/permission2/src/android/permission2/cts/RestrictedPermissionsTest.java
index b44cfcb..11e6121 100644
--- a/tests/tests/permission2/src/android/permission2/cts/RestrictedPermissionsTest.java
+++ b/tests/tests/permission2/src/android/permission2/cts/RestrictedPermissionsTest.java
@@ -26,6 +26,7 @@
 import static com.android.compatibility.common.util.SystemUtil.runShellCommand;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import static org.junit.Assert.fail;
 
@@ -490,7 +491,7 @@
     private void assertRestrictedPermissionWhitelisted(
             @NonNull Set<String> expectedWhitelistedPermissions) throws Exception {
         final PackageManager packageManager = getContext().getPackageManager();
-    eventually(() -> runWithShellPermissionIdentity(() -> {
+        eventually(() -> runWithShellPermissionIdentity(() -> {
             final AppOpsManager appOpsManager = getContext().getSystemService(AppOpsManager.class);
             final PackageInfo packageInfo = packageManager.getPackageInfo(PKG,
                     PackageManager.GET_PERMISSIONS);
@@ -502,7 +503,7 @@
                         | PackageManager.FLAG_PERMISSION_WHITELIST_UPGRADE);
 
             assertThat(whitelistedPermissions).isNotNull();
-            assertThat(whitelistedPermissions).named("Whitelisted permissions")
+            assertWithMessage("Whitelisted permissions").that(whitelistedPermissions)
                     .containsExactlyElementsIn(expectedWhitelistedPermissions);
 
             // Also assert that apps ops are properly set
@@ -540,8 +541,8 @@
                     }
                 }
 
-                assertThat(appOpsManager.unsafeCheckOpRawNoThrow(op,
-                        packageInfo.applicationInfo.uid, PKG)).named(op).isIn(possibleModes);
+                assertWithMessage(op).that(appOpsManager.unsafeCheckOpRawNoThrow(op,
+                        packageInfo.applicationInfo.uid, PKG)).isIn(possibleModes);
             }
         }));
     }
diff --git a/tests/tests/permission2/src/android/permission2/cts/RestrictedStoragePermissionSharedUidTest.java b/tests/tests/permission2/src/android/permission2/cts/RestrictedStoragePermissionSharedUidTest.java
index 044abe2..5fb56e8 100644
--- a/tests/tests/permission2/src/android/permission2/cts/RestrictedStoragePermissionSharedUidTest.java
+++ b/tests/tests/permission2/src/android/permission2/cts/RestrictedStoragePermissionSharedUidTest.java
@@ -28,7 +28,7 @@
 import static com.android.compatibility.common.util.SystemUtil.runShellCommand;
 import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
 
-import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import static java.lang.Integer.min;
 
@@ -99,8 +99,8 @@
          * @param expectGranted {@code true} if the permission is expected to be granted
          */
         void assertStoragePermGranted(boolean expectGranted) {
-            eventually(() -> assertThat(isGranted(mPkg, READ_EXTERNAL_STORAGE)).named(
-                    this + " read storage granted").isEqualTo(expectGranted));
+            eventually(() -> assertWithMessage(this + " read storage granted").that(
+                    isGranted(mPkg, READ_EXTERNAL_STORAGE)).isEqualTo(expectGranted));
         }
 
         /**
@@ -112,11 +112,13 @@
             eventually(() -> runWithShellPermissionIdentity(() -> {
                 int uid = sContext.getPackageManager().getPackageUid(mPkg, 0);
                 if (expectHasNotIsolatedStorage) {
-                    assertThat(sAppOpsManager.unsafeCheckOpRawNoThrow(OPSTR_LEGACY_STORAGE, uid,
-                            mPkg)).named(this + " legacy storage mode").isEqualTo(MODE_ALLOWED);
+                    assertWithMessage(this + " legacy storage mode").that(
+                            sAppOpsManager.unsafeCheckOpRawNoThrow(OPSTR_LEGACY_STORAGE, uid,
+                            mPkg)).isEqualTo(MODE_ALLOWED);
                 } else {
-                    assertThat(sAppOpsManager.unsafeCheckOpRawNoThrow(OPSTR_LEGACY_STORAGE, uid,
-                            mPkg)).named(this + " legacy storage mode").isNotEqualTo(MODE_ALLOWED);
+                    assertWithMessage(this + " legacy storage mode").that(
+                            sAppOpsManager.unsafeCheckOpRawNoThrow(OPSTR_LEGACY_STORAGE, uid,
+                            mPkg)).isNotEqualTo(MODE_ALLOWED);
                 }
             }));
         }
diff --git a/tests/tests/permission2/src/android/permission2/cts/RuntimePermissionProperties.kt b/tests/tests/permission2/src/android/permission2/cts/RuntimePermissionProperties.kt
index 26c6cc8..c54a96c 100644
--- a/tests/tests/permission2/src/android/permission2/cts/RuntimePermissionProperties.kt
+++ b/tests/tests/permission2/src/android/permission2/cts/RuntimePermissionProperties.kt
@@ -56,6 +56,7 @@
 import androidx.test.platform.app.InstrumentationRegistry
 import androidx.test.runner.AndroidJUnit4
 import com.google.common.truth.Truth.assertThat
+import com.google.common.truth.Truth.assertWithMessage
 import org.junit.Test
 import org.junit.runner.RunWith
 
@@ -75,14 +76,14 @@
             platformRuntimePerms.filter { !platformBgPermNames.contains(it.name) }
 
         for (perm in platformFgPerms) {
-            assertThat(permissionToOp(perm.name)).named("AppOp for ${perm.name}").isNotNull()
+            assertWithMessage("AppOp for ${perm.name}").that(permissionToOp(perm.name)).isNotNull()
         }
     }
 
     @Test
     fun groupOfRuntimePermissionsShouldBeUnknown() {
         for (perm in platformRuntimePerms) {
-            assertThat(perm.group).named("Group of ${perm.name}").isEqualTo(UNDEFINED)
+            assertWithMessage("Group of ${perm.name}").that(perm.group).isEqualTo(UNDEFINED)
         }
     }
 
@@ -96,7 +97,7 @@
                 }
 
         for (perm in platformAppOpPerms) {
-            assertThat(permissionToOp(perm.name)).named("AppOp for ${perm.name}").isNotNull()
+            assertWithMessage("AppOp for ${perm.name}").that(permissionToOp(perm.name)).isNotNull()
         }
     }
 
@@ -109,7 +110,7 @@
             platformRuntimePerms.filter { platformBgPermNames.contains(it.name) }
 
         for (perm in platformBgPerms) {
-            assertThat(permissionToOp(perm.name)).named("AppOp for ${perm.name}").isNull()
+            assertWithMessage("AppOp for ${perm.name}").that(permissionToOp(perm.name)).isNull()
         }
     }
 
diff --git a/tests/tests/permission3/Android.bp b/tests/tests/permission3/Android.bp
index abedeef..bdc5728 100644
--- a/tests/tests/permission3/Android.bp
+++ b/tests/tests/permission3/Android.bp
@@ -41,7 +41,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "mts",
     ],
diff --git a/tests/tests/preference/Android.bp b/tests/tests/preference/Android.bp
index 7ec19fc..4d99904 100644
--- a/tests/tests/preference/Android.bp
+++ b/tests/tests/preference/Android.bp
@@ -18,7 +18,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
@@ -31,8 +30,8 @@
     ],
 
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
 
     srcs: ["src/**/*.java"],
diff --git a/tests/tests/print/Android.bp b/tests/tests/print/Android.bp
index 0c1b40e..74afe97 100644
--- a/tests/tests/print/Android.bp
+++ b/tests/tests/print/Android.bp
@@ -18,7 +18,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src/**/*.java"],
diff --git a/tests/tests/print/ExternalPrintService/Android.bp b/tests/tests/print/ExternalPrintService/Android.bp
index eca73ff..8beddd5 100644
--- a/tests/tests/print/ExternalPrintService/Android.bp
+++ b/tests/tests/print/ExternalPrintService/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src/**/*.java"],
diff --git a/tests/tests/print/printTestUtilLib/src/android/print/test/BasePrintTest.java b/tests/tests/print/printTestUtilLib/src/android/print/test/BasePrintTest.java
index 3128b17..dd5e497 100755
--- a/tests/tests/print/printTestUtilLib/src/android/print/test/BasePrintTest.java
+++ b/tests/tests/print/printTestUtilLib/src/android/print/test/BasePrintTest.java
@@ -35,6 +35,7 @@
 
 import android.app.Activity;
 import android.app.Instrumentation;
+import android.app.UiAutomation;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -118,6 +119,7 @@
     private static final String COMMAND_PREFIX_DISABLE_IME = "ime disable ";
     private static final int CURRENT_USER_ID = -2; // Mirrors UserHandle.USER_CURRENT
     private static final String PRINTSPOOLER_PACKAGE = "com.android.printspooler";
+    private static final long GET_UIAUTOMATION_TIMEOUT_MS = 60000;
 
     private static final AtomicInteger sLastTestID = new AtomicInteger();
     private int mTestId;
@@ -150,7 +152,7 @@
     private static String[] getEnabledImes() throws IOException {
         List<String> imeList = new ArrayList<>();
 
-        ParcelFileDescriptor pfd = getInstrumentation().getUiAutomation()
+        ParcelFileDescriptor pfd = getUiAutomation()
                 .executeShellCommand(COMMAND_LIST_ENABLED_IME_COMPONENTS);
         try (BufferedReader reader = new BufferedReader(
                 new InputStreamReader(new FileInputStream(pfd.getFileDescriptor())))) {
@@ -187,6 +189,18 @@
         return InstrumentationRegistry.getInstrumentation();
     }
 
+    public static UiAutomation getUiAutomation() {
+        long start = SystemClock.uptimeMillis();
+        while (SystemClock.uptimeMillis() - start < GET_UIAUTOMATION_TIMEOUT_MS) {
+            UiAutomation ui = getInstrumentation().getUiAutomation();
+            if (ui != null) {
+                return ui;
+            }
+        }
+
+        throw new AssertionError("Failed to get UiAutomation");
+    }
+
     @BeforeClass
     public static void setUpClass() throws Exception {
         Log.d(LOG_TAG, "setUpClass()");
diff --git a/tests/tests/print/printTestUtilLib/src/android/print/test/Utils.java b/tests/tests/print/printTestUtilLib/src/android/print/test/Utils.java
index b7f9fe6..80fc907 100644
--- a/tests/tests/print/printTestUtilLib/src/android/print/test/Utils.java
+++ b/tests/tests/print/printTestUtilLib/src/android/print/test/Utils.java
@@ -16,7 +16,7 @@
 
 package android.print.test;
 
-import static android.print.test.BasePrintTest.getInstrumentation;
+import static android.print.test.BasePrintTest.getUiAutomation;
 
 import android.content.Context;
 import android.os.Handler;
@@ -170,7 +170,7 @@
      * Get the {@link PrintServiceDumpProto}
      */
     public static PrintServiceDumpProto getProtoDump() throws Exception {
-        ParcelFileDescriptor pfd = getInstrumentation().getUiAutomation()
+        ParcelFileDescriptor pfd = getUiAutomation()
                 .executeShellCommand("dumpsys print --proto");
 
         try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
diff --git a/tests/tests/proto/Android.bp b/tests/tests/proto/Android.bp
index 703eb1a..88dd506 100644
--- a/tests/tests/proto/Android.bp
+++ b/tests/tests/proto/Android.bp
@@ -25,11 +25,10 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     //sdl_version: "current",
     platform_apis: true,
-    libs: ["android.test.runner.stubs"],
+    libs: ["android.test.runner"],
     static_libs: ["ctstestrunner-axt"],
 }
diff --git a/tests/tests/provider/Android.bp b/tests/tests/provider/Android.bp
index 4c797d0..3d4c84c 100644
--- a/tests/tests/provider/Android.bp
+++ b/tests/tests/provider/Android.bp
@@ -7,20 +7,17 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
     libs: [
         "android.test.mock",
-        "android.test.base.stubs",
-        "android.test.runner.stubs",
+        "android.test.base",
+        "android.test.runner",
         "telephony-common",
     ],
 
     static_libs: [
-        "androidx.slice_slice-core",
-        "androidx.slice_slice-view",
         "compatibility-device-util-axt",
         "ctstestrunner-axt",
         "junit",
@@ -45,3 +42,9 @@
 
     data: [":CtsProviderGalleryTestApp"],
 }
+
+filegroup {
+    name: "CtsProviderTestUtils",
+    srcs: ["src/android/provider/cts/ProviderTestUtils.java",
+           "src/android/provider/cts/media/MediaStoreUtils.java"],
+}
diff --git a/tests/tests/provider/AndroidManifest.xml b/tests/tests/provider/AndroidManifest.xml
index 84d2528..a4f55b3 100644
--- a/tests/tests/provider/AndroidManifest.xml
+++ b/tests/tests/provider/AndroidManifest.xml
@@ -46,8 +46,6 @@
     <uses-permission android:name="android.permission.READ_CONTACTS" />
     <uses-permission android:name="android.permission.READ_SMS" />
     <uses-permission android:name="android.permission.WRITE_SMS" />
-    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
-    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
 
     <application>
         <uses-library android:name="android.test.runner"/>
diff --git a/tests/tests/provider/OWNERS b/tests/tests/provider/OWNERS
index ed13f6f..5861cd2 100644
--- a/tests/tests/provider/OWNERS
+++ b/tests/tests/provider/OWNERS
@@ -1,9 +1,9 @@
-# Bug component: 1344
+# Bug component: 655625
+nandana@google.com
+zezeozue@google.com
 jsharkey@android.com
-omakoto@google.com
-yamasani@google.com
+corinac@google.com
 tgunn@google.com
 nicksauer@google.com
 nona@google.com
-nandana@google.com
-zezeozue@google.com
+omakoto@google.com
diff --git a/tests/tests/provider/preconditions/Android.bp b/tests/tests/provider/preconditions/Android.bp
index 31247b0..2f2dfae 100644
--- a/tests/tests/provider/preconditions/Android.bp
+++ b/tests/tests/provider/preconditions/Android.bp
@@ -9,7 +9,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     host_supported: true,
diff --git a/tests/tests/provider/src/android/provider/cts/ProviderTestUtils.java b/tests/tests/provider/src/android/provider/cts/ProviderTestUtils.java
index 942d4f4..e24c3e1 100644
--- a/tests/tests/provider/src/android/provider/cts/ProviderTestUtils.java
+++ b/tests/tests/provider/src/android/provider/cts/ProviderTestUtils.java
@@ -73,6 +73,7 @@
 import java.security.MessageDigest;
 import java.util.HashSet;
 import java.util.Objects;
+import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -94,8 +95,16 @@
     public static Iterable<String> getSharedVolumeNames() {
         // We test both new and legacy volume names
         final HashSet<String> testVolumes = new HashSet<>();
-        testVolumes.addAll(
-                MediaStore.getExternalVolumeNames(InstrumentationRegistry.getTargetContext()));
+        final Set<String> volumeNames = MediaStore.getExternalVolumeNames(
+                InstrumentationRegistry.getTargetContext());
+        // Run tests only on VISIBLE volumes which are FUSE mounted and indexed by MediaProvider
+        for (String vol : volumeNames) {
+            final File mountedPath = getVolumePath(vol);
+            if (mountedPath == null || mountedPath.getAbsolutePath() == null) continue;
+            if (mountedPath.getAbsolutePath().startsWith("/storage/")) {
+                testVolumes.add(vol);
+            }
+        }
         testVolumes.add(MediaStore.VOLUME_EXTERNAL);
         return testVolumes;
     }
diff --git a/tests/tests/provider/src/android/provider/cts/SettingsPanelTest.java b/tests/tests/provider/src/android/provider/cts/SettingsPanelTest.java
index c3c2cad..e842917 100644
--- a/tests/tests/provider/src/android/provider/cts/SettingsPanelTest.java
+++ b/tests/tests/provider/src/android/provider/cts/SettingsPanelTest.java
@@ -56,13 +56,6 @@
     private static final String RESOURCE_DONE = "done";
     private static final String RESOURCE_SEE_MORE = "see_more";
     private static final String RESOURCE_TITLE = "panel_title";
-    private static final String RESOURCE_HEADER = "header_title";
-    private static final String TEST_PACKAGE_NAME = "test_package_name";
-    private static final String MEDIA_OUTPUT_TITLE_NAME = "Media";
-    private static final String ACTION_MEDIA_OUTPUT =
-            "com.android.settings.panel.action.MEDIA_OUTPUT";
-    private static final String EXTRA_PACKAGE_NAME =
-            "com.android.settings.panel.extra.PACKAGE_NAME";
 
     private String mSettingsPackage;
     private String mLauncherPackage;
@@ -133,28 +126,6 @@
     }
 
     @Test
-    public void mediaOutputPanel_withPackageNameExtra_correctPackage() {
-        assumeTrue(mHasTouchScreen);
-        assumeTrue(mHasBluetooth);
-        launchMediaOutputPanel(TEST_PACKAGE_NAME);
-
-        String currentPackage = mDevice.getCurrentPackageName();
-
-        assertThat(currentPackage).isEqualTo(mSettingsPackage);
-    }
-
-    @Test
-    public void mediaOutputPanel_noPutPackageNameExtra_correctPackage() {
-        assumeTrue(mHasTouchScreen);
-        assumeTrue(mHasBluetooth);
-        launchMediaOutputPanel(null /* packageName */);
-
-        String currentPackage = mDevice.getCurrentPackageName();
-
-        assertThat(currentPackage).isEqualTo(mSettingsPackage);
-    }
-
-    @Test
     public void wifiPanel_correctPackage() {
         launchWifiPanel();
 
@@ -164,16 +135,6 @@
     }
 
     @Test
-    public void mediaOutputPanel_correctTitle() {
-        assumeTrue(mHasTouchScreen);
-        assumeTrue(mHasBluetooth);
-        launchMediaOutputPanel(TEST_PACKAGE_NAME);
-
-        final UiObject2 titleView = mDevice.findObject(By.res(mSettingsPackage, RESOURCE_HEADER));
-
-        assertThat(titleView.getText()).isEqualTo(MEDIA_OUTPUT_TITLE_NAME);
-    }
-    @Test
     public void internetPanel_doneClosesPanel() {
         // Launch panel
         launchInternetPanel();
@@ -235,24 +196,6 @@
     }
 
     @Test
-    public void mediaOutputPanel_doneClosesPanel() {
-        assumeTrue(mHasTouchScreen);
-        assumeTrue(mHasBluetooth);
-        // Launch panel
-        launchMediaOutputPanel(TEST_PACKAGE_NAME);
-        String currentPackage = mDevice.getCurrentPackageName();
-        assertThat(currentPackage).isEqualTo(mSettingsPackage);
-
-        // Click the done button
-        mDevice.findObject(By.res(currentPackage, RESOURCE_DONE)).click();
-        mDevice.wait(Until.hasObject(By.pkg(mLauncherPackage).depth(0)), TIMEOUT);
-
-        // Assert that we have left the panel
-        currentPackage = mDevice.getCurrentPackageName();
-        assertThat(currentPackage).isNotEqualTo(mSettingsPackage);
-    }
-
-    @Test
     public void internetPanel_seeMoreButton_launchesIntoSettings() {
         // Launch panel
         launchInternetPanel();
@@ -318,28 +261,10 @@
         assumeTrue(mHasTouchScreen);
         pressSeeMore();
 
-        // Assert that we're still in Settings, on a different page.
-        currentPackage = mDevice.getCurrentPackageName();
-        assertThat(currentPackage).isEqualTo(mSettingsPackage);
         UiObject2 titleView = mDevice.findObject(By.res(mSettingsPackage, RESOURCE_TITLE));
         assertThat(titleView).isNull();
     }
 
-    @Test
-    public void mediaOutputPanel_seeMoreButton_doNothing() {
-        assumeTrue(mHasTouchScreen);
-        assumeTrue(mHasBluetooth);
-        // Launch panel
-        launchMediaOutputPanel(TEST_PACKAGE_NAME);
-        String currentPackage = mDevice.getCurrentPackageName();
-        assertThat(currentPackage).isEqualTo(mSettingsPackage);
-
-        // Find the see more button
-        // SeeMoreIntent is null in MediaOutputPanel, so the see more button will not visible.
-        UiObject2 seeMoreView = mDevice.findObject(By.res(mSettingsPackage, RESOURCE_SEE_MORE));
-        assertThat(seeMoreView).isNull();
-    }
-
     private void launchVolumePanel() {
         launchPanel(Settings.Panel.ACTION_VOLUME);
     }
@@ -348,10 +273,6 @@
         launchPanel(Settings.Panel.ACTION_INTERNET_CONNECTIVITY);
     }
 
-    private void launchMediaOutputPanel(String packageName) {
-        launchPanel(ACTION_MEDIA_OUTPUT, packageName);
-    }
-
     private void launchNfcPanel() {
         assumeTrue(mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC));
         launchPanel(Settings.Panel.ACTION_NFC);
@@ -363,10 +284,6 @@
     }
 
     private void launchPanel(String action) {
-        launchPanel(action,  null /* packageName */);
-    }
-
-    private void launchPanel(String action, String packageName) {
         // Start from the home screen
         mDevice.pressHome();
         mDevice.wait(Until.hasObject(By.pkg(mLauncherPackage).depth(0)), TIMEOUT);
@@ -374,7 +291,6 @@
         Intent intent = new Intent(action);
         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                 | Intent.FLAG_ACTIVITY_CLEAR_TASK);    // Clear out any previous instances
-        intent.putExtra(EXTRA_PACKAGE_NAME, packageName);
         mContext.startActivity(intent);
 
         // Wait for the app to appear
diff --git a/tests/tests/provider/src/android/provider/cts/WifiSliceTest.java b/tests/tests/provider/src/android/provider/cts/WifiSliceTest.java
deleted file mode 100644
index da5c713..0000000
--- a/tests/tests/provider/src/android/provider/cts/WifiSliceTest.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (C) 2019 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.provider.cts;
-
-import static android.content.pm.PackageManager.PERMISSION_GRANTED;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assume.assumeFalse;
-
-import android.app.slice.Slice;
-import android.app.slice.SliceManager;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.ResolveInfo;
-import android.net.Uri;
-import android.os.Process;
-
-import android.net.wifi.WifiManager;
-import android.util.Log;
-
-import androidx.slice.SliceConvert;
-import androidx.slice.SliceMetadata;
-import androidx.slice.core.SliceAction;
-import androidx.test.InstrumentationRegistry;
-import androidx.test.runner.AndroidJUnit4;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class WifiSliceTest {
-  private static final String TAG = "WifiSliceTest";
-
-  private static final Uri WIFI_SLICE_URI =
-          Uri.parse("content://android.settings.slices/action/wifi");
-
-  private static final String ACTION_ASSIST = "android.intent.action.ASSIST";
-  private static final String ACTION_VOICE_ASSIST = "android.intent.action.VOICE_ASSIST";
-  private static final String CATEGORY_DEFAULT = "android.intent.category.DEFAULT";
-  private static final String FEATURE_VOICE_RECOGNIZERS = "android.software.voice_recognizers";
-
-  private final Context mContext = InstrumentationRegistry.getContext();
-  private final SliceManager mSliceManager = mContext.getSystemService(SliceManager.class);
-  private final boolean mHasVoiceRecognizersFeature =
-          mContext.getPackageManager().hasSystemFeature(FEATURE_VOICE_RECOGNIZERS);
-
-  private Slice mWifiSlice;
-
-  @Before
-  public void setUp() throws Exception {
-    assumeFalse("Skipping test: Auto does not support provider android.settings.slices", isCar());
-    assumeFalse("Skipping test: TV does not support provider android.settings.slices", isTv());
-    mWifiSlice = mSliceManager.bindSlice(WIFI_SLICE_URI, Collections.emptySet());
-  }
-
-  @Test
-  public void wifiSliceToggle_changeWifiState() {
-    SliceMetadata mWifiSliceMetadata =
-            SliceMetadata.from(mContext, SliceConvert.wrap(mWifiSlice, mContext));
-    List<SliceAction> wifiSliceActions = mWifiSliceMetadata.getToggles();
-    if (wifiSliceActions.size() != 0) {
-      SliceAction toggleAction = wifiSliceActions.get(0);
-
-      toggleAction.setChecked(true);
-      assertThat(toggleAction.isChecked()).isEqualTo(isWifiEnabled());
-
-      toggleAction.setChecked(false);
-      assertThat(toggleAction.isChecked()).isEqualTo(isWifiEnabled());
-    }
-  }
-
-  @Test
-  public void wifiSlice_hasCorrectUri() {
-    assertThat(mWifiSlice.getUri()).isEqualTo(WIFI_SLICE_URI);
-  }
-
-  @Test
-  public void wifiSlice_grantedPermissionToDefaultAssistant() throws NameNotFoundException {
-    if (!mHasVoiceRecognizersFeature) {
-      Log.i(TAG, "The device doesn't support feature: " + FEATURE_VOICE_RECOGNIZERS);
-      return;
-    }
-    final PackageManager pm = mContext.getPackageManager();
-    final Intent requestDefaultAssistant =
-            new Intent(ACTION_ASSIST).addCategory(CATEGORY_DEFAULT);
-
-    final ResolveInfo info = pm.resolveActivity(requestDefaultAssistant, 0);
-
-    if (info != null) {
-      final int testPid = Process.myPid();
-      final int testUid = pm.getPackageUid(info.activityInfo.packageName,  0);
-
-      assertThat(mSliceManager.checkSlicePermission(WIFI_SLICE_URI, testPid, testUid))
-              .isEqualTo(PERMISSION_GRANTED);
-    }
-  }
-
-  @Test
-  public void wifiSlice_grantedPermissionToDefaultVoiceAssistant() throws NameNotFoundException {
-    if (!mHasVoiceRecognizersFeature) {
-      Log.i(TAG, "The device doesn't support feature: " + FEATURE_VOICE_RECOGNIZERS);
-      return;
-    }
-    final PackageManager pm = mContext.getPackageManager();
-    final Intent requestDefaultAssistant =
-            new Intent(ACTION_VOICE_ASSIST).addCategory(CATEGORY_DEFAULT);
-
-    final ResolveInfo info = pm.resolveActivity(requestDefaultAssistant, 0);
-
-    if (info != null) {
-      final int testPid = Process.myPid();
-      final int testUid = pm.getPackageUid(info.activityInfo.packageName,  0);
-
-      assertThat(mSliceManager.checkSlicePermission(WIFI_SLICE_URI, testPid, testUid))
-              .isEqualTo(PERMISSION_GRANTED);
-    }
-  }
-
-  private boolean isCar() {
-    PackageManager pm = mContext.getPackageManager();
-    return pm.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE);
-  }
-
-  private boolean isTv() {
-    PackageManager pm = mContext.getPackageManager();
-    return pm.hasSystemFeature(PackageManager.FEATURE_TELEVISION)
-            && pm.hasSystemFeature(PackageManager.FEATURE_LEANBACK);
-  }
-
-  private boolean isWifiEnabled() {
-    final WifiManager wifiManager = mContext.getSystemService(WifiManager.class);
-    return wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLED
-            || wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING;
-  }
-
-}
diff --git a/tests/tests/provider/src/android/provider/cts/media/MediaStoreNotificationTest.java b/tests/tests/provider/src/android/provider/cts/media/MediaStoreNotificationTest.java
index 3bb3ca3..797fd14 100644
--- a/tests/tests/provider/src/android/provider/cts/media/MediaStoreNotificationTest.java
+++ b/tests/tests/provider/src/android/provider/cts/media/MediaStoreNotificationTest.java
@@ -28,6 +28,7 @@
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.provider.MediaStore;
+import android.provider.cts.ProviderTestUtils;
 import android.util.Log;
 
 import androidx.test.InstrumentationRegistry;
@@ -58,7 +59,7 @@
 
     @Parameters
     public static Iterable<? extends Object> data() {
-        return MediaStore.getExternalVolumeNames(InstrumentationRegistry.getTargetContext());
+        return ProviderTestUtils.getSharedVolumeNames();
     }
 
     @Before
diff --git a/tests/tests/provider/src/android/provider/cts/media/MediaStore_Images_MediaTest.java b/tests/tests/provider/src/android/provider/cts/media/MediaStore_Images_MediaTest.java
index 1d18a8a..67b233d 100644
--- a/tests/tests/provider/src/android/provider/cts/media/MediaStore_Images_MediaTest.java
+++ b/tests/tests/provider/src/android/provider/cts/media/MediaStore_Images_MediaTest.java
@@ -77,6 +77,7 @@
     private ContentResolver mContentResolver;
 
     private Uri mExternalImages;
+    private Uri mExternalFiles;
 
     @Parameter(0)
     public String mVolumeName;
@@ -93,6 +94,7 @@
 
         Log.d(TAG, "Using volume " + mVolumeName);
         mExternalImages = MediaStore.Images.Media.getContentUri(mVolumeName);
+        mExternalFiles = MediaStore.Files.getContentUri(mVolumeName);
     }
 
     @Test
@@ -298,7 +300,7 @@
     @Test
     public void testUpdateAndReplace() throws Exception {
         File dir = mContext.getSystemService(StorageManager.class)
-                .getStorageVolume(mExternalImages).getDirectory();
+                .getStorageVolume(mExternalFiles).getDirectory();
         File dcimDir = new File(dir, Environment.DIRECTORY_DCIM);
         File file = null;
         try {
@@ -335,7 +337,7 @@
     @Test
     public void testUpsert() throws Exception {
         File dir = mContext.getSystemService(StorageManager.class)
-                .getStorageVolume(mExternalImages).getDirectory();
+                .getStorageVolume(mExternalFiles).getDirectory();
         File dcimDir = new File(dir, Environment.DIRECTORY_DCIM);
         File file = null;
         try {
diff --git a/tests/tests/provider/src/android/provider/cts/media/MediaStore_Images_ThumbnailsTest.java b/tests/tests/provider/src/android/provider/cts/media/MediaStore_Images_ThumbnailsTest.java
index 479c3ab..11a0e66 100644
--- a/tests/tests/provider/src/android/provider/cts/media/MediaStore_Images_ThumbnailsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/media/MediaStore_Images_ThumbnailsTest.java
@@ -17,8 +17,6 @@
 package android.provider.cts.media;
 
 import static android.provider.cts.ProviderTestUtils.assertColorMostlyEquals;
-import static android.provider.cts.ProviderTestUtils.assertExists;
-import static android.provider.cts.ProviderTestUtils.assertNotExists;
 import static android.provider.cts.ProviderTestUtils.extractAverageColor;
 import static android.provider.cts.media.MediaStoreTest.TAG;
 
@@ -51,6 +49,9 @@
 import android.provider.cts.R;
 import android.provider.cts.media.MediaStoreUtils.PendingParams;
 import android.provider.cts.media.MediaStoreUtils.PendingSession;
+import android.system.ErrnoException;
+import android.system.Os;
+import android.system.OsConstants;
 import android.util.DisplayMetrics;
 import android.util.Log;
 import android.util.Size;
@@ -69,6 +70,7 @@
 
 import java.io.File;
 import java.io.FileNotFoundException;
+import java.io.IOException;
 import java.io.OutputStream;
 import java.util.ArrayList;
 
@@ -211,7 +213,7 @@
         c.close();
 
         ProviderTestUtils.waitForIdle();
-        assertExists("image file does not exist", imagePath);
+        assertFileExists(imagePath);
         assertNotNull(Thumbnails.getThumbnail(resolver, imageId, Thumbnails.MINI_KIND, null));
         assertNotNull(Thumbnails.getThumbnail(resolver, imageId, Thumbnails.MICRO_KIND, null));
 
@@ -222,7 +224,7 @@
         mRowsAdded.remove(stringUri);
 
         ProviderTestUtils.waitForIdle();
-        assertNotExists("image file should no longer exist", imagePath);
+        assertFileNotExists(imagePath);
         assertNull(Thumbnails.getThumbnail(resolver, imageId, Thumbnails.MINI_KIND, null));
         assertNull(Thumbnails.getThumbnail(resolver, imageId, Thumbnails.MICRO_KIND, null));
 
@@ -234,10 +236,10 @@
         imageId = c.getLong(c.getColumnIndex(Media._ID));
         imagePath = c.getString(c.getColumnIndex(Media.DATA));
         c.close();
-        assertExists("image file does not exist", imagePath);
+        assertFileExists(imagePath);
         Uri fileuri = MediaStore.Files.getContentUri("external", imageId);
         mContentResolver.delete(fileuri, null, null);
-        assertNotExists("image file should no longer exist", imagePath);
+        assertFileNotExists(imagePath);
     }
 
     @Test
@@ -503,4 +505,26 @@
         bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
     }
 
+    private static void assertFileExists(String path) throws Exception {
+        try {
+            Os.access(path, OsConstants.F_OK);
+        } catch (ErrnoException e) {
+            if (e.errno == OsConstants.ENOENT) {
+                fail("File " + path + " doesn't exist.");
+            } else {
+                throw e;
+            }
+        }
+    }
+
+    private static void assertFileNotExists(String path) throws Exception {
+        try {
+            Os.access(path, OsConstants.F_OK);
+            fail("File " + path + " exists.");
+        } catch (ErrnoException e) {
+            if (e.errno != OsConstants.ENOENT) {
+                throw e;
+            }
+        }
+    }
 }
diff --git a/tests/tests/renderscript/Android.mk b/tests/tests/renderscript/Android.mk
index f313550..bf121c2 100644
--- a/tests/tests/renderscript/Android.mk
+++ b/tests/tests/renderscript/Android.mk
@@ -41,7 +41,7 @@
 LOCAL_SDK_VERSION := current
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 include $(BUILD_CTS_PACKAGE)
 include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TestCtxDim.rscript b/tests/tests/renderscript/src/android/renderscript/cts/TestCtxDim.rscript
index 3530f1c..24cd1e6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TestCtxDim.rscript
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TestCtxDim.rscript
@@ -22,7 +22,7 @@
 int gDimX, gDimY, gDimZ;
 static bool failed = false;
 
-void __attribute__((kernel)) check_kernel(int32_t in /* dummy */, rs_kernel_context context) {
+void __attribute__((kernel)) check_kernel(int32_t unused, rs_kernel_context context) {
     uint32_t dimX = rsGetDimX(context);
     _RS_ASSERT(gDimX == dimX);
     uint32_t dimY = rsGetDimY(context);
diff --git a/tests/tests/renderscriptlegacy/Android.mk b/tests/tests/renderscriptlegacy/Android.mk
index 7d7ebb7..98df8e9 100644
--- a/tests/tests/renderscriptlegacy/Android.mk
+++ b/tests/tests/renderscriptlegacy/Android.mk
@@ -31,6 +31,6 @@
 LOCAL_SDK_VERSION := 19
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/renderscriptlegacy/AndroidTest.xml b/tests/tests/renderscriptlegacy/AndroidTest.xml
index 33dff52..43fa7ee 100644
--- a/tests/tests/renderscriptlegacy/AndroidTest.xml
+++ b/tests/tests/renderscriptlegacy/AndroidTest.xml
@@ -19,6 +19,11 @@
     <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
     <option name="config-descriptor:metadata" key="parameter" value="multi_abi" />
     <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
+    <!-- The test can only run on 32 bit abi  -->
+    <object type="module_controller" class="com.android.tradefed.testtype.suite.module.ArchModuleController">
+        <option name="arch" value="x86" />
+        <option name="arch" value="arm" />
+    </object>
     <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
         <option name="cleanup-apks" value="true" />
         <option name="test-file-name" value="CtsRenderscriptLegacyTestCases.apk" />
diff --git a/tests/tests/resolverservice/Android.bp b/tests/tests/resolverservice/Android.bp
index 648e5df..af92ff1 100644
--- a/tests/tests/resolverservice/Android.bp
+++ b/tests/tests/resolverservice/Android.bp
@@ -28,7 +28,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ]
 }
diff --git a/tests/tests/resourcesloader/Android.bp b/tests/tests/resourcesloader/Android.bp
index 3debbda..07c0517 100644
--- a/tests/tests/resourcesloader/Android.bp
+++ b/tests/tests/resourcesloader/Android.bp
@@ -21,15 +21,14 @@
     test_suites: [
         "cts",
         "vts",
-        "vts10",
         "general-tests",
     ],
     srcs: [
         "src/**/*.kt"
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs"
+        "android.test.runner",
+        "android.test.base"
     ],
     static_libs: [
         "CtsResourcesLoaderTests_Providers",
diff --git a/tests/tests/role/Android.bp b/tests/tests/role/Android.bp
index bb35032..6604415 100644
--- a/tests/tests/role/Android.bp
+++ b/tests/tests/role/Android.bp
@@ -30,7 +30,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "mts",
     ],
diff --git a/tests/tests/rsblas/Android.mk b/tests/tests/rsblas/Android.mk
index 88aa75a..6b18c5d 100644
--- a/tests/tests/rsblas/Android.mk
+++ b/tests/tests/rsblas/Android.mk
@@ -36,7 +36,7 @@
 LOCAL_RENDERSCRIPT_FLAGS := -Wno-error=deprecated-declarations
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_SDK_VERSION := current
 
diff --git a/tests/tests/rsblas/libbnnmdata/Android.bp b/tests/tests/rsblas/libbnnmdata/Android.bp
index ec6a524..f9ffb54 100644
--- a/tests/tests/rsblas/libbnnmdata/Android.bp
+++ b/tests/tests/rsblas/libbnnmdata/Android.bp
@@ -22,4 +22,5 @@
         "-Werror",
         "-Wno-unused-const-variable",
     ],
+    header_libs: ["jni_headers"]
 }
diff --git a/tests/tests/rscpp/Android.mk b/tests/tests/rscpp/Android.mk
index e598a69..79e8a2c 100644
--- a/tests/tests/rscpp/Android.mk
+++ b/tests/tests/rscpp/Android.mk
@@ -37,7 +37,7 @@
 LOCAL_SDK_VERSION := current
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 include $(BUILD_CTS_PACKAGE)
 include $(LOCAL_PATH)/librscpptest/Android.mk
diff --git a/tests/tests/rscpp/librscpptest/Android.mk b/tests/tests/rscpp/librscpptest/Android.mk
index 0084d82..f9370cc 100644
--- a/tests/tests/rscpp/librscpptest/Android.mk
+++ b/tests/tests/rscpp/librscpptest/Android.mk
@@ -40,12 +40,12 @@
     noroot.rscript \
     vector.rscript
 
-LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
 LOCAL_C_INCLUDES += frameworks/rs/cpp
 LOCAL_C_INCLUDES += frameworks/rs
 
 LOCAL_CFLAGS := -Wall -Werror -Wno-unused-parameter
 
+LOCAL_HEADER_LIBRARIES := jni_headers
 LOCAL_SHARED_LIBRARIES := libdl liblog
 LOCAL_STATIC_LIBRARIES := libRScpp_static
 
diff --git a/tests/tests/sax/Android.bp b/tests/tests/sax/Android.bp
index 2d86164..8a1a30a 100644
--- a/tests/tests/sax/Android.bp
+++ b/tests/tests/sax/Android.bp
@@ -16,13 +16,12 @@
     name: "CtsSaxTestCases",
     defaults: ["cts_defaults"],
     static_libs: ["ctstestrunner-axt"],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: ["src/**/*.java"],
     sdk_version: "current",
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/secure_element/access_control/AccessControlApp1/Android.bp b/tests/tests/secure_element/access_control/AccessControlApp1/Android.bp
index 5c400a8..fc241b3 100644
--- a/tests/tests/secure_element/access_control/AccessControlApp1/Android.bp
+++ b/tests/tests/secure_element/access_control/AccessControlApp1/Android.bp
@@ -7,9 +7,7 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
-        "cts-instant",
     ],
     // Make sure the build system doesn't try to resign the APK
     presigned: true,
@@ -36,7 +34,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     dist: {
diff --git a/tests/tests/secure_element/access_control/AccessControlApp1/AndroidTest.xml b/tests/tests/secure_element/access_control/AccessControlApp1/AndroidTest.xml
index ea9476a..e93d5fa 100644
--- a/tests/tests/secure_element/access_control/AccessControlApp1/AndroidTest.xml
+++ b/tests/tests/secure_element/access_control/AccessControlApp1/AndroidTest.xml
@@ -17,7 +17,7 @@
     <option name="test-suite-tag" value="cts"/>
     <option name="config-descriptor:metadata" key="component" value="systems"/>
     <option name="config-descriptor:metadata" key="token" value="SECURE_ELEMENT_SIM_CARD" />
-    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
+    <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
     <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
     <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
     <option name="not-shardable" value="true" />
diff --git a/tests/tests/secure_element/access_control/AccessControlApp2/Android.bp b/tests/tests/secure_element/access_control/AccessControlApp2/Android.bp
index dfb270b..1582a1c 100644
--- a/tests/tests/secure_element/access_control/AccessControlApp2/Android.bp
+++ b/tests/tests/secure_element/access_control/AccessControlApp2/Android.bp
@@ -7,9 +7,7 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
-        "cts-instant",
     ],
     // Make sure the build system doesn't try to resign the APK
     presigned: true,
@@ -36,7 +34,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     dist: {
diff --git a/tests/tests/secure_element/access_control/AccessControlApp2/AndroidTest.xml b/tests/tests/secure_element/access_control/AccessControlApp2/AndroidTest.xml
index 72c6240..45be09b 100644
--- a/tests/tests/secure_element/access_control/AccessControlApp2/AndroidTest.xml
+++ b/tests/tests/secure_element/access_control/AccessControlApp2/AndroidTest.xml
@@ -17,7 +17,7 @@
     <option name="test-suite-tag" value="cts"/>
     <option name="config-descriptor:metadata" key="component" value="systems"/>
     <option name="config-descriptor:metadata" key="token" value="SECURE_ELEMENT_SIM_CARD" />
-    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
+    <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
     <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
     <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
     <option name="not-shardable" value="true" />
diff --git a/tests/tests/secure_element/access_control/AccessControlApp3/Android.bp b/tests/tests/secure_element/access_control/AccessControlApp3/Android.bp
index 4219345..7ae3cf6 100644
--- a/tests/tests/secure_element/access_control/AccessControlApp3/Android.bp
+++ b/tests/tests/secure_element/access_control/AccessControlApp3/Android.bp
@@ -7,9 +7,7 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
-        "cts-instant",
     ],
     // Make sure the build system doesn't try to resign the APK
     presigned: true,
@@ -36,7 +34,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     dist: {
diff --git a/tests/tests/secure_element/access_control/AccessControlApp3/AndroidTest.xml b/tests/tests/secure_element/access_control/AccessControlApp3/AndroidTest.xml
index 6ab45da..9561daf 100644
--- a/tests/tests/secure_element/access_control/AccessControlApp3/AndroidTest.xml
+++ b/tests/tests/secure_element/access_control/AccessControlApp3/AndroidTest.xml
@@ -17,7 +17,7 @@
     <option name="test-suite-tag" value="cts"/>
     <option name="config-descriptor:metadata" key="component" value="systems"/>
     <option name="config-descriptor:metadata" key="token" value="SECURE_ELEMENT_SIM_CARD" />
-    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
+    <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
     <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
     <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
     <option name="not-shardable" value="true" />
diff --git a/tests/tests/secure_element/omapi/Android.bp b/tests/tests/secure_element/omapi/Android.bp
index d1e0dab..cd6362b 100644
--- a/tests/tests/secure_element/omapi/Android.bp
+++ b/tests/tests/secure_element/omapi/Android.bp
@@ -21,9 +21,7 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
-        "cts-instant",
     ],
     // Make sure the build system doesn't try to resign the APK
     presigned: true,
@@ -51,7 +49,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     dist: {
diff --git a/tests/tests/secure_element/omapi/AndroidTest.xml b/tests/tests/secure_element/omapi/AndroidTest.xml
index b3e6291..948c3ee 100644
--- a/tests/tests/secure_element/omapi/AndroidTest.xml
+++ b/tests/tests/secure_element/omapi/AndroidTest.xml
@@ -17,7 +17,7 @@
     <option name="test-suite-tag" value="cts"/>
     <option name="config-descriptor:metadata" key="component" value="systems"/>
     <option name="config-descriptor:metadata" key="token" value="SECURE_ELEMENT_SIM_CARD" />
-    <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
+    <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
     <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
     <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
     <option name="not-shardable" value="true" />
diff --git a/tests/tests/security/Android.bp b/tests/tests/security/Android.bp
index 41d9fad..18a1754 100644
--- a/tests/tests/security/Android.bp
+++ b/tests/tests/security/Android.bp
@@ -29,9 +29,9 @@
         "platform-test-annotations",
     ],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     java_resources: [
         ":PackageInstallerTestApp",
@@ -59,7 +59,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "sts",
     ],
@@ -75,4 +74,4 @@
 android_app_certificate {
     name: "security_cts_test_certificate",
     certificate: "security_cts_test_cert",
-}
\ No newline at end of file
+}
diff --git a/tests/tests/security/native/encryption/Android.bp b/tests/tests/security/native/encryption/Android.bp
index f07d905..b6b9d27 100644
--- a/tests/tests/security/native/encryption/Android.bp
+++ b/tests/tests/security/native/encryption/Android.bp
@@ -21,5 +21,6 @@
     },
     test_suites: [
         "cts",
+        "general-tests",
     ],
 }
diff --git a/tests/tests/security/src/android/security/cts/EncryptionTest.java b/tests/tests/security/src/android/security/cts/EncryptionTest.java
index 15a7081..52e4064 100644
--- a/tests/tests/security/src/android/security/cts/EncryptionTest.java
+++ b/tests/tests/security/src/android/security/cts/EncryptionTest.java
@@ -17,6 +17,7 @@
 package android.security.cts;
 
 import com.android.compatibility.common.util.CddTest;
+import com.android.compatibility.common.util.FeatureUtil;
 import com.android.compatibility.common.util.PropertyUtil;
 
 import android.platform.test.annotations.AppModeFull;
@@ -33,25 +34,23 @@
         System.loadLibrary("ctssecurity_jni");
     }
 
-    private static final int MIN_ENCRYPTION_REQUIRED_API_LEVEL = 23;
-
-    // First API level where there are no speed exemptions.
-    private static final int MIN_ALL_SPEEDS_API_LEVEL = Build.VERSION_CODES.Q;
-
-    // First API level at which file based encryption must be used.
-    private static final int MIN_FBE_REQUIRED_API_LEVEL = Build.VERSION_CODES.Q;
-
     private static final String TAG = "EncryptionTest";
 
     private static native boolean aesIsFast();
 
     private void handleUnencryptedDevice() {
-        if (PropertyUtil.getFirstApiLevel() < MIN_ENCRYPTION_REQUIRED_API_LEVEL) {
+        // Prior to Android M, encryption wasn't required at all.
+        if (PropertyUtil.getFirstApiLevel() < Build.VERSION_CODES.M) {
             Log.d(TAG, "Exempt from encryption due to an old starting API level.");
             return;
         }
-        // In older API levels, we grant an exemption if AES is not fast enough.
-        if (PropertyUtil.getFirstApiLevel() < MIN_ALL_SPEEDS_API_LEVEL) {
+        // Prior to Android Q, encryption wasn't required if AES performance is
+        // too low or if the device is "typically shared (e.g. Television)".
+        if (PropertyUtil.getFirstApiLevel() < Build.VERSION_CODES.Q) {
+            if (FeatureUtil.isTV()) {
+                Log.d(TAG, "Exempt from encryption because because device is TV.");
+                return;
+            }
             // Note: aesIsFast() takes ~2 second to run, so it's worth rearranging
             //     test logic to delay calling this.
             if (!aesIsFast()) {
@@ -71,7 +70,9 @@
             // CtsNativeEncryptionTestCases.
             return;
         }
-        if (PropertyUtil.getFirstApiLevel() < MIN_FBE_REQUIRED_API_LEVEL) {
+        // Prior to Android Q, file-based encryption wasn't required
+        // (full-disk encryption was also allowed).
+        if (PropertyUtil.getFirstApiLevel() < Build.VERSION_CODES.Q) {
             Log.d(TAG, "Device is encrypted.");
             return;
         }
diff --git a/tests/tests/security/src/android/security/cts/HwRngTest.java b/tests/tests/security/src/android/security/cts/HwRngTest.java
index bb1d5d9..175b305 100644
--- a/tests/tests/security/src/android/security/cts/HwRngTest.java
+++ b/tests/tests/security/src/android/security/cts/HwRngTest.java
@@ -83,7 +83,7 @@
             return;
         }
 
-        // Sanity check based on https://www.kernel.org/doc/Documentation/hw_random.txt.
+        // Quick check based on https://www.kernel.org/doc/Documentation/hw_random.txt.
 
         // In short, assert that:
         // 1. hwrng kernel driver is using MAJOR 10 and MINOR 183,
diff --git a/tests/tests/selinux/selinuxEphemeral/Android.bp b/tests/tests/selinux/selinuxEphemeral/Android.bp
index ef16d48..b1299d2 100644
--- a/tests/tests/selinux/selinuxEphemeral/Android.bp
+++ b/tests/tests/selinux/selinuxEphemeral/Android.bp
@@ -22,8 +22,8 @@
         "compatibility-device-util-axt",
     ],
     libs: [
-        "android.test.base.stubs",
-        "android.test.runner.stubs",
+        "android.test.base",
+        "android.test.runner",
     ],
     jni_libs: [
         "libbase",
@@ -44,7 +44,6 @@
     platform_apis: true,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     min_sdk_version: "21",
diff --git a/tests/tests/selinux/selinuxTargetSdk25/Android.bp b/tests/tests/selinux/selinuxTargetSdk25/Android.bp
index ca25f89..3021200 100644
--- a/tests/tests/selinux/selinuxTargetSdk25/Android.bp
+++ b/tests/tests/selinux/selinuxTargetSdk25/Android.bp
@@ -22,8 +22,8 @@
         "compatibility-device-util-axt",
     ],
     libs: [
-        "android.test.base.stubs",
-        "android.test.runner.stubs",
+        "android.test.base",
+        "android.test.runner",
     ],
     jni_libs: [
         "libbase",
@@ -44,7 +44,6 @@
     platform_apis: true,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     min_sdk_version: "21",
diff --git a/tests/tests/selinux/selinuxTargetSdk27/Android.bp b/tests/tests/selinux/selinuxTargetSdk27/Android.bp
index 9344cc6..269b574 100644
--- a/tests/tests/selinux/selinuxTargetSdk27/Android.bp
+++ b/tests/tests/selinux/selinuxTargetSdk27/Android.bp
@@ -22,8 +22,8 @@
         "compatibility-device-util-axt",
     ],
     libs: [
-        "android.test.base.stubs",
-        "android.test.runner.stubs",
+        "android.test.base",
+        "android.test.runner",
     ],
     jni_libs: [
         "libbase",
@@ -44,7 +44,6 @@
     platform_apis: true,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     min_sdk_version: "21",
diff --git a/tests/tests/selinux/selinuxTargetSdk28/Android.bp b/tests/tests/selinux/selinuxTargetSdk28/Android.bp
index a68900c..f2dddbc 100644
--- a/tests/tests/selinux/selinuxTargetSdk28/Android.bp
+++ b/tests/tests/selinux/selinuxTargetSdk28/Android.bp
@@ -22,8 +22,8 @@
         "compatibility-device-util-axt",
     ],
     libs: [
-        "android.test.base.stubs",
-        "android.test.runner.stubs",
+        "android.test.base",
+        "android.test.runner",
     ],
     jni_libs: [
         "libbase",
@@ -44,7 +44,6 @@
     platform_apis: true,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     min_sdk_version: "21",
diff --git a/tests/tests/selinux/selinuxTargetSdk29/Android.bp b/tests/tests/selinux/selinuxTargetSdk29/Android.bp
index a203473..5307277 100644
--- a/tests/tests/selinux/selinuxTargetSdk29/Android.bp
+++ b/tests/tests/selinux/selinuxTargetSdk29/Android.bp
@@ -22,8 +22,8 @@
         "compatibility-device-util-axt",
     ],
     libs: [
-        "android.test.base.stubs",
-        "android.test.runner.stubs",
+        "android.test.base",
+        "android.test.runner",
     ],
     jni_libs: [
         "libbase",
@@ -44,7 +44,6 @@
     platform_apis: true,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     min_sdk_version: "21",
diff --git a/tests/tests/selinux/selinuxTargetSdkCurrent/Android.bp b/tests/tests/selinux/selinuxTargetSdkCurrent/Android.bp
index 648aa7c..e192e84 100644
--- a/tests/tests/selinux/selinuxTargetSdkCurrent/Android.bp
+++ b/tests/tests/selinux/selinuxTargetSdkCurrent/Android.bp
@@ -22,8 +22,8 @@
         "compatibility-device-util-axt",
     ],
     libs: [
-        "android.test.base.stubs",
-        "android.test.runner.stubs",
+        "android.test.base",
+        "android.test.runner",
     ],
     jni_libs: [
         "libbase",
@@ -44,7 +44,6 @@
     platform_apis: true,
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     min_sdk_version: "21",
diff --git a/tests/tests/settings/Android.bp b/tests/tests/settings/Android.bp
new file mode 100644
index 0000000..b55ecaa
--- /dev/null
+++ b/tests/tests/settings/Android.bp
@@ -0,0 +1,24 @@
+
+android_test {
+    name: "CtsSettingsTestCases",
+    defaults: ["cts_defaults"],
+
+    test_suites: [
+        "cts",
+        "general-tests",
+    ],
+
+    libs: ["android.test.runner"],
+
+    static_libs: [
+        "androidx.slice_slice-core",
+        "androidx.slice_slice-view",
+        "ctstestrunner-axt",
+        "junit",
+        "truth-prebuilt",
+    ],
+
+    srcs: ["src/**/*.java"],
+
+    sdk_version: "test_current",
+}
diff --git a/tests/tests/settings/AndroidManifest.xml b/tests/tests/settings/AndroidManifest.xml
new file mode 100644
index 0000000..925e357
--- /dev/null
+++ b/tests/tests/settings/AndroidManifest.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2020 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.settings.cts">
+
+    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
+
+    <application>
+        <uses-library android:name="android.test.runner"/>
+    </application>
+
+    <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
+         android:targetPackage="android.settings.cts"
+         android:label="CTS tests of android Settings app">
+        <meta-data android:name="listener"
+             android:value="com.android.cts.runner.CtsTestRunListener"/>
+    </instrumentation>
+</manifest>
diff --git a/tests/tests/settings/AndroidTest.xml b/tests/tests/settings/AndroidTest.xml
new file mode 100644
index 0000000..5f220f3
--- /dev/null
+++ b/tests/tests/settings/AndroidTest.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+<configuration description="Config for CTS Settings test cases">
+    <option name="test-suite-tag" value="cts" />
+
+    <option name="config-descriptor:metadata" key="component" value="framework" />
+    <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
+    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
+    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
+
+    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
+        <option name="cleanup-apks" value="true" />
+        <option name="test-file-name" value="CtsSettingsTestCases.apk" />
+    </target_preparer>
+    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
+        <option name="package" value="android.settings.cts" />
+    </test>
+</configuration>
diff --git a/tests/tests/settings/OWNERS b/tests/tests/settings/OWNERS
new file mode 100644
index 0000000..c5f7090
--- /dev/null
+++ b/tests/tests/settings/OWNERS
@@ -0,0 +1,3 @@
+# Bug component: 27091
+tmfang@google.com
+chiujason@google.com
diff --git a/tests/tests/settings/src/android/settings/cts/WifiSliceTest.java b/tests/tests/settings/src/android/settings/cts/WifiSliceTest.java
new file mode 100644
index 0000000..26d78a5
--- /dev/null
+++ b/tests/tests/settings/src/android/settings/cts/WifiSliceTest.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2020 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.settings.cts;
+
+import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.provider.Settings.Secure;
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assume.assumeFalse;
+
+import android.app.slice.Slice;
+import android.app.slice.SliceManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.ResolveInfo;
+import android.net.Uri;
+import android.net.wifi.WifiManager;
+import android.os.Process;
+import android.text.TextUtils;
+import android.util.Log;
+
+import androidx.slice.SliceConvert;
+import androidx.slice.SliceMetadata;
+import androidx.slice.core.SliceAction;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Collections;
+import java.util.List;
+
+@RunWith(AndroidJUnit4.class)
+public class WifiSliceTest {
+  private static final String TAG = "WifiSliceTest";
+
+  private static final Uri WIFI_SLICE_URI =
+          Uri.parse("content://android.settings.slices/action/wifi");
+
+  private static final String ACTION_ASSIST = "android.intent.action.ASSIST";
+  private static final String ACTION_VOICE_ASSIST = "android.intent.action.VOICE_ASSIST";
+  private static final String CATEGORY_DEFAULT = "android.intent.category.DEFAULT";
+  private static final String FEATURE_VOICE_RECOGNIZERS = "android.software.voice_recognizers";
+  private static final String ASSISTANT = "assistant";
+
+  private final Context mContext = InstrumentationRegistry.getContext();
+  private final SliceManager mSliceManager = mContext.getSystemService(SliceManager.class);
+  private final boolean mHasVoiceRecognizersFeature =
+          mContext.getPackageManager().hasSystemFeature(FEATURE_VOICE_RECOGNIZERS);
+
+  private Slice mWifiSlice;
+  private String mAssistant;
+
+  @Before
+  public void setUp() throws Exception {
+    assumeFalse("Skipping test: Auto does not support provider android.settings.slices", isCar());
+    assumeFalse("Skipping test: TV does not support provider android.settings.slices", isTv());
+    mWifiSlice = mSliceManager.bindSlice(WIFI_SLICE_URI, Collections.emptySet());
+    mAssistant = Secure.getString(mContext.getContentResolver(), ASSISTANT);
+  }
+
+  @After
+  public void tearDown() {
+    final String assistant = Secure.getString(mContext.getContentResolver(), ASSISTANT);
+    if (!TextUtils.equals(mAssistant, assistant)) {
+      Secure.putString(mContext.getContentResolver(), ASSISTANT, mAssistant);
+    }
+  }
+
+  @Test
+  public void wifiSliceToggle_changeWifiState() {
+    SliceMetadata mWifiSliceMetadata =
+            SliceMetadata.from(mContext, SliceConvert.wrap(mWifiSlice, mContext));
+    List<SliceAction> wifiSliceActions = mWifiSliceMetadata.getToggles();
+    if (wifiSliceActions.size() != 0) {
+      SliceAction toggleAction = wifiSliceActions.get(0);
+
+      toggleAction.setChecked(true);
+      assertThat(toggleAction.isChecked()).isEqualTo(isWifiEnabled());
+
+      toggleAction.setChecked(false);
+      assertThat(toggleAction.isChecked()).isEqualTo(isWifiEnabled());
+    }
+  }
+
+  @Test
+  public void wifiSlice_hasCorrectUri() {
+    assertThat(mWifiSlice.getUri()).isEqualTo(WIFI_SLICE_URI);
+  }
+
+  @Test
+  public void wifiSlice_grantedPermissionToDefaultAssistant() throws NameNotFoundException {
+    if (!mHasVoiceRecognizersFeature) {
+      Log.i(TAG, "The device doesn't support feature: " + FEATURE_VOICE_RECOGNIZERS);
+      return;
+    }
+    final PackageManager pm = mContext.getPackageManager();
+    final Intent requestDefaultAssistant =
+            new Intent(ACTION_ASSIST).addCategory(CATEGORY_DEFAULT);
+
+    final List<ResolveInfo> infos = pm.queryIntentActivities(requestDefaultAssistant, 0);
+
+    if (!infos.isEmpty()) {
+      final String packageName;
+      if (!TextUtils.isEmpty(mAssistant)) {
+        packageName = ComponentName.unflattenFromString(mAssistant).getPackageName();
+        Log.i(TAG, "Default assistant: " + packageName);
+      } else {
+        packageName = infos.get(0).activityInfo.packageName;
+        Log.i(TAG, "Set assistant: " + packageName);
+        Secure.putString(mContext.getContentResolver(), ASSISTANT,
+                new ComponentName(packageName, infos.get(0).activityInfo.name).flattenToString());
+      }
+      final int testPid = Process.myPid();
+      final int testUid = pm.getPackageUid(packageName, 0);
+
+      assertThat(mSliceManager.checkSlicePermission(WIFI_SLICE_URI, testPid, testUid))
+              .isEqualTo(PERMISSION_GRANTED);
+    }
+  }
+
+  @Test
+  public void wifiSlice_grantedPermissionToDefaultVoiceAssistant() throws NameNotFoundException {
+    if (!mHasVoiceRecognizersFeature) {
+      Log.i(TAG, "The device doesn't support feature: " + FEATURE_VOICE_RECOGNIZERS);
+      return;
+    }
+    final PackageManager pm = mContext.getPackageManager();
+    final Intent requestDefaultAssistant =
+            new Intent(ACTION_VOICE_ASSIST).addCategory(CATEGORY_DEFAULT);
+
+    final ResolveInfo info = pm.resolveActivity(requestDefaultAssistant, 0);
+
+    if (info != null) {
+      final int testPid = Process.myPid();
+      final int testUid = pm.getPackageUid(info.activityInfo.packageName, 0);
+
+      assertThat(mSliceManager.checkSlicePermission(WIFI_SLICE_URI, testPid, testUid))
+              .isEqualTo(PERMISSION_GRANTED);
+    }
+  }
+
+  private boolean isCar() {
+    PackageManager pm = mContext.getPackageManager();
+    return pm.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE);
+  }
+
+  private boolean isTv() {
+    PackageManager pm = mContext.getPackageManager();
+    return pm.hasSystemFeature(PackageManager.FEATURE_TELEVISION)
+            && pm.hasSystemFeature(PackageManager.FEATURE_LEANBACK);
+  }
+
+  private boolean isWifiEnabled() {
+    final WifiManager wifiManager = mContext.getSystemService(WifiManager.class);
+    return wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLED
+            || wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING;
+  }
+
+}
diff --git a/tests/tests/sharesheet/Android.bp b/tests/tests/sharesheet/Android.bp
index 5eee18b..5832998 100644
--- a/tests/tests/sharesheet/Android.bp
+++ b/tests/tests/sharesheet/Android.bp
@@ -18,7 +18,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
@@ -30,8 +29,8 @@
     ],
 
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
 
     srcs: ["src/**/*.java"],
diff --git a/tests/tests/sharesheet/packages/Android.bp b/tests/tests/sharesheet/packages/Android.bp
index cf56e40..bb2f804 100644
--- a/tests/tests/sharesheet/packages/Android.bp
+++ b/tests/tests/sharesheet/packages/Android.bp
@@ -19,7 +19,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     aaptflags: [
@@ -36,7 +35,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     aaptflags: [
@@ -53,7 +51,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     aaptflags: [
diff --git a/tests/tests/shortcutmanager/Android.bp b/tests/tests/shortcutmanager/Android.bp
index 5867354..2c7667c 100644
--- a/tests/tests/shortcutmanager/Android.bp
+++ b/tests/tests/shortcutmanager/Android.bp
@@ -19,13 +19,12 @@
         "CtsShortcutManagerDefaults",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
@@ -41,7 +40,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     aaptflags: [
@@ -62,7 +60,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     aaptflags: [
@@ -83,7 +80,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     aaptflags: [
@@ -103,7 +99,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     aaptflags: [
@@ -123,7 +118,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     aaptflags: [
@@ -145,7 +139,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     aaptflags: [
@@ -167,7 +160,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     aaptflags: [
@@ -188,7 +180,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     aaptflags: [
@@ -207,7 +198,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["throttling/src/**/*.java"],
diff --git a/tests/tests/simpleperf/Android.mk b/tests/tests/simpleperf/Android.mk
index fc4a584..7cae376 100644
--- a/tests/tests/simpleperf/Android.mk
+++ b/tests/tests/simpleperf/Android.mk
@@ -19,7 +19,7 @@
   libsimpleperf_etm_decoder \
   libbacktrace \
   libunwindstack \
-  libdexfile_support_static \
+  libdexfile_external_static \
   libziparchive \
   libz \
   libgtest \
@@ -38,13 +38,14 @@
   libprotobuf-cpp-lite \
   libevent \
   libopencsd_decoder \
+  libc++fs \
 
 simpleperf_testdata_files := $(shell cd $(simpleperf_src_path); find testdata -type f)
 
 LOCAL_COMPATIBILITY_SUPPORT_FILES := \
   $(foreach file, $(simpleperf_testdata_files), $(simpleperf_src_path)/$(file):CtsSimpleperfTestCases_$(file))
 
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_CTS_TEST_PACKAGE := android.simpleperf
 include $(LLVM_DEVICE_BUILD_MK)
diff --git a/tests/tests/simpleperf/AndroidTest.xml b/tests/tests/simpleperf/AndroidTest.xml
index 73e1568..cfafd8e 100644
--- a/tests/tests/simpleperf/AndroidTest.xml
+++ b/tests/tests/simpleperf/AndroidTest.xml
@@ -18,7 +18,7 @@
     <option name="config-descriptor:metadata" key="component" value="bionic" />
     <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
     <option name="config-descriptor:metadata" key="parameter" value="multi_abi" />
-    <option name="config-descriptor:metadata" key="parameter" value="not_secondary_user" />
+    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
     <target_preparer class="com.android.tradefed.targetprep.SwitchUserTargetPreparer">
         <option name="user-type" value="system" />
     </target_preparer>
diff --git a/tests/tests/simpleperf/CtsSimpleperfDebuggableApp/Android.bp b/tests/tests/simpleperf/CtsSimpleperfDebuggableApp/Android.bp
index 48fc889..c53723b 100644
--- a/tests/tests/simpleperf/CtsSimpleperfDebuggableApp/Android.bp
+++ b/tests/tests/simpleperf/CtsSimpleperfDebuggableApp/Android.bp
@@ -20,7 +20,6 @@
     sdk_version: "current",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/simpleperf/CtsSimpleperfProfileableApp/Android.bp b/tests/tests/simpleperf/CtsSimpleperfProfileableApp/Android.bp
index e29cbe4..babe753 100644
--- a/tests/tests/simpleperf/CtsSimpleperfProfileableApp/Android.bp
+++ b/tests/tests/simpleperf/CtsSimpleperfProfileableApp/Android.bp
@@ -20,7 +20,6 @@
     sdk_version: "current",
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/slice/Android.bp b/tests/tests/slice/Android.bp
index 2fc8f01..718b1d0 100644
--- a/tests/tests/slice/Android.bp
+++ b/tests/tests/slice/Android.bp
@@ -19,10 +19,9 @@
     test_suites: [
         "cts",
         "sts",
-        "vts10",
         "general-tests",
     ],
-    libs: ["android.test.runner.stubs"],
+    libs: ["android.test.runner"],
     static_libs: [
         "androidx.test.rules",
         "compatibility-device-util-axt",
diff --git a/tests/tests/slice/src/android/slice/cts/SliceBindingTest.java b/tests/tests/slice/src/android/slice/cts/SliceBindingTest.java
index 710ac94..35b4f70 100644
--- a/tests/tests/slice/src/android/slice/cts/SliceBindingTest.java
+++ b/tests/tests/slice/src/android/slice/cts/SliceBindingTest.java
@@ -18,6 +18,7 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeFalse;
 
 import android.app.PendingIntent.CanceledException;
 import android.app.slice.Slice;
@@ -59,9 +60,7 @@
 
     @Test
     public void testProcess() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         sFlag = false;
         mSliceManager.bindSlice(BASE_URI.buildUpon().appendPath("set_flag").build(),
                 Collections.emptySet());
@@ -76,9 +75,7 @@
 
     @Test
     public void testSliceUri() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         Slice s = mSliceManager.bindSlice(BASE_URI,
                 Collections.emptySet());
         assertEquals(BASE_URI, s.getUri());
@@ -86,9 +83,7 @@
 
     @Test
     public void testSubSlice() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         Uri uri = BASE_URI.buildUpon().appendPath("subslice").build();
         Slice s = mSliceManager.bindSlice(uri, Collections.emptySet());
         assertEquals(uri, s.getUri());
@@ -104,9 +99,7 @@
 
     @Test
     public void testText() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         Uri uri = BASE_URI.buildUpon().appendPath("text").build();
         Slice s = mSliceManager.bindSlice(uri,
                 Collections.emptySet());
@@ -121,9 +114,7 @@
 
     @Test
     public void testIcon() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         Uri uri = BASE_URI.buildUpon().appendPath("icon").build();
         Slice s = mSliceManager.bindSlice(uri,
                 Collections.emptySet());
@@ -138,9 +129,7 @@
 
     @Test
     public void testAction() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         sFlag = false;
         CountDownLatch latch = new CountDownLatch(1);
         BroadcastReceiver receiver = new BroadcastReceiver() {
@@ -175,9 +164,7 @@
 
     @Test
     public void testInt() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         Uri uri = BASE_URI.buildUpon().appendPath("int").build();
         Slice s = mSliceManager.bindSlice(uri, Collections.emptySet());
         assertEquals(uri, s.getUri());
@@ -190,9 +177,7 @@
 
     @Test
     public void testTimestamp() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         Uri uri = BASE_URI.buildUpon().appendPath("timestamp").build();
         Slice s = mSliceManager.bindSlice(uri,
                 Collections.emptySet());
@@ -206,9 +191,7 @@
 
     @Test
     public void testHints() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         // Note this tests that hints are propagated through to the client but not that any specific
         // hints have any effects.
         Uri uri = BASE_URI.buildUpon().appendPath("hints").build();
@@ -223,9 +206,7 @@
 
     @Test
     public void testHasHints() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         Uri uri = BASE_URI.buildUpon().appendPath("hints").build();
         Slice s = mSliceManager.bindSlice(uri, Collections.emptySet());
 
@@ -235,9 +216,7 @@
 
     @Test
     public void testBundle() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         Uri uri = BASE_URI.buildUpon().appendPath("bundle").build();
         Slice s = mSliceManager.bindSlice(uri, Collections.emptySet());
         assertEquals(uri, s.getUri());
@@ -252,9 +231,7 @@
 
     @Test
     public void testGetDescendants() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         Collection<Uri> allUris = mSliceManager.getSliceDescendants(BASE_URI);
         assertEquals(SliceProvider.PATHS.length, allUris.size());
         Iterator<Uri> it = allUris.iterator();
@@ -268,9 +245,7 @@
 
     @Test
     public void testGetSliceSpec() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         Uri uri = BASE_URI.buildUpon().appendPath("spec").build();
         Slice s = mSliceManager.bindSlice(uri, Collections.emptySet());
         assertEquals(new SliceSpec(SliceProvider.SPEC_TYPE, SliceProvider.SPEC_REV), s.getSpec());
diff --git a/tests/tests/slice/src/android/slice/cts/SliceManagerTest.java b/tests/tests/slice/src/android/slice/cts/SliceManagerTest.java
index 1e5c718..135c67a 100644
--- a/tests/tests/slice/src/android/slice/cts/SliceManagerTest.java
+++ b/tests/tests/slice/src/android/slice/cts/SliceManagerTest.java
@@ -16,6 +16,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeFalse;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
@@ -60,9 +61,7 @@
 
     @Before
     public void setup() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         LocalSliceProvider.sProxy = mock(SliceProvider.class);
         try {
             mSliceManager.unpinSlice(BASE_URI);
@@ -83,9 +82,7 @@
 
     @Test
     public void testPinSlice() throws Exception {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         mSliceManager.pinSlice(BASE_URI, Collections.emptySet());
 
         verify(LocalSliceProvider.sProxy, timeout(2000)).onSlicePinned(eq(BASE_URI));
@@ -93,9 +90,7 @@
 
     @Test
     public void testUnpinSlice() throws Exception {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         mSliceManager.pinSlice(BASE_URI, Collections.emptySet());
 
         verify(LocalSliceProvider.sProxy, timeout(2000)).onSlicePinned(eq(BASE_URI));
@@ -107,9 +102,7 @@
 
     @Test
     public void testPinList() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         Uri uri = BASE_URI;
         Uri longerUri = uri.buildUpon().appendPath("something").build();
         try {
@@ -129,9 +122,7 @@
 
     @Test
     public void testMapIntentToUri() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         Intent intent = new Intent("android.slice.cts.action.TEST_ACTION");
         intent.setPackage("android.slice.cts");
         intent.putExtra("path", "intent");
@@ -148,9 +139,7 @@
 
     @Test
     public void testOnCreatePermissionSlice() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         LocalSliceProvider.sAnswer = invocation -> {
             throw new SecurityException("No slices allowed");
         };
diff --git a/tests/tests/slice/src/android/slice/cts/SlicePermissionsTest.java b/tests/tests/slice/src/android/slice/cts/SlicePermissionsTest.java
index c36e7c9..c3cf011 100644
--- a/tests/tests/slice/src/android/slice/cts/SlicePermissionsTest.java
+++ b/tests/tests/slice/src/android/slice/cts/SlicePermissionsTest.java
@@ -19,6 +19,7 @@
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assume.assumeFalse;
 
 import android.app.slice.SliceManager;
 import android.content.Context;
@@ -47,9 +48,7 @@
 
     @Before
     public void setup() throws NameNotFoundException {
-        if(isSliceDisabled) {
-          return;
-        }
+        assumeFalse(isSliceDisabled);
         mSliceManager = mContext.getSystemService(SliceManager.class);
         mTestPkg = mContext.getPackageName();
         mTestUid = mContext.getPackageManager().getPackageUid(mTestPkg, 0);
@@ -66,9 +65,7 @@
 
     @Test
     public void testGrant() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         assertEquals(PERMISSION_DENIED,
                 mSliceManager.checkSlicePermission(BASE_URI, mTestPid, mTestUid));
 
@@ -80,9 +77,7 @@
 
     @Test
     public void testGrantParent() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         Uri uri = BASE_URI.buildUpon()
                 .appendPath("something")
                 .build();
@@ -98,9 +93,7 @@
 
     @Test
     public void testGrantParentExpands() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         Uri uri = BASE_URI.buildUpon()
                 .appendPath("something")
                 .build();
@@ -127,9 +120,7 @@
 
     @Test
     public void testGrantChild() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         Uri uri = BASE_URI.buildUpon()
                 .appendPath("something")
                 .build();
@@ -146,9 +137,7 @@
 
     @Test
     public void testRevoke() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         assertEquals(PERMISSION_DENIED,
                 mSliceManager.checkSlicePermission(BASE_URI, mTestPid, mTestUid));
 
@@ -165,9 +154,7 @@
 
     @Test
     public void testRevokeParent() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         Uri uri = BASE_URI.buildUpon()
                 .appendPath("something")
                 .build();
@@ -188,9 +175,7 @@
 
     @Test
     public void testRevokeChild() {
-        if (isSliceDisabled) {
-            return;
-        }
+        assumeFalse(isSliceDisabled);
         Uri uri = BASE_URI.buildUpon()
                 .appendPath("something")
                 .build();
diff --git a/tests/tests/slice/src/android/slice/cts/SliceProviderTest.java b/tests/tests/slice/src/android/slice/cts/SliceProviderTest.java
index 2a2e8e4..664b4fd 100644
--- a/tests/tests/slice/src/android/slice/cts/SliceProviderTest.java
+++ b/tests/tests/slice/src/android/slice/cts/SliceProviderTest.java
@@ -16,6 +16,10 @@
 
 package android.slice.cts;
 
+import android.content.pm.PackageManager;
+import androidx.test.InstrumentationRegistry;
+import android.content.Context;
+
 import android.app.slice.Slice;
 import android.app.slice.SliceSpec;
 import android.content.ContentResolver;
@@ -32,6 +36,8 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import static org.junit.Assume.assumeFalse;
+
 @RunWith(AndroidJUnit4.class)
 public class SliceProviderTest {
 
@@ -43,6 +49,8 @@
             "content://" + VALID_AUTHORITY + ACTION_BLUETOOTH;
     private static final String SHADY_ACTION_URI_STRING =
             "content://" + SUSPICIOUS_AUTHORITY + ACTION_BLUETOOTH;
+    private final Context mContext = InstrumentationRegistry.getContext();
+    private boolean isSliceDisabled = mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_SLICES_DISABLED);
 
     @Rule
     public ActivityTestRule<Launcher> mLauncherActivityTestRule = new ActivityTestRule<>(Launcher.class);
@@ -60,11 +68,13 @@
 
     @Test
     public void testCallSliceUri_ValidAuthority() {
+        assumeFalse(isSliceDisabled);
         doQuery(validActionUri);
     }
 
     @Test(expected = SecurityException.class)
     public void testCallSliceUri_ShadyAuthority() {
+        assumeFalse(isSliceDisabled);
         doQuery(shadyActionUri);
     }
 
diff --git a/tests/tests/slice/src/android/slice/cts/SliceProviderTest.kt b/tests/tests/slice/src/android/slice/cts/SliceProviderTest.kt
index 5e7f940..e2fd053 100644
--- a/tests/tests/slice/src/android/slice/cts/SliceProviderTest.kt
+++ b/tests/tests/slice/src/android/slice/cts/SliceProviderTest.kt
@@ -17,6 +17,7 @@
 import android.app.slice.Slice
 import android.app.slice.SliceSpec
 import android.content.ContentResolver
+import android.content.pm.PackageManager
 import android.net.Uri
 import android.os.Bundle
 
@@ -24,6 +25,7 @@
 import androidx.test.rule.ActivityTestRule
 import androidx.test.runner.AndroidJUnit4
 import org.junit.Before
+import org.junit.Assume.assumeFalse
 
 import org.junit.Rule
 import org.junit.Test
@@ -47,20 +49,31 @@
 
     private lateinit var contentResolver: ContentResolver
 
+    private var isSlicesDisabled: Boolean = false
+
     @Before
     fun setUp() {
         contentResolver = activityTestRule.activity.contentResolver
+        isSlicesDisabled = activityTestRule
+                            .activity
+                            .packageManager
+                            .hasSystemFeature(
+                                PackageManager.FEATURE_SLICES_DISABLED)
     }
 
     @Test
     @SecurityTest(minPatchLevel = "2019-11-01")
     fun testCallSliceUri_ValidAuthority() {
+        assumeFalse(isSlicesDisabled)
+
         doQuery(validActionUri)
     }
 
     @Test(expected = SecurityException::class)
     @SecurityTest(minPatchLevel = "2019-11-01")
     fun testCallSliceUri_ShadyAuthority() {
+        assumeFalse(isSlicesDisabled)
+
         doQuery(shadyActionUri)
     }
 
diff --git a/tests/tests/speech/Android.bp b/tests/tests/speech/Android.bp
index 09df6ed..ee5eb38 100644
--- a/tests/tests/speech/Android.bp
+++ b/tests/tests/speech/Android.bp
@@ -19,12 +19,11 @@
         "ctstestrunner-axt",
         "androidx.test.rules",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: ["src/**/*.java"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     // Needed for testing O API
diff --git a/tests/tests/syncmanager/Android.bp b/tests/tests/syncmanager/Android.bp
index 1b5623d..61eb483 100644
--- a/tests/tests/syncmanager/Android.bp
+++ b/tests/tests/syncmanager/Android.bp
@@ -25,13 +25,12 @@
         "ub-uiautomator",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/syncmanager/apps/Android.bp b/tests/tests/syncmanager/apps/Android.bp
index ef55658..d759221 100644
--- a/tests/tests/syncmanager/apps/Android.bp
+++ b/tests/tests/syncmanager/apps/Android.bp
@@ -28,7 +28,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "app1/AndroidManifest.xml",
@@ -51,7 +50,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     manifest: "app2/AndroidManifest.xml",
diff --git a/tests/tests/syncmanager/common/Android.bp b/tests/tests/syncmanager/common/Android.bp
index cba51fc..a5e8733 100644
--- a/tests/tests/syncmanager/common/Android.bp
+++ b/tests/tests/syncmanager/common/Android.bp
@@ -26,7 +26,7 @@
         "androidx.legacy_legacy-support-v4",
         "mockito-target",
         "compatibility-device-util-axt",
-        "android.test.runner.stubs",
+        "android.test.runner",
     ],
     sdk_version: "test_current",
 }
diff --git a/tests/tests/systemintents/Android.bp b/tests/tests/systemintents/Android.bp
index ab83f84..b3def56 100644
--- a/tests/tests/systemintents/Android.bp
+++ b/tests/tests/systemintents/Android.bp
@@ -18,7 +18,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src/**/*.java"],
diff --git a/tests/tests/systemui/Android.bp b/tests/tests/systemui/Android.bp
index e98240c..22ee8a3 100644
--- a/tests/tests/systemui/Android.bp
+++ b/tests/tests/systemui/Android.bp
@@ -17,10 +17,9 @@
     defaults: ["cts_defaults"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
-    libs: ["android.test.runner.stubs"],
+    libs: ["android.test.runner"],
     static_libs: [
         "compatibility-device-util-axt",
         "ctstestrunner-axt",
diff --git a/tests/tests/systemui/src/android/systemui/cts/WindowInsetsBehaviorTests.java b/tests/tests/systemui/src/android/systemui/cts/WindowInsetsBehaviorTests.java
index 87478d0..69c5cc2 100644
--- a/tests/tests/systemui/src/android/systemui/cts/WindowInsetsBehaviorTests.java
+++ b/tests/tests/systemui/src/android/systemui/cts/WindowInsetsBehaviorTests.java
@@ -16,6 +16,8 @@
 
 package android.systemui.cts;
 
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
 import static android.provider.DeviceConfig.NAMESPACE_ANDROID;
 import static android.provider.AndroidDeviceConfig.KEY_SYSTEM_GESTURE_EXCLUSION_LIMIT_DP;
 import static android.view.View.SYSTEM_UI_CLEARABLE_FLAGS;
@@ -34,6 +36,7 @@
 
 import static java.util.concurrent.TimeUnit.SECONDS;
 
+import android.app.ActivityOptions;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -73,6 +76,7 @@
 import org.junit.rules.RuleChain;
 import org.junit.runner.RunWith;
 
+import java.lang.reflect.Array;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -312,13 +316,26 @@
 
         // launch the Activity and wait until Activity onAttach
         CountDownLatch latch = new CountDownLatch(1);
-        mActivity = mActivityRule.launchActivity(null);
+        mActivity = launchActivity();
         mActivity.setInitialFinishCallBack(isFinish -> latch.countDown());
         mDevice.waitForIdle();
 
         latch.await(5, SECONDS);
     }
 
+    private WindowInsetsActivity launchActivity() {
+        final ActivityOptions options= ActivityOptions.makeBasic();
+        options.setLaunchWindowingMode(WINDOWING_MODE_FULLSCREEN);
+        final WindowInsetsActivity[] activity = (WindowInsetsActivity[]) Array.newInstance(
+                WindowInsetsActivity.class, 1);
+        SystemUtil.runWithShellPermissionIdentity(() -> {
+            activity[0] = (WindowInsetsActivity) getInstrumentation().startActivitySync(
+                    new Intent(getInstrumentation().getTargetContext(), WindowInsetsActivity.class)
+                            .addFlags(FLAG_ACTIVITY_NEW_TASK), options.toBundle());
+        });
+        return activity[0];
+    }
+
     /**
      * Restore the original configured value for the system gesture by operating Settings.
      */
@@ -647,9 +664,6 @@
             throws InterruptedException {
         assumeTrue(hasSystemGestureFeature());
 
-        final Rect[] rects = new Rect[1];
-        mainThreadRun(() -> rects[0] = mActivity.getViewBound(mActivity.getContentView()));
-        setAndWaitForSystemGestureExclusionRectsListenerTrigger(rects[0]);
         mainThreadRun(() -> mContentViewWindowInsets = mActivity.getDecorViewWindowInsets());
         mainThreadRun(() -> mSwipeBound = mActivity.getOperationArea(
                 mContentViewWindowInsets.getTappableElementInsets(), mContentViewWindowInsets));
@@ -755,16 +769,16 @@
             setSystemUiVisibility(systemUiVisibility);
             setAndWaitForSystemGestureExclusionRectsListenerTrigger(null);
 
-            // The limit is consumed from bottom to top.
-            final int[] bottom = new int[1];
+            final Rect swipeBounds = new Rect();
             mainThreadRun(() -> {
                 final View rootView = mActivity.getWindow().getDecorView();
-                bottom[0] = rootView.getLocationOnScreen()[1] + rootView.getHeight();
+                swipeBounds.set(mActivity.getViewBound(rootView));
             });
-            final int swipeY = bottom[0] - mExclusionLimit + shiftY;
+            // The limit is consumed from bottom to top.
+            final int swipeY = swipeBounds.bottom - mExclusionLimit + shiftY;
 
             for (int i = 0; i < swipeCount; i++) {
-                swipeFromLeftToRight(swipeY, mDisplayWidth);
+                mDevice.swipe(swipeBounds.left, swipeY, swipeBounds.right, swipeY, STEPS);
             }
 
             mainThreadRun(() -> {
@@ -845,10 +859,6 @@
         assertTrue("Exclusion must be applied.", exclusionApplied.await(3, SECONDS));
     }
 
-    private void swipeFromLeftToRight(int y, int distance) {
-        mDevice.swipe(0, y, distance, y, STEPS);
-    }
-
     private static int getPropertyOfMaxExclusionHeight() {
         final int[] originalLimitDp = new int[1];
         SystemUtil.runWithShellPermissionIdentity(() -> {
diff --git a/tests/tests/telecom/Android.bp b/tests/tests/telecom/Android.bp
index eca4b1d..2fdb0b3 100644
--- a/tests/tests/telecom/Android.bp
+++ b/tests/tests/telecom/Android.bp
@@ -40,8 +40,8 @@
         "CtsTelecomUtilLib",
     ],
     libs: [
-        "android.test.base.stubs",
-        "android.test.runner.stubs",
+        "android.test.base",
+        "android.test.runner",
     ],
     srcs: [
         "src/**/*.java",
@@ -73,7 +73,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/telecom/AndroidManifest.xml b/tests/tests/telecom/AndroidManifest.xml
index 5e6a6ee..4d746c1 100644
--- a/tests/tests/telecom/AndroidManifest.xml
+++ b/tests/tests/telecom/AndroidManifest.xml
@@ -34,7 +34,7 @@
     <uses-permission android:name="android.permission.WRITE_CONTACTS" />
     <uses-permission android:name="android.permission.CONTROL_INCALL_EXPERIENCE" />
     <uses-permission android:name="android.permission.ENTER_CAR_MODE_PRIORITIZED" />
-
+    <uses-permission android:name="android.permission.MANAGE_ONGOING_CALLS" />
     <uses-permission android:name="com.android.voicemail.permission.ADD_VOICEMAIL" />
 
     <application>
diff --git a/tests/tests/telecom/AndroidTest.xml b/tests/tests/telecom/AndroidTest.xml
index 741a897..e605691 100644
--- a/tests/tests/telecom/AndroidTest.xml
+++ b/tests/tests/telecom/AndroidTest.xml
@@ -20,9 +20,6 @@
     <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
     <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
     <option name="hidden-api-checks" value="false" />
-    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.TokenRequirement">
-        <option name="token" value="sim-card" />
-    </target_preparer>
     <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
         <option name="cleanup-apks" value="true" />
         <option name="test-file-name" value="CallRedirectionServiceTestApp.apk" />
@@ -33,6 +30,11 @@
         <option name="test-file-name" value="CarModeTestApp.apk" />
         <option name="test-file-name" value="CarModeTestAppTwo.apk" />
     </target_preparer>
+    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
+      <!-- Disable hidden API checking, see b/166236554 -->
+        <option name="run-command" value="settings put global hidden_api_policy 1" />
+        <option name="teardown-command" value="settings delete global hidden_api_policy" />
+    </target_preparer>
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="android.telecom.cts" />
         <option name="runtime-hint" value="10m20s" />
diff --git a/tests/tests/telecom/Api29InCallServiceTestApp/Android.bp b/tests/tests/telecom/Api29InCallServiceTestApp/Android.bp
index b700f2c..74b42aa 100644
--- a/tests/tests/telecom/Api29InCallServiceTestApp/Android.bp
+++ b/tests/tests/telecom/Api29InCallServiceTestApp/Android.bp
@@ -28,6 +28,6 @@
     sdk_version: "test_current",
     test_suites: [
         "cts",
-        "vts10",
+        "general-tests",
     ],
 }
diff --git a/tests/tests/telecom/Api29InCallServiceTestApp/aidl/android/telecom/cts/api29incallservice/ICtsApi29InCallServiceControl.aidl b/tests/tests/telecom/Api29InCallServiceTestApp/aidl/android/telecom/cts/api29incallservice/ICtsApi29InCallServiceControl.aidl
index 1c96bdf..7dd22cd 100644
--- a/tests/tests/telecom/Api29InCallServiceTestApp/aidl/android/telecom/cts/api29incallservice/ICtsApi29InCallServiceControl.aidl
+++ b/tests/tests/telecom/Api29InCallServiceTestApp/aidl/android/telecom/cts/api29incallservice/ICtsApi29InCallServiceControl.aidl
@@ -22,4 +22,12 @@
     int getLocalCallCount();
 
     int getHistoricalCallCount();
+
+    boolean hasReceivedBindRequest();
+
+    void setShouldReturnNullBinding(boolean shouldReturnNullBinding);
+
+    boolean waitForBindRequest();
+
+    void kill();
 }
diff --git a/tests/tests/telecom/Api29InCallServiceTestApp/src/android/telecom/cts/api29incallservice/CtsApi29InCallService.java b/tests/tests/telecom/Api29InCallServiceTestApp/src/android/telecom/cts/api29incallservice/CtsApi29InCallService.java
index a1aaf35..562ebe1 100644
--- a/tests/tests/telecom/Api29InCallServiceTestApp/src/android/telecom/cts/api29incallservice/CtsApi29InCallService.java
+++ b/tests/tests/telecom/Api29InCallServiceTestApp/src/android/telecom/cts/api29incallservice/CtsApi29InCallService.java
@@ -16,12 +16,19 @@
 
 package android.telecom.cts.api29incallservice;
 
+import android.content.Intent;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.IBinder;
 import android.telecom.Call;
 import android.telecom.cts.MockInCallService;
 import android.util.Log;
 
 import java.util.HashSet;
 import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 
 public class CtsApi29InCallService extends MockInCallService {
 
@@ -31,22 +38,54 @@
 
     static Set<Call> sCalls = new HashSet<>();
     static int sHistoricalCallCount = 0;
+    static boolean sShouldReturnNullBinding = false;
+    static CompletableFuture<Boolean> sBindRequestFuture = new CompletableFuture<>();
 
     @Override
     public void onCallAdded(Call call) {
-        Log.i(TAG, "onCallAdded");
         super.onCallAdded(call);
         if (!sCalls.contains(call)) {
             sHistoricalCallCount++;
         }
         sCalls.add(call);
+        Log.i(TAG, "onCallAdded, size=" + sCalls.size());
     }
 
     @Override
     public void onCallRemoved(Call call) {
-        Log.i(TAG, "onCallRemoved");
         super.onCallRemoved(call);
         sCalls.remove(call);
+        Log.i(TAG, "onCallRemoved, size=" + sCalls.size());
+    }
+
+    @Override
+    public IBinder onBind(Intent intent) {
+        Log.i(TAG, "onBind future=" + sBindRequestFuture);
+        sBindRequestFuture.complete(true);
+        // Sets mIsServiceBound
+        IBinder result = super.onBind(intent);
+        if (!sShouldReturnNullBinding) {
+            return result;
+        }
+        return null;
+    }
+
+    @Override
+    public boolean onUnbind(Intent intent) {
+        reset();
+        return super.onUnbind(intent);
+    }
+
+    public static boolean waitForBindRequest() {
+        try {
+            if (isServiceBound()) return true;
+            return sBindRequestFuture.get(TIMEOUT, TimeUnit.MILLISECONDS);
+        } catch (TimeoutException te) {
+            Log.e(TAG, "Waited too long for bind request. future=" + sBindRequestFuture);
+            return false;
+        } catch (Exception e) {
+            return false;
+        }
     }
 
     public static int getLocalCallCount() {
@@ -58,5 +97,7 @@
     static void reset() {
         sCalls.clear();
         sHistoricalCallCount = 0;
+        sShouldReturnNullBinding = false;
+        sBindRequestFuture = new CompletableFuture<>();
     }
 }
diff --git a/tests/tests/telecom/Api29InCallServiceTestApp/src/android/telecom/cts/api29incallservice/CtsApi29InCallServiceControl.java b/tests/tests/telecom/Api29InCallServiceTestApp/src/android/telecom/cts/api29incallservice/CtsApi29InCallServiceControl.java
index 27876cd..4b8d1e0 100644
--- a/tests/tests/telecom/Api29InCallServiceTestApp/src/android/telecom/cts/api29incallservice/CtsApi29InCallServiceControl.java
+++ b/tests/tests/telecom/Api29InCallServiceTestApp/src/android/telecom/cts/api29incallservice/CtsApi29InCallServiceControl.java
@@ -19,6 +19,7 @@
 import android.app.Service;
 import android.content.Intent;
 import android.os.IBinder;
+import android.os.Process;
 import android.telecom.Call;
 import android.util.Log;
 
@@ -46,6 +47,26 @@
         public int getHistoricalCallCount() {
             return CtsApi29InCallService.sHistoricalCallCount;
         }
+
+        @Override
+        public boolean hasReceivedBindRequest() {
+            return CtsApi29InCallService.sBindRequestFuture.getNow(false);
+        }
+
+        @Override
+        public void setShouldReturnNullBinding(boolean shouldReturnNullBinding) {
+            CtsApi29InCallService.sShouldReturnNullBinding = shouldReturnNullBinding;
+        }
+
+        @Override
+        public boolean waitForBindRequest() {
+            return CtsApi29InCallService.waitForBindRequest();
+        }
+
+        @Override
+        public void kill() {
+            Process.killProcess(Process.myPid());
+        }
     };
 
     @Override
diff --git a/tests/tests/telecom/CallRedirectionServiceTestApp/Android.bp b/tests/tests/telecom/CallRedirectionServiceTestApp/Android.bp
index ba15dd9..632a714 100644
--- a/tests/tests/telecom/CallRedirectionServiceTestApp/Android.bp
+++ b/tests/tests/telecom/CallRedirectionServiceTestApp/Android.bp
@@ -24,7 +24,7 @@
     sdk_version: "test_current",
     test_suites: [
         "cts",
-        "vts10",
+        "general-tests",
     ],
     optimize: {
         enabled: false,
diff --git a/tests/tests/telecom/CallRedirectionServiceTestApp/AndroidManifest.xml b/tests/tests/telecom/CallRedirectionServiceTestApp/AndroidManifest.xml
index ff23b74..8527c9e 100644
--- a/tests/tests/telecom/CallRedirectionServiceTestApp/AndroidManifest.xml
+++ b/tests/tests/telecom/CallRedirectionServiceTestApp/AndroidManifest.xml
@@ -16,8 +16,6 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.telecom.cts.redirectiontestapp">
-    <permission android:name="android.telecom.cts.redirectiontestapp.CTS_SERVICE_PERMISSION"
-                android.protectionLevel="signature"/>
     <application android:label="CTSCRTest">
         <service android:name=".CtsCallRedirectionService"
                  android:permission="android.permission.BIND_CALL_REDIRECTION_SERVICE">
diff --git a/tests/tests/telecom/CallScreeningServiceTestApp/Android.bp b/tests/tests/telecom/CallScreeningServiceTestApp/Android.bp
index 8664904..79bf603 100644
--- a/tests/tests/telecom/CallScreeningServiceTestApp/Android.bp
+++ b/tests/tests/telecom/CallScreeningServiceTestApp/Android.bp
@@ -26,7 +26,7 @@
     sdk_version: "test_current",
     test_suites: [
         "cts",
-        "vts10",
+        "general-tests",
     ],
     optimize: {
         enabled: false,
diff --git a/tests/tests/telecom/CallScreeningServiceTestApp/AndroidManifest.xml b/tests/tests/telecom/CallScreeningServiceTestApp/AndroidManifest.xml
index 7428130..1d10377 100644
--- a/tests/tests/telecom/CallScreeningServiceTestApp/AndroidManifest.xml
+++ b/tests/tests/telecom/CallScreeningServiceTestApp/AndroidManifest.xml
@@ -16,8 +16,6 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.telecom.cts.screeningtestapp">
-    <permission android:name="android.telecom.cts.screeningtestapp.CTS_SERVICE_PERMISSION"
-                android.protectionLevel="signature"/>
     <uses-permission android:name="android.permission.READ_CONTACTS" />
     <uses-permission android:name="android.permission.REVOKE_RUNTIME_PERMISSIONS" />
     <uses-permission android:name="android.permission.GRANT_RUNTIME_PERMISSIONS" />
diff --git a/tests/tests/telecom/CarModeTestApp/Android.bp b/tests/tests/telecom/CarModeTestApp/Android.bp
index bc760ef..53ea07e 100644
--- a/tests/tests/telecom/CarModeTestApp/Android.bp
+++ b/tests/tests/telecom/CarModeTestApp/Android.bp
@@ -28,6 +28,6 @@
     sdk_version: "test_current",
     test_suites: [
         "cts",
-        "vts10",
+        "general-tests",
     ],
 }
diff --git a/tests/tests/telecom/CarModeTestAppTwo/Android.bp b/tests/tests/telecom/CarModeTestAppTwo/Android.bp
index 11e9487..4ab49df 100644
--- a/tests/tests/telecom/CarModeTestAppTwo/Android.bp
+++ b/tests/tests/telecom/CarModeTestAppTwo/Android.bp
@@ -29,6 +29,6 @@
     sdk_version: "test_current",
     test_suites: [
         "cts",
-        "vts10",
+        "general-tests",
     ],
 }
diff --git a/tests/tests/telecom/ThirdPtyInCallServiceTestApp/Android.bp b/tests/tests/telecom/ThirdPtyInCallServiceTestApp/Android.bp
index c6f13b5..faf7305 100644
--- a/tests/tests/telecom/ThirdPtyInCallServiceTestApp/Android.bp
+++ b/tests/tests/telecom/ThirdPtyInCallServiceTestApp/Android.bp
@@ -28,6 +28,6 @@
     sdk_version: "test_current",
     test_suites: [
         "cts",
-        "vts10",
+        "general-tests",
     ],
 }
diff --git a/tests/tests/telecom/ThirdPtyInCallServiceTestApp/AndroidManifest.xml b/tests/tests/telecom/ThirdPtyInCallServiceTestApp/AndroidManifest.xml
index eb509ec..710b3e6 100644
--- a/tests/tests/telecom/ThirdPtyInCallServiceTestApp/AndroidManifest.xml
+++ b/tests/tests/telecom/ThirdPtyInCallServiceTestApp/AndroidManifest.xml
@@ -24,7 +24,8 @@
 
     <uses-permission android:name="android.permission.READ_CALL_LOG"/>
     <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
-    <uses-permission android:name="android.permission.CALL_COMPANION_APP" />
+    <uses-permission android:name="android.permission.CALL_COMPANION_APP"/>
+    <uses-permission android:name="android.permission.MANAGE_ONGOING_CALLS"/>
 
     <application android:label="ThirdPtyCTSInCallService">
         <service android:name=".CtsThirdPartyInCallService"
@@ -35,8 +36,6 @@
             <intent-filter>
                 <action android:name="android.telecom.InCallService"/>
             </intent-filter>
-            <meta-data android:name="android.telecom.IN_CALL_SERVICE_CAR_MODE_UI"
-                       android:value="true" />
             <meta-data android:name="android.telecom.INCLUDE_EXTERNAL_CALLS"
                        android:value="true" />
         </service>
diff --git a/tests/tests/telecom/src/android/telecom/cts/AdhocConferenceTest.java b/tests/tests/telecom/src/android/telecom/cts/AdhocConferenceTest.java
new file mode 100644
index 0000000..6e8acd1
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/AdhocConferenceTest.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2020 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.telecom.cts;
+
+import static android.telecom.Connection.STATE_DISCONNECTED;
+import static android.telecom.cts.TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS;
+
+import android.net.Uri;
+import android.os.Bundle;
+import android.telecom.Call;
+import android.telecom.Conference;
+import android.telecom.Connection;
+import android.telecom.ConnectionRequest;
+import android.telecom.DisconnectCause;
+import android.telecom.VideoProfile;
+import android.util.Log;
+import android.util.Pair;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+public class AdhocConferenceTest extends BaseTelecomTestWithMockServices {
+    public static final List<Uri> PARTICIPANTS = new ArrayList<>(Arrays.asList(
+            Uri.parse("tel:555-TEST"),
+            Uri.parse("tel:555-TEST2")));
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        if (mShouldTestTelecom) {
+            setupConnectionService(null, FLAG_REGISTER | FLAG_ENABLE);
+            mTelecomManager.registerPhoneAccount(TestUtils.TEST_PHONE_ACCOUNT);
+            setupForEmergencyCalling(TEST_EMERGENCY_NUMBER);
+            MockInCallService.setCallbacks(mInCallCallbacks);
+        }
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        mTelecomManager.unregisterPhoneAccount(TestUtils.TEST_PHONE_ACCOUNT_HANDLE);
+        super.tearDown();
+    }
+
+    public void testStartConference() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        Bundle extra = new Bundle();
+        mTelecomManager.startConference(PARTICIPANTS, extra);
+        ConnectionRequest request = verifyAdhocConferenceCall().second;
+        assertTrue(request.isAdhocConferenceCall());
+        assertEquals(2, request.getParticipants().size());
+        assertTrue(request.getParticipants().containsAll(PARTICIPANTS));
+    }
+
+    public void testStartConferenceFailed() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        List<Uri> participants = new ArrayList<>();
+        Bundle extra = new Bundle();
+        placeAndVerifyEmergencyCall(true);
+        mTelecomManager.startConference(participants, extra);
+        Conference conference = verifyAdhocConferenceCall().first;
+        assertEquals(DisconnectCause.CANCELED, conference.getDisconnectCause().getCode());
+    }
+
+    public void testAddNewIncomingConference_onAnswer() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        Bundle extra = new Bundle();
+        mTelecomManager.addNewIncomingConference(TestUtils.TEST_PHONE_ACCOUNT_HANDLE, extra);
+        Pair<Conference, ConnectionRequest>  resultPair = verifyAdhocConferenceCall();
+        assertTrue(resultPair.second.isAdhocConferenceCall());
+        try {
+            if (!mInCallCallbacks.lock.tryAcquire(WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                    TimeUnit.MILLISECONDS)) {
+                fail("No conference call added.");
+            }
+        } catch (InterruptedException e) {
+            Log.i(TestUtils.TAG, "Test interrupted");
+        }
+        MockConference conference = (MockConference) resultPair.first;
+        Call call = mInCallCallbacks.getService().getLastConferenceCall();
+        call.answer(VideoProfile.STATE_RX_ENABLED);
+        conference.acquireLock(WAIT_FOR_STATE_CHANGE_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+        assertEquals(VideoProfile.STATE_RX_ENABLED, conference.getVideoState());
+    }
+
+    public void testAddNewIncomingConference_onReject() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        Bundle extra = new Bundle();
+        mTelecomManager.addNewIncomingConference(TestUtils.TEST_PHONE_ACCOUNT_HANDLE, extra);
+        Pair<Conference, ConnectionRequest>  resultPair = verifyAdhocConferenceCall();
+        assertTrue(resultPair.second.isAdhocConferenceCall());
+        try {
+            if (!mInCallCallbacks.lock.tryAcquire(WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                    TimeUnit.MILLISECONDS)) {
+                fail("No conference call added.");
+            }
+        } catch (InterruptedException e) {
+            Log.i(TestUtils.TAG, "Test interrupted");
+        }
+        MockConference conference = (MockConference) resultPair.first;
+        Call call = mInCallCallbacks.getService().getLastConferenceCall();
+        call.reject(false /* rejectWithMessage */, null /* textMessage */);
+        conference.acquireLock(WAIT_FOR_STATE_CHANGE_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+        for (Connection conn : conference.getConnections()) {
+            assertEquals(STATE_DISCONNECTED, conn.getState());
+            assertEquals(DisconnectCause.REJECTED, conn.getDisconnectCause().getCode());
+        }
+    }
+
+    public void testAddNewIncomingConferenceFailed() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        placeAndVerifyEmergencyCall(true);
+        Bundle extra = new Bundle();
+        mTelecomManager.addNewIncomingConference(TestUtils.TEST_PHONE_ACCOUNT_HANDLE, extra);
+        Conference conference = verifyAdhocConferenceCall().first;
+        assertEquals(DisconnectCause.CANCELED, conference.getDisconnectCause().getCode());
+    }
+
+    public void testConferenceCallAddConferenceParticipants() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        Bundle extra = new Bundle();
+        mTelecomManager.addNewIncomingConference(TestUtils.TEST_PHONE_ACCOUNT_HANDLE, extra);
+        Pair<Conference, ConnectionRequest> resultPair = verifyAdhocConferenceCall();
+        assertTrue(resultPair.second.isAdhocConferenceCall());
+        try {
+            if (!mInCallCallbacks.lock.tryAcquire(WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                    TimeUnit.MILLISECONDS)) {
+                fail("No conference call added.");
+            }
+        } catch (InterruptedException e) {
+            Log.i(TestUtils.TAG, "Test interrupted");
+        }
+        Call call = mInCallCallbacks.getService().getLastConferenceCall();
+        call.answer(VideoProfile.STATE_AUDIO_ONLY);
+        MockConference conference = (MockConference) resultPair.first;
+        conference.setConnectionCapabilities(conference.getConnectionCapabilities()
+                | Connection.CAPABILITY_ADD_PARTICIPANT);
+
+        // Wait for the capability change to propagate before adding participants.
+        waitUntilConditionIsTrueOrTimeout(
+                new Condition() {
+                    @Override
+                    public Object expected() {
+                        return true;
+                    }
+
+                    @Override
+                    public Object actual() {
+                        return call.getDetails().can(Call.Details.CAPABILITY_ADD_PARTICIPANT);
+                    }
+                },
+                WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Call should have capability " + Call.Details.CAPABILITY_ADD_PARTICIPANT
+        );
+
+        conference.resetLock();
+        call.addConferenceParticipants(PARTICIPANTS);
+        assertTrue(conference.acquireLock(WAIT_FOR_STATE_CHANGE_TIMEOUT_MS, TimeUnit.MILLISECONDS));
+        assertTrue(conference.mParticipants.containsAll(PARTICIPANTS));
+    }
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/Api29InCallUtils.java b/tests/tests/telecom/src/android/telecom/cts/Api29InCallUtils.java
new file mode 100644
index 0000000..3ce7c33
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/Api29InCallUtils.java
@@ -0,0 +1,60 @@
+package android.telecom.cts;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+import android.telecom.cts.api29incallservice.CtsApi29InCallServiceControl;
+import android.telecom.cts.api29incallservice.ICtsApi29InCallServiceControl;
+import android.util.Log;
+import android.util.Pair;
+
+import junit.framework.TestCase;
+
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+public final class Api29InCallUtils {
+    private static final String LOG_TAG = Api29InCallUtils.class.getSimpleName();
+
+    public static Pair<ServiceConnection, ICtsApi29InCallServiceControl> setupControl(
+            Context context) throws Exception {
+
+        Intent bindIntent = new Intent(CtsApi29InCallServiceControl.CONTROL_INTERFACE_ACTION);
+        ComponentName controlComponentName =
+                ComponentName.createRelative(
+                        CtsApi29InCallServiceControl.class.getPackage().getName(),
+                        CtsApi29InCallServiceControl.class.getName());
+
+        bindIntent.setComponent(controlComponentName);
+        LinkedBlockingQueue<ICtsApi29InCallServiceControl> result = new LinkedBlockingQueue<>(1);
+
+        ServiceConnection serviceConnection = new ServiceConnection() {
+            @Override
+            public void onServiceConnected(ComponentName name, IBinder service) {
+                Log.i(LOG_TAG, "Service Connected: " + name);
+                result.offer(ICtsApi29InCallServiceControl.Stub.asInterface(service));
+            }
+
+            @Override
+            public void onServiceDisconnected(ComponentName name) {
+            }
+        };
+
+        boolean success = context.bindService(bindIntent,
+                serviceConnection, Context.BIND_AUTO_CREATE);
+
+        if (!success) {
+            TestCase.fail("Failed to get control interface -- bind error");
+        }
+        return Pair.create(serviceConnection,
+                result.poll(TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS, TimeUnit.MILLISECONDS));
+    }
+
+    public static void tearDownControl(Context context, ServiceConnection serviceConnection) {
+        context.unbindService(serviceConnection);
+    }
+
+    private Api29InCallUtils() {}
+}
diff --git a/tests/tests/telecom/src/android/telecom/cts/BackgroundCallAudioTest.java b/tests/tests/telecom/src/android/telecom/cts/BackgroundCallAudioTest.java
index f455a39..e01b12b 100644
--- a/tests/tests/telecom/src/android/telecom/cts/BackgroundCallAudioTest.java
+++ b/tests/tests/telecom/src/android/telecom/cts/BackgroundCallAudioTest.java
@@ -6,13 +6,10 @@
 import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
 
 import android.app.role.RoleManager;
-import android.content.ComponentName;
 import android.content.Context;
-import android.content.Intent;
 import android.content.ServiceConnection;
 import android.media.AudioManager;
 import android.os.Bundle;
-import android.os.IBinder;
 import android.os.Process;
 import android.os.UserHandle;
 import android.provider.CallLog;
@@ -24,15 +21,12 @@
 import android.telecom.TelecomManager;
 import android.telecom.VideoProfile;
 import android.telecom.cts.MockCallScreeningService.CallScreeningServiceCallbacks;
-import android.telecom.cts.api29incallservice.CtsApi29InCallService;
-import android.telecom.cts.api29incallservice.CtsApi29InCallServiceControl;
 import android.telecom.cts.api29incallservice.ICtsApi29InCallServiceControl;
 import android.text.TextUtils;
-import android.util.Log;
+import android.util.Pair;
 
 import androidx.test.InstrumentationRegistry;
 
-
 import java.util.concurrent.Executor;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
@@ -50,6 +44,8 @@
     // true if there's platform support for call screening in the audio stack.
     private boolean doesAudioManagerSupportCallScreening = false;
 
+    private String mPreviousDefaultDialer = null;
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
@@ -515,14 +511,14 @@
             Call call = mInCallCallbacks.getService().getLastCall();
             assertCallState(call, Call.STATE_AUDIO_PROCESSING);
             assertConnectionState(connection, Connection.STATE_ACTIVE);
-            // Make sure that the dummy app never got any calls
+            // Make sure that the test app never got any calls
             assertEquals(0, controlInterface.getHistoricalCallCount());
 
             call.exitBackgroundAudioProcessing(true);
             assertCallState(call, Call.STATE_SIMULATED_RINGING);
             waitOnAllHandlers(getInstrumentation());
             assertConnectionState(connection, Connection.STATE_ACTIVE);
-            // Make sure that the dummy app sees a ringing call.
+            // Make sure that the test app sees a ringing call.
             assertEquals(Call.STATE_RINGING,
                     controlInterface.getCallState(call.getDetails().getTelecomCallId()));
 
@@ -530,7 +526,7 @@
             assertCallState(call, Call.STATE_ACTIVE);
             waitOnAllHandlers(getInstrumentation());
             assertConnectionState(connection, Connection.STATE_ACTIVE);
-            // Make sure that the dummy app sees an active call.
+            // Make sure that the test app sees an active call.
             assertEquals(Call.STATE_ACTIVE,
                     controlInterface.getCallState(call.getDetails().getTelecomCallId()));
 
@@ -562,14 +558,14 @@
             Call call = mInCallCallbacks.getService().getLastCall();
             assertCallState(call, Call.STATE_AUDIO_PROCESSING);
             assertConnectionState(connection, Connection.STATE_ACTIVE);
-            // Make sure that the dummy app never got any calls
+            // Make sure that the test app never got any calls
             assertEquals(0, controlInterface.getHistoricalCallCount());
 
             call.disconnect();
             assertCallState(call, Call.STATE_DISCONNECTED);
             waitOnAllHandlers(getInstrumentation());
             assertConnectionState(connection, Connection.STATE_DISCONNECTED);
-            // Under some rare circumstances, the dummy app might get a flash of the disconnection
+            // Under some rare circumstances, the test app might get a flash of the disconnection
             // call, so we won't do the call count check again.
 
             tearDownControl();
@@ -621,6 +617,7 @@
             assertAudioMode(audioManager, MODE_CALL_SCREENING);
         }
         assertConnectionState(connection, Connection.STATE_ACTIVE);
+        assertTrue(mTelecomManager.isRinging());
 
         call.disconnect();
         assertCallState(call, Call.STATE_DISCONNECTED);
@@ -653,46 +650,15 @@
     }
 
     private ICtsApi29InCallServiceControl setUpControl() throws Exception {
-        TestUtils.executeShellCommand(getInstrumentation(),
-                "telecom add-or-remove-call-companion-app " + CtsApi29InCallService.PACKAGE_NAME
-                        + " 1");
-
-        Intent bindIntent = new Intent(CtsApi29InCallServiceControl.CONTROL_INTERFACE_ACTION);
-        ComponentName controlComponentName =
-                ComponentName.createRelative(
-                        CtsApi29InCallServiceControl.class.getPackage().getName(),
-                        CtsApi29InCallServiceControl.class.getName());
-
-        bindIntent.setComponent(controlComponentName);
-        LinkedBlockingQueue<ICtsApi29InCallServiceControl> result = new LinkedBlockingQueue<>(1);
-
-        mApiCompatControlServiceConnection = new ServiceConnection() {
-            @Override
-            public void onServiceConnected(ComponentName name, IBinder service) {
-                Log.i(LOG_TAG, "Service Connected: " + name);
-                result.offer(ICtsApi29InCallServiceControl.Stub.asInterface(service));
-            }
-
-            @Override
-            public void onServiceDisconnected(ComponentName name) {
-            }
-        };
-
-        boolean success = mContext.bindService(bindIntent,
-                mApiCompatControlServiceConnection, Context.BIND_AUTO_CREATE);
-
-        if (!success) {
-            fail("Failed to get control interface -- bind error");
-        }
-        return result.poll(TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+        Pair<ServiceConnection, ICtsApi29InCallServiceControl> setupResult =
+                Api29InCallUtils.setupControl(mContext);
+        mApiCompatControlServiceConnection = setupResult.first;
+        return setupResult.second;
     }
 
     private void tearDownControl() throws Exception {
-        mContext.unbindService(mApiCompatControlServiceConnection);
-
-        TestUtils.executeShellCommand(getInstrumentation(),
-                "telecom add-or-remove-call-companion-app " + CtsApi29InCallService.PACKAGE_NAME
-                        + " 0");
+        Api29InCallUtils.tearDownControl(mContext,
+                mApiCompatControlServiceConnection);
     }
 
     private void clearRoleHoldersAsUser(String roleName)
diff --git a/tests/tests/telecom/src/android/telecom/cts/BaseRemoteTelecomTest.java b/tests/tests/telecom/src/android/telecom/cts/BaseRemoteTelecomTest.java
index 3a0dbd3..0548a70 100644
--- a/tests/tests/telecom/src/android/telecom/cts/BaseRemoteTelecomTest.java
+++ b/tests/tests/telecom/src/android/telecom/cts/BaseRemoteTelecomTest.java
@@ -182,6 +182,18 @@
         return conference;
     }
 
+    MockConference verifyConferenceOnRemoteCS(int permit) {
+        try {
+            if (!remoteConnectionService.lock.tryAcquire(permit, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                    TimeUnit.MILLISECONDS)) {
+                fail("No conference requested by Telecom");
+            }
+        } catch (InterruptedException e) {
+            Log.i(TAG, "Test interrupted!");
+        }
+        return remoteConnectionService.conferences.get(0);
+    }
+
     void assertRemoteConnectionState(final RemoteConnection connection, final int state) {
         waitUntilConditionIsTrueOrTimeout(
                 new Condition() {
diff --git a/tests/tests/telecom/src/android/telecom/cts/BaseTelecomTestWithMockServices.java b/tests/tests/telecom/src/android/telecom/cts/BaseTelecomTestWithMockServices.java
index b45180e..459ff27 100644
--- a/tests/tests/telecom/src/android/telecom/cts/BaseTelecomTestWithMockServices.java
+++ b/tests/tests/telecom/src/android/telecom/cts/BaseTelecomTestWithMockServices.java
@@ -42,6 +42,7 @@
 import android.telecom.CallAudioState;
 import android.telecom.Conference;
 import android.telecom.Connection;
+import android.telecom.ConnectionRequest;
 import android.telecom.InCallService;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
@@ -60,9 +61,11 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Random;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 
@@ -124,6 +127,9 @@
         List<Pair<Integer, String>> mCallStates = new ArrayList<>();
         EmergencyNumber mLastOutgoingEmergencyNumber;
 
+        LinkedBlockingQueue<Map<Integer, List<EmergencyNumber>>> mEmergencyNumberListQueue =
+               new LinkedBlockingQueue<>(2);
+
         @Override
         public void onCallStateChanged(int state, String number) {
             Log.i(TAG, "onCallStateChanged: state=" + state + ", number=" + number);
@@ -132,11 +138,24 @@
         }
 
         @Override
-        public void onOutgoingEmergencyCall(EmergencyNumber emergencyNumber) {
+        public void onOutgoingEmergencyCall(EmergencyNumber emergencyNumber, int subscriptionId) {
             Log.i(TAG, "onOutgoingEmergencyCall: emergencyNumber=" + emergencyNumber);
             mLastOutgoingEmergencyNumber = emergencyNumber;
             mCallbackSemaphore.release();
         }
+
+        @Override
+        public void onEmergencyNumberListChanged(
+                Map<Integer, List<EmergencyNumber>> emergencyNumberList) {
+            Log.i(TAG, "onEmergencyNumberChanged, total size=" + emergencyNumberList.values()
+                    .stream().mapToInt(List::size).sum());
+            mEmergencyNumberListQueue.offer(emergencyNumberList);
+        }
+
+        public Map<Integer, List<EmergencyNumber>> waitForEmergencyNumberListUpdate(
+                long timeoutMillis) throws Throwable {
+            return mEmergencyNumberListQueue.poll(timeoutMillis, TimeUnit.MILLISECONDS);
+        }
     }
 
     boolean mShouldTestTelecom = true;
@@ -175,8 +194,9 @@
                 mPhoneStateListener = new TestPhoneStateListener();
                 ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mTelephonyManager,
                     (tm) -> tm.listen(mPhoneStateListener,
-                        PhoneStateListener.LISTEN_CALL_STATE | PhoneStateListener
-                            .LISTEN_OUTGOING_EMERGENCY_CALL));
+                        PhoneStateListener.LISTEN_CALL_STATE
+                                | PhoneStateListener.LISTEN_OUTGOING_EMERGENCY_CALL
+                                | PhoneStateListener.LISTEN_EMERGENCY_NUMBER_LIST));
                 registeredLatch.countDown();
             }
         });
@@ -209,7 +229,15 @@
         }
         tearDownConnectionService(TestUtils.TEST_PHONE_ACCOUNT_HANDLE);
         tearDownEmergencyCalling();
-        assertMockInCallServiceUnbound();
+        try {
+            assertMockInCallServiceUnbound();
+        } catch (Throwable t) {
+            // If we haven't unbound, that means there's some dirty state in Telecom that needs
+            // cleaning up. Forcibly unbind and clean up Telecom state so that we don't have a
+            // cascading failure of tests.
+            TestUtils.executeShellCommand(getInstrumentation(), "telecom cleanup-stuck-calls");
+            throw t;
+        }
     }
 
     protected PhoneAccount setupConnectionService(MockConnectionService connectionService,
@@ -471,6 +499,11 @@
      * {@link CtsConnectionService} which can be tested.
      */
     void addAndVerifyNewIncomingCall(Uri incomingHandle, Bundle extras) {
+        int currentCallCount = addNewIncomingCall(incomingHandle, extras);
+        verifyNewIncomingCall(currentCallCount);
+    }
+
+    int addNewIncomingCall(Uri incomingHandle, Bundle extras) {
         assertEquals("Lock should have no permits!", 0, mInCallCallbacks.lock.availablePermits());
         int currentCallCount = 0;
         if (mInCallCallbacks.getService() != null) {
@@ -483,9 +516,13 @@
         extras.putParcelable(TelecomManager.EXTRA_INCOMING_CALL_ADDRESS, incomingHandle);
         mTelecomManager.addNewIncomingCall(TestUtils.TEST_PHONE_ACCOUNT_HANDLE, extras);
 
+        return currentCallCount;
+    }
+
+    void verifyNewIncomingCall(int currentCallCount) {
         try {
             if (!mInCallCallbacks.lock.tryAcquire(TestUtils.WAIT_FOR_CALL_ADDED_TIMEOUT_S,
-                        TimeUnit.SECONDS)) {
+                    TimeUnit.SECONDS)) {
                 fail("No call added to InCallService.");
             }
         } catch (InterruptedException e) {
@@ -698,6 +735,18 @@
         return connection;
     }
 
+    MockConference verifyConference(int permit) {
+        try {
+            if (!connectionService.lock.tryAcquire(permit, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                    TimeUnit.MILLISECONDS)) {
+                fail("No conference requested by Telecom");
+            }
+        } catch (InterruptedException e) {
+            Log.i(TAG, "Test interrupted!");
+        }
+        return connectionService.conferences.get(0);
+    }
+
     void setAndVerifyConnectionForIncomingCall(MockConnection connection) {
         if (connection.getState() == Connection.STATE_ACTIVE) {
             // If the connection is already active (like if it got picked up immediately), don't
@@ -789,6 +838,19 @@
         return conference;
     }
 
+    Pair<Conference, ConnectionRequest> verifyAdhocConferenceCall() {
+        try {
+            if (!connectionService.lock.tryAcquire(2, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                    TimeUnit.MILLISECONDS)) {
+                fail("No conference requested by Telecom");
+            }
+        } catch (InterruptedException e) {
+            Log.i(TAG, "Test interrupted!");
+        }
+        return new Pair<>(connectionService.conferences.get(0),
+                connectionService.connectionRequest);
+    }
+
     void setAndVerifyConferenceForOutgoingCall(MockConference conference) {
         conference.setActive();
         assertConferenceState(conference, Connection.STATE_ACTIVE);
diff --git a/tests/tests/telecom/src/android/telecom/cts/BasicInCallServiceTest.java b/tests/tests/telecom/src/android/telecom/cts/BasicInCallServiceTest.java
index 75b9372..0233ed1 100644
--- a/tests/tests/telecom/src/android/telecom/cts/BasicInCallServiceTest.java
+++ b/tests/tests/telecom/src/android/telecom/cts/BasicInCallServiceTest.java
@@ -38,7 +38,7 @@
 import java.util.concurrent.TimeUnit;
 
 /**
- * Sanity test that adding a new call via the CALL intent works correctly.
+ * Soundness test that adding a new call via the CALL intent works correctly.
  */
 public class BasicInCallServiceTest extends InstrumentationTestCase {
 
diff --git a/tests/tests/telecom/src/android/telecom/cts/CallDetailsTest.java b/tests/tests/telecom/src/android/telecom/cts/CallDetailsTest.java
index a6fe2bf..5b99e3c 100644
--- a/tests/tests/telecom/src/android/telecom/cts/CallDetailsTest.java
+++ b/tests/tests/telecom/src/android/telecom/cts/CallDetailsTest.java
@@ -70,6 +70,8 @@
     public static final String TEST_EXTRA_KEY = "android.test.extra.TEST";
     public static final String TEST_EXTRA_KEY2 = "android.test.extra.TEST2";
     public static final String TEST_EXTRA_KEY3 = "android.test.extra.TEST3";
+    public static final float TEST_EXTRA_BITRATE = 23.85f ;
+    public static final float TEST_EXTRA_BANDWIDTH = 7.0f ;
     public static final String TEST_INVALID_EXTRA_KEY = "blah";
     public static final int TEST_EXTRA_VALUE = 10;
     public static final String TEST_EVENT = "com.test.event.TEST";
@@ -479,6 +481,8 @@
         exampleExtras.putString(Connection.EXTRA_LAST_FORWARDED_NUMBER, TEST_FORWARDED_NUMBER);
         exampleExtras.putInt(TEST_EXTRA_KEY, TEST_EXTRA_VALUE);
         exampleExtras.putInt(Connection.EXTRA_AUDIO_CODEC, Connection.AUDIO_CODEC_AMR);
+        exampleExtras.putFloat(Connection.EXTRA_AUDIO_CODEC_BITRATE_KBPS, TEST_EXTRA_BITRATE);
+        exampleExtras.putFloat(Connection.EXTRA_AUDIO_CODEC_BANDWIDTH_KHZ, TEST_EXTRA_BANDWIDTH);
         mConnection.setExtras(exampleExtras);
 
         // Make sure we got back a bundle with the call subject key set.
@@ -492,6 +496,10 @@
         assertEquals(TEST_EXTRA_VALUE, callExtras.getInt(TEST_EXTRA_KEY));
         assertEquals(Connection.AUDIO_CODEC_AMR,
                 callExtras.getInt(Connection.EXTRA_AUDIO_CODEC));
+        assertEquals(TEST_EXTRA_BITRATE,
+                callExtras.getFloat(Connection.EXTRA_AUDIO_CODEC_BITRATE_KBPS), 0.01);
+        assertEquals(TEST_EXTRA_BANDWIDTH,
+                callExtras.getFloat(Connection.EXTRA_AUDIO_CODEC_BANDWIDTH_KHZ), 0.01);
     }
 
     /**
diff --git a/tests/tests/telecom/src/android/telecom/cts/ConferenceTest.java b/tests/tests/telecom/src/android/telecom/cts/ConferenceTest.java
index 9b63765..de19e23 100644
--- a/tests/tests/telecom/src/android/telecom/cts/ConferenceTest.java
+++ b/tests/tests/telecom/src/android/telecom/cts/ConferenceTest.java
@@ -237,6 +237,9 @@
         // just assert call state is not dialing, the state remains as previous one.
         assertTrue(conf.getState() != Call.STATE_DIALING);
 
+        mConferenceObject.setRinging();
+        assertCallState(conf, Call.STATE_RINGING);
+
         mConferenceObject.setOnHold();
         assertCallState(conf, Call.STATE_HOLDING);
 
@@ -283,6 +286,10 @@
                     .dropShellPermissionIdentity();
         }
 
+        assertFalse(mConferenceObject.isRingbackRequested());
+        mConferenceObject.setRingbackRequested(true);
+        assertTrue(mConferenceObject.isRingbackRequested());
+
         mConferenceObject.setDisconnected(new DisconnectCause(DisconnectCause.LOCAL));
         assertCallState(conf, Call.STATE_DISCONNECTED);
 
@@ -337,6 +344,16 @@
         assertTrue(changedExtras.containsKey(TEST_EXTRA_KEY_2));
     }
 
+    public void testCreateFailedConference() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        Conference failedConference = Conference.createFailedConference(
+                new DisconnectCause(DisconnectCause.CANCELED), TEST_PHONE_ACCOUNT_HANDLE);
+        assertEquals(Connection.STATE_DISCONNECTED, failedConference.getState());
+        assertEquals(DisconnectCause.CANCELED, failedConference.getDisconnectCause().getCode());
+    }
+
     /**
      * Verifies {@link Conference#removeExtras(List)} calls are propagated to
      * {@link android.telecom.Call.Callback#onDetailsChanged(Call, Call.Details)}.
diff --git a/tests/tests/telecom/src/android/telecom/cts/ConnectionServiceTest.java b/tests/tests/telecom/src/android/telecom/cts/ConnectionServiceTest.java
index d3e71ab..95ea9bc 100755
--- a/tests/tests/telecom/src/android/telecom/cts/ConnectionServiceTest.java
+++ b/tests/tests/telecom/src/android/telecom/cts/ConnectionServiceTest.java
@@ -230,6 +230,10 @@
         assertTrue(CtsSelfManagedConnectionService.getConnectionService().waitForUpdate(
                         CtsSelfManagedConnectionService.FOCUS_GAINED_LOCK));
 
+        // Wait for the internal handlers to set the self-managed call to active. Otherwise, the
+        // call will get stuck in telecom if the set-active command gets run after the initial
+        // disconnect command.
+        TestUtils.waitOnAllHandlers(getInstrumentation());
         // Disconnected the self-managed call
         selfManagedConnection.disconnectAndDestroy();
     }
diff --git a/tests/tests/telecom/src/android/telecom/cts/CtsConnectionService.java b/tests/tests/telecom/src/android/telecom/cts/CtsConnectionService.java
index 17f759e..89eb5a6 100644
--- a/tests/tests/telecom/src/android/telecom/cts/CtsConnectionService.java
+++ b/tests/tests/telecom/src/android/telecom/cts/CtsConnectionService.java
@@ -118,6 +118,54 @@
     }
 
     @Override
+    public Conference onCreateOutgoingConference(PhoneAccountHandle connectionManagerPhoneAccount,
+            ConnectionRequest request) {
+        synchronized (sLock) {
+            if (sConnectionService != null) {
+                return sConnectionService.onCreateOutgoingConference(connectionManagerPhoneAccount,
+                        request);
+            } else {
+                return null;
+            }
+        }
+    }
+
+    @Override
+    public void onCreateOutgoingConferenceFailed(PhoneAccountHandle connectionManagerPhoneAccount,
+            ConnectionRequest request) {
+        synchronized (sLock) {
+            if (sConnectionService != null) {
+                sConnectionService.onCreateOutgoingConferenceFailed(connectionManagerPhoneAccount,
+                        request);
+            }
+        }
+    }
+
+    @Override
+    public Conference onCreateIncomingConference(PhoneAccountHandle connectionManagerPhoneAccount,
+            ConnectionRequest request) {
+        synchronized (sLock) {
+            if (sConnectionService != null) {
+                return sConnectionService.onCreateIncomingConference(connectionManagerPhoneAccount,
+                        request);
+            } else {
+                return null;
+            }
+        }
+    }
+
+    @Override
+    public void onCreateIncomingConferenceFailed(PhoneAccountHandle connectionManagerPhoneAccount,
+            ConnectionRequest request) {
+        synchronized (sLock) {
+            if (sConnectionService != null) {
+                sConnectionService.onCreateIncomingConferenceFailed(connectionManagerPhoneAccount,
+                        request);
+            }
+        }
+    }
+
+    @Override
     public void onConference(Connection connection1, Connection connection2) {
         synchronized(sLock) {
             if (sConnectionService != null) {
@@ -175,6 +223,25 @@
         }
     }
 
+    public static RemoteConference createRemoteIncomingConferenceToTelecom(
+            PhoneAccountHandle connectionManagerPhoneAccount,
+            ConnectionRequest request) {
+        synchronized (sLock) {
+            return sTelecomConnectionService.createRemoteIncomingConference(
+                    connectionManagerPhoneAccount, request);
+        }
+    }
+
+
+    public static RemoteConference createRemoteOutgoingConferenceToTelecom(
+            PhoneAccountHandle connectionManagerPhoneAccount,
+            ConnectionRequest request) {
+        synchronized (sLock) {
+            return sTelecomConnectionService.createRemoteOutgoingConference(
+                    connectionManagerPhoneAccount, request);
+        }
+    }
+
     @Override
     public void onRemoteConferenceAdded(RemoteConference conference) {
         synchronized(sLock) {
diff --git a/tests/tests/telecom/src/android/telecom/cts/CtsRemoteConnectionService.java b/tests/tests/telecom/src/android/telecom/cts/CtsRemoteConnectionService.java
index 13b525f..6d137f5 100644
--- a/tests/tests/telecom/src/android/telecom/cts/CtsRemoteConnectionService.java
+++ b/tests/tests/telecom/src/android/telecom/cts/CtsRemoteConnectionService.java
@@ -116,6 +116,35 @@
     }
 
     @Override
+    public Conference onCreateOutgoingConference(PhoneAccountHandle connectionManagerPhoneAccount,
+            ConnectionRequest request) {
+        synchronized(sLock) {
+            if (sConnectionService != null) {
+                return sConnectionService.onCreateOutgoingConference(
+                        connectionManagerPhoneAccount, request);
+            } else {
+                return mMockConnectionService.onCreateOutgoingConference(
+                        connectionManagerPhoneAccount, request);
+            }
+        }
+    }
+
+
+    @Override
+    public Conference onCreateIncomingConference(PhoneAccountHandle connectionManagerPhoneAccount,
+            ConnectionRequest request) {
+        synchronized(sLock) {
+            if (sConnectionService != null) {
+                return sConnectionService.onCreateIncomingConference(
+                        connectionManagerPhoneAccount, request);
+            } else {
+                return mMockConnectionService.onCreateIncomingConference(
+                        connectionManagerPhoneAccount, request);
+            }
+        }
+    }
+
+    @Override
     public void onConference(Connection connection1, Connection connection2) {
         synchronized(sLock) {
             if (sConnectionService != null) {
diff --git a/tests/tests/telecom/src/android/telecom/cts/ExtendedInCallServiceTest.java b/tests/tests/telecom/src/android/telecom/cts/ExtendedInCallServiceTest.java
index e6a9c05..1afeeab 100644
--- a/tests/tests/telecom/src/android/telecom/cts/ExtendedInCallServiceTest.java
+++ b/tests/tests/telecom/src/android/telecom/cts/ExtendedInCallServiceTest.java
@@ -137,7 +137,7 @@
         assertAudioRoute(connection, secondRoute);
         assertAudioRoute(inCallService, secondRoute);
 
-        // Call requestBluetoothAudio on a dummy device. This will be a noop since no devices are
+        // Call requestBluetoothAudio on a device. This will be a noop since no devices are
         // connected.
         if(TestUtils.HAS_BLUETOOTH) {
             ((InCallService) inCallService).requestBluetoothAudio(TestUtils.BLUETOOTH_DEVICE1);
@@ -367,8 +367,12 @@
             // The second call should now be active
             assertCallState(call2, Call.STATE_ACTIVE);
             assertConnectionState(connection2, Connection.STATE_ACTIVE);
-
         } finally {
+            // Cleanup the call explicitly before exiting car mode -- there's a potential race
+            // between disconnecting the calls from CTS and disabling car mode where if Telecom
+            // sees the car mode change first, it'll try and rebind the incall services while
+            // the calls are disconnecting.
+            cleanupCalls();
             // Set device back to normal
             manager.disableCarMode(0);
         }
diff --git a/tests/tests/telecom/src/android/telecom/cts/HandoverTest.java b/tests/tests/telecom/src/android/telecom/cts/HandoverTest.java
index 8c9131c..0b166c8 100644
--- a/tests/tests/telecom/src/android/telecom/cts/HandoverTest.java
+++ b/tests/tests/telecom/src/android/telecom/cts/HandoverTest.java
@@ -23,6 +23,7 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.telecom.Call;
+import android.telecom.Connection;
 import android.telecom.ConnectionRequest;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
@@ -210,6 +211,10 @@
         extras.putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE,
                 TEST_HANDOVER_SRC_PHONE_ACCOUNT_HANDLE);
         placeAndVerifyCall(extras);
+        Connection connection = verifyConnectionForOutgoingCall();
+        connection.setActive();
+        Call call = mInCallCallbacks.getService().getLastCall();
+        assertCallState(call, Call.STATE_ACTIVE);
     }
 
     /**
@@ -223,11 +228,13 @@
 
         // Expect the original call to have been informed of handover completion.
         mOnHandoverCompleteCounter.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
-        assertEquals(1, mOnHandoverCompleteCounter.getInvokeCount());
+        assertTrue("mOnHandoverCompleteCounter is zero",
+                mOnHandoverCompleteCounter.getInvokeCount() >= 1);
 
         // Also expect the connection to be informed of handover completion.
         connection.getHandoverCompleteCounter().waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
-        assertEquals(1, connection.getHandoverCompleteCounter().getInvokeCount());
+        assertTrue("connection's handoverCompleteCounter is zero",
+                connection.getHandoverCompleteCounter().getInvokeCount() >= 1);
 
         // Now, we expect that the original connection will get disconnected.
         waitUntilConditionIsTrueOrTimeout(new Condition() {
diff --git a/tests/tests/telecom/src/android/telecom/cts/IncomingCallTest.java b/tests/tests/telecom/src/android/telecom/cts/IncomingCallTest.java
index 4c579ed..0128b6d 100644
--- a/tests/tests/telecom/src/android/telecom/cts/IncomingCallTest.java
+++ b/tests/tests/telecom/src/android/telecom/cts/IncomingCallTest.java
@@ -16,14 +16,21 @@
 
 package android.telecom.cts;
 
+import static android.media.AudioAttributes.USAGE_NOTIFICATION_RINGTONE;
 import static android.telecom.cts.TestUtils.COMPONENT;
 import static android.telecom.cts.TestUtils.PACKAGE;
+import static android.telecom.cts.TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS;
 import static android.telephony.TelephonyManager.CALL_STATE_RINGING;
 
 import android.content.ComponentName;
+import android.media.AudioManager;
+import android.media.AudioPlaybackConfiguration;
+import android.media.RingtoneManager;
 import android.net.Uri;
 import android.os.Bundle;
-import android.provider.Telephony;
+import android.os.Handler;
+import android.os.Looper;
+import android.provider.Settings;
 import android.telecom.Call;
 import android.telecom.Connection;
 import android.telecom.ConnectionRequest;
@@ -31,9 +38,14 @@
 import android.telecom.TelecomManager;
 import android.telephony.PhoneStateListener;
 
+import com.android.compatibility.common.util.ShellIdentityUtils;
+
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executor;
+import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -110,6 +122,54 @@
     }
 
     /**
+     * This test verifies that when a default dialer is incapable of playing a ringtone that the
+     * platform still plays a ringtone.
+     * <p>
+     * Given that the default {@link MockInCallService} defined in the CTS tests does not declare
+     * {@link TelecomManager#METADATA_IN_CALL_SERVICE_RINGING}, we expect the Telecom framework to
+     * play a ringtone for an incoming call.
+     * @throws Exception
+     */
+    public void testRingOnIncomingCall() throws Exception {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        ShellIdentityUtils.invokeStaticMethodWithShellPermissions(
+                (ShellIdentityUtils.StaticShellPermissionMethodHelper<Void>) () -> {
+                    RingtoneManager.setActualDefaultRingtoneUri(mContext,
+                            RingtoneManager.TYPE_RINGTONE,
+                            Settings.System.DEFAULT_RINGTONE_URI);
+                    return null;
+                });
+        LinkedBlockingQueue<Boolean> queue = new LinkedBlockingQueue(1);
+        setupConnectionService(null, FLAG_REGISTER | FLAG_ENABLE);
+        AudioManager audioManager = mContext.getSystemService(AudioManager.class);
+        AudioManager.AudioPlaybackCallback callback = new AudioManager.AudioPlaybackCallback() {
+            @Override
+            public void onPlaybackConfigChanged(List<AudioPlaybackConfiguration> configs) {
+                super.onPlaybackConfigChanged(configs);
+                boolean isPlayingRingtone = configs.stream()
+                        .anyMatch(c -> c.getAudioAttributes().getUsage()
+                                == USAGE_NOTIFICATION_RINGTONE);
+                if (isPlayingRingtone && queue.isEmpty()) {
+                    queue.add(isPlayingRingtone);
+                }
+            }
+        };
+        audioManager.registerAudioPlaybackCallback(callback, new Handler(Looper.getMainLooper()));
+        Uri testNumber = createTestNumber();
+        addAndVerifyNewIncomingCall(testNumber, null);
+        verifyConnectionForIncomingCall();
+        verifyPhoneStateListenerCallbacksForCall(CALL_STATE_RINGING,
+                testNumber.getSchemeSpecificPart());
+        Boolean ringing = queue.poll(WAIT_FOR_STATE_CHANGE_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+        assertNotNull("Telecom should have played a ringtone, timed out waiting for state change",
+                ringing);
+        assertTrue("Telecom should have played a ringtone.", ringing);
+        audioManager.unregisterAudioPlaybackCallback(callback);
+    }
+
+    /**
      * Tests to be sure that new incoming calls can only be added using a valid PhoneAccountHandle
      * (b/26864502). If a PhoneAccount has not been registered for the PhoneAccountHandle, then
      * a SecurityException will be thrown.
diff --git a/tests/tests/telecom/src/android/telecom/cts/MockConference.java b/tests/tests/telecom/src/android/telecom/cts/MockConference.java
index 91c5a1a..1c8e9d9 100644
--- a/tests/tests/telecom/src/android/telecom/cts/MockConference.java
+++ b/tests/tests/telecom/src/android/telecom/cts/MockConference.java
@@ -16,6 +16,7 @@
 
 package android.telecom.cts;
 
+import android.net.Uri;
 import android.os.Bundle;
 import android.telecom.Conference;
 import android.telecom.Connection;
@@ -23,6 +24,14 @@
 import android.telecom.PhoneAccountHandle;
 import android.telecom.RemoteConference;
 import android.telecom.TelecomManager;
+import android.telecom.VideoProfile;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 
 /**
  * {@link Conference} subclass that immediately performs any state changes that are a result of
@@ -34,6 +43,9 @@
     private String mDtmfString = "";
     public TestUtils.InvokeCounter mOnExtrasChanged =
             new TestUtils.InvokeCounter("onExtrasChanged");
+    public List<Uri> mParticipants = new ArrayList<>();
+    public CompletableFuture<Void> mLock = new CompletableFuture<>();
+    private int mVideoState = VideoProfile.STATE_AUDIO_ONLY;
 
     public MockConference(PhoneAccountHandle phoneAccount) {
         super(phoneAccount);
@@ -63,6 +75,20 @@
     }
 
     @Override
+    public void onReject() {
+        super.onReject();
+        for (Connection c : getConnections()) {
+            c.setDisconnected(new DisconnectCause(DisconnectCause.REJECTED));
+            c.destroy();
+        }
+        destroy();
+        if (mRemoteConference != null) {
+            mRemoteConference.disconnect();
+        }
+        mLock.complete(null);
+    }
+
+    @Override
     public void onSeparate(Connection connection) {
         super.onSeparate(connection);
         if (getConnections().contains(connection)) {
@@ -141,6 +167,20 @@
         }
     }
 
+    @Override
+    public void onAddConferenceParticipants(List<Uri> participants) {
+        super.onAddConferenceParticipants(participants);
+        mParticipants.addAll(participants);
+        mLock.complete(null);
+    }
+
+    @Override
+    public void onAnswer(int videoState) {
+        super.onAnswer(videoState);
+        mVideoState = videoState;
+        mLock.complete(null);
+    }
+
     public void setRemoteConference(RemoteConference remoteConference) {
         mRemoteConference = remoteConference;
         Bundle bundle = remoteConference.getExtras();
@@ -157,9 +197,26 @@
         return mDtmfString;
     }
 
+    public int getVideoState() {
+        return mVideoState;
+    }
+
     @Override
     public void onExtrasChanged(Bundle extras) {
         setExtras(extras);
         mOnExtrasChanged.invoke(extras);
     }
+
+    public boolean acquireLock(long time, TimeUnit unit) {
+        try {
+            mLock.get(time, unit);
+        } catch (InterruptedException | ExecutionException | TimeoutException e) {
+            return false;
+        }
+        return true;
+    }
+
+    public void resetLock() {
+        mLock = new CompletableFuture<>();
+    }
 }
diff --git a/tests/tests/telecom/src/android/telecom/cts/MockConnection.java b/tests/tests/telecom/src/android/telecom/cts/MockConnection.java
index 463eb40..6b23dc6 100644
--- a/tests/tests/telecom/src/android/telecom/cts/MockConnection.java
+++ b/tests/tests/telecom/src/android/telecom/cts/MockConnection.java
@@ -29,6 +29,8 @@
 import android.telecom.cts.TestUtils.InvokeCounter;
 import android.util.SparseArray;
 
+import java.util.List;
+
 /**
  * {@link Connection} subclass that immediately performs any state changes that are a result of
  * callbacks sent from Telecom.
@@ -43,6 +45,7 @@
     public static final int ON_STOP_RTT = 7;
     public static final int ON_DEFLECT = 8;
     public static final int ON_SILENCE = 9;
+    public static final int ON_ADD_CONFERENCE_PARTICIPANTS = 10;
 
     private CallAudioState mCallAudioState =
             new CallAudioState(false, CallAudioState.ROUTE_EARPIECE, ROUTE_EARPIECE | ROUTE_SPEAKER);
@@ -54,7 +57,7 @@
     private RemoteConnection mRemoteConnection = null;
     private RttTextStream mRttTextStream;
 
-    private SparseArray<InvokeCounter> mInvokeCounterMap = new SparseArray<>(10);
+    private SparseArray<InvokeCounter> mInvokeCounterMap = new SparseArray<>(11);
 
     @Override
     public void onAnswer() {
@@ -195,6 +198,14 @@
     }
 
     @Override
+    public void onAddConferenceParticipants(List<Uri> participants) {
+        super.onAddConferenceParticipants(participants);
+        if (mInvokeCounterMap.get(ON_ADD_CONFERENCE_PARTICIPANTS) != null) {
+            mInvokeCounterMap.get(ON_ADD_CONFERENCE_PARTICIPANTS).invoke(participants);
+        }
+    }
+
+    @Override
     public void onExtrasChanged(Bundle extras) {
         super.onExtrasChanged(extras);
         if (mInvokeCounterMap.get(ON_EXTRAS_CHANGED) != null) {
@@ -353,6 +364,8 @@
                 return "onDeflect";
             case ON_SILENCE:
                 return "onSilence";
+            case ON_ADD_CONFERENCE_PARTICIPANTS:
+                return "onAddConferenceParticipants";
             default:
                 return "Callback";
         }
diff --git a/tests/tests/telecom/src/android/telecom/cts/MockConnectionService.java b/tests/tests/telecom/src/android/telecom/cts/MockConnectionService.java
index 72da8dc..2089fb9 100644
--- a/tests/tests/telecom/src/android/telecom/cts/MockConnectionService.java
+++ b/tests/tests/telecom/src/android/telecom/cts/MockConnectionService.java
@@ -20,13 +20,16 @@
 
 import android.net.Uri;
 import android.os.Bundle;
+import android.telecom.Conference;
 import android.telecom.Connection;
 import android.telecom.ConnectionRequest;
 import android.telecom.ConnectionService;
+import android.telecom.DisconnectCause;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.RemoteConference;
 import android.telecom.RemoteConnection;
 import android.telecom.TelecomManager;
+import android.util.Log;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -70,6 +73,7 @@
     public List<MockConference> conferences = new ArrayList<MockConference>();
     public List<RemoteConference> remoteConferences = new ArrayList<RemoteConference>();
     public List<MockConnection> failedConnections = new ArrayList<>();
+    public ConnectionRequest connectionRequest = null;
 
     @Override
     public Connection onCreateOutgoingConnection(PhoneAccountHandle connectionManagerPhoneAccount,
@@ -173,6 +177,51 @@
             lock.release();
         }
     }
+    @Override
+    public Conference onCreateOutgoingConference(PhoneAccountHandle connectionManagerPhoneAccount,
+            ConnectionRequest request) {
+        final Connection connection = onCreateOutgoingConnection(connectionManagerPhoneAccount,
+                request);
+        final MockConference conference = new MockConference(connectionManagerPhoneAccount);
+        conference.addConnection(connection);
+        conferences.add(conference);
+        connectionRequest = request;
+        lock.release();
+        return conference;
+    }
+
+    @Override
+    public void onCreateOutgoingConferenceFailed(PhoneAccountHandle connectionManagerPhoneAccount,
+            ConnectionRequest request) {
+        final MockConference conference = new MockConference(connectionManagerPhoneAccount);
+        conference.setDisconnected(new DisconnectCause(DisconnectCause.CANCELED));
+        conferences.add(conference);
+        connectionRequest = request;
+        lock.release(2);
+    }
+
+    @Override
+    public Conference onCreateIncomingConference(PhoneAccountHandle connectionManagerPhoneAccount,
+            ConnectionRequest request) {
+        final Connection connection = onCreateIncomingConnection(connectionManagerPhoneAccount,
+                request);
+        final MockConference conference = new MockConference(connectionManagerPhoneAccount);
+        conference.addConnection(connection);
+        connectionRequest = request;
+        conferences.add(conference);
+        lock.release();
+        return conference;
+    }
+
+    @Override
+    public void onCreateIncomingConferenceFailed(PhoneAccountHandle connectionManagerPhoneAccount,
+            ConnectionRequest request) {
+        final MockConference conference = new MockConference(connectionManagerPhoneAccount);
+        conference.setDisconnected(new DisconnectCause(DisconnectCause.CANCELED));
+        conferences.add(conference);
+        connectionRequest = request;
+        lock.release(2);
+    }
 
     @Override
     public void onRemoteExistingConnectionAdded(RemoteConnection connection) {
diff --git a/tests/tests/telecom/src/android/telecom/cts/MockInCallService.java b/tests/tests/telecom/src/android/telecom/cts/MockInCallService.java
index c4674f1..1df643a 100644
--- a/tests/tests/telecom/src/android/telecom/cts/MockInCallService.java
+++ b/tests/tests/telecom/src/android/telecom/cts/MockInCallService.java
@@ -27,14 +27,15 @@
 import android.util.Log;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Semaphore;
 
 public class MockInCallService extends InCallService {
     private static String LOG_TAG = "MockInCallService";
-    private ArrayList<Call> mCalls = new ArrayList<>();
-    private ArrayList<Call> mConferenceCalls = new ArrayList<>();
+    private final List<Call> mCalls = Collections.synchronizedList(new ArrayList<>());
+    private final List<Call> mConferenceCalls = Collections.synchronizedList(new ArrayList<>());
     private static InCallServiceCallbacks sCallbacks;
     private Map<Call, MockVideoCallCallback> mVideoCallCallbacks =
             new ArrayMap<Call, MockVideoCallCallback>();
@@ -349,20 +350,18 @@
     }
 
     public void disconnectAllCalls() {
-        for (final Call call: mCalls) {
-            call.disconnect();
-        }
-    }
-
-    public void rejectAllCalls() {
-        for (final Call call: mCalls) {
-            call.reject(false, null);
+        synchronized (mCalls) {
+            for (final Call call : mCalls) {
+                call.disconnect();
+            }
         }
     }
 
     public void disconnectAllConferenceCalls() {
-        for (final Call call: mConferenceCalls) {
-            call.disconnect();
+        synchronized (mConferenceCalls) {
+            for (final Call call : mConferenceCalls) {
+                call.disconnect();
+            }
         }
     }
 
diff --git a/tests/tests/telecom/src/android/telecom/cts/NonUiInCallServiceTest.java b/tests/tests/telecom/src/android/telecom/cts/NonUiInCallServiceTest.java
new file mode 100644
index 0000000..94ec4d0
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/NonUiInCallServiceTest.java
@@ -0,0 +1,133 @@
+package android.telecom.cts;
+
+import static android.telecom.cts.TestUtils.TEST_PHONE_ACCOUNT_HANDLE;
+import static android.telecom.cts.TestUtils.waitOnAllHandlers;
+
+import android.content.ComponentName;
+import android.content.ServiceConnection;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.os.DeadObjectException;
+import android.telecom.cts.api29incallservice.CtsApi29InCallService;
+import android.telecom.cts.api29incallservice.ICtsApi29InCallServiceControl;
+import android.util.Pair;
+
+import androidx.test.InstrumentationRegistry;
+
+public class NonUiInCallServiceTest extends BaseTelecomTestWithMockServices {
+    private static final String LOG_TAG = NonUiInCallServiceTest.class.getSimpleName();
+
+    private ServiceConnection mServiceConnection;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        if (mShouldTestTelecom) {
+            setupConnectionService(null, FLAG_REGISTER | FLAG_ENABLE);
+        }
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (mShouldTestTelecom) {
+            mTelecomManager.unregisterPhoneAccount(TEST_PHONE_ACCOUNT_HANDLE);
+            CtsConnectionService.tearDown();
+        }
+        super.tearDown();
+        waitOnAllHandlers(getInstrumentation());
+    }
+
+    public void testMidCallComponentEnablement() throws Exception {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        InstrumentationRegistry.getInstrumentation().getUiAutomation()
+                .adoptShellPermissionIdentity(
+                        "android.permission.CONTROL_INCALL_EXPERIENCE",
+                        "android.permission.CHANGE_COMPONENT_ENABLED_STATE");
+        try {
+            mContext.getPackageManager().setComponentEnabledSetting(
+                    ComponentName.createRelative(CtsApi29InCallService.PACKAGE_NAME,
+                            "." + CtsApi29InCallService.class.getSimpleName()),
+                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);
+            ICtsApi29InCallServiceControl controlInterface = setUpControl();
+
+            addAndVerifyNewIncomingCall(createTestNumber(), new Bundle());
+            waitOnAllHandlers(getInstrumentation());
+            assertFalse("Non-UI incall incorrectly bound to despite being disabled",
+                    controlInterface.hasReceivedBindRequest());
+
+            mContext.getPackageManager().setComponentEnabledSetting(
+                    ComponentName.createRelative(CtsApi29InCallService.PACKAGE_NAME,
+                            "." + CtsApi29InCallService.class.getSimpleName()),
+                    PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
+                    PackageManager.DONT_KILL_APP);
+
+            boolean hasBound = controlInterface.waitForBindRequest();
+            assertTrue("InCall was not bound to", hasBound);
+            waitOnAllHandlers(getInstrumentation());
+
+            assertEquals("Call was not sent to incall", 1, controlInterface.getLocalCallCount());
+
+            try {
+                controlInterface.kill();
+            } catch (DeadObjectException e) {
+                //expected
+            }
+            tearDownControl();
+        } finally {
+            InstrumentationRegistry.getInstrumentation().getUiAutomation()
+                    .dropShellPermissionIdentity();
+        }
+    }
+
+    public void testNullBinding() throws Exception {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        InstrumentationRegistry.getInstrumentation().getUiAutomation()
+                .adoptShellPermissionIdentity(
+                        "android.permission.CONTROL_INCALL_EXPERIENCE",
+                        "android.permission.CHANGE_COMPONENT_ENABLED_STATE");
+        try {
+            mContext.getPackageManager().setComponentEnabledSetting(
+                    ComponentName.createRelative(CtsApi29InCallService.PACKAGE_NAME,
+                            "." + CtsApi29InCallService.class.getSimpleName()),
+                    PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);
+            ICtsApi29InCallServiceControl controlInterface = setUpControl();
+            controlInterface.setShouldReturnNullBinding(true);
+
+            int currentCallCount = addNewIncomingCall(createTestNumber(), new Bundle());
+            // The test InCallService can be bound and unbound before this test gets a chance to
+            // validate. Ensure that the test verifies it is bound before checking if onCallAdded
+            // was called.
+            assertTrue("Non-UI incall incorrectly not bound to despite being enabled",
+                    controlInterface.waitForBindRequest());
+            verifyNewIncomingCall(currentCallCount);
+
+            assertEquals("Call was sent to incall despite null binding",
+                    0, controlInterface.getLocalCallCount());
+
+            try {
+                controlInterface.kill();
+            } catch (DeadObjectException e) {
+                //expected
+            }
+            tearDownControl();
+        } finally {
+            InstrumentationRegistry.getInstrumentation().getUiAutomation()
+                    .dropShellPermissionIdentity();
+        }
+    }
+    private ICtsApi29InCallServiceControl setUpControl() throws Exception {
+        Pair<ServiceConnection, ICtsApi29InCallServiceControl> setupResult =
+                Api29InCallUtils.setupControl(mContext);
+        mServiceConnection = setupResult.first;
+        return setupResult.second;
+    }
+
+    private void tearDownControl() throws Exception {
+        Api29InCallUtils.tearDownControl(mContext,
+                mServiceConnection);
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/telecom/src/android/telecom/cts/OutgoingCallTest.java b/tests/tests/telecom/src/android/telecom/cts/OutgoingCallTest.java
index 494b2c8..5a75fbc 100644
--- a/tests/tests/telecom/src/android/telecom/cts/OutgoingCallTest.java
+++ b/tests/tests/telecom/src/android/telecom/cts/OutgoingCallTest.java
@@ -16,16 +16,26 @@
 
 package android.telecom.cts;
 
+import static android.telecom.Call.STATE_SELECT_PHONE_ACCOUNT;
+
 import android.content.Context;
 import android.media.AudioManager;
 import android.net.Uri;
 import android.os.Bundle;
+import android.telecom.Call;
 import android.telecom.CallAudioState;
 import android.telecom.Connection;
+import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
 import android.telephony.PhoneStateListener;
 import android.telephony.TelephonyManager;
+import android.telephony.emergency.EmergencyNumber;
 
+import com.android.compatibility.common.util.SystemUtil;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
@@ -112,14 +122,45 @@
         assertNotAudioRoute(mInCallCallbacks.getService(), CallAudioState.ROUTE_SPEAKER);
     }
 
-    public void testPhoneStateListenerInvokedOnOutgoingEmergencyCall() throws Exception {
+    public void testPhoneStateListenerInvokedOnOutgoingEmergencyCall() throws Throwable {
         if (!mShouldTestTelecom) {
             return;
         }
         TestUtils.setSystemDialerOverride(getInstrumentation());
+        TestUtils.setTestEmergencyPhoneAccountPackageFilter(getInstrumentation(), mContext);
         TestUtils.addTestEmergencyNumber(getInstrumentation(), TEST_EMERGENCY_NUMBER);
-        mTelecomManager.placeCall(Uri.fromParts("tel", TEST_EMERGENCY_NUMBER, null), null);
-        verifyPhoneStateListenerCallbacksForEmergencyCall(TEST_EMERGENCY_NUMBER);
+        Map<Integer, List<EmergencyNumber>> emergencyNumbers = null;
+
+        for (int i = 0; i < 5; i++) {
+            emergencyNumbers = mPhoneStateListener.waitForEmergencyNumberListUpdate(
+                    TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+            assertNotNull("Never got an update that the test emergency number was registered",
+                    emergencyNumbers);
+            if (doesEmergencyNumberListContainTestNumber(emergencyNumbers)) {
+                break;
+            }
+        }
+        assertTrue("Emergency number list from telephony still doesn't have the test number",
+                doesEmergencyNumberListContainTestNumber(emergencyNumbers));
+
+        try {
+            Bundle extras = new Bundle();
+            extras.putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE,
+                    TestUtils.TEST_PHONE_ACCOUNT_HANDLE);
+            mTelecomManager.placeCall(Uri.fromParts("tel", TEST_EMERGENCY_NUMBER, null), extras);
+
+            verifyPhoneStateListenerCallbacksForEmergencyCall(TEST_EMERGENCY_NUMBER);
+        } finally {
+            TestUtils.removeTestEmergencyNumber(getInstrumentation(), TEST_EMERGENCY_NUMBER);
+            TestUtils.clearTestEmergencyPhoneAccountPackageFilter(getInstrumentation());
+        }
+    }
+
+    private boolean doesEmergencyNumberListContainTestNumber(
+            Map<Integer, List<EmergencyNumber>> emergencyNumbers) {
+        return emergencyNumbers.values().stream().flatMap(List::stream)
+                .anyMatch(numberObj ->
+                        Objects.equals(numberObj.getNumber(), TEST_EMERGENCY_NUMBER));
     }
 
     public void testPhoneStateListenerInvokedOnOutgoingCall() throws Exception {
@@ -197,4 +238,42 @@
         assertEquals(TestUtils.TEST_PHONE_ACCOUNT_HANDLE_2, conn.getPhoneAccountHandle());
         conn.onDisconnect();
     }
+
+    public void testAccountSelectionAvailable() throws Exception {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        CountDownLatch latch = new CountDownLatch(1);
+        mInCallCallbacks = new MockInCallService.InCallServiceCallbacks() {
+            @Override
+            public void onCallAdded(Call call, int numCalls) {
+                if (call.getState() == STATE_SELECT_PHONE_ACCOUNT) {
+                    latch.countDown();
+                }
+            }
+        };
+        MockInCallService.setCallbacks(mInCallCallbacks);
+
+        mTelecomManager.registerPhoneAccount(TestUtils.TEST_PHONE_ACCOUNT);
+        TestUtils.enablePhoneAccount(getInstrumentation(), TestUtils.TEST_PHONE_ACCOUNT_HANDLE);
+        mTelecomManager.registerPhoneAccount(TestUtils.TEST_PHONE_ACCOUNT_2);
+        TestUtils.enablePhoneAccount(getInstrumentation(), TestUtils.TEST_PHONE_ACCOUNT_HANDLE_2);
+
+        PhoneAccountHandle cachedHandle = mTelecomManager.getUserSelectedOutgoingPhoneAccount();
+        SystemUtil.runWithShellPermissionIdentity(() -> {
+            mTelecomManager.setUserSelectedOutgoingPhoneAccount(null);
+        });
+
+        try {
+            Uri testNumber = createTestNumber();
+            mTelecomManager.placeCall(testNumber, null);
+
+            assertTrue(latch.await(TestUtils.WAIT_FOR_CALL_ADDED_TIMEOUT_S, TimeUnit.SECONDS));
+        } finally {
+            SystemUtil.runWithShellPermissionIdentity(() -> {
+                mTelecomManager.setUserSelectedOutgoingPhoneAccount(cachedHandle);
+            });
+        }
+    }
 }
diff --git a/tests/tests/telecom/src/android/telecom/cts/RemoteConferenceTest.java b/tests/tests/telecom/src/android/telecom/cts/RemoteConferenceTest.java
index 57654f40..7ac728f 100644
--- a/tests/tests/telecom/src/android/telecom/cts/RemoteConferenceTest.java
+++ b/tests/tests/telecom/src/android/telecom/cts/RemoteConferenceTest.java
@@ -460,14 +460,17 @@
         mRemoteConferenceObject.unregisterCallback(callback);
     }
 
-    private void verifyRemoteConferenceObject(RemoteConference remoteConferenceObject,
+    public static void verifyRemoteConferenceObject(RemoteConference remoteConferenceObject,
             MockConference remoteConference, MockConference conference) {
         assertEquals(remoteConference.getConnectionCapabilities(),
                 remoteConferenceObject.getConnectionCapabilities());
         assertTrue(remoteConferenceObject.getConferenceableConnections().isEmpty());
         List<RemoteConnection> remoteConnections = new ArrayList<>();
         for (Connection c: conference.getConnections()) {
-            remoteConnections.add(((MockConnection)c).getRemoteConnection());
+            RemoteConnection remoteConnection = ((MockConnection) c).getRemoteConnection();
+            if (remoteConnection != null) {
+                remoteConnections.add(remoteConnection);
+            }
         }
         assertEquals(remoteConnections, remoteConferenceObject.getConnections());
         assertEquals(remoteConference.getDisconnectCause(),
diff --git a/tests/tests/telecom/src/android/telecom/cts/RemoteConnectionTest.java b/tests/tests/telecom/src/android/telecom/cts/RemoteConnectionTest.java
index 12960f3..a1fa14d 100644
--- a/tests/tests/telecom/src/android/telecom/cts/RemoteConnectionTest.java
+++ b/tests/tests/telecom/src/android/telecom/cts/RemoteConnectionTest.java
@@ -16,7 +16,11 @@
 
 package android.telecom.cts;
 
-import static android.telecom.cts.TestUtils.*;
+import static android.telecom.cts.AdhocConferenceTest.PARTICIPANTS;
+import static android.telecom.cts.TestUtils.InvokeCounter;
+import static android.telecom.cts.TestUtils.TEST_PHONE_ACCOUNT_HANDLE;
+import static android.telecom.cts.TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_CALLBACK;
+import static android.telecom.cts.TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS;
 
 import android.graphics.SurfaceTexture;
 import android.net.Uri;
@@ -24,10 +28,12 @@
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.telecom.Call;
+import android.telecom.Conference;
 import android.telecom.Connection;
 import android.telecom.ConnectionRequest;
 import android.telecom.DisconnectCause;
 import android.telecom.PhoneAccountHandle;
+import android.telecom.RemoteConference;
 import android.telecom.RemoteConnection;
 import android.telecom.RemoteConnection.VideoProvider;
 import android.telecom.StatusHints;
@@ -132,6 +138,94 @@
         assertConnectionState(mRemoteConnection, Connection.STATE_DISCONNECTED);
     }
 
+    public void testRemoteIncomingConference() throws Exception {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        try {
+            MockConnectionService managerConnectionService = new MockConnectionService() {
+                @Override
+                public Conference onCreateIncomingConference(
+                        PhoneAccountHandle connectionManagerPhoneAccount,
+                        ConnectionRequest request) {
+                    MockConference conference = (MockConference) super.onCreateIncomingConference(
+                            connectionManagerPhoneAccount, request);
+                    ConnectionRequest remoteRequest = new ConnectionRequest(
+                            TEST_REMOTE_PHONE_ACCOUNT_HANDLE,
+                            request.getAddress(),
+                            request.getExtras());
+                    RemoteConference remoteConference = CtsConnectionService
+                            .createRemoteIncomingConferenceToTelecom(
+                                    TEST_REMOTE_PHONE_ACCOUNT_HANDLE, remoteRequest);
+                    conference.setRemoteConference(remoteConference);
+                    return conference;
+                }
+            };
+            setupConnectionServices(managerConnectionService, null,
+                    FLAG_REGISTER | FLAG_ENABLE);
+        } catch (Exception e) {
+            fail("Error in setting up the connection services");
+        }
+
+        try {
+            mTelecomManager.addNewIncomingConference(TEST_PHONE_ACCOUNT_HANDLE, null);
+            MockConference conference = verifyConference(2);
+            MockConference remoteConference = verifyConferenceOnRemoteCS(2);
+            RemoteConferenceTest.verifyRemoteConferenceObject(conference.getRemoteConference(),
+                    remoteConference, conference);
+            conference.onDisconnect();
+        } catch (Exception e) {
+            fail(e.getMessage());
+        } finally {
+            CtsConnectionService.tearDown();
+            CtsRemoteConnectionService.tearDown();
+        }
+    }
+
+    public void testRemoteOutgoingConference() throws Exception {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        try {
+            MockConnectionService managerConnectionService = new MockConnectionService() {
+                @Override
+                public Conference onCreateOutgoingConference(
+                        PhoneAccountHandle connectionManagerPhoneAccount,
+                        ConnectionRequest request) {
+                    MockConference conference = (MockConference) super.onCreateIncomingConference(
+                            connectionManagerPhoneAccount, request);
+                    ConnectionRequest remoteRequest = new ConnectionRequest(
+                            TEST_REMOTE_PHONE_ACCOUNT_HANDLE,
+                            request.getAddress(),
+                            request.getExtras());
+                    RemoteConference remoteConference = CtsConnectionService
+                            .createRemoteOutgoingConferenceToTelecom(
+                                    TEST_REMOTE_PHONE_ACCOUNT_HANDLE, remoteRequest);
+                    conference.setRemoteConference(remoteConference);
+                    return conference;
+                }
+            };
+            setupConnectionServices(managerConnectionService, null,
+                    FLAG_REGISTER | FLAG_ENABLE);
+        } catch (Exception e) {
+            fail("Error in setting up the connection services");
+        }
+
+        try {
+            mTelecomManager.startConference(PARTICIPANTS, null);
+            MockConference conference = verifyConference(2);
+            MockConference remoteConference = verifyConferenceOnRemoteCS(2);
+            RemoteConferenceTest.verifyRemoteConferenceObject(conference.getRemoteConference(),
+                    remoteConference, conference);
+            conference.onDisconnect();
+        } catch (Exception e) {
+            fail(e.getMessage());
+        } finally {
+            CtsConnectionService.tearDown();
+            CtsRemoteConnectionService.tearDown();
+        }
+    }
+
     public void testRemoteConnectionDTMFTone() {
         if (!mShouldTestTelecom) {
             return;
@@ -638,6 +732,24 @@
         counter.waitForCount(1);
     }
 
+    /**
+     * Verifies that a call to {@link RemoteConnection#addConferenceParticipants(List)} is proxied
+     * to {@link Connection#onAddConferenceParticipants(List)}.
+     */
+    public void testAddConferenceParticipants() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+
+        setupRemoteConnectionCallbacksTest();
+
+        InvokeCounter counter = mRemoteConnection.getInvokeCounter(
+                MockConnection.ON_ADD_CONFERENCE_PARTICIPANTS);
+        mRemoteConnectionObject.addConferenceParticipants(PARTICIPANTS);
+        counter.waitForCount(1, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
+        assertEquals(PARTICIPANTS, counter.getArgs(0)[0]);
+    }
+
     public void testRemoteConnectionCallbacks_Destroy() {
         if (!mShouldTestTelecom) {
             return;
diff --git a/tests/tests/telecom/src/android/telecom/cts/SelfManagedConnectionServiceTest.java b/tests/tests/telecom/src/android/telecom/cts/SelfManagedConnectionServiceTest.java
index 875122b..7311d50 100644
--- a/tests/tests/telecom/src/android/telecom/cts/SelfManagedConnectionServiceTest.java
+++ b/tests/tests/telecom/src/android/telecom/cts/SelfManagedConnectionServiceTest.java
@@ -456,7 +456,7 @@
             }
         }, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS);
         if (TestUtils.HAS_BLUETOOTH) {
-            // Call requestBluetoothAudio on a dummy device. This will be a noop since no devices are
+            // Call requestBluetoothAudio on a device. This will be a noop since no devices are
             // connected.
             connection.requestBluetoothAudio(TestUtils.BLUETOOTH_DEVICE1);
         }
diff --git a/tests/tests/telecom/src/android/telecom/cts/TelecomManagerTest.java b/tests/tests/telecom/src/android/telecom/cts/TelecomManagerTest.java
index 56ea29c..fa0deda 100644
--- a/tests/tests/telecom/src/android/telecom/cts/TelecomManagerTest.java
+++ b/tests/tests/telecom/src/android/telecom/cts/TelecomManagerTest.java
@@ -16,8 +16,18 @@
 
 package android.telecom.cts;
 
+import static com.android.compatibility.common.util.ShellIdentityUtils
+        .invokeMethodWithShellPermissionsNoReturn;
 import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
 
+import android.app.AppOpsManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.media.AudioDeviceInfo;
+import android.media.AudioManager;
 import android.net.Uri;
 import android.os.Bundle;
 import android.telecom.TelecomManager;
@@ -29,6 +39,7 @@
 
     private static final String TEST_EMERGENCY_NUMBER = "5553637";
     private static final Uri TEST_EMERGENCY_URI = Uri.fromParts("tel", TEST_EMERGENCY_NUMBER, null);
+    private static final String CTS_TELECOM_PKG = TelecomManagerTest.class.getPackage().getName();
 
     public void testGetCurrentTtyMode() {
         if (!mShouldTestTelecom) {
@@ -51,6 +62,68 @@
         }
     }
 
+    public void testHasCompanionInCallServiceAccess() {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        AppOpsManager appOpsManager = mContext.getSystemService(AppOpsManager.class);
+        PackageManager packageManager = mContext.getPackageManager();
+        try {
+            final int uid = packageManager.getApplicationInfo(CTS_TELECOM_PKG, 0).uid;
+            invokeMethodWithShellPermissionsNoReturn(appOpsManager,
+                    (appOpsMan) -> appOpsMan.setUidMode(AppOpsManager.OPSTR_MANAGE_ONGOING_CALLS,
+                            uid, AppOpsManager.MODE_ALLOWED));
+            assertTrue(mTelecomManager.hasCompanionInCallServiceAccess());
+            invokeMethodWithShellPermissionsNoReturn(appOpsManager,
+                    (appOpsMan) -> appOpsMan.setUidMode(AppOpsManager.OPSTR_MANAGE_ONGOING_CALLS,
+                            uid, AppOpsManager.opToDefaultMode(
+                                    AppOpsManager.OPSTR_MANAGE_ONGOING_CALLS)));
+            assertFalse(mTelecomManager.hasCompanionInCallServiceAccess());
+        } catch (PackageManager.NameNotFoundException ex) {
+            fail("Couldn't get uid for android.telecom.cts");
+        }
+    }
+
+    public void testTtyModeBroadcasts() {
+        // We only expect the actual tty mode to change if there's a wired headset plugged in, so
+        // don't do the test if there isn't one plugged in.
+        if (!mShouldTestTelecom || !isWiredHeadsetPluggedIn()) {
+            return;
+        }
+        LinkedBlockingQueue<Intent> ttyModeQueue = new LinkedBlockingQueue<>(1);
+        BroadcastReceiver ttyModeReceiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                if (TelecomManager.ACTION_CURRENT_TTY_MODE_CHANGED.equals(intent.getAction())) {
+                    ttyModeQueue.offer(intent);
+                }
+            }
+        };
+        mContext.registerReceiver(ttyModeReceiver,
+                new IntentFilter(TelecomManager.ACTION_CURRENT_TTY_MODE_CHANGED));
+        Intent changePreferredTtyMode =
+                new Intent(TelecomManager.ACTION_TTY_PREFERRED_MODE_CHANGED);
+        changePreferredTtyMode.putExtra(TelecomManager.EXTRA_TTY_PREFERRED_MODE,
+                TelecomManager.TTY_MODE_FULL);
+
+        try {
+            runWithShellPermissionIdentity(() -> mContext.sendBroadcast(changePreferredTtyMode));
+            Intent intent = ttyModeQueue.poll(
+                    TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+            assertTrue(intent.hasExtra(TelecomManager.EXTRA_CURRENT_TTY_MODE));
+            assertEquals(TelecomManager.TTY_MODE_FULL,
+                    intent.getIntExtra(TelecomManager.EXTRA_CURRENT_TTY_MODE, -1));
+        } catch (InterruptedException e) {
+            fail("interrupted");
+        } finally {
+            Intent revertPreferredTtyMode =
+                    new Intent(TelecomManager.ACTION_TTY_PREFERRED_MODE_CHANGED);
+            revertPreferredTtyMode.putExtra(TelecomManager.EXTRA_TTY_PREFERRED_MODE,
+                    TelecomManager.TTY_MODE_OFF);
+            runWithShellPermissionIdentity(() -> mContext.sendBroadcast(revertPreferredTtyMode));
+        }
+    }
+
     public void testIsInEmergencyCall_noOngoingEmergencyCall() {
         if (!mShouldTestTelecom) {
             return;
@@ -101,4 +174,24 @@
             e.printStackTrace();
         }
     }
+
+    private boolean isWiredHeadsetPluggedIn() {
+        AudioManager audioManager = mContext.getSystemService(AudioManager.class);
+        AudioDeviceInfo[] devices = audioManager.getDevices(AudioManager.GET_DEVICES_ALL);
+        boolean isPluggedIn = false;
+        for (AudioDeviceInfo device : devices) {
+            switch (device.getType()) {
+                case AudioDeviceInfo.TYPE_WIRED_HEADPHONES:
+                case AudioDeviceInfo.TYPE_WIRED_HEADSET:
+                case AudioDeviceInfo.TYPE_USB_HEADSET:
+                case AudioDeviceInfo.TYPE_USB_DEVICE:
+                    isPluggedIn = true;
+            }
+            if (isPluggedIn) {
+                break;
+            }
+        }
+        return isPluggedIn;
+    }
+
 }
diff --git a/tests/tests/telecom/src/android/telecom/cts/TestUtils.java b/tests/tests/telecom/src/android/telecom/cts/TestUtils.java
index a360bd9..dcd3e26 100644
--- a/tests/tests/telecom/src/android/telecom/cts/TestUtils.java
+++ b/tests/tests/telecom/src/android/telecom/cts/TestUtils.java
@@ -120,7 +120,8 @@
                     PhoneAccount.CAPABILITY_VIDEO_CALLING |
                     PhoneAccount.CAPABILITY_RTT |
                     PhoneAccount.CAPABILITY_CONNECTION_MANAGER |
-                    PhoneAccount.CAPABILITY_PLACE_EMERGENCY_CALLS)
+                    PhoneAccount.CAPABILITY_PLACE_EMERGENCY_CALLS |
+                    PhoneAccount.CAPABILITY_ADHOC_CONFERENCE_CALLING)
             .setHighlightColor(Color.RED)
             .setShortDescription(ACCOUNT_LABEL)
             .addSupportedUriScheme(PhoneAccount.SCHEME_TEL)
diff --git a/tests/tests/telecom/src/android/telecom/cts/ThirdPartyInCallServiceAppOpsPermissionTest.java b/tests/tests/telecom/src/android/telecom/cts/ThirdPartyInCallServiceAppOpsPermissionTest.java
new file mode 100644
index 0000000..446c67c
--- /dev/null
+++ b/tests/tests/telecom/src/android/telecom/cts/ThirdPartyInCallServiceAppOpsPermissionTest.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2020 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.telecom.cts;
+
+import static android.telecom.cts.TestUtils.TEST_PHONE_ACCOUNT_HANDLE;
+import static android.telecom.cts.TestUtils.WAIT_FOR_STATE_CHANGE_TIMEOUT_MS;
+
+import static com.android.compatibility.common.util.ShellIdentityUtils
+        .invokeMethodWithShellPermissionsNoReturn;
+import static com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity;
+
+import android.app.AppOpsManager;
+import android.app.UiModeManager;
+import android.app.role.RoleManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.telecom.TelecomManager;
+import android.telecom.cts.thirdptyincallservice.CtsThirdPartyInCallService;
+import android.telecom.cts.thirdptyincallservice.CtsThirdPartyInCallServiceControl;
+import android.telecom.cts.thirdptyincallservice.ICtsThirdPartyInCallServiceControl;
+import android.text.TextUtils;
+import android.util.Log;
+
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+public class ThirdPartyInCallServiceAppOpsPermissionTest extends BaseTelecomTestWithMockServices {
+
+    private static final String TAG = ThirdPartyInCallServiceAppOpsPermissionTest
+            .class.getSimpleName();
+    private static final String THIRD_PARITY_PACKAGE_NAME = CtsThirdPartyInCallService
+            .class.getPackage().getName();
+    private static final Uri TEST_URI = Uri.parse("tel:555-TEST");
+    private Context mContext;
+    private AppOpsManager mAppOpsManager;
+    private PackageManager mPackageManager;
+    private TelecomManager mTelecomManager;
+    ICtsThirdPartyInCallServiceControl mICtsThirdPartyInCallServiceControl;
+    private boolean mExpectedTearDownBindingStatus;
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        mContext = getInstrumentation().getContext();
+        mAppOpsManager = mContext.getSystemService(AppOpsManager.class);
+        mPackageManager = mContext.getPackageManager();
+        mTelecomManager = mContext.getSystemService(TelecomManager.class);
+        setupConnectionService(null, FLAG_REGISTER | FLAG_ENABLE);
+        setUpControl();
+        mICtsThirdPartyInCallServiceControl.resetLatchForServiceBound(false);
+        mExpectedTearDownBindingStatus = true;
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        mICtsThirdPartyInCallServiceControl.resetCalls();
+        super.tearDown();
+        if (mExpectedTearDownBindingStatus) {
+            assertBindStatus(/* true: bind, false: unbind */false, /* expected result */true);
+        }
+    }
+
+    public void testWithoutAppOpsPermission() throws Exception {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        setInCallServiceAppOpsPermission(false);
+        int previousCallCount = mICtsThirdPartyInCallServiceControl.getLocalCallCount();
+        addAndVerifyNewIncomingCall(TEST_URI, null);
+        assertBindStatus(/* true: bind, false: unbind */true, /* expected result */false);
+        assertCallCount(previousCallCount);
+        // Third Party InCallService hasn't been bound yet, unbound latch can be null when tearDown.
+        mExpectedTearDownBindingStatus = false;
+    }
+
+    public void testWithAppOpsPermission() throws Exception {
+        if (!mShouldTestTelecom) {
+            return;
+        }
+        // Grant App Ops Permission
+        setInCallServiceAppOpsPermission(true);
+
+        int previousCallCount = mICtsThirdPartyInCallServiceControl.getLocalCallCount();
+        addAndVerifyNewIncomingCall(TEST_URI, null);
+        assertBindStatus(/* true: bind, false: unbind */true, /* expected result */true);
+        assertCallCount(previousCallCount + 1);
+        mICtsThirdPartyInCallServiceControl.resetLatchForServiceBound(true);
+
+        // Revoke App Ops Permission
+        setInCallServiceAppOpsPermission(false);
+    }
+
+    /**
+     *
+     * @param bind: check the status of InCallService bind latches.
+     *             Values: true (bound latch), false (unbound latch).
+     * @param success: whether the latch should have counted down.
+     */
+    private void assertBindStatus(boolean bind, boolean success) {
+        waitUntilConditionIsTrueOrTimeout(new Condition() {
+            @Override
+            public Object expected() {
+                return success;
+            }
+
+            @Override
+            public Object actual() {
+                try {
+                    return mICtsThirdPartyInCallServiceControl.checkBindStatus(bind);
+                } catch (RemoteException re) {
+                    Log.e(TAG, "Remote exception when checking bind status: " + re);
+                    return false;
+                }
+            }
+        }, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS, "Unable to " + (bind ? "Bind" : "Unbind")
+                + " third party in call service");
+    }
+
+    private void assertCallCount(int expected) {
+        waitUntilConditionIsTrueOrTimeout(new Condition() {
+            @Override
+            public Object expected() {
+                return expected;
+            }
+
+            @Override
+            public Object actual() {
+                try {
+                    return mICtsThirdPartyInCallServiceControl.getLocalCallCount();
+                } catch (RemoteException re) {
+                    Log.e(TAG, "Remote exception when getting local call count: " + re);
+                    return -1;
+                }
+            }
+         }, WAIT_FOR_STATE_CHANGE_TIMEOUT_MS,
+                "Failed to match localCallCount and expected: " + expected);
+    }
+
+    private void setUpControl() throws InterruptedException {
+        Intent bindIntent = new Intent(CtsThirdPartyInCallServiceControl.CONTROL_INTERFACE_ACTION);
+        // mContext is android.telecom.cts, which doesn't include thirdptyincallservice.
+        ComponentName controlComponentName =
+              ComponentName.createRelative(
+                    CtsThirdPartyInCallServiceControl.class.getPackage().getName(),
+                            CtsThirdPartyInCallServiceControl.class.getName());
+
+        bindIntent.setComponent(controlComponentName);
+        final CountDownLatch bindLatch = new CountDownLatch(1);
+        boolean success = mContext.bindService(bindIntent, new ServiceConnection() {
+            @Override
+            public void onServiceConnected(ComponentName name, IBinder service) {
+                Log.i(TAG, "Service Connected: " + name);
+                mICtsThirdPartyInCallServiceControl =
+                        ICtsThirdPartyInCallServiceControl.Stub.asInterface(service);
+                bindLatch.countDown();
+            }
+
+            @Override
+            public void onServiceDisconnected(ComponentName name) {
+                mICtsThirdPartyInCallServiceControl = null;
+            }
+        }, Context.BIND_AUTO_CREATE);
+        if (!success) {
+            fail("Failed to get control interface -- bind error");
+        }
+        bindLatch.await(WAIT_FOR_STATE_CHANGE_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+    }
+
+    private void setInCallServiceAppOpsPermission(boolean allow)
+            throws PackageManager.NameNotFoundException {
+        int uid = mPackageManager.getApplicationInfo(THIRD_PARITY_PACKAGE_NAME, 0).uid;
+        invokeMethodWithShellPermissionsNoReturn(mAppOpsManager,
+              (appOpsMan) -> appOpsMan.setUidMode(AppOpsManager.OPSTR_MANAGE_ONGOING_CALLS,
+                      uid, allow ? AppOpsManager.MODE_ALLOWED : AppOpsManager.opToDefaultMode(
+                              AppOpsManager.OPSTR_MANAGE_ONGOING_CALLS)));
+    }
+}
diff --git a/tests/tests/telecom2/Android.bp b/tests/tests/telecom2/Android.bp
index 3370dc3..abc14a8 100644
--- a/tests/tests/telecom2/Android.bp
+++ b/tests/tests/telecom2/Android.bp
@@ -20,7 +20,7 @@
         "ctstestrunner-axt",
         "CtsTelecomUtilLib",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: [
         "src/**/*.java",
     ],
@@ -35,7 +35,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/telecom3/Android.bp b/tests/tests/telecom3/Android.bp
index dffd822..1b87231 100644
--- a/tests/tests/telecom3/Android.bp
+++ b/tests/tests/telecom3/Android.bp
@@ -21,7 +21,7 @@
         "ctstestrunner-axt",
         "CtsTelecomUtilLib",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: ["src/**/*.java"],
     aaptflags: [
         "--auto-add-overlay",
@@ -32,7 +32,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/telephony/TestFinancialSmsApp/Android.bp b/tests/tests/telephony/TestFinancialSmsApp/Android.bp
index 15a82ac..9d1a7fd 100644
--- a/tests/tests/telephony/TestFinancialSmsApp/Android.bp
+++ b/tests/tests/telephony/TestFinancialSmsApp/Android.bp
@@ -23,6 +23,7 @@
 
     test_suites: [
         "cts",
+        "general-tests",
         "mts",
     ],
 }
\ No newline at end of file
diff --git a/tests/tests/telephony/TestSmsApp/Android.bp b/tests/tests/telephony/TestSmsApp/Android.bp
index 1488d12..b2f5775 100644
--- a/tests/tests/telephony/TestSmsApp/Android.bp
+++ b/tests/tests/telephony/TestSmsApp/Android.bp
@@ -24,6 +24,7 @@
 
     test_suites: [
         "cts",
+        "general-tests",
         "mts",
     ],
 }
\ No newline at end of file
diff --git a/tests/tests/telephony/TestSmsApp22/Android.bp b/tests/tests/telephony/TestSmsApp22/Android.bp
index 5bc7338..3a0b476 100644
--- a/tests/tests/telephony/TestSmsApp22/Android.bp
+++ b/tests/tests/telephony/TestSmsApp22/Android.bp
@@ -24,6 +24,7 @@
 
     test_suites: [
         "cts",
+        "general-tests",
         "mts",
     ],
 }
\ No newline at end of file
diff --git a/tests/tests/telephony/TestSmsRetrieverApp/Android.bp b/tests/tests/telephony/TestSmsRetrieverApp/Android.bp
index 2aeb3c9..ac83a84 100644
--- a/tests/tests/telephony/TestSmsRetrieverApp/Android.bp
+++ b/tests/tests/telephony/TestSmsRetrieverApp/Android.bp
@@ -23,6 +23,7 @@
 
     test_suites: [
         "cts",
+        "general-tests",
         "mts",
     ],
 }
\ No newline at end of file
diff --git a/tests/tests/telephony/current/Android.bp b/tests/tests/telephony/current/Android.bp
index 3e03f05..046587c 100644
--- a/tests/tests/telephony/current/Android.bp
+++ b/tests/tests/telephony/current/Android.bp
@@ -20,6 +20,7 @@
         "src/android/telephony/ims/cts/TestMmTelFeature.java",
         "src/android/telephony/ims/cts/TestImsSmsImpl.java",
         "src/android/telephony/ims/cts/TestImsConfig.java",
+        "src/android/telephony/ims/cts/TestSipTransport.java",
         "src/android/telephony/ims/cts/ImsUtils.java",
     ],
     path: "src/",
@@ -30,8 +31,8 @@
     defaults: ["cts_defaults"],
     libs: [
         "telephony-common",
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
         "voip-common",
     ],
     // uncomment when EuiccService tests do not use hidden APIs (Binder instances)
@@ -60,7 +61,6 @@
     },
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     platform_apis: true,
diff --git a/tests/tests/telephony/current/EmbmsMiddlewareTestApp/Android.bp b/tests/tests/telephony/current/EmbmsMiddlewareTestApp/Android.bp
index 7eccd36..fb79bb1 100644
--- a/tests/tests/telephony/current/EmbmsMiddlewareTestApp/Android.bp
+++ b/tests/tests/telephony/current/EmbmsMiddlewareTestApp/Android.bp
@@ -27,7 +27,7 @@
     sdk_version: "test_current",
     test_suites: [
         "cts",
+        "general-tests",
         "mts",
-        "vts10",
     ],
 }
diff --git a/tests/tests/telephony/current/EmbmsMiddlewareTestApp/AndroidManifest.xml b/tests/tests/telephony/current/EmbmsMiddlewareTestApp/AndroidManifest.xml
index 880faf6..0798e79 100644
--- a/tests/tests/telephony/current/EmbmsMiddlewareTestApp/AndroidManifest.xml
+++ b/tests/tests/telephony/current/EmbmsMiddlewareTestApp/AndroidManifest.xml
@@ -17,7 +17,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="android.telephony.cts.embmstestapp">
   <permission android:name="android.telephony.cts.embmstestapp.CTS_DOWNLOAD_PERMISSION"
-              android.protectionLevel="signature"/>
+              android:protectionLevel="signature"/>
 
   <uses-permission android:name="android.telephony.cts.embms.permission.SEND_EMBMS_INTENTS"/>
   <uses-permission android:name="android.telephony.cts.embmstestapp.CTS_DOWNLOAD_PERMISSION"/>
diff --git a/tests/tests/telephony/current/EmbmsMiddlewareTestApp/src/android/telephony/cts/embmstestapp/CtsDownloadService.java b/tests/tests/telephony/current/EmbmsMiddlewareTestApp/src/android/telephony/cts/embmstestapp/CtsDownloadService.java
index 30447b8..e74c315 100644
--- a/tests/tests/telephony/current/EmbmsMiddlewareTestApp/src/android/telephony/cts/embmstestapp/CtsDownloadService.java
+++ b/tests/tests/telephony/current/EmbmsMiddlewareTestApp/src/android/telephony/cts/embmstestapp/CtsDownloadService.java
@@ -67,6 +67,7 @@
     public static final String METHOD_INITIALIZE = "initialize";
     public static final String METHOD_REQUEST_UPDATE_FILE_SERVICES =
             "requestUpdateFileServices";
+    public static final String METHOD_ADD_SERVICE_ANNOUNCEMENT = "addServiceAnnouncementFile";
     public static final String METHOD_SET_TEMP_FILE_ROOT = "setTempFileRootDirectory";
     public static final String METHOD_RESET_DOWNLOAD_KNOWLEDGE = "resetDownloadKnowledge";
     public static final String METHOD_GET_DOWNLOAD_STATUS = "getDownloadStatus";
@@ -82,6 +83,7 @@
     public static final String ARGUMENT_DOWNLOAD_REQUEST = "downloadRequest";
     public static final String ARGUMENT_FILE_INFO = "fileInfo";
     public static final String ARGUMENT_RESULT_CODE = "resultCode";
+    public static final String ARGUMENT_SERVICE_ANNOUNCEMENT_FILE = "serviceAnnouncementFile";
 
     public static final String CONTROL_INTERFACE_ACTION =
             "android.telephony.cts.embmstestapp.ACTION_CONTROL_MIDDLEWARE";
@@ -256,6 +258,16 @@
         }
 
         @Override
+        public int addServiceAnnouncement(int subscriptionId, byte[] announcementFile) {
+            Bundle b = new Bundle();
+            b.putString(METHOD_NAME, METHOD_ADD_SERVICE_ANNOUNCEMENT);
+            b.putInt(ARGUMENT_SUBSCRIPTION_ID, subscriptionId);
+            b.putByteArray(ARGUMENT_SERVICE_ANNOUNCEMENT_FILE, announcementFile);
+            mReceivedCalls.add(b);
+            return MbmsErrors.SUCCESS;
+        }
+
+        @Override
         public int cancelDownload(DownloadRequest request) {
             Bundle b = new Bundle();
             b.putString(METHOD_NAME, METHOD_CANCEL_DOWNLOAD);
diff --git a/tests/tests/telephony/current/LocationAccessingApp/Android.bp b/tests/tests/telephony/current/LocationAccessingApp/Android.bp
index 311c338..4721538 100644
--- a/tests/tests/telephony/current/LocationAccessingApp/Android.bp
+++ b/tests/tests/telephony/current/LocationAccessingApp/Android.bp
@@ -10,7 +10,7 @@
     sdk_version: "test_current",
     test_suites: [
         "cts",
-        "vts10",
+        "general-tests",
         "mts",
     ],
 }
diff --git a/tests/tests/telephony/current/LocationAccessingApp/sdk28/Android.bp b/tests/tests/telephony/current/LocationAccessingApp/sdk28/Android.bp
index f9664ad..2635472 100644
--- a/tests/tests/telephony/current/LocationAccessingApp/sdk28/Android.bp
+++ b/tests/tests/telephony/current/LocationAccessingApp/sdk28/Android.bp
@@ -7,7 +7,7 @@
     sdk_version: "test_current",
     test_suites: [
         "cts",
-        "vts10",
+        "general-tests",
         "mts",
     ],
 }
diff --git a/tests/tests/telephony/current/TestExternalImsServiceApp/Android.bp b/tests/tests/telephony/current/TestExternalImsServiceApp/Android.bp
index fa1b17d..eb77c19 100644
--- a/tests/tests/telephony/current/TestExternalImsServiceApp/Android.bp
+++ b/tests/tests/telephony/current/TestExternalImsServiceApp/Android.bp
@@ -15,7 +15,7 @@
     sdk_version: "test_current",
     test_suites: [
         "cts",
-        "vts10",
+        "general-tests",
         "mts",
     ]
 }
diff --git a/tests/tests/telephony/current/permissions/Android.bp b/tests/tests/telephony/current/permissions/Android.bp
index 0ae3ee4..ebd04ce 100644
--- a/tests/tests/telephony/current/permissions/Android.bp
+++ b/tests/tests/telephony/current/permissions/Android.bp
@@ -20,7 +20,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     // Include both the 32 and 64 bit versions
diff --git a/tests/tests/telephony/current/permissions/src/android/telephony/cts/telephonypermission/TelephonyManagerReadPhoneStatePermissionTest.java b/tests/tests/telephony/current/permissions/src/android/telephony/cts/telephonypermission/TelephonyManagerReadPhoneStatePermissionTest.java
index 9fa1994..688fc52 100644
--- a/tests/tests/telephony/current/permissions/src/android/telephony/cts/telephonypermission/TelephonyManagerReadPhoneStatePermissionTest.java
+++ b/tests/tests/telephony/current/permissions/src/android/telephony/cts/telephonypermission/TelephonyManagerReadPhoneStatePermissionTest.java
@@ -23,7 +23,11 @@
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.platform.test.annotations.AppModeFull;
+import android.telecom.PhoneAccount;
+import android.telecom.TelecomManager;
+import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
+import android.telephony.emergency.EmergencyNumber;
 
 import androidx.test.InstrumentationRegistry;
 import androidx.test.runner.AndroidJUnit4;
@@ -41,6 +45,7 @@
 
     private boolean mHasTelephony;
     TelephonyManager mTelephonyManager = null;
+    TelecomManager mTelecomManager = null;
 
     @Before
     public void setUp() throws Exception {
@@ -49,6 +54,9 @@
         mTelephonyManager =
                 (TelephonyManager) getContext().getSystemService(Context.TELEPHONY_SERVICE);
         assertNotNull(mTelephonyManager);
+        mTelecomManager =
+                (TelecomManager) getContext().getSystemService(Context.TELECOM_SERVICE);
+        assertNotNull(mTelecomManager);
     }
 
     public static void grantUserReadPhoneStatePermission() {
@@ -57,6 +65,12 @@
                 android.Manifest.permission.READ_PHONE_STATE);
     }
 
+    public static void revokeUserReadPhoneStatePermission() {
+        UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+        uiAutomation.revokeRuntimePermission(getContext().getPackageName(),
+                android.Manifest.permission.READ_PHONE_STATE);
+    }
+
     /**
      * Verify that TelephonyManager APIs requiring READ_PHONE_STATE Permission must work.
      * <p>
@@ -64,8 +78,26 @@
      * {@link android.Manifest.permission#READ_PHONE_STATE}.
      *
      * APIs list:
-     * 1) getNetworkType
-     * TODO Adding more APIs
+     * getDeviceSoftwareVersion()
+     * getCarrierConfig()
+     * getNetworkType()
+     * getDataNetworkType()
+     * getVoiceNetworkType()
+     * getGroupIdLevel1()
+     * getLine1AlphaTag()
+     * getVoiceMailNumber()
+     * getVisualVoicemailPackageName()
+     * getVoiceMailAlphaTag()
+     * getForbiddenPlmns()
+     * isDataRoamingEnabled()
+     * getSubscriptionId(@NonNull PhoneAccountHandle phoneAccountHandle)
+     * getServiceState()
+     * getEmergencyNumberList()
+     * getEmergencyNumberList(@EmergencyServiceCategories int categories)
+     * getPreferredOpportunisticDataSubscription()
+     * isModemEnabledForSlot(int slotIndex)
+     * isMultiSimSupported()
+     * doesSwitchMultiSimConfigTriggerReboot()
      */
     @Test
     public void testTelephonyManagersAPIsRequiringReadPhoneStatePermissions() {
@@ -75,11 +107,131 @@
 
         grantUserReadPhoneStatePermission();
 
+        int subId = mTelephonyManager.getSubscriptionId();
+
         try {
             mTelephonyManager.getNetworkType();
         } catch (SecurityException e) {
             fail("getNetworkType() must not throw a SecurityException with READ_PHONE_STATE" + e);
         }
+        try {
+            mTelephonyManager.getDeviceSoftwareVersion();
+        } catch (SecurityException e) {
+            fail("getDeviceSoftwareVersion() must not throw a SecurityException"
+                    + " with READ_PHONE_STATE" + e);
+        }
+        try {
+            mTelephonyManager.getCarrierConfig();
+        } catch (SecurityException e) {
+            fail("getCarrierConfig() must not throw a SecurityException"
+                    + " with READ_PHONE_STATE" + e);
+        }
+        try {
+            mTelephonyManager.getDataNetworkType();
+        } catch (SecurityException e) {
+            fail("getDataNetworkType() must not throw a SecurityException"
+                    + " with READ_PHONE_STATE" + e);
+        }
+        try {
+            mTelephonyManager.getVoiceNetworkType();
+        } catch (SecurityException e) {
+            fail("getVoiceNetworkType() must not throw a SecurityException"
+                    + " with READ_PHONE_STATE" + e);
+        }
+        try {
+            mTelephonyManager.getGroupIdLevel1();
+        } catch (SecurityException e) {
+            fail("getGroupIdLevel1() must not throw a SecurityException"
+                    + " with READ_PHONE_STATE" + e);
+        }
+        try {
+            mTelephonyManager.getLine1AlphaTag();
+        } catch (SecurityException e) {
+            fail("getLine1AlphaTag() must not throw a SecurityException"
+                    + " with READ_PHONE_STATE" + e);
+        }
+        try {
+            mTelephonyManager.getVoiceMailNumber();
+        } catch (SecurityException e) {
+            fail("getVoiceMailNumber() must not throw a SecurityException"
+                    + " with READ_PHONE_STATE" + e);
+        }
+        try {
+            mTelephonyManager.getVisualVoicemailPackageName();
+        } catch (SecurityException e) {
+            fail("getVisualVoicemailPackageName() must not throw a SecurityException"
+                    + " with READ_PHONE_STATE" + e);
+        }
+        try {
+            mTelephonyManager.getVoiceMailAlphaTag();
+        } catch (SecurityException e) {
+            fail("getVoiceMailAlphaTag() must not throw a SecurityException"
+                    + " with READ_PHONE_STATE" + e);
+        }
+        try {
+            mTelephonyManager.getForbiddenPlmns();
+        } catch (SecurityException e) {
+            fail("getForbiddenPlmns() must not throw a SecurityException"
+                    + " with READ_PHONE_STATE" + e);
+        }
+        try {
+            mTelephonyManager.isDataRoamingEnabled();
+        } catch (SecurityException e) {
+            fail("isDataRoamingEnabled() must not throw a SecurityException"
+                    + " with READ_PHONE_STATE" + e);
+        }
+        try {
+            mTelephonyManager.getSubscriptionId(
+                    mTelecomManager.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL));
+        } catch (SecurityException e) {
+            fail("getSubscriptionId(phoneAccountHandle) must not throw a SecurityException"
+                    + " with READ_PHONE_STATE" + e);
+        }
+        try {
+            mTelephonyManager.getServiceState();
+        } catch (SecurityException e) {
+            fail("getServiceState() must not throw a SecurityException"
+                    + " with READ_PHONE_STATE" + e);
+        }
+        try {
+            mTelephonyManager.getEmergencyNumberList();
+        } catch (SecurityException e) {
+            fail("getEmergencyNumberList() must not throw a SecurityException"
+                    + " with READ_PHONE_STATE" + e);
+        }
+        try {
+            mTelephonyManager.getEmergencyNumberList(
+                    EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_POLICE);
+        } catch (SecurityException e) {
+            fail("getEmergencyNumberList(EMERGENCY_SERVICE_CATEGORY_POLICE) must"
+                    + " not throw a SecurityException with READ_PHONE_STATE" + e);
+        }
+        try {
+            mTelephonyManager.getPreferredOpportunisticDataSubscription();
+        } catch (SecurityException e) {
+            fail("getPreferredOpportunisticDataSubscription() must not throw"
+                    + " a SecurityException with READ_PHONE_STATE" + e);
+        }
+        try {
+            mTelephonyManager.isModemEnabledForSlot(SubscriptionManager.getSlotIndex(subId));
+        } catch (SecurityException e) {
+            fail("isModemEnabledForSlot(slotIndex) must not throw a SecurityException"
+                    + " with READ_PHONE_STATE" + e);
+        }
+        try {
+            mTelephonyManager.isMultiSimSupported();
+        } catch (SecurityException e) {
+            fail("isMultiSimSupported() must not throw a SecurityException"
+                    + " with READ_PHONE_STATE" + e);
+        }
+        try {
+            mTelephonyManager.doesSwitchMultiSimConfigTriggerReboot();
+        } catch (SecurityException e) {
+            fail("doesSwitchMultiSimConfigTriggerReboot() must not throw a SecurityException"
+                    + " with READ_PHONE_STATE" + e);
+        }
+
+        revokeUserReadPhoneStatePermission();
     }
 
     private static Context getContext() {
diff --git a/tests/tests/telephony/current/preconditions/Android.bp b/tests/tests/telephony/current/preconditions/Android.bp
index 9c1f950..ddb3262 100644
--- a/tests/tests/telephony/current/preconditions/Android.bp
+++ b/tests/tests/telephony/current/preconditions/Android.bp
@@ -26,7 +26,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "mts",
         "general-tests",
     ],
diff --git a/tests/tests/telephony/current/preconditions/app/Android.bp b/tests/tests/telephony/current/preconditions/app/Android.bp
index e2606ae..debc2e3 100644
--- a/tests/tests/telephony/current/preconditions/app/Android.bp
+++ b/tests/tests/telephony/current/preconditions/app/Android.bp
@@ -22,11 +22,10 @@
         "compatibility-device-util-axt",
         "compatibility-device-preconditions",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "mts",
         "general-tests",
     ],
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/CarrierConfigManagerTest.java b/tests/tests/telephony/current/src/android/telephony/cts/CarrierConfigManagerTest.java
index 2d63f71..e91f3f6 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/CarrierConfigManagerTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/CarrierConfigManagerTest.java
@@ -160,6 +160,13 @@
             assertEquals("KEY_MONTHLY_DATA_CYCLE_DAY_INT doesn't match static default.",
                     config.getInt(CarrierConfigManager.KEY_MONTHLY_DATA_CYCLE_DAY_INT),
                             CarrierConfigManager.DATA_CYCLE_USE_PLATFORM_DEFAULT);
+            assertEquals("KEY_SUPPORT_ADHOC_CONFERENCE_CALLS_BOOL doesn't match static default.",
+                    config.getBoolean(CarrierConfigManager.KEY_SUPPORT_ADHOC_CONFERENCE_CALLS_BOOL),
+                    false);
+
+            assertEquals("KEY_CARRIER_USSD_METHOD_INT doesn't match static default.",
+                    config.getInt(CarrierConfigManager.KEY_CARRIER_USSD_METHOD_INT),
+                            CarrierConfigManager.USSD_OVER_CS_PREFERRED);
         }
 
         // These key should return default values if not customized.
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/CellInfoTest.java b/tests/tests/telephony/current/src/android/telephony/cts/CellInfoTest.java
index c03877c..86b4dde 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/CellInfoTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/CellInfoTest.java
@@ -57,6 +57,8 @@
 import android.util.Log;
 import android.util.Pair;
 
+import androidx.test.InstrumentationRegistry;
+
 import org.junit.Before;
 import org.junit.Test;
 
@@ -216,6 +218,9 @@
     }
 
     private boolean isCamped() {
+        InstrumentationRegistry.getInstrumentation().getUiAutomation()
+                .adoptShellPermissionIdentity("android.permission.READ_PHONE_STATE");
+
         ServiceState ss = mTm.getServiceState();
         if (ss == null) return false;
         return (ss.getState() == ServiceState.STATE_IN_SERVICE
@@ -382,30 +387,32 @@
     private void verifyCellIdentityCdma(CellIdentityCdma cdma, boolean isRegistered) {
         int networkId = cdma.getNetworkId();
         assertTrue("getNetworkId() out of range [0,65535], networkId=" + networkId,
-                networkId == Integer.MAX_VALUE || (networkId >= 0 && networkId <= NETWORK_ID));
+                networkId == CellInfo.UNAVAILABLE || (networkId >= 0 && networkId <= NETWORK_ID));
 
         int systemId = cdma.getSystemId();
         assertTrue("getSystemId() out of range [0,32767], systemId=" + systemId,
-                systemId == Integer.MAX_VALUE || (systemId >= 0 && systemId <= SYSTEM_ID));
+                systemId == CellInfo.UNAVAILABLE || (systemId >= 0 && systemId <= SYSTEM_ID));
 
         int basestationId = cdma.getBasestationId();
         assertTrue("getBasestationId() out of range [0,65535], basestationId=" + basestationId,
-                basestationId == Integer.MAX_VALUE
+                basestationId == CellInfo.UNAVAILABLE
                         || (basestationId >= 0 && basestationId <= BASESTATION_ID));
 
         int longitude = cdma.getLongitude();
         assertTrue("getLongitude() out of range [-2592000,2592000], longitude=" + longitude,
-                longitude == Integer.MAX_VALUE
+                longitude == CellInfo.UNAVAILABLE
                         || (longitude >= -LONGITUDE && longitude <= LONGITUDE));
 
         int latitude = cdma.getLatitude();
         assertTrue("getLatitude() out of range [-1296000,1296000], latitude=" + latitude,
-                latitude == Integer.MAX_VALUE || (latitude >= -LATITUDE && latitude <= LATITUDE));
+                latitude == CellInfo.UNAVAILABLE
+                        || (latitude >= -LATITUDE && latitude <= LATITUDE));
 
         if (isRegistered) {
-            assertTrue("SID is required for registered cells", systemId != Integer.MAX_VALUE);
-            assertTrue("NID is required for registered cells", networkId != Integer.MAX_VALUE);
-            assertTrue("BSID is required for registered cells", basestationId != Integer.MAX_VALUE);
+            assertTrue("SID is required for registered cells", systemId != CellInfo.UNAVAILABLE);
+            assertTrue("NID is required for registered cells", networkId != CellInfo.UNAVAILABLE);
+            assertTrue("BSID is required for registered cells",
+                    basestationId != CellInfo.UNAVAILABLE);
         }
 
         verifyCellIdentityCdmaLocationSanitation(cdma);
@@ -458,7 +465,7 @@
 
         int evdoSnr = cdma.getEvdoSnr();
         assertTrue("getEvdoSnr() out of range [0,8], evdoSnr=" + evdoSnr,
-                (evdoSnr == Integer.MAX_VALUE) || (evdoSnr >= 0 && evdoSnr <= 8));
+                (evdoSnr == CellInfo.UNAVAILABLE) || (evdoSnr >= 0 && evdoSnr <= 8));
     }
 
     private void verifyCellSignalStrengthCdmaParcel(CellSignalStrengthCdma cdma) {
@@ -472,9 +479,9 @@
 
     private static void verifyPlmnInfo(String mccStr, String mncStr, int mcc, int mnc) {
         // If either int value is invalid, all values must be invalid
-        if (mcc == Integer.MAX_VALUE) {
+        if (mcc == CellInfo.UNAVAILABLE) {
             assertTrue("MNC and MNC must always be reported together.",
-                    mnc == Integer.MAX_VALUE && mccStr == null && mncStr == null);
+                    mnc == CellInfo.UNAVAILABLE && mccStr == null && mncStr == null);
             return;
         }
 
@@ -539,7 +546,7 @@
 
     private void verifyCellIdentityNr(CellIdentityNr nr, boolean isRegistered) {
         // This class was added after numeric mcc/mncs were no longer provided, so it lacks the
-        // basic getMcc() and getMnc() - Dummy out those checks.
+        // basic getMcc() and getMnc() - empty out those checks.
         String mccStr = nr.getMccString();
         String mncStr = nr.getMncString();
         verifyPlmnInfo(mccStr, mncStr,
@@ -571,7 +578,7 @@
 
         // If the cell is reported as registered, then all the logical cell info must be reported
         if (isRegistered) {
-            assertTrue("TAC is required for registered cells", tac != Integer.MAX_VALUE);
+            assertTrue("TAC is required for registered cells", tac != CellInfo.UNAVAILABLE);
             assertTrue("MCC is required for registered cells", nr.getMccString() != null);
             assertTrue("MNC is required for registered cells", nr.getMncString() != null);
         }
@@ -596,17 +603,18 @@
 
         assertTrue("getCsiRsrp() out of range [-140, -44] | Integer.MAX_INTEGER, csiRsrp = "
                         + csiRsrp, -140 <= csiRsrp && csiRsrp <= -44
-                || csiRsrp == Integer.MAX_VALUE);
+                || csiRsrp == CellInfo.UNAVAILABLE);
         assertTrue("getCsiRsrq() out of range [-20, -3] | Integer.MAX_INTEGER, csiRsrq = "
-                + csiRsrq, -20 <= csiRsrq && csiRsrq <= -3 || csiRsrq == Integer.MAX_VALUE);
+                + csiRsrq, -20 <= csiRsrq && csiRsrq <= -3 || csiRsrq == CellInfo.UNAVAILABLE);
         assertTrue("getCsiSinr() out of range [-23, 40] | Integer.MAX_INTEGER, csiSinr = "
-                + csiSinr, -23 <= csiSinr && csiSinr <= 40 || csiSinr == Integer.MAX_VALUE);
+                + csiSinr, -23 <= csiSinr && csiSinr <= 40 || csiSinr == CellInfo.UNAVAILABLE);
         assertTrue("getSsRsrp() out of range [-140, -44] | Integer.MAX_INTEGER, ssRsrp = "
-                        + ssRsrp, -140 <= ssRsrp && ssRsrp <= -44 || ssRsrp == Integer.MAX_VALUE);
+                        + ssRsrp, -140 <= ssRsrp && ssRsrp <= -44
+                || ssRsrp == CellInfo.UNAVAILABLE);
         assertTrue("getSsRsrq() out of range [-20, -3] | Integer.MAX_INTEGER, ssRsrq = "
-                + ssRsrq, -20 <= ssRsrq && ssRsrq <= -3 || ssRsrq == Integer.MAX_VALUE);
+                + ssRsrq, -20 <= ssRsrq && ssRsrq <= -3 || ssRsrq == CellInfo.UNAVAILABLE);
         assertTrue("getSsSinr() out of range [-23, 40] | Integer.MAX_INTEGER, ssSinr = "
-                + ssSinr, -23 <= ssSinr && ssSinr <= 40 || ssSinr == Integer.MAX_VALUE);
+                + ssSinr, -23 <= ssSinr && ssSinr <= 40 || ssSinr == CellInfo.UNAVAILABLE);
     }
 
     private void verifyCellInfoLteParcelandHashcode(CellInfoLte lte) {
@@ -625,23 +633,23 @@
         // Cell identity ranges from 0 to 268435456.
         int ci = lte.getCi();
         assertTrue("getCi() out of range [0,268435456], ci=" + ci,
-                (ci == Integer.MAX_VALUE) || (ci >= 0 && ci <= CI));
+                (ci == CellInfo.UNAVAILABLE) || (ci >= 0 && ci <= CI));
 
         // Verify LTE physical cell id information.
         // Only physical cell id is available for LTE neighbor.
         int pci = lte.getPci();
         // Physical cell id should be within [0, 503].
         assertTrue("getPci() out of range [0, 503], pci=" + pci,
-                (pci== Integer.MAX_VALUE) || (pci >= 0 && pci <= PCI));
+                (pci == CellInfo.UNAVAILABLE) || (pci >= 0 && pci <= PCI));
 
         // Tracking area code ranges from 0 to 65535.
         int tac = lte.getTac();
         assertTrue("getTac() out of range [0,65535], tac=" + tac,
-                (tac == Integer.MAX_VALUE) || (tac >= 0 && tac <= TAC));
+                (tac == CellInfo.UNAVAILABLE) || (tac >= 0 && tac <= TAC));
 
         int bw = lte.getBandwidth();
         assertTrue("getBandwidth out of range [1400, 20000] | Integer.Max_Value, bw=",
-                bw == Integer.MAX_VALUE || bw >= BANDWIDTH_LOW && bw <= BANDWIDTH_HIGH);
+                bw == CellInfo.UNAVAILABLE || bw >= BANDWIDTH_LOW && bw <= BANDWIDTH_HIGH);
 
         int earfcn = lte.getEarfcn();
         // Reference 3GPP 36.101 Table 5.7.3-1
@@ -650,7 +658,7 @@
         // out of the range of the narrowest 1.4Mhz deployment.
         int minEarfcn = 7;
         int maxEarfcn = EARFCN_MAX - 7;
-        if (bw != Integer.MAX_VALUE) {
+        if (bw != CellInfo.UNAVAILABLE) {
             // The number of channels used by a cell is equal to the cell bandwidth divided
             // by the channel raster (bandwidth of a channel). The center channel is the channel
             // the n/2-th channel where n is the number of channels, and since it is the center
@@ -664,7 +672,7 @@
         }
         assertTrue(
                 "getEarfcn() out of range [" + minEarfcn + "," + maxEarfcn + "], earfcn=" + earfcn,
-                earfcn == Integer.MAX_VALUE || (earfcn >= minEarfcn && earfcn <= maxEarfcn));
+                earfcn == CellInfo.UNAVAILABLE || (earfcn >= minEarfcn && earfcn <= maxEarfcn));
 
         if (mRadioHalVersion >= RADIO_HAL_VERSION_1_5) {
             int[] bands = lte.getBands();
@@ -690,12 +698,12 @@
 
         // If the cell is reported as registered, then all the logical cell info must be reported
         if (isRegistered) {
-            assertTrue("TAC is required for registered cells", tac != Integer.MAX_VALUE);
-            assertTrue("CID is required for registered cells", ci != Integer.MAX_VALUE);
+            assertTrue("TAC is required for registered cells", tac != CellInfo.UNAVAILABLE);
+            assertTrue("CID is required for registered cells", ci != CellInfo.UNAVAILABLE);
             assertTrue("MCC is required for registered cells",
-                    lte.getMccString() != null || lte.getMcc() != Integer.MAX_VALUE);
+                    lte.getMccString() != null || lte.getMcc() != CellInfo.UNAVAILABLE);
             assertTrue("MNC is required for registered cells",
-                    lte.getMncString() != null || lte.getMnc() != Integer.MAX_VALUE);
+                    lte.getMncString() != null || lte.getMnc() != CellInfo.UNAVAILABLE);
         }
     }
 
@@ -719,32 +727,32 @@
     private void verifyCellSignalStrengthLte(CellSignalStrengthLte cellSignalStrengthLte) {
         verifyRssiDbm(cellSignalStrengthLte.getDbm());
 
-        //Integer.MAX_VALUE indicates an unavailable field
+        //ICellInfo.UNAVAILABLE indicates an unavailable field
         int rsrp = cellSignalStrengthLte.getRsrp();
         // RSRP is being treated as RSSI in LTE (they are similar but not quite right)
         // so reusing the constants here.
         assertTrue("getRsrp() out of range, rsrp=" + rsrp, rsrp >= MIN_RSRP && rsrp <= MAX_RSRP);
 
         int rsrq = cellSignalStrengthLte.getRsrq();
-        assertTrue("getRsrq() out of range | Integer.MAX_VALUE, rsrq=" + rsrq,
-            rsrq == Integer.MAX_VALUE || (rsrq >= MIN_RSRQ && rsrq <= MAX_RSRQ));
+        assertTrue("getRsrq() out of range | CellInfo.UNAVAILABLE, rsrq=" + rsrq,
+                rsrq == CellInfo.UNAVAILABLE || (rsrq >= MIN_RSRQ && rsrq <= MAX_RSRQ));
 
         int rssi = cellSignalStrengthLte.getRssi();
-        assertTrue("getRssi() out of range [-113, -51] or Integer.MAX_VALUE if unknown, rssi="
+        assertTrue("getRssi() out of range [-113, -51] or CellInfo.UNAVAILABLE if unknown, rssi="
                 + rssi, rssi == CellInfo.UNAVAILABLE
                 || (rssi >= MIN_LTE_RSSI && rssi <= MAX_LTE_RSSI));
 
         int rssnr = cellSignalStrengthLte.getRssnr();
-        assertTrue("getRssnr() out of range | Integer.MAX_VALUE, rssnr=" + rssnr,
-            rssnr == Integer.MAX_VALUE || (rssnr >= MIN_RSSNR && rssnr <= MAX_RSSNR));
+        assertTrue("getRssnr() out of range | CellInfo.UNAVAILABLE, rssnr=" + rssnr,
+                rssnr == CellInfo.UNAVAILABLE || (rssnr >= MIN_RSSNR && rssnr <= MAX_RSSNR));
 
         int cqi = cellSignalStrengthLte.getCqi();
-        assertTrue("getCqi() out of range | Integer.MAX_VALUE, cqi=" + cqi,
-            cqi == Integer.MAX_VALUE || (cqi >= MIN_CQI && cqi <= MAX_CQI));
+        assertTrue("getCqi() out of range | CellInfo.UNAVAILABLE, cqi=" + cqi,
+                cqi == CellInfo.UNAVAILABLE || (cqi >= MIN_CQI && cqi <= MAX_CQI));
 
         int ta = cellSignalStrengthLte.getTimingAdvance();
-        assertTrue("getTimingAdvance() invalid [0-1282] | Integer.MAX_VALUE, ta=" + ta,
-                ta == Integer.MAX_VALUE || (ta >= 0 && ta <=1282));
+        assertTrue("getTimingAdvance() invalid [0-1282] | CellInfo.UNAVAILABLE, ta=" + ta,
+                ta == CellInfo.UNAVAILABLE || (ta >= 0 && ta <= 1282));
 
         int level = cellSignalStrengthLte.getLevel();
         assertTrue("getLevel() out of range [0,4], level=" + level, level >= 0 && level <= 4);
@@ -755,7 +763,8 @@
 
         int timingAdvance = cellSignalStrengthLte.getTimingAdvance();
         assertTrue("getTimingAdvance() out of range [0,1282], timingAdvance=" + timingAdvance,
-                timingAdvance == Integer.MAX_VALUE || (timingAdvance >= 0 && timingAdvance <= 1282));
+                timingAdvance == CellInfo.UNAVAILABLE
+                        || (timingAdvance >= 0 && timingAdvance <= 1282));
 
         if (mRadioHalVersion >= RADIO_HAL_VERSION_1_2) {
             assertTrue("RSRP Must be valid for LTE",
@@ -797,17 +806,17 @@
 
         int lac = wcdma.getLac();
         assertTrue("getLac() out of range [0, 65535], lac=" + lac,
-                (lac >= 0 && lac <= LAC) || lac == Integer.MAX_VALUE);
+                (lac >= 0 && lac <= LAC) || lac == CellInfo.UNAVAILABLE);
 
         int cid = wcdma.getCid();
         assertTrue("getCid() out of range [0, 268435455], cid=" + cid,
-                (cid >= 0 && cid <= CID_UMTS) || cid == Integer.MAX_VALUE);
+                (cid >= 0 && cid <= CID_UMTS) || cid == CellInfo.UNAVAILABLE);
 
         // Verify wcdma primary scrambling code information.
         // Primary scrambling code should be within [0, 511].
         int psc = wcdma.getPsc();
         assertTrue("getPsc() out of range [0, 511], psc=" + psc,
-                (psc >= 0 && psc <= PSC) || psc == Integer.MAX_VALUE);
+                (psc >= 0 && psc <= PSC) || psc == CellInfo.UNAVAILABLE);
 
         String mobileNetworkOperator = wcdma.getMobileNetworkOperator();
         assertTrue("getMobileNetworkOperator() out of range [0, 999999], mobileNetworkOperator="
@@ -830,12 +839,12 @@
 
         // If the cell is reported as registered, then all the logical cell info must be reported
         if (isRegistered) {
-            assertTrue("LAC is required for registered cells", lac != Integer.MAX_VALUE);
-            assertTrue("CID is required for registered cells", cid != Integer.MAX_VALUE);
+            assertTrue("LAC is required for registered cells", lac != CellInfo.UNAVAILABLE);
+            assertTrue("CID is required for registered cells", cid != CellInfo.UNAVAILABLE);
             assertTrue("MCC is required for registered cells",
-                    wcdma.getMccString() != null || wcdma.getMcc() != Integer.MAX_VALUE);
+                    wcdma.getMccString() != null || wcdma.getMcc() != CellInfo.UNAVAILABLE);
             assertTrue("MNC is required for registered cells",
-                    wcdma.getMncString() != null || wcdma.getMnc() != Integer.MAX_VALUE);
+                    wcdma.getMncString() != null || wcdma.getMnc() != CellInfo.UNAVAILABLE);
         }
 
         verifyCellIdentityWcdmaLocationSanitation(wcdma);
@@ -924,15 +933,15 @@
         // Local area code and cellid should be with [0, 65535].
         int lac = gsm.getLac();
         assertTrue("getLac() out of range [0, 65535], lac=" + lac,
-                lac == Integer.MAX_VALUE || (lac >= 0 && lac <= LAC));
+                lac == CellInfo.UNAVAILABLE || (lac >= 0 && lac <= LAC));
         int cid = gsm.getCid();
         assertTrue("getCid() out range [0, 65535], cid=" + cid,
-                cid== Integer.MAX_VALUE || (cid >= 0 && cid <= CID_GSM));
+                cid == CellInfo.UNAVAILABLE || (cid >= 0 && cid <= CID_GSM));
 
         int arfcn = gsm.getArfcn();
         // Reference 3GPP 45.005 Table 2-2
         assertTrue("getArfcn() out of range [0,1024], arfcn=" + arfcn,
-                arfcn == Integer.MAX_VALUE || (arfcn >= 0 && arfcn <= ARFCN));
+                arfcn == CellInfo.UNAVAILABLE || (arfcn >= 0 && arfcn <= ARFCN));
 
         String mobileNetworkOperator = gsm.getMobileNetworkOperator();
         assertTrue("getMobileNetworkOperator() out of range [0, 999999], mobileNetworkOperator="
@@ -950,12 +959,12 @@
 
         // If the cell is reported as registered, then all the logical cell info must be reported
         if (isRegistered) {
-            assertTrue("LAC is required for registered cells", lac != Integer.MAX_VALUE);
-            assertTrue("CID is required for registered cells", cid != Integer.MAX_VALUE);
+            assertTrue("LAC is required for registered cells", lac != CellInfo.UNAVAILABLE);
+            assertTrue("CID is required for registered cells", cid != CellInfo.UNAVAILABLE);
             assertTrue("MCC is required for registered cells",
-                    gsm.getMccString() != null || gsm.getMcc() != Integer.MAX_VALUE);
+                    gsm.getMccString() != null || gsm.getMcc() != CellInfo.UNAVAILABLE);
             assertTrue("MNC is required for registered cells",
-                    gsm.getMncString() != null || gsm.getMnc() != Integer.MAX_VALUE);
+                    gsm.getMncString() != null || gsm.getMnc() != CellInfo.UNAVAILABLE);
         }
 
         verifyCellIdentityGsmLocationSanitation(gsm);
@@ -985,8 +994,8 @@
         assertTrue("getLevel() out of range [0,4], level=" + level, level >= 0 && level <= 4);
 
         int ta = gsm.getTimingAdvance();
-        assertTrue("getTimingAdvance() out of range [0,219] | Integer.MAX_VALUE, ta=" + ta,
-                ta == Integer.MAX_VALUE || (ta >= 0 && ta <= 219));
+        assertTrue("getTimingAdvance() out of range [0,219] | CellInfo.UNAVAILABLE, ta=" + ta,
+                ta == CellInfo.UNAVAILABLE || (ta >= 0 && ta <= 219));
 
         assertEquals(gsm.getDbm(), gsm.getRssi());
 
@@ -1037,18 +1046,18 @@
         String mncStr = tdscdma.getMncString();
 
         // This class was added after numeric mcc/mncs were no longer provided, so it lacks the
-        // basic getMcc() and getMnc() - Dummy out those checks.
+        // basic getMcc() and getMnc() - empty out those checks.
         verifyPlmnInfo(tdscdma.getMccString(), tdscdma.getMncString(),
                 mccStr != null ? Integer.parseInt(mccStr) : CellInfo.UNAVAILABLE,
                 mncStr != null ? Integer.parseInt(mncStr) : CellInfo.UNAVAILABLE);
 
         int lac = tdscdma.getLac();
         assertTrue("getLac() out of range [0, 65535], lac=" + lac,
-                (lac >= 0 && lac <= LAC) || lac == Integer.MAX_VALUE);
+                (lac >= 0 && lac <= LAC) || lac == CellInfo.UNAVAILABLE);
 
         int cid = tdscdma.getCid();
         assertTrue("getCid() out of range [0, 268435455], cid=" + cid,
-                (cid >= 0 && cid <= CID_UMTS) || cid == Integer.MAX_VALUE);
+                (cid >= 0 && cid <= CID_UMTS) || cid == CellInfo.UNAVAILABLE);
 
         // Verify tdscdma primary scrambling code information.
         // Primary scrambling code should be within [0, 511].
@@ -1076,8 +1085,8 @@
 
         // If the cell is reported as registered, then all the logical cell info must be reported
         if (isRegistered) {
-            assertTrue("LAC is required for registered cells", lac != Integer.MAX_VALUE);
-            assertTrue("CID is required for registered cells", cid != Integer.MAX_VALUE);
+            assertTrue("LAC is required for registered cells", lac != CellInfo.UNAVAILABLE);
+            assertTrue("CID is required for registered cells", cid != CellInfo.UNAVAILABLE);
             assertTrue("MCC is required for registered cells", tdscdma.getMccString() != null);
             assertTrue("MNC is required for registered cells", tdscdma.getMncString() != null);
         }
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/DataCallResponseTest.java b/tests/tests/telephony/current/src/android/telephony/cts/DataCallResponseTest.java
index 1ec1c81..96985cd 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/DataCallResponseTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/DataCallResponseTest.java
@@ -16,6 +16,9 @@
 
 package android.telephony.cts;
 
+import static android.telephony.data.DataCallResponse.HANDOVER_FAILURE_MODE_DO_FALLBACK;
+import static android.telephony.data.DataCallResponse.HANDOVER_FAILURE_MODE_LEGACY;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import android.net.InetAddresses;
@@ -47,6 +50,7 @@
             Arrays.asList(InetAddresses.parseNumericAddress("22.33.44.55"));
     private static final int MTU_V4 = 1440;
     private static final int MTU_V6 = 1400;
+    private static final int HANDOVER_FAILURE_MODE = HANDOVER_FAILURE_MODE_DO_FALLBACK;
 
     @Test
     public void testConstructorAndGetters() {
@@ -63,6 +67,7 @@
                 .setPcscfAddresses(PCSCFS)
                 .setMtuV4(MTU_V4)
                 .setMtuV6(MTU_V6)
+                .setHandoverFailureMode(HANDOVER_FAILURE_MODE)
                 .build();
 
         assertThat(response.getCause()).isEqualTo(CAUSE);
@@ -77,6 +82,7 @@
         assertThat(response.getPcscfAddresses()).isEqualTo(PCSCFS);
         assertThat(response.getMtuV4()).isEqualTo(MTU_V4);
         assertThat(response.getMtuV6()).isEqualTo(MTU_V6);
+        assertThat(response.getHandoverFailureMode()).isEqualTo(HANDOVER_FAILURE_MODE_DO_FALLBACK);
     }
 
     @Test
@@ -94,6 +100,7 @@
                 .setPcscfAddresses(PCSCFS)
                 .setMtuV4(MTU_V4)
                 .setMtuV6(MTU_V6)
+                .setHandoverFailureMode(HANDOVER_FAILURE_MODE)
                 .build();
 
         DataCallResponse equalsResponse = new DataCallResponse.Builder()
@@ -109,6 +116,7 @@
                 .setPcscfAddresses(PCSCFS)
                 .setMtuV4(MTU_V4)
                 .setMtuV6(MTU_V6)
+                .setHandoverFailureMode(HANDOVER_FAILURE_MODE)
                 .build();
 
         assertThat(response).isEqualTo(equalsResponse);
@@ -129,6 +137,7 @@
                 .setPcscfAddresses(PCSCFS)
                 .setMtuV4(MTU_V4)
                 .setMtuV6(MTU_V6)
+                .setHandoverFailureMode(HANDOVER_FAILURE_MODE)
                 .build();
 
         DataCallResponse notEqualsResponse = new DataCallResponse.Builder()
@@ -144,6 +153,7 @@
                 .setPcscfAddresses(PCSCFS)
                 .setMtuV4(1441)
                 .setMtuV6(1440)
+                .setHandoverFailureMode(HANDOVER_FAILURE_MODE_LEGACY)
                 .build();
 
         assertThat(response).isNotEqualTo(notEqualsResponse);
@@ -166,6 +176,7 @@
                 .setPcscfAddresses(PCSCFS)
                 .setMtuV4(MTU_V4)
                 .setMtuV6(MTU_V6)
+                .setHandoverFailureMode(HANDOVER_FAILURE_MODE)
                 .build();
 
         Parcel stateParcel = Parcel.obtain();
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/IwlanModeTest.java b/tests/tests/telephony/current/src/android/telephony/cts/IwlanModeTest.java
deleted file mode 100644
index a68ebb5..0000000
--- a/tests/tests/telephony/current/src/android/telephony/cts/IwlanModeTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2020 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.telephony.cts;
-
-import static org.junit.Assert.assertNotEquals;
-
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.os.SystemProperties;
-import android.telephony.TelephonyManager;
-import android.content.res.Resources;
-import androidx.test.InstrumentationRegistry;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class IwlanModeTest {
-    private TelephonyManager mTelephonyManager;
-
-    private PackageManager mPackageManager;
-
-    private Context mContext;
-
-    @Before
-    public void setUp() throws Exception {
-        mContext = InstrumentationRegistry.getContext();
-        mPackageManager = mContext.getPackageManager();
-        mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
-    }
-
-    @Test
-    public void testIwlanMode() {
-        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
-            return;
-        }
-
-        // All new devices should not enable IWLAN legacy mode. Legacy mode is for existing old
-        // devices.
-        if (mTelephonyManager.getRadioHalVersion().first >= 1
-                && mTelephonyManager.getRadioHalVersion().second >= 5) {
-            String mode = SystemProperties.get("ro.telephony.iwlan_operation_mode");
-            assertNotEquals("legacy", mode);
-
-            Resources res = Resources.getSystem();
-            int id = res.getIdentifier("config_wlan_data_service_package", "string", "android");
-            String wlanDataServicePackage = res.getString(id);
-            assertNotEquals("", wlanDataServicePackage);
-
-            id = res.getIdentifier("config_wlan_network_service_package", "string", "android");
-            String wlanNetworkServicePackage = res.getString(id);
-            assertNotEquals("", wlanNetworkServicePackage);
-        }
-    }
-}
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/ModemActivityInfoTest.java b/tests/tests/telephony/current/src/android/telephony/cts/ModemActivityInfoTest.java
new file mode 100644
index 0000000..f0acc85
--- /dev/null
+++ b/tests/tests/telephony/current/src/android/telephony/cts/ModemActivityInfoTest.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2020 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.telephony.cts;
+
+import android.telephony.ModemActivityInfo;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+/**
+ * CTS test for ModemActivityInfo APIs
+ */
+public class ModemActivityInfoTest {
+    private static final String TAG = "ModemActivityInfoTest";
+
+    private static final int VALID_SLEEP_TIME_MS = 1;
+    private static final int VALID_IDLE_TIME_MS = 1;
+    private static final int VALID_RX_TIME_MS = 1;
+    private static final int[] VALID_TX_TIME_MS = {1, 1};
+
+    private static final int INVALID_SLEEP_TIME_MS = -1;
+    private static final int INVALID_IDLE_TIME_MS = -1;
+    private static final int INVALID_RX_TIME_MS = -1;
+    private static final int[] INVALID_TX_TIME_MS = {-1, 1};
+
+    @Test
+    public void testModemActivityInfoIsValid() {
+        ModemActivityInfo modemActivityInfo = new ModemActivityInfo(0, VALID_SLEEP_TIME_MS,
+                VALID_IDLE_TIME_MS, VALID_TX_TIME_MS, VALID_RX_TIME_MS);
+        assertTrue("ModemActivityInfo should be valid", modemActivityInfo.isValid());
+
+        modemActivityInfo = new ModemActivityInfo(0, INVALID_SLEEP_TIME_MS,
+                VALID_IDLE_TIME_MS, VALID_TX_TIME_MS, VALID_RX_TIME_MS);
+        assertFalse("ModemActivityInfo should be invalid because sleep time is invalid",
+                modemActivityInfo.isValid());
+
+        modemActivityInfo = new ModemActivityInfo(0, VALID_SLEEP_TIME_MS,
+                INVALID_IDLE_TIME_MS, VALID_TX_TIME_MS, VALID_RX_TIME_MS);
+        assertFalse("ModemActivityInfo should be invalid because idle time is invalid",
+                modemActivityInfo.isValid());
+
+        modemActivityInfo = new ModemActivityInfo(0, VALID_SLEEP_TIME_MS,
+                VALID_IDLE_TIME_MS, VALID_TX_TIME_MS, INVALID_RX_TIME_MS);
+        assertFalse("ModemActivityInfo should be invalid because receive time is invalid",
+                modemActivityInfo.isValid());
+
+        modemActivityInfo = new ModemActivityInfo(0, VALID_SLEEP_TIME_MS,
+                VALID_IDLE_TIME_MS, INVALID_TX_TIME_MS, INVALID_RX_TIME_MS);
+        assertFalse("ModemActivityInfo should be invalid because transmit time is invalid",
+                modemActivityInfo.isValid());
+    }
+}
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/NetworkRegistrationInfoTest.java b/tests/tests/telephony/current/src/android/telephony/cts/NetworkRegistrationInfoTest.java
index f5a8477..d4e2a28 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/NetworkRegistrationInfoTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/NetworkRegistrationInfoTest.java
@@ -244,4 +244,10 @@
         NetworkRegistrationInfo newNrs = NetworkRegistrationInfo.CREATOR.createFromParcel(p);
         assertEquals(nri, newNrs);
     }
+
+    @Test
+    public void testGetNrState() {
+        final NetworkRegistrationInfo nri = new NetworkRegistrationInfo.Builder().build();
+        assertEquals(nri.getNrState(), NetworkRegistrationInfo.NR_STATE_NONE);
+    }
 }
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/PhoneStateListenerTest.java b/tests/tests/telephony/current/src/android/telephony/cts/PhoneStateListenerTest.java
index 06e2b59..92f5e44 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/PhoneStateListenerTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/PhoneStateListenerTest.java
@@ -23,7 +23,6 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import android.content.Context;
@@ -43,11 +42,13 @@
 import android.telephony.ServiceState;
 import android.telephony.SignalStrength;
 import android.telephony.SmsManager;
+import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyDisplayInfo;
 import android.telephony.TelephonyManager;
 import android.telephony.emergency.EmergencyNumber;
 import android.telephony.ims.ImsReasonInfo;
 import android.util.Log;
+import android.util.Pair;
 
 import androidx.test.InstrumentationRegistry;
 
@@ -60,6 +61,8 @@
 import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.Executor;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
 
 public class PhoneStateListenerTest {
 
@@ -678,16 +681,14 @@
         mPreciseDataConnectionState.getLastCauseCode();
         mPreciseDataConnectionState.getLinkProperties();
         mPreciseDataConnectionState.getApnSetting();
+        mPreciseDataConnectionState.getTransportType();
+        mPreciseDataConnectionState.getId();
 
         // Deprecated in R
         assertEquals(mPreciseDataConnectionState.getDataConnectionState(),
                 mPreciseDataConnectionState.getState());
-        assertEquals(mPreciseDataConnectionState.getDataConnectionNetworkType(),
-                mPreciseDataConnectionState.getNetworkType());
         assertEquals(mPreciseDataConnectionState.getDataConnectionFailCause(),
                 mPreciseDataConnectionState.getLastCauseCode());
-        assertEquals(mPreciseDataConnectionState.getDataConnectionLinkProperties(),
-                mPreciseDataConnectionState.getLinkProperties());
 
         // Superseded in R by getApnSetting()
         mPreciseDataConnectionState.getDataConnectionApnTypeBitMask();
@@ -959,16 +960,17 @@
         TelephonyUtils.addTestEmergencyNumber(
                 InstrumentationRegistry.getInstrumentation(), TEST_EMERGENCY_NUMBER);
 
-        assertNull(mOnOutgoingSmsEmergencyNumberChanged);
+        LinkedBlockingQueue<Pair<EmergencyNumber, Integer>> smsCallbackQueue =
+                new LinkedBlockingQueue<>(1);
 
         mHandler.post(() -> {
             mListener = new PhoneStateListener() {
                 @Override
-                public void onOutgoingEmergencySms(EmergencyNumber emergencyNumber) {
+                public void onOutgoingEmergencySms(EmergencyNumber emergencyNumber,
+                        int subscriptionId) {
                     synchronized (mLock) {
                         Log.i(TAG, "onOutgoingEmergencySms: emergencyNumber=" + emergencyNumber);
-                        mOnOutgoingSmsEmergencyNumberChanged = emergencyNumber;
-                        mLock.notify();
+                        smsCallbackQueue.offer(Pair.create(emergencyNumber, subscriptionId));
                     }
                 }
             };
@@ -980,11 +982,12 @@
         });
 
         try {
-            synchronized (mLock) {
-                if (mOnOutgoingSmsEmergencyNumberChanged == null) {
-                    mLock.wait(WAIT_TIME);
-                }
-            }
+            Pair<EmergencyNumber, Integer> emergencySmsInfo =
+                    smsCallbackQueue.poll(WAIT_TIME, TimeUnit.MILLISECONDS);
+            assertNotNull("Never got emergency sms callback", emergencySmsInfo);
+            assertEquals(TEST_EMERGENCY_NUMBER, emergencySmsInfo.first.getNumber());
+            assertEquals(SubscriptionManager.getDefaultSmsSubscriptionId(),
+                    emergencySmsInfo.second.intValue());
         } catch (InterruptedException e) {
             Log.e(TAG, "Operation interrupted.");
         } finally {
@@ -992,8 +995,6 @@
                     InstrumentationRegistry.getInstrumentation(), TEST_EMERGENCY_NUMBER);
         }
 
-        assertNotNull(mOnOutgoingSmsEmergencyNumberChanged);
-        assertEquals(mOnOutgoingSmsEmergencyNumberChanged.getNumber(), TEST_EMERGENCY_NUMBER);
     }
 
     @Test
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/ServiceStateTest.java b/tests/tests/telephony/current/src/android/telephony/cts/ServiceStateTest.java
index b832a74..3ec048b 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/ServiceStateTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/ServiceStateTest.java
@@ -330,7 +330,7 @@
 
         NetworkRegistrationInfo wwanDataRegState = new NetworkRegistrationInfo(
                 NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
-                0, 0, 0, true, null, null, "", 0, false, false, false, lteVopsSupportInfo, false);
+                0, 0, 0, true, null, null, "", 0, false, false, false, lteVopsSupportInfo);
 
         ServiceState ss = new ServiceState();
 
@@ -345,7 +345,7 @@
 
         wwanDataRegState = new NetworkRegistrationInfo(
                 NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
-                0, 0, 0, true, null, null, "", 0, false, false, false, lteVopsSupportInfo, false);
+                0, 0, 0, true, null, null, "", 0, false, false, false, lteVopsSupportInfo);
         ss.addNetworkRegistrationInfo(wwanDataRegState);
         assertEquals(ss.getNetworkRegistrationInfo(NetworkRegistrationInfo.DOMAIN_PS,
                 AccessNetworkConstants.TRANSPORT_TYPE_WWAN), wwanDataRegState);
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/SmsManagerTest.java b/tests/tests/telephony/current/src/android/telephony/cts/SmsManagerTest.java
index c6f1aa6..e6f30a2 100755
--- a/tests/tests/telephony/current/src/android/telephony/cts/SmsManagerTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/SmsManagerTest.java
@@ -156,6 +156,34 @@
             String mccmnc = mTelephonyManager.getSimOperator();
             mDeliveryReportSupported = !(CarrierCapability.NO_DELIVERY_REPORTS.contains(mccmnc));
         }
+
+        // register receivers
+        mSendIntent = new Intent(SMS_SEND_ACTION);
+        mDeliveryIntent = new Intent(SMS_DELIVERY_ACTION);
+
+        IntentFilter sendIntentFilter = new IntentFilter(SMS_SEND_ACTION);
+        IntentFilter deliveryIntentFilter = new IntentFilter(SMS_DELIVERY_ACTION);
+        IntentFilter dataSmsReceivedIntentFilter = new IntentFilter(DATA_SMS_RECEIVED_ACTION);
+        IntentFilter smsDeliverIntentFilter = new IntentFilter(SMS_DELIVER_DEFAULT_APP_ACTION);
+        IntentFilter smsReceivedIntentFilter =
+                new IntentFilter(Telephony.Sms.Intents.SMS_RECEIVED_ACTION);
+        IntentFilter smsRetrieverIntentFilter = new IntentFilter(SMS_RETRIEVER_ACTION);
+        dataSmsReceivedIntentFilter.addDataScheme("sms");
+        dataSmsReceivedIntentFilter.addDataAuthority("localhost", "19989");
+
+        mSendReceiver = new SmsBroadcastReceiver(SMS_SEND_ACTION);
+        mDeliveryReceiver = new SmsBroadcastReceiver(SMS_DELIVERY_ACTION);
+        mDataSmsReceiver = new SmsBroadcastReceiver(DATA_SMS_RECEIVED_ACTION);
+        mSmsDeliverReceiver = new SmsBroadcastReceiver(SMS_DELIVER_DEFAULT_APP_ACTION);
+        mSmsReceivedReceiver = new SmsBroadcastReceiver(Telephony.Sms.Intents.SMS_RECEIVED_ACTION);
+        mSmsRetrieverReceiver = new SmsBroadcastReceiver(SMS_RETRIEVER_ACTION);
+
+        mContext.registerReceiver(mSendReceiver, sendIntentFilter);
+        mContext.registerReceiver(mDeliveryReceiver, deliveryIntentFilter);
+        mContext.registerReceiver(mDataSmsReceiver, dataSmsReceivedIntentFilter);
+        mContext.registerReceiver(mSmsDeliverReceiver, smsDeliverIntentFilter);
+        mContext.registerReceiver(mSmsReceivedReceiver, smsReceivedIntentFilter);
+        mContext.registerReceiver(mSmsRetrieverReceiver, smsRetrieverIntentFilter);
     }
 
     @After
@@ -167,6 +195,26 @@
         if (mTestAppSetAsDefaultSmsApp) {
             setDefaultSmsApp(false);
         }
+
+        // unregister receivers
+        if (mSendReceiver != null) {
+            mContext.unregisterReceiver(mSendReceiver);
+        }
+        if (mDeliveryReceiver != null) {
+            mContext.unregisterReceiver(mDeliveryReceiver);
+        }
+        if (mDataSmsReceiver != null) {
+            mContext.unregisterReceiver(mDataSmsReceiver);
+        }
+        if (mSmsDeliverReceiver != null) {
+            mContext.unregisterReceiver(mSmsDeliverReceiver);
+        }
+        if (mSmsReceivedReceiver != null) {
+            mContext.unregisterReceiver(mSmsReceivedReceiver);
+        }
+        if (mSmsRetrieverReceiver != null) {
+            mContext.unregisterReceiver(mSmsRetrieverReceiver);
+        }
     }
 
     @Test
@@ -213,7 +261,6 @@
                 TextUtils.isEmpty(mDestAddr));
 
         String mccmnc = mTelephonyManager.getSimOperator();
-        setupBroadcastReceivers();
         init();
 
         CompletableFuture<Bundle> callbackResult = new CompletableFuture<>();
@@ -304,7 +351,6 @@
                 TextUtils.isEmpty(mDestAddr));
 
         String mccmnc = mTelephonyManager.getSimOperator();
-        setupBroadcastReceivers();
 
         // send/receive single text sms with and without messageId
         sendAndReceiveSms(/* addMessageId= */ true);
@@ -338,7 +384,6 @@
         // Setting default SMS App is needed to be able to block numbers.
         setDefaultSmsApp(true);
         blockNumber(mDestAddr);
-        setupBroadcastReceivers();
 
         // single-part SMS blocking
         init();
@@ -440,7 +485,7 @@
         int originalWriteSmsMode = -1;
         String ctsPackageName = context.getPackageName();
         try {
-            // Insert some dummy sms
+            // Insert some test sms
             originalWriteSmsMode = context.getSystemService(AppOpsManager.class)
                     .unsafeCheckOpNoThrow(AppOpsManager.OPSTR_WRITE_SMS,
                             getPackageUid(ctsPackageName), ctsPackageName);
@@ -455,8 +500,8 @@
                         new Date().toString().replace(" ", "_"));
                 return contentResolver.insert(Telephony.Sms.CONTENT_URI, contentValues);
             });
-            assertNotNull("Failed to insert dummy sms", dummySmsUri);
-            assertNotEquals("Failed to insert dummy sms", dummySmsUri.getLastPathSegment(), "0");
+            assertNotNull("Failed to insert test sms", dummySmsUri);
+            assertNotEquals("Failed to insert test sms", dummySmsUri.getLastPathSegment(), "0");
             testSmsAccessAboutDefaultApp(LEGACY_SMS_APP);
             testSmsAccessAboutDefaultApp(MODERN_SMS_APP);
         } finally {
@@ -586,35 +631,6 @@
                 PendingIntent.FLAG_ONE_SHOT);
     }
 
-    private void setupBroadcastReceivers() {
-        mSendIntent = new Intent(SMS_SEND_ACTION);
-        mDeliveryIntent = new Intent(SMS_DELIVERY_ACTION);
-
-        IntentFilter sendIntentFilter = new IntentFilter(SMS_SEND_ACTION);
-        IntentFilter deliveryIntentFilter = new IntentFilter(SMS_DELIVERY_ACTION);
-        IntentFilter dataSmsReceivedIntentFilter = new IntentFilter(DATA_SMS_RECEIVED_ACTION);
-        IntentFilter smsDeliverIntentFilter = new IntentFilter(SMS_DELIVER_DEFAULT_APP_ACTION);
-        IntentFilter smsReceivedIntentFilter =
-                new IntentFilter(Telephony.Sms.Intents.SMS_RECEIVED_ACTION);
-        IntentFilter smsRetrieverIntentFilter = new IntentFilter(SMS_RETRIEVER_ACTION);
-        dataSmsReceivedIntentFilter.addDataScheme("sms");
-        dataSmsReceivedIntentFilter.addDataAuthority("localhost", "19989");
-
-        mSendReceiver = new SmsBroadcastReceiver(SMS_SEND_ACTION);
-        mDeliveryReceiver = new SmsBroadcastReceiver(SMS_DELIVERY_ACTION);
-        mDataSmsReceiver = new SmsBroadcastReceiver(DATA_SMS_RECEIVED_ACTION);
-        mSmsDeliverReceiver = new SmsBroadcastReceiver(SMS_DELIVER_DEFAULT_APP_ACTION);
-        mSmsReceivedReceiver = new SmsBroadcastReceiver(Telephony.Sms.Intents.SMS_RECEIVED_ACTION);
-        mSmsRetrieverReceiver = new SmsBroadcastReceiver(SMS_RETRIEVER_ACTION);
-
-        mContext.registerReceiver(mSendReceiver, sendIntentFilter);
-        mContext.registerReceiver(mDeliveryReceiver, deliveryIntentFilter);
-        mContext.registerReceiver(mDataSmsReceiver, dataSmsReceivedIntentFilter);
-        mContext.registerReceiver(mSmsDeliverReceiver, smsDeliverIntentFilter);
-        mContext.registerReceiver(mSmsReceivedReceiver, smsReceivedIntentFilter);
-        mContext.registerReceiver(mSmsRetrieverReceiver, smsRetrieverIntentFilter);
-    }
-
     /**
      * Returns the number of parts sent in the message. If Multi-part SMS is not supported,
      * returns 0.
@@ -654,9 +670,10 @@
     }
 
     @Test
-    public void testGetSmscAddress() {
+    public void testGetSetSmscAddress() {
+        String smsc = null;
         try {
-            getSmsManager().getSmscAddress();
+            smsc = getSmsManager().getSmscAddress();
             fail("SmsManager.getSmscAddress() should throw a SecurityException");
         } catch (SecurityException e) {
             // expected
@@ -665,19 +682,16 @@
         InstrumentationRegistry.getInstrumentation().getUiAutomation()
                 .adoptShellPermissionIdentity("android.permission.READ_PRIVILEGED_PHONE_STATE");
         try {
-            getSmsManager().getSmscAddress();
+            smsc = getSmsManager().getSmscAddress();
         } catch (SecurityException se) {
             fail("Caller with READ_PRIVILEGED_PHONE_STATE should be able to call API");
         } finally {
             InstrumentationRegistry.getInstrumentation().getUiAutomation()
                     .dropShellPermissionIdentity();
         }
-    }
 
-    @Test
-    public void testSetSmscAddress() {
         try {
-            getSmsManager().setSmscAddress("fake smsc");
+            getSmsManager().setSmscAddress(smsc);
             fail("SmsManager.setSmscAddress() should throw a SecurityException");
         } catch (SecurityException e) {
             // expected
@@ -686,7 +700,7 @@
         InstrumentationRegistry.getInstrumentation().getUiAutomation()
                 .adoptShellPermissionIdentity("android.permission.MODIFY_PHONE_STATE");
         try {
-            getSmsManager().setSmscAddress("fake smsc");
+            getSmsManager().setSmscAddress(smsc);
         } catch (SecurityException se) {
             fail("Caller with MODIFY_PHONE_STATE should be able to call API");
         } finally {
@@ -739,24 +753,18 @@
         }
     }
 
+    /**
+     * Verify that SmsManager.getSmsCapacityOnIcc requires Permission.
+     * <p>
+     * Requires Permission:
+     * {@link android.Manifest.permission#READ_PHONE_STATE}.
+     */
     @Test
     public void testGetSmsCapacityOnIcc() {
         try {
             getSmsManager().getSmsCapacityOnIcc();
-            fail("Caller without READ_PRIVILEGED_PHONE_STATE should NOT be able to call API");
-        } catch (SecurityException se) {
-            // all good
-        }
-
-        InstrumentationRegistry.getInstrumentation().getUiAutomation()
-                .adoptShellPermissionIdentity("android.permission.READ_PRIVILEGED_PHONE_STATE");
-        try {
-            getSmsManager().getSmsCapacityOnIcc();
-        } catch (SecurityException se) {
-            fail("Caller with READ_PRIVILEGED_PHONE_STATE should be able to call API");
-        } finally {
-            InstrumentationRegistry.getInstrumentation().getUiAutomation()
-                    .dropShellPermissionIdentity();
+        } catch (SecurityException e) {
+            fail("Caller with READ_PHONE_STATE should be able to call API");
         }
     }
 
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/SubscriptionManagerTest.java b/tests/tests/telephony/current/src/android/telephony/cts/SubscriptionManagerTest.java
index 01401f8..987e098 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/SubscriptionManagerTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/SubscriptionManagerTest.java
@@ -136,12 +136,14 @@
     }
 
     /**
-     * Sanity check that both {@link PackageManager#FEATURE_TELEPHONY} and
+     * Correctness check that both {@link PackageManager#FEATURE_TELEPHONY} and
      * {@link NetworkCapabilities#TRANSPORT_CELLULAR} network must both be
      * either defined or undefined; you can't cross the streams.
      */
     @Test
-    public void testSanity() throws Exception {
+    public void testCorrectness() throws Exception {
+        if (!isSupported()) return;
+
         final boolean hasCellular = findCellularNetwork() != null;
         if (isSupported() && !hasCellular) {
             fail("Device claims to support " + PackageManager.FEATURE_TELEPHONY
@@ -243,7 +245,7 @@
         assertEquals(Arrays.asList(), mSm.getSubscriptionPlans(mSubId));
 
         // Push simple plan and get it back
-        final SubscriptionPlan plan = buildValidSubscriptionPlan();
+        final SubscriptionPlan plan = buildValidSubscriptionPlan(System.currentTimeMillis());
         mSm.setSubscriptionPlans(mSubId, Arrays.asList(plan));
         assertEquals(Arrays.asList(plan), mSm.getSubscriptionPlans(mSubId));
 
@@ -282,7 +284,8 @@
         }
 
         // Defining plans means we get to override
-        mSm.setSubscriptionPlans(mSubId, Arrays.asList(buildValidSubscriptionPlan()));
+        mSm.setSubscriptionPlans(mSubId,
+                Arrays.asList(buildValidSubscriptionPlan(System.currentTimeMillis())));
 
         // Cellular is uncongested by default
         assertTrue(cm.getNetworkCapabilities(net).hasCapability(NET_CAPABILITY_NOT_CONGESTED));
@@ -344,7 +347,8 @@
 
         // Make ourselves the owner and define some plans
         setSubPlanOwner(mSubId, mPackageName);
-        mSm.setSubscriptionPlans(mSubId, Arrays.asList(buildValidSubscriptionPlan()));
+        mSm.setSubscriptionPlans(mSubId,
+                Arrays.asList(buildValidSubscriptionPlan(System.currentTimeMillis())));
 
         // Cellular is metered by default
         assertFalse(cm.getNetworkCapabilities(net).hasCapability(
@@ -380,7 +384,8 @@
 
         // Make ourselves the owner and define some plans
         setSubPlanOwner(mSubId, mPackageName);
-        mSm.setSubscriptionPlans(mSubId, Arrays.asList(buildValidSubscriptionPlan()));
+        mSm.setSubscriptionPlans(mSubId,
+                Arrays.asList(buildValidSubscriptionPlan(System.currentTimeMillis())));
 
         // Cellular is metered by default
         assertFalse(cm.getNetworkCapabilities(net).hasCapability(
@@ -408,7 +413,8 @@
             final CountDownLatch latch = waitForNetworkCapabilities(net, caps -> {
                 return !caps.hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED);
             });
-            mSm.setSubscriptionPlans(mSubId, Arrays.asList(buildValidSubscriptionPlan()));
+            mSm.setSubscriptionPlans(mSubId,
+                    Arrays.asList(buildValidSubscriptionPlan(System.currentTimeMillis())));
             assertTrue(latch.await(10, TimeUnit.SECONDS));
         }
     }
@@ -463,7 +469,7 @@
 
         // Error when adding 2 plans with the same network type
         List<SubscriptionPlan> plans = new ArrayList<>();
-        plans.add(buildValidSubscriptionPlan());
+        plans.add(buildValidSubscriptionPlan(System.currentTimeMillis()));
         plans.add(SubscriptionPlan.Builder
                 .createRecurring(ZonedDateTime.parse("2007-03-14T00:00:00.000Z"),
                         Period.ofMonths(1))
@@ -499,16 +505,17 @@
 
     @Test
     public void testSubscriptionPlanResetNetworkTypes() {
+        long time = System.currentTimeMillis();
         SubscriptionPlan plan = SubscriptionPlan.Builder
                 .createRecurring(ZonedDateTime.parse("2007-03-14T00:00:00.000Z"),
                         Period.ofMonths(1))
                 .setTitle("CTS")
                 .setNetworkTypes(new int[] {TelephonyManager.NETWORK_TYPE_LTE})
                 .setDataLimit(1_000_000_000, SubscriptionPlan.LIMIT_BEHAVIOR_DISABLED)
-                .setDataUsage(500_000_000, System.currentTimeMillis())
+                .setDataUsage(500_000_000, time)
                 .resetNetworkTypes()
                 .build();
-        assertEquals(plan, buildValidSubscriptionPlan());
+        assertEquals(plan, buildValidSubscriptionPlan(time));
     }
 
     @Test
@@ -900,13 +907,13 @@
         return latch;
     }
 
-    private static SubscriptionPlan buildValidSubscriptionPlan() {
+    private static SubscriptionPlan buildValidSubscriptionPlan(long dataUsageTime) {
         return SubscriptionPlan.Builder
                 .createRecurring(ZonedDateTime.parse("2007-03-14T00:00:00.000Z"),
                         Period.ofMonths(1))
                 .setTitle("CTS")
                 .setDataLimit(1_000_000_000, SubscriptionPlan.LIMIT_BEHAVIOR_DISABLED)
-                .setDataUsage(500_000_000, System.currentTimeMillis())
+                .setDataUsage(500_000_000, dataUsageTime)
                 .build();
     }
 
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/TelephonyManagerTest.java b/tests/tests/telephony/current/src/android/telephony/cts/TelephonyManagerTest.java
index 4b8b2d6..5253fab 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/TelephonyManagerTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/TelephonyManagerTest.java
@@ -22,6 +22,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
@@ -37,18 +38,14 @@
 import android.content.IntentFilter;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
-import android.database.ContentObserver;
 import android.net.ConnectivityManager;
-import android.net.Uri;
 import android.net.wifi.WifiManager;
 import android.os.AsyncTask;
 import android.os.Build;
-import android.os.Handler;
 import android.os.Looper;
 import android.os.PersistableBundle;
 import android.os.Process;
 import android.os.UserManager;
-import android.provider.Settings;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
@@ -56,7 +53,9 @@
 import android.telephony.Annotation.RadioPowerState;
 import android.telephony.AvailableNetworkInfo;
 import android.telephony.CallAttributes;
+import android.telephony.CallForwardingInfo;
 import android.telephony.CallQuality;
+import android.telephony.CarrierBandwidth;
 import android.telephony.CarrierConfigManager;
 import android.telephony.CellLocation;
 import android.telephony.NetworkRegistrationInfo;
@@ -99,11 +98,14 @@
 import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Consumer;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 
 /**
@@ -127,6 +129,7 @@
     private String mSelfCertHash;
 
     private static final int TOLERANCE = 1000;
+    private static final int TIMEOUT_FOR_NETWORK_OPS = TOLERANCE * 10;
     private PhoneStateListener mListener;
     private static ConnectivityManager mCm;
     private static final String TAG = "TelephonyManagerTest";
@@ -171,6 +174,7 @@
     private static final String TESTING_PLMN = "12345";
 
     private static final int RADIO_HAL_VERSION_1_3 = makeRadioVersion(1, 3);
+    private static final int RADIO_HAL_VERSION_1_6 = makeRadioVersion(1, 6);
 
     static {
         EMERGENCY_NUMBER_SOURCE_SET = new HashSet<Integer>();
@@ -243,6 +247,8 @@
         IntentFilter filter = new IntentFilter(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
         // ACTION_CARRIER_CONFIG_CHANGED is sticky, so we will get a callback right away.
         getContext().registerReceiver(mReceiver, filter);
+        InstrumentationRegistry.getInstrumentation().getUiAutomation()
+                .adoptShellPermissionIdentity("android.permission.READ_PHONE_STATE");
     }
 
     @After
@@ -433,7 +439,9 @@
             CellLocation.requestLocationUpdate();
             mLock.wait(TOLERANCE);
 
-            assertTrue("Test register, mOnCellLocationChangedCalled should be true.",
+            // Starting with Android S, this API will silently drop all requests from apps
+            // targeting Android S due to unfixable limitations with the API.
+            assertFalse("Test register, mOnCellLocationChangedCalled should be false.",
                     mOnCellLocationChangedCalled);
         }
 
@@ -568,12 +576,12 @@
                 TelephonyManager::getAndUpdateDefaultRespondViaMessageApplication);
     }
 
-    /**
-     * Due to the corresponding API is hidden in R and will be public in S, this test
-     * is commented and will be un-commented in Android S.
-     *
     @Test
-    public void testGetCallForwarding() {
+    public void testGetCallForwarding() throws Exception {
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            Log.d(TAG, "skipping test on device without FEATURE_TELEPHONY present");
+            return;
+        }
         List<Integer> callForwardingReasons = new ArrayList<>();
         callForwardingReasons.add(CallForwardingInfo.REASON_UNCONDITIONAL);
         callForwardingReasons.add(CallForwardingInfo.REASON_BUSY);
@@ -582,35 +590,61 @@
         callForwardingReasons.add(CallForwardingInfo.REASON_ALL);
         callForwardingReasons.add(CallForwardingInfo.REASON_ALL_CONDITIONAL);
 
-        Set<Integer> callForwardingStatus = new HashSet<Integer>();
-        callForwardingStatus.add(CallForwardingInfo.STATUS_INACTIVE);
-        callForwardingStatus.add(CallForwardingInfo.STATUS_ACTIVE);
-        callForwardingStatus.add(CallForwardingInfo.STATUS_FDN_CHECK_FAILURE);
-        callForwardingStatus.add(CallForwardingInfo.STATUS_UNKNOWN_ERROR);
-        callForwardingStatus.add(CallForwardingInfo.STATUS_NOT_SUPPORTED);
+        Set<Integer> callForwardingErrors = new HashSet<Integer>();
+        callForwardingErrors.add(TelephonyManager.CallForwardingInfoCallback
+                .RESULT_ERROR_FDN_CHECK_FAILURE);
+        callForwardingErrors.add(TelephonyManager.CallForwardingInfoCallback.RESULT_ERROR_UNKNOWN);
+        callForwardingErrors.add(TelephonyManager.CallForwardingInfoCallback
+                .RESULT_ERROR_NOT_SUPPORTED);
 
         for (int callForwardingReasonToGet : callForwardingReasons) {
             Log.d(TAG, "[testGetCallForwarding] callForwardingReasonToGet: "
                     + callForwardingReasonToGet);
-            CallForwardingInfo callForwardingInfo =
-                    ShellIdentityUtils.invokeMethodWithShellPermissions(mTelephonyManager,
-                            (tm) -> tm.getCallForwarding(callForwardingReasonToGet));
+            AtomicReference<CallForwardingInfo> receivedForwardingInfo = new AtomicReference<>();
+            AtomicReference<Integer> receivedErrorCode = new AtomicReference<>();
+            CountDownLatch latch = new CountDownLatch(1);
+            TelephonyManager.CallForwardingInfoCallback callback =
+                    new TelephonyManager.CallForwardingInfoCallback() {
+                        @Override
+                        public void onCallForwardingInfoAvailable(CallForwardingInfo info) {
+                            receivedForwardingInfo.set(info);
+                            latch.countDown();
+                        }
 
-            assertNotNull(callForwardingInfo);
-            assertTrue(callForwardingStatus.contains(callForwardingInfo.getStatus()));
-            assertTrue(callForwardingReasons.contains(callForwardingInfo.getReason()));
-            callForwardingInfo.getNumber();
-            assertTrue(callForwardingInfo.getTimeoutSeconds() >= 0);
+                        @Override
+                        public void onError(int error) {
+                            receivedErrorCode.set(error);
+                            latch.countDown();
+                        }
+            };
+            ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mTelephonyManager,
+                    (tm) -> tm.getCallForwarding(callForwardingReasonToGet,
+                            getContext().getMainExecutor(), callback));
+
+            assertTrue(latch.await(TIMEOUT_FOR_NETWORK_OPS, TimeUnit.MILLISECONDS));
+            // Make sure only one of the callbacks gets invoked
+            assertTrue((receivedForwardingInfo.get() != null) ^ (receivedErrorCode.get() != null));
+            if (receivedForwardingInfo.get() != null) {
+                CallForwardingInfo info = receivedForwardingInfo.get();
+                assertTrue(callForwardingReasons.contains(info.getReason()));
+                if (info.isEnabled()) {
+                    assertNotNull(info.getNumber());
+                    assertTrue(info.getTimeoutSeconds() >= 0);
+                }
+            }
+
+            if (receivedErrorCode.get() != null) {
+                assertTrue(callForwardingErrors.contains(receivedErrorCode.get()));
+            }
         }
     }
-     */
 
-    /**
-     * Due to the corresponding API is hidden in R and will be public in S, this test
-     * is commented and will be un-commented in Android S.
-     *
     @Test
-    public void testSetCallForwarding() {
+    public void testSetCallForwarding() throws Exception {
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            Log.d(TAG, "skipping test on device without FEATURE_TELEPHONY present");
+            return;
+        }
         List<Integer> callForwardingReasons = new ArrayList<>();
         callForwardingReasons.add(CallForwardingInfo.REASON_UNCONDITIONAL);
         callForwardingReasons.add(CallForwardingInfo.REASON_BUSY);
@@ -621,68 +655,107 @@
 
         // Enable Call Forwarding
         for (int callForwardingReasonToEnable : callForwardingReasons) {
+            CountDownLatch latch = new CountDownLatch(1);
+            // Disregard success or failure; just make sure it reports back.
+            Consumer<Integer> ignoringResultListener = (x) -> latch.countDown();
+
             final CallForwardingInfo callForwardingInfoToEnable = new CallForwardingInfo(
-                    CallForwardingInfo.STATUS_ACTIVE,
+                    true,
                     callForwardingReasonToEnable,
                     TEST_FORWARD_NUMBER,
                     // time seconds
                     1);
-            Log.d(TAG, "[testSetCallForwarding] Enable Call Forwarding. Status: "
-                    + CallForwardingInfo.STATUS_ACTIVE + " Reason: "
+            Log.d(TAG, "[testSetCallForwarding] Enable Call Forwarding. Reason: "
                     + callForwardingReasonToEnable + " Number: " + TEST_FORWARD_NUMBER
                     + " Time Seconds: 1");
-            ShellIdentityUtils.invokeMethodWithShellPermissions(mTelephonyManager,
-                    (tm) -> tm.setCallForwarding(callForwardingInfoToEnable));
+            ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mTelephonyManager,
+                    (tm) -> tm.setCallForwarding(callForwardingInfoToEnable,
+                            getContext().getMainExecutor(), ignoringResultListener));
+            // TODO: this takes way too long on a real network (upwards of 40s).
+            // assertTrue("No response for forwarding for reason " + callForwardingReasonToEnable,
+            //        latch.await(TIMEOUT_FOR_NETWORK_OPS * 3, TimeUnit.MILLISECONDS));
         }
 
         // Disable Call Forwarding
         for (int callForwardingReasonToDisable : callForwardingReasons) {
+            CountDownLatch latch = new CountDownLatch(1);
+            // Disregard success or failure; just make sure it reports back.
+            Consumer<Integer> ignoringResultListener = (x) -> latch.countDown();
+
             final CallForwardingInfo callForwardingInfoToDisable = new CallForwardingInfo(
-                    CallForwardingInfo.STATUS_INACTIVE,
+                    false,
                     callForwardingReasonToDisable,
                     TEST_FORWARD_NUMBER,
                     // time seconds
                     1);
-            Log.d(TAG, "[testSetCallForwarding] Disable Call Forwarding. Status: "
-                    + CallForwardingInfo.STATUS_INACTIVE + " Reason: "
+            Log.d(TAG, "[testSetCallForwarding] Disable Call Forwarding. Reason: "
                     + callForwardingReasonToDisable + " Number: " + TEST_FORWARD_NUMBER
                     + " Time Seconds: 1");
-            ShellIdentityUtils.invokeMethodWithShellPermissions(mTelephonyManager,
-                    (tm) -> tm.setCallForwarding(callForwardingInfoToDisable));
+            ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mTelephonyManager,
+                    (tm) -> tm.setCallForwarding(callForwardingInfoToDisable,
+                            getContext().getMainExecutor(), ignoringResultListener));
+            // TODO: this takes way too long on a real network (upwards of 40s).
+            //assertTrue("No response for forwarding for reason " + callForwardingReasonToDisable,
+            //        latch.await(TIMEOUT_FOR_NETWORK_OPS * 3, TimeUnit.MILLISECONDS));
         }
     }
-    */
 
-    /**
-     * Due to the corresponding API is hidden in R and will be public in S, this test
-     * is commented and will be un-commented in Android S.
-     *
     @Test
-    public void testGetCallWaitingStatus() {
-        Set<Integer> callWaitingStatus = new HashSet<Integer>();
-        callWaitingStatus.add(TelephonyManager.CALL_WAITING_STATUS_ACTIVE);
-        callWaitingStatus.add(TelephonyManager.CALL_WAITING_STATUS_INACTIVE);
-        callWaitingStatus.add(TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR);
-        callWaitingStatus.add(TelephonyManager.CALL_WAITING_STATUS_NOT_SUPPORTED);
+    public void testGetCallWaitingStatus() throws Exception {
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            Log.d(TAG, "skipping test on device without FEATURE_TELEPHONY present");
+            return;
+        }
+        Set<Integer> validCallWaitingStatuses = new HashSet<Integer>();
+        validCallWaitingStatuses.add(TelephonyManager.CALL_WAITING_STATUS_ENABLED);
+        validCallWaitingStatuses.add(TelephonyManager.CALL_WAITING_STATUS_DISABLED);
+        validCallWaitingStatuses.add(TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR);
+        validCallWaitingStatuses.add(TelephonyManager.CALL_WAITING_STATUS_NOT_SUPPORTED);
 
-        int status = ShellIdentityUtils.invokeMethodWithShellPermissions(
-                mTelephonyManager, (tm) -> tm.getCallWaitingStatus());
-        assertTrue(callWaitingStatus.contains(status));
+        LinkedBlockingQueue<Integer> callWaitingStatusResult = new LinkedBlockingQueue<>(1);
+        ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(
+                mTelephonyManager, (tm) -> tm.getCallWaitingStatus(getContext().getMainExecutor(),
+                        callWaitingStatusResult::offer));
+        assertTrue(validCallWaitingStatuses.contains(
+                callWaitingStatusResult.poll(TIMEOUT_FOR_NETWORK_OPS, TimeUnit.MILLISECONDS)));
     }
-     */
 
-    /**
-     * Due to the corresponding API is hidden in R and will be public in S, this test
-     * is commented and will be un-commented in Android S.
-     *
     @Test
-    public void testSetCallWaitingStatus() {
-        ShellIdentityUtils.invokeMethodWithShellPermissions(mTelephonyManager,
-                (tm) -> tm.setCallWaitingStatus(true));
-        ShellIdentityUtils.invokeMethodWithShellPermissions(mTelephonyManager,
-                (tm) -> tm.setCallWaitingStatus(false));
+    public void testSetCallWaitingStatus() throws Exception {
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            Log.d(TAG, "skipping test on device without FEATURE_TELEPHONY present");
+            return;
+        }
+        Set<Integer> validCallWaitingErrors = new HashSet<Integer>();
+        validCallWaitingErrors.add(TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR);
+        validCallWaitingErrors.add(TelephonyManager.CALL_WAITING_STATUS_NOT_SUPPORTED);
+        Executor executor = getContext().getMainExecutor();
+        {
+            LinkedBlockingQueue<Integer> callWaitingResult = new LinkedBlockingQueue<>(1);
+
+            ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mTelephonyManager,
+                    (tm) -> tm.setCallWaitingEnabled(true, executor, callWaitingResult::offer));
+            Integer result = callWaitingResult.poll(TIMEOUT_FOR_NETWORK_OPS, TimeUnit.MILLISECONDS);
+            assertNotNull("Never got callback from set call waiting", result);
+            if (result != TelephonyManager.CALL_WAITING_STATUS_ENABLED) {
+                assertTrue("Call waiting callback got an invalid value: " + result,
+                        validCallWaitingErrors.contains(result));
+            }
+        }
+
+        {
+            LinkedBlockingQueue<Integer> callWaitingResult = new LinkedBlockingQueue<>(1);
+
+            ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mTelephonyManager,
+                    (tm) -> tm.setCallWaitingEnabled(false, executor, callWaitingResult::offer));
+            Integer result = callWaitingResult.poll(TIMEOUT_FOR_NETWORK_OPS, TimeUnit.MILLISECONDS);
+            assertNotNull("Never got callback from set call waiting", result);
+            if (result != TelephonyManager.CALL_WAITING_STATUS_DISABLED) {
+                assertTrue("Call waiting callback got an invalid value: " + result,
+                        validCallWaitingErrors.contains(result));
+            }
+        }
     }
-     */
 
     @Test
     public void testGetRadioHalVersion() {
@@ -708,6 +781,12 @@
             Log.d(TAG, "Skipping test that requires config_voice_capable is true");
             return;
         }
+        int subId = SubscriptionManager.getDefaultDataSubscriptionId();
+        if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+            Log.d(TAG, "Skipping test that requires DefaultDataSubscriptionId setting");
+            return;
+        }
+
         TelecomManager telecomManager = getContext().getSystemService(TelecomManager.class);
         PhoneAccountHandle handle =
                 telecomManager.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL);
@@ -739,7 +818,7 @@
                 assertTrue("Phone count should be > 0", phoneCount > 0);
                 break;
             case TelephonyManager.PHONE_TYPE_NONE:
-                assertTrue("Phone count should be 0", phoneCount == 0 || phoneCount == 1);
+                assertTrue("Phone count should be >= 0", phoneCount >= 0);
                 break;
             default:
                 throw new IllegalArgumentException("Did you add a new phone type? " + phoneType);
@@ -1021,6 +1100,7 @@
                 && !userManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS);
         assertTrue("Primary user must be able to configure mobile networks to pass this test",
                 canChangeMobileNetworkSettings);
+        boolean initialDataSetting = isDataEnabled();
 
         //First check permissions are correct
         try {
@@ -1038,28 +1118,20 @@
             fail("TelephonyManager#resetSettings requires the"
                     + " android.Manifest.permission.NETWORK_SETTINGS permission");
         }
+        // This may timeout because the default is equal to the initial data setting, but there is
+        // no way to definitively check what the default should be, so assume the default will be
+        // set within TOLERANCE time.
+        TelephonyUtils.pollUntilTrue(() -> initialDataSetting != isDataEnabled(), 5 /*times*/,
+                TOLERANCE/5 /*timeout per poll*/);
 
-        LinkedBlockingQueue<Boolean> queue = new LinkedBlockingQueue<>(2);
-        final ContentObserver mobileDataChangeObserver = new ContentObserver(
-                new Handler(Looper.getMainLooper())) {
-            @Override
-            public void onChange(boolean selfChange) {
-                queue.offer(isDataEnabled());
-            }
-        };
-
-        getContext().getContentResolver().registerContentObserver(
-                getObservableDataEnabledUri(mTestSub), /* notifyForDescendants= */ false,
-                mobileDataChangeObserver);
         boolean defaultDataSetting = isDataEnabled();
 
         // set data to not the default!
         ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mTelephonyManager,
                 tm -> tm.setDataEnabled(!defaultDataSetting));
-        Boolean dataChangedResult = queue.poll(TOLERANCE, TimeUnit.MILLISECONDS);
-        assertNotNull("Data setting was not changed", dataChangedResult);
-        assertEquals("Data enable change didn't work", !defaultDataSetting,
-                dataChangedResult);
+        assertTrue("Data enable change didn't work",
+                TelephonyUtils.pollUntilTrue(() -> defaultDataSetting != isDataEnabled(),
+                        5 /*times*/, TOLERANCE/5 /*timeout per poll*/));
 
         // and then do a reset to move data to default again.
         try {
@@ -1069,10 +1141,10 @@
             fail("TelephonyManager#resetSettings requires the"
                     + " android.Manifest.permission.NETWORK_SETTINGS permission");
         }
-        dataChangedResult = queue.poll(TOLERANCE, TimeUnit.MILLISECONDS);
-        assertNotNull("Data setting was not changed", dataChangedResult);
-        assertEquals("resetSettings did not reset default data", defaultDataSetting,
-                dataChangedResult);
+
+        assertTrue("resetSettings did not reset default data",
+                TelephonyUtils.pollUntilTrue(() -> defaultDataSetting == isDataEnabled(),
+                        5 /*times*/, TOLERANCE/5 /*timeout per poll*/));
     }
 
     @Test
@@ -1160,6 +1232,11 @@
             return;
         }
 
+        // mc and meid should either be null or supported. empty string is not expected even if
+        // the device does not support mc/meid.
+        assertNotEquals("", mc);
+        assertNotEquals("", meid);
+
         if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
             if (mTelephonyManager.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA) {
                 assertEquals(meid.substring(0, 8), mc);
@@ -1329,6 +1406,8 @@
                 mLock.wait(60000);
             }
         }
+        InstrumentationRegistry.getInstrumentation().getUiAutomation()
+                .adoptShellPermissionIdentity("android.permission.READ_PHONE_STATE");
         assertThat(mTelephonyManager.getServiceState().getState()).isEqualTo(
                 ServiceState.STATE_IN_SERVICE);
     }
@@ -1695,6 +1774,28 @@
         }
     }
 
+    @Test
+    public void testGetEquivalentHomePlmns() {
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            return;
+        }
+
+        List<String> plmns = mTelephonyManager.getEquivalentHomePlmns();
+
+        if (mTelephonyManager.getPhoneType() != TelephonyManager.PHONE_TYPE_GSM) {
+            assertEquals(0, plmns.size());
+        } else {
+            for (String plmn : plmns) {
+                assertTrue(
+                        "Invalid Length for PLMN-ID, must be 5 or 6! plmn=" + plmn,
+                        plmn.length() >= 5 && plmn.length() <= 6);
+                assertTrue(
+                        "PLMNs must be strings of digits 0-9! plmn=" + plmn,
+                        android.text.TextUtils.isDigitsOnly(plmn));
+            }
+        }
+    }
+
     /**
      * Tests that the device properly reports the contents of ManualNetworkSelectionPlmn
      * The setting is not persisted selection
@@ -1866,6 +1967,8 @@
             Log.d(TAG, "Skipping test that requires FEATURE_TELEPHONY");
             return;
         }
+        if (mTelephonyManager.getPhoneType() != TelephonyManager.PHONE_TYPE_GSM) return;
+
         assertTrue(ShellIdentityUtils.invokeMethodWithShellPermissions(mTelephonyManager,
                 (tm) -> tm.isManualNetworkSelectionAllowed()));
     }
@@ -2571,6 +2674,37 @@
     }
 
     @Test
+    public void testGetAllNetworkTypes() {
+        Set<Integer> expectedNetworkTypes = new HashSet<>(Arrays.asList(
+                TelephonyManager.NETWORK_TYPE_GPRS,
+                TelephonyManager.NETWORK_TYPE_EDGE,
+                TelephonyManager.NETWORK_TYPE_UMTS,
+                TelephonyManager.NETWORK_TYPE_CDMA,
+                TelephonyManager.NETWORK_TYPE_EVDO_0,
+                TelephonyManager.NETWORK_TYPE_EVDO_A,
+                TelephonyManager.NETWORK_TYPE_1xRTT,
+                TelephonyManager.NETWORK_TYPE_HSDPA,
+                TelephonyManager.NETWORK_TYPE_HSUPA,
+                TelephonyManager.NETWORK_TYPE_HSPA,
+                TelephonyManager.NETWORK_TYPE_IDEN,
+                TelephonyManager.NETWORK_TYPE_EVDO_B,
+                TelephonyManager.NETWORK_TYPE_LTE,
+                TelephonyManager.NETWORK_TYPE_EHRPD,
+                TelephonyManager.NETWORK_TYPE_HSPAP,
+                TelephonyManager.NETWORK_TYPE_GSM,
+                TelephonyManager.NETWORK_TYPE_TD_SCDMA,
+                TelephonyManager.NETWORK_TYPE_IWLAN,
+                TelephonyManager.NETWORK_TYPE_LTE_CA,
+                TelephonyManager.NETWORK_TYPE_NR
+        ));
+
+        Set<Integer> actualNetworkTypes = IntStream.of(TelephonyManager.getAllNetworkTypes())
+                .boxed().collect(Collectors.toSet());
+        assertTrue(expectedNetworkTypes.containsAll(actualNetworkTypes));
+        assertTrue(actualNetworkTypes.containsAll(expectedNetworkTypes));
+    }
+
+    @Test
     public void testIsModemEnabledForSlot() {
         if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
             return;
@@ -2631,18 +2765,274 @@
                 TelephonyManager.SIM_STATE_PRESENT).contains(simCardState));
     }
 
-
     private boolean isDataEnabled() {
         return ShellIdentityUtils.invokeMethodWithShellPermissions(mTelephonyManager,
                 TelephonyManager::isDataEnabled);
     }
 
-    private Uri getObservableDataEnabledUri(int subId) {
-        Uri uri = Settings.Global.getUriFor(Settings.Global.MOBILE_DATA);
-        if (mTelephonyManager.getActiveModemCount() != 1) {
-            uri = Settings.Global.getUriFor(Settings.Global.MOBILE_DATA + subId);
+    @Test
+    public void testDataDuringVoiceCallPolicy() {
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            return;
         }
-        return uri;
+
+        ShellIdentityUtils.ShellPermissionMethodHelper<Boolean, TelephonyManager> getPolicyHelper =
+                (tm) -> tm.isMobileDataPolicyEnabled(
+                        TelephonyManager.MOBILE_DATA_POLICY_DATA_ON_NON_DEFAULT_DURING_VOICE_CALL);
+
+        boolean allowDataDuringVoiceCall = ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyManager, getPolicyHelper);
+
+        ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(
+                mTelephonyManager, (tm) -> tm.setMobileDataPolicyEnabledStatus(
+                        TelephonyManager.MOBILE_DATA_POLICY_DATA_ON_NON_DEFAULT_DURING_VOICE_CALL,
+                        !allowDataDuringVoiceCall));
+
+        assertNotEquals(allowDataDuringVoiceCall,
+                ShellIdentityUtils.invokeMethodWithShellPermissions(
+                        mTelephonyManager, getPolicyHelper));
+
+        ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(
+                mTelephonyManager, (tm) -> tm.setMobileDataPolicyEnabledStatus(
+                        TelephonyManager.MOBILE_DATA_POLICY_DATA_ON_NON_DEFAULT_DURING_VOICE_CALL,
+                        allowDataDuringVoiceCall));
+
+        assertEquals(allowDataDuringVoiceCall,
+                ShellIdentityUtils.invokeMethodWithShellPermissions(
+                        mTelephonyManager, getPolicyHelper));
+    }
+
+    @Test
+    public void testAlwaysAllowMmsDataPolicy() {
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            return;
+        }
+
+        ShellIdentityUtils.ShellPermissionMethodHelper<Boolean, TelephonyManager> getPolicyHelper =
+                (tm) -> tm.isMobileDataPolicyEnabled(
+                        TelephonyManager.MOBILE_DATA_POLICY_MMS_ALWAYS_ALLOWED);
+
+        boolean mmsAlwaysAllowed = ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyManager, getPolicyHelper);
+
+        ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(
+                mTelephonyManager, (tm) -> tm.setMobileDataPolicyEnabledStatus(
+                        TelephonyManager.MOBILE_DATA_POLICY_MMS_ALWAYS_ALLOWED,
+                        !mmsAlwaysAllowed));
+
+        assertNotEquals(mmsAlwaysAllowed,
+                ShellIdentityUtils.invokeMethodWithShellPermissions(
+                        mTelephonyManager, getPolicyHelper));
+
+        ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(
+                mTelephonyManager, (tm) -> tm.setMobileDataPolicyEnabledStatus(
+                        TelephonyManager.MOBILE_DATA_POLICY_MMS_ALWAYS_ALLOWED,
+                        mmsAlwaysAllowed));
+
+        assertEquals(mmsAlwaysAllowed,
+                ShellIdentityUtils.invokeMethodWithShellPermissions(
+                        mTelephonyManager, getPolicyHelper));
+    }
+
+    @Test
+    public void testThermalDataEnable() {
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            return;
+        }
+
+        ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(
+                mTelephonyManager,
+                (tm) -> tm.setDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_THERMAL,
+                        false));
+
+        boolean isDataEnabledForReason = ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyManager, (tm) -> tm.isDataEnabledForReason(
+                        TelephonyManager.DATA_ENABLED_REASON_THERMAL));
+        assertFalse(isDataEnabledForReason);
+
+        boolean isDataConnectionAvailable = ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyManager, (tm) -> tm.isDataConnectionAllowed());
+        assertFalse(isDataConnectionAvailable);
+
+        ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(
+                mTelephonyManager,
+                (tm) -> tm.setDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_THERMAL,
+                        true));
+
+        isDataEnabledForReason = ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyManager, (tm) -> tm.isDataEnabledForReason(
+                        TelephonyManager.DATA_ENABLED_REASON_THERMAL));
+        assertTrue(isDataEnabledForReason);
+
+        isDataConnectionAvailable = ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyManager, (tm) -> tm.isDataConnectionAllowed());
+        assertTrue(isDataConnectionAvailable);
+    }
+
+    @Test
+    public void testPolicyDataEnable() {
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            return;
+        }
+
+        ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(
+                mTelephonyManager,
+                (tm) -> tm.setDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_POLICY,
+                        false));
+
+        boolean isDataEnabledForReason = ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyManager, (tm) -> tm.isDataEnabledForReason(
+                        TelephonyManager.DATA_ENABLED_REASON_POLICY));
+        assertFalse(isDataEnabledForReason);
+
+        boolean isDataConnectionAvailable = ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyManager, (tm) -> tm.isDataConnectionAllowed());
+        assertFalse(isDataConnectionAvailable);
+
+        ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(
+                mTelephonyManager,
+                (tm) -> tm.setDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_POLICY,
+                        true));
+
+        isDataEnabledForReason = ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyManager, (tm) -> tm.isDataEnabledForReason(
+                        TelephonyManager.DATA_ENABLED_REASON_POLICY));
+        assertTrue(isDataEnabledForReason);
+
+        isDataConnectionAvailable = ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyManager, (tm) -> tm.isDataConnectionAllowed());
+        assertTrue(isDataConnectionAvailable);
+    }
+
+    @Test
+    public void testCarrierDataEnable() {
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            return;
+        }
+
+        ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(
+                mTelephonyManager,
+                (tm) -> tm.setDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_CARRIER,
+                        false));
+
+        waitForMs(100);
+        boolean isDataEnabledForReason = ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyManager, (tm) -> tm.isDataEnabledForReason(
+                        TelephonyManager.DATA_ENABLED_REASON_CARRIER));
+        assertFalse(isDataEnabledForReason);
+
+        boolean isDataConnectionAvailable = ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyManager, (tm) -> tm.isDataConnectionAllowed());
+        assertFalse(isDataConnectionAvailable);
+
+        ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(
+                mTelephonyManager,
+                (tm) -> tm.setDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_CARRIER,
+                        true));
+
+        waitForMs(100);
+        isDataEnabledForReason = ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyManager, (tm) -> tm.isDataEnabledForReason(
+                        TelephonyManager.DATA_ENABLED_REASON_CARRIER));
+        assertTrue(isDataEnabledForReason);
+        isDataConnectionAvailable = ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyManager, (tm) -> tm.isDataConnectionAllowed());
+        assertTrue(isDataConnectionAvailable);
+    }
+
+    @Test
+    public void testUserDataEnable() {
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            return;
+        }
+
+        ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(
+                mTelephonyManager,
+                (tm) -> tm.setDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_USER,
+                        false));
+
+        boolean isDataEnabledForReason = ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyManager, (tm) -> tm.isDataEnabledForReason(
+                        TelephonyManager.DATA_ENABLED_REASON_USER));
+        assertFalse(isDataEnabledForReason);
+
+        boolean isDataConnectionAvailable = ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyManager, (tm) -> tm.isDataConnectionAllowed());
+        assertFalse(isDataConnectionAvailable);
+
+        ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(
+                mTelephonyManager,
+                (tm) -> tm.setDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_USER,
+                        true));
+
+        isDataEnabledForReason = ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyManager, (tm) -> tm.isDataEnabledForReason(
+                        TelephonyManager.DATA_ENABLED_REASON_USER));
+        assertTrue(isDataEnabledForReason);
+        isDataConnectionAvailable = ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyManager, (tm) -> tm.isDataConnectionAllowed());
+        assertTrue(isDataConnectionAvailable);
+    }
+
+    private void disableNrDualConnectivity() {
+        ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(
+                mTelephonyManager,
+                (tm) -> tm.setNrDualConnectivityState(
+                        TelephonyManager.NR_DUAL_CONNECTIVITY_DISABLE));
+
+        boolean isNrDualConnectivityEnabled =
+                ShellIdentityUtils.invokeMethodWithShellPermissions(
+                        mTelephonyManager, (tm) -> tm.isNrDualConnectivityEnabled());
+        // Only verify the result for supported devices on IRadio 1.6+
+        if (mRadioVersion >= RADIO_HAL_VERSION_1_6) {
+            assertFalse(isNrDualConnectivityEnabled);
+        }
+    }
+
+    @Test
+    public void testNrDualConnectivityEnable() {
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            return;
+        }
+
+        boolean isInitiallyEnabled = ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyManager, (tm) -> tm.isNrDualConnectivityEnabled());
+        boolean isNrDualConnectivityEnabled;
+        if (isInitiallyEnabled) {
+            disableNrDualConnectivity();
+        }
+
+        ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(
+                mTelephonyManager,
+                (tm) -> tm.setNrDualConnectivityState(
+                        TelephonyManager.NR_DUAL_CONNECTIVITY_ENABLE));
+        isNrDualConnectivityEnabled = ShellIdentityUtils.invokeMethodWithShellPermissions(
+                mTelephonyManager, (tm) -> tm.isNrDualConnectivityEnabled());
+        // Only verify the result for supported devices on IRadio 1.6+
+        if (mRadioVersion >= RADIO_HAL_VERSION_1_6) {
+            assertTrue(isNrDualConnectivityEnabled);
+        }
+
+        if (!isInitiallyEnabled) {
+            disableNrDualConnectivity();
+        }
+    }
+
+    @Test
+    public void testGetCarrierBandwidth() {
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            return;
+        }
+        CarrierBandwidth bandwidth =
+                ShellIdentityUtils.invokeMethodWithShellPermissions(mTelephonyManager,
+                        (tm) -> tm.getCarrierBandwidth());
+        if (mRadioVersion >= RADIO_HAL_VERSION_1_6) {
+            assertTrue(bandwidth != null);
+            assertTrue(bandwidth.getPrimaryDownlinkCapacityKbps()
+                            != CarrierBandwidth.INVALID);
+            assertTrue(bandwidth.getPrimaryUplinkCapacityKbps()
+                            != CarrierBandwidth.INVALID);
+        }
     }
 
     /**
@@ -2855,6 +3245,18 @@
         return mTelephonyManager.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM;
     }
 
+    /**
+     * Verify that the phone is supporting the action of setForbiddenPlmn.
+     *
+     * @return whether to proceed the test
+     */
+    private boolean test() {
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            return false;
+        }
+        return mTelephonyManager.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM;
+    }
+
     private static int makeRadioVersion(int major, int minor) {
         if (major < 0 || minor < 0) return 0;
         return major * 100 + minor;
diff --git a/tests/tests/telephony/current/src/android/telephony/cts/TelephonyUtils.java b/tests/tests/telephony/current/src/android/telephony/cts/TelephonyUtils.java
index f389098..6b75746 100644
--- a/tests/tests/telephony/current/src/android/telephony/cts/TelephonyUtils.java
+++ b/tests/tests/telephony/current/src/android/telephony/cts/TelephonyUtils.java
@@ -25,6 +25,7 @@
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.nio.charset.StandardCharsets;
+import java.util.function.BooleanSupplier;
 
 public class TelephonyUtils {
     private static final String COMMAND_ADD_TEST_EMERGENCY_NUMBER =
@@ -100,4 +101,17 @@
             }
         }
     }
+
+
+    public static boolean pollUntilTrue(BooleanSupplier s, int times, int timeoutMs) {
+        boolean successful = false;
+        for (int i = 0; i < times; i++) {
+            successful = s.getAsBoolean();
+            if (successful) break;
+            try {
+                Thread.sleep(timeoutMs);
+            } catch (InterruptedException e) { }
+        }
+        return successful;
+    }
 }
diff --git a/tests/tests/telephony/current/src/android/telephony/embms/cts/MbmsDownloadSessionTest.java b/tests/tests/telephony/current/src/android/telephony/embms/cts/MbmsDownloadSessionTest.java
index ecb11ee..910050f 100644
--- a/tests/tests/telephony/current/src/android/telephony/embms/cts/MbmsDownloadSessionTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/embms/cts/MbmsDownloadSessionTest.java
@@ -29,11 +29,12 @@
 import android.telephony.mbms.FileServiceInfo;
 import android.telephony.mbms.MbmsErrors;
 
+import org.junit.Test;
+
 import java.io.File;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import org.junit.Test;
 
 public class MbmsDownloadSessionTest extends MbmsDownloadTestBase {
 
@@ -90,6 +91,15 @@
     }
 
     @Test
+    public void testAddServiceAnnouncementFile() throws Exception {
+        byte[] sampleAnnouncementFile = "<xml></xml>".getBytes();
+        mDownloadSession.addServiceAnnouncement(sampleAnnouncementFile);
+        List<Bundle> addServiceAnnouncementCalls =
+                getMiddlewareCalls(CtsDownloadService.METHOD_ADD_SERVICE_ANNOUNCEMENT);
+        assertEquals(1, addServiceAnnouncementCalls.size());
+    }
+
+    @Test
     public void testSetTempFileDirectory() throws Exception {
         String tempFileDirName = "CTSTestDir";
         File tempFileRootDirectory = new File(mContext.getFilesDir(), tempFileDirName);
@@ -233,4 +243,20 @@
         assertEquals(MbmsErrors.GeneralErrors.ERROR_MIDDLEWARE_TEMPORARILY_UNAVAILABLE,
                 mCallback.waitOnError().arg1);
     }
+
+    @Test
+    public void testMaxServiceAnnouncementSize() throws Exception {
+        byte[] sampleAnnouncementFile =
+                new byte[MbmsDownloadSession.getMaximumServiceAnnouncementSize() + 1];
+        Arrays.fill(sampleAnnouncementFile, (byte) 0b10101010);
+        try {
+            mDownloadSession.addServiceAnnouncement(sampleAnnouncementFile);
+            fail("Expected IllegalArgumentException due to size constraints");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+        List<Bundle> addServiceAnnouncementCalls =
+                getMiddlewareCalls(CtsDownloadService.METHOD_ADD_SERVICE_ANNOUNCEMENT);
+        assertEquals(0, addServiceAnnouncementCalls.size());
+    }
 }
diff --git a/tests/tests/telephony/current/src/android/telephony/euicc/cts/EuiccResolutionActivity.java b/tests/tests/telephony/current/src/android/telephony/euicc/cts/EuiccResolutionActivity.java
index 7a4ca2a..d06283d 100644
--- a/tests/tests/telephony/current/src/android/telephony/euicc/cts/EuiccResolutionActivity.java
+++ b/tests/tests/telephony/current/src/android/telephony/euicc/cts/EuiccResolutionActivity.java
@@ -21,7 +21,7 @@
 import android.telephony.euicc.EuiccManager;
 
 /**
- * A dummy activity which simulates a resolution activity. Returns {@link Activity#RESULT_OK} to
+ * A mock activity which simulates a resolution activity. Returns {@link Activity#RESULT_OK} to
  * caller if 1) {@link Activity#onResume()} is called (as proof that the activity has been
  * successfully started), and 2) the callback intent is verified.
  */
diff --git a/tests/tests/telephony/current/src/android/telephony/euicc/cts/EuiccTestResolutionActivity.java b/tests/tests/telephony/current/src/android/telephony/euicc/cts/EuiccTestResolutionActivity.java
index b15ab22..67b5116 100644
--- a/tests/tests/telephony/current/src/android/telephony/euicc/cts/EuiccTestResolutionActivity.java
+++ b/tests/tests/telephony/current/src/android/telephony/euicc/cts/EuiccTestResolutionActivity.java
@@ -25,7 +25,7 @@
 import android.telephony.euicc.EuiccManager;
 
 /**
- * A dummy activity started by {@link EuiccManagerTest#testStartResolutionActivity()} for testing
+ * A mock activity started by {@link EuiccManagerTest#testStartResolutionActivity()} for testing
  * {@link android.telephony.euicc.EuiccManager#startResolutionActivity(Activity, int, Intent,
  * PendingIntent)}. Sends {@link EuiccTestResolutionActivity#RESULT_CODE_TEST_PASSED} if the
  * resolution activity is successfully started, {@link
diff --git a/tests/tests/telephony/current/src/android/telephony/euicc/cts/MockEuiccService.java b/tests/tests/telephony/current/src/android/telephony/euicc/cts/MockEuiccService.java
index bfd1601..52dd47c 100644
--- a/tests/tests/telephony/current/src/android/telephony/euicc/cts/MockEuiccService.java
+++ b/tests/tests/telephony/current/src/android/telephony/euicc/cts/MockEuiccService.java
@@ -31,7 +31,7 @@
 
 import java.io.PrintWriter;
 
-/** Dummy implementation of {@link EuiccService} for testing. */
+/** Mock implementation of {@link EuiccService} for testing. */
 public class MockEuiccService extends EuiccService {
     static String MOCK_EID = "89000000000000000000000000000000";
     static String MOCK_OS_VERSION = "1.0";
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsCallProfileTest.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsCallProfileTest.java
index a35dfd7..302f293 100644
--- a/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsCallProfileTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsCallProfileTest.java
@@ -21,6 +21,7 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import android.net.Uri;
 import android.os.Bundle;
 import android.os.Parcel;
 import android.telecom.VideoProfile;
@@ -28,6 +29,8 @@
 import android.telephony.emergency.EmergencyNumber;
 import android.telephony.ims.ImsCallProfile;
 import android.telephony.ims.ImsStreamMediaProfile;
+import android.telephony.ims.RtpHeaderExtensionType;
+import android.util.ArraySet;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
@@ -36,9 +39,14 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
 
 @RunWith(AndroidJUnit4.class)
 public class ImsCallProfileTest {
+    private static final RtpHeaderExtensionType EXTENSION_TYPE_1 = new RtpHeaderExtensionType(1,
+            Uri.parse("http://developer.android.com/092020/test1"));
+    private static final RtpHeaderExtensionType EXTENSION_TYPE_2 = new RtpHeaderExtensionType(2,
+            Uri.parse("http://developer.android.com/092020/test2"));
 
     @Test
     public void testParcelUnparcel() {
@@ -338,4 +346,27 @@
                 data.getCallExtraInt(ImsCallProfile.EXTRA_CALL_NETWORK_TYPE),
                 unparceledData.getCallExtraInt(ImsCallProfile.EXTRA_CALL_NETWORK_TYPE));
     }
+
+    /**
+     * Verifies basic RTP header extension type parcelling in the {@link ImsCallProfile} class.
+     */
+    @Test
+    public void testParcelUnparcelRtpHeaderExtensionTypes() {
+        ImsCallProfile data = new ImsCallProfile(ImsCallProfile.SERVICE_TYPE_NORMAL,
+                ImsCallProfile.CALL_TYPE_VOICE_N_VIDEO, new Bundle(),
+                new ImsStreamMediaProfile(1, 1, 1, 1, 1));
+        Set<RtpHeaderExtensionType> accepted = new ArraySet<>();
+        accepted.add(EXTENSION_TYPE_1);
+        data.setAcceptedRtpHeaderExtensionTypes(accepted);
+        assertEquals(accepted, data.getAcceptedRtpHeaderExtensionTypes());
+
+        Parcel dataParceled = Parcel.obtain();
+        data.writeToParcel(dataParceled, 0);
+        dataParceled.setDataPosition(0);
+        ImsCallProfile unparceledData =
+                ImsCallProfile.CREATOR.createFromParcel(dataParceled);
+        dataParceled.recycle();
+
+        assertEquals(accepted, unparceledData.getAcceptedRtpHeaderExtensionTypes());
+    }
 }
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsServiceConnector.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsServiceConnector.java
index dcc0f9a..d5ec9e0 100644
--- a/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsServiceConnector.java
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsServiceConnector.java
@@ -28,7 +28,9 @@
 import android.telephony.cts.externalimsservice.TestExternalImsService;
 import android.telephony.ims.feature.ImsFeature;
 import android.telephony.ims.stub.ImsFeatureConfiguration;
+import android.text.TextUtils;
 import android.util.Log;
+import android.util.SparseArray;
 
 import androidx.test.platform.app.InstrumentationRegistry;
 
@@ -113,6 +115,7 @@
         private String mOrigSmsPackage;
         private int mConnectionType;
         private int mSlotId;
+        private SparseArray<String> mFeatureTypeToPackageOverrideMap = new SparseArray<>(2);
         Connection(int connectionType, int slotId) {
             mConnectionType = connectionType;
             mSlotId = slotId;
@@ -183,16 +186,49 @@
             }
         }
 
-        private void storeOriginalPackage() throws Exception {
+        /**
+         * @return true if the configuration set here still exists in telephony or false if it was
+         * changed (due to something like a Phone process crash).
+         */
+        boolean checkConfigurationExists() throws Exception {
+            boolean result = true;
+            String mmTelPackage = mFeatureTypeToPackageOverrideMap.get(ImsFeature.FEATURE_MMTEL);
+            String rcsPackage = mFeatureTypeToPackageOverrideMap.get(ImsFeature.FEATURE_RCS);
             switch (mConnectionType) {
                 case CONNECTION_TYPE_IMS_SERVICE_CARRIER: {
-                    mOrigMmTelServicePackage = getOriginalMmTelCarrierService();
-                    mOrigRcsServicePackage = getOriginalRcsCarrierService();
+                    result &= isPackageTheSame(mmTelPackage, getMmTelCarrierService());
+                    result &= isPackageTheSame(rcsPackage, getRcsCarrierService());
                     break;
                 }
                 case CONNECTION_TYPE_IMS_SERVICE_DEVICE: {
-                    mOrigMmTelServicePackage = getOriginalMmTelDeviceService();
-                    mOrigRcsServicePackage = getOriginalRcsDeviceService();
+                    result &= isPackageTheSame(mmTelPackage, getMmTelDeviceService());
+                    result &= isPackageTheSame(rcsPackage, getRcsDeviceService());
+                    break;
+                }
+                case CONNECTION_TYPE_DEFAULT_SMS_APP: {
+                    break;
+                }
+            }
+            return result;
+        }
+
+        private boolean isPackageTheSame(String pkgA, String pkgB) {
+            if (TextUtils.isEmpty(pkgA) && TextUtils.isEmpty(pkgB)) {
+                return true;
+            }
+            return TextUtils.equals(pkgA, pkgB);
+        }
+
+        private void storeOriginalPackage() throws Exception {
+            switch (mConnectionType) {
+                case CONNECTION_TYPE_IMS_SERVICE_CARRIER: {
+                    mOrigMmTelServicePackage = getMmTelCarrierService();
+                    mOrigRcsServicePackage = getRcsCarrierService();
+                    break;
+                }
+                case CONNECTION_TYPE_IMS_SERVICE_DEVICE: {
+                    mOrigMmTelServicePackage = getMmTelDeviceService();
+                    mOrigRcsServicePackage = getRcsDeviceService();
                     break;
                 }
                 case CONNECTION_TYPE_DEFAULT_SMS_APP: {
@@ -203,6 +239,8 @@
         }
 
         private boolean setDeviceImsService(String packageName) throws Exception {
+            mFeatureTypeToPackageOverrideMap.put(ImsFeature.FEATURE_MMTEL, packageName);
+            mFeatureTypeToPackageOverrideMap.put(ImsFeature.FEATURE_RCS, packageName);
             String result = TelephonyUtils.executeShellCommand(mInstrumentation,
                     constructSetImsServiceOverrideCommand(false, packageName, new int[] {
                             ImsFeature.FEATURE_MMTEL, ImsFeature.FEATURE_RCS}));
@@ -213,6 +251,8 @@
         }
 
         private boolean setCarrierImsService(String packageName) throws Exception {
+            mFeatureTypeToPackageOverrideMap.put(ImsFeature.FEATURE_MMTEL, packageName);
+            mFeatureTypeToPackageOverrideMap.put(ImsFeature.FEATURE_RCS, packageName);
             String result = TelephonyUtils.executeShellCommand(mInstrumentation,
                     constructSetImsServiceOverrideCommand(true, packageName, new int[] {
                             ImsFeature.FEATURE_MMTEL, ImsFeature.FEATURE_RCS}));
@@ -223,6 +263,7 @@
         }
 
         private boolean setDeviceImsService(String packageName, int featureType) throws Exception {
+            mFeatureTypeToPackageOverrideMap.put(featureType, packageName);
             String result = TelephonyUtils.executeShellCommand(mInstrumentation,
                     constructSetImsServiceOverrideCommand(false, packageName,
                             new int[]{featureType}));
@@ -233,6 +274,7 @@
         }
 
         private boolean setCarrierImsService(String packageName, int featureType) throws Exception {
+            mFeatureTypeToPackageOverrideMap.put(featureType, packageName);
             String result = TelephonyUtils.executeShellCommand(mInstrumentation,
                     constructSetImsServiceOverrideCommand(true, packageName,
                             new int[]{featureType}));
@@ -284,38 +326,38 @@
                     TestImsService.LATCH_FEATURES_READY);
         }
 
-        private String getOriginalMmTelCarrierService() throws Exception {
+        private String getMmTelCarrierService() throws Exception {
             String result = TelephonyUtils.executeShellCommand(mInstrumentation,
                     constructGetImsServiceCommand(true, ImsFeature.FEATURE_MMTEL));
             if (ImsUtils.VDBG) {
-                Log.d(TAG, "getOriginalMmTelCarrierService result: " + result);
+                Log.d(TAG, "getMmTelCarrierService result: " + result);
             }
             return result;
         }
 
-        private String getOriginalRcsCarrierService() throws Exception {
+        private String getRcsCarrierService() throws Exception {
             String result = TelephonyUtils.executeShellCommand(mInstrumentation,
                     constructGetImsServiceCommand(true, ImsFeature.FEATURE_RCS));
             if (ImsUtils.VDBG) {
-                Log.d(TAG, "getOriginalRcsCarrierService result: " + result);
+                Log.d(TAG, "getRcsCarrierService result: " + result);
             }
             return result;
         }
 
-        private String getOriginalMmTelDeviceService() throws Exception {
+        private String getMmTelDeviceService() throws Exception {
             String result = TelephonyUtils.executeShellCommand(mInstrumentation,
                     constructGetImsServiceCommand(false, ImsFeature.FEATURE_MMTEL));
             if (ImsUtils.VDBG) {
-                Log.d(TAG, "getOriginalMmTelDeviceService result: " + result);
+                Log.d(TAG, "getMmTelDeviceService result: " + result);
             }
             return result;
         }
 
-        private String getOriginalRcsDeviceService() throws Exception {
+        private String getRcsDeviceService() throws Exception {
             String result = TelephonyUtils.executeShellCommand(mInstrumentation,
                     constructGetImsServiceCommand(false, ImsFeature.FEATURE_RCS));
             if (ImsUtils.VDBG) {
-                Log.d(TAG, "getOriginalRcsDeviceService result: " + result);
+                Log.d(TAG, "getRcsDeviceService result: " + result);
             }
             return result;
         }
@@ -380,15 +422,34 @@
         // No need to clear SMS App, only replace when necessary.
     }
 
-    boolean connectCarrierImsService(ImsFeatureConfiguration config) throws Exception {
+    /**
+     * Binds to the local implementation of ImsService but does not trigger ImsService bind from
+     * telephony to allow additional configuration steps.
+     * @return true if this request succeeded, false otherwise.
+     */
+    boolean connectCarrierImsServiceLocally() {
         if (!setupLocalCarrierImsService()) {
             Log.w(TAG, "connectCarrierImsService: couldn't set up service.");
             return false;
         }
         mCarrierService.resetState();
+        return true;
+    }
+
+    /**
+     * Trigger the telephony framework to bind to the local ImsService implementation.
+     * @return true if this request succeeded, false otherwise.
+     */
+    boolean triggerFrameworkConnectionToCarrierImsService(
+            ImsFeatureConfiguration config) throws Exception {
         return mCarrierServiceConnection.overrideService(config);
     }
 
+    boolean connectCarrierImsService(ImsFeatureConfiguration config) throws Exception {
+        if (!connectCarrierImsServiceLocally()) return false;
+        return triggerFrameworkConnectionToCarrierImsService(config);
+    }
+
     boolean connectDeviceImsService(ImsFeatureConfiguration config) throws Exception {
         if (!setupExternalImsService()) {
             Log.w(TAG, "connectDeviceImsService: couldn't set up service.");
@@ -410,6 +471,10 @@
         mDeviceServiceConnection.clearPackage();
     }
 
+    boolean isCarrierServiceStillConfigured() throws Exception {
+        return mCarrierServiceConnection.checkConfigurationExists();
+    }
+
     private boolean setupLocalCarrierImsService() {
         if (mCarrierService != null) {
             return true;
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsServiceTest.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsServiceTest.java
index 2c24f18..8005d0d 100644
--- a/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsServiceTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsServiceTest.java
@@ -46,6 +46,7 @@
 import android.telephony.ims.ImsRcsManager;
 import android.telephony.ims.ImsReasonInfo;
 import android.telephony.ims.ProvisioningManager;
+import android.telephony.ims.RcsUceAdapter;
 import android.telephony.ims.RegistrationManager;
 import android.telephony.ims.feature.ImsFeature;
 import android.telephony.ims.feature.MmTelFeature;
@@ -196,7 +197,7 @@
         if (tm.getSimState(sTestSlot) != TelephonyManager.SIM_STATE_READY) {
             fail("This test requires that there is a SIM in the device!");
         }
-        // Sanity check: ensure that the subscription hasn't changed between tests.
+        // Correctness check: ensure that the subscription hasn't changed between tests.
         int[] subs = SubscriptionManager.getSubId(sTestSlot);
 
         if (subs == null) {
@@ -343,6 +344,31 @@
     }
 
     @Test
+    public void testCarrierImsServiceBindNullRcsFeature() throws Exception {
+        if (!ImsUtils.shouldTestImsService()) {
+            return;
+        }
+        // Connect to the ImsService with the RCS feature.
+        ImsFeatureConfiguration config = new ImsFeatureConfiguration.Builder()
+                .addFeature(sTestSlot, ImsFeature.FEATURE_RCS)
+                .build();
+        assertTrue(sServiceConnector.connectCarrierImsServiceLocally());
+        sServiceConnector.getCarrierService().resetState();
+        sServiceConnector.getCarrierService().setNullRcsBinding();
+        assertTrue(sServiceConnector.triggerFrameworkConnectionToCarrierImsService(config));
+
+        // The RcsFeature is created when the ImsService is bound. If it wasn't created, then the
+        // Framework did not call it.
+        assertTrue(sServiceConnector.getCarrierService().waitForLatchCountdown(
+                TestImsService.LATCH_CREATE_RCS));
+        // Check to see if telephony state was reset at some point due to a crash and fail if so
+        assertFalse("ImsService should not crash if there is a null ImsFeature returned",
+                ImsUtils.retryUntilTrue(() ->
+                        !sServiceConnector.isCarrierServiceStillConfigured(),
+                5000 /*test timeout*/, 5 /*num times*/));
+    }
+
+    @Test
     public void testDeviceImsServiceBindRcsFeature() throws Exception {
         if (!ImsUtils.shouldTestImsService()) {
             return;
@@ -1356,10 +1382,11 @@
         }
 
         // A queue to receive capability changed
-        LinkedBlockingQueue<RcsImsCapabilities> mQueue = new LinkedBlockingQueue<>();
+        LinkedBlockingQueue<Integer> mQueue = new LinkedBlockingQueue<>();
         ImsRcsManager.AvailabilityCallback callback = new ImsRcsManager.AvailabilityCallback() {
             @Override
-            public void onAvailabilityChanged(RcsImsCapabilities capabilities) {
+            public void onAvailabilityChanged(
+                    @RcsUceAdapter.RcsImsCapabilityFlag int capabilities) {
                 mQueue.offer(capabilities);
             }
         };
@@ -1373,11 +1400,12 @@
         }
 
         // We should not have any availabilities here, we notified the framework earlier.
-        RcsImsCapabilities capCb = waitForResult(mQueue);
+        //RcsImsCapabilities capCb = waitForResult(mQueue);
+        int capCb = waitForResult(mQueue);
 
         // The SIP OPTIONS capability from onAvailabilityChanged should be disabled.
         // Moreover, ImsRcsManager#isAvailable also return FALSE with SIP OPTIONS
-        assertTrue(capCb.isCapable(RCS_CAP_NONE));
+        assertEquals(capCb, RCS_CAP_NONE);
         try {
             automan.adoptShellPermissionIdentity();
             assertFalse(imsRcsManager.isAvailable(RCS_CAP_OPTIONS));
@@ -1393,7 +1421,7 @@
 
         // The SIP OPTIONS capability from onAvailabilityChanged should be enabled.
         // Verify ImsRcsManager#isAvailable also return true with SIP OPTIONS
-        assertTrue(capCb.isCapable(RCS_CAP_OPTIONS));
+        assertEquals(capCb, RCS_CAP_OPTIONS);
         try {
             automan.adoptShellPermissionIdentity();
             assertTrue(imsRcsManager.isAvailable(RCS_CAP_OPTIONS));
@@ -1634,6 +1662,8 @@
                     ProvisioningManager.KEY_MULTIENDPOINT_ENABLED, 0);
             verifyIntKey(provisioningManager, mIntQueue,
                     ProvisioningManager.KEY_RTT_ENABLED, 0);
+            verifyStringKey(provisioningManager, mStringQueue,
+                    ProvisioningManager.KEY_VOICE_OVER_WIFI_ENTITLEMENT_ID, "carrier_spec");
 
             automan.adoptShellPermissionIdentity();
             provisioningManager.unregisterProvisioningChangedCallback(callback);
@@ -1686,6 +1716,45 @@
         overrideCarrierConfig(null);
     }
 
+    @Test
+    public void testProvisioningManagerRcsProvisioningCaps() throws Exception {
+        if (!ImsUtils.shouldTestImsService()) {
+            return;
+        }
+
+        triggerFrameworkConnectToCarrierImsService();
+
+        PersistableBundle bundle = new PersistableBundle();
+        bundle.putBoolean(CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL, true);
+        bundle.putBoolean(CarrierConfigManager.KEY_CARRIER_RCS_PROVISIONING_REQUIRED_BOOL, true);
+        overrideCarrierConfig(bundle);
+
+        ProvisioningManager provisioningManager =
+                ProvisioningManager.createForSubscriptionId(sTestSub);
+
+        final UiAutomation automan = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+        try {
+            automan.adoptShellPermissionIdentity();
+            boolean provisioningStatus = provisioningManager.getRcsProvisioningStatusForCapability(
+                    RCS_CAP_PRESENCE);
+            provisioningManager.setRcsProvisioningStatusForCapability(RCS_CAP_PRESENCE,
+                    !provisioningStatus);
+            // Make sure the change in provisioning status is correctly returned.
+            assertEquals(!provisioningStatus,
+                    provisioningManager.getRcsProvisioningStatusForCapability(RCS_CAP_PRESENCE));
+            // TODO: Enhance test to make sure the provisioning change is also sent to the
+            // ImsService
+
+            // set back to current status
+            provisioningManager.setRcsProvisioningStatusForCapability(RCS_CAP_PRESENCE,
+                    provisioningStatus);
+        } finally {
+            automan.dropShellPermissionIdentity();
+        }
+
+        overrideCarrierConfig(null);
+    }
+
     private void verifyIntKey(ProvisioningManager pm,
             LinkedBlockingQueue<Pair<Integer, Integer>> intQueue, int key, int value)
             throws Exception {
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsStreamMediaProfileTest.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsStreamMediaProfileTest.java
index 2fe2307..994db22 100644
--- a/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsStreamMediaProfileTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsStreamMediaProfileTest.java
@@ -18,10 +18,13 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import android.os.Parcel;
+import android.telephony.ims.AudioCodecAttributes;
 import android.telephony.ims.ImsStreamMediaProfile;
+import android.util.Range;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
@@ -50,6 +53,45 @@
         assertEquals(data.getRttMode(), unparceledData.getRttMode());
         assertEquals(data.getVideoDirection(), unparceledData.getVideoDirection());
         assertEquals(data.getVideoQuality(), unparceledData.getVideoQuality());
+
+        assertNull(unparceledData.getAudioCodecAttributes());
+    }
+
+    @Test
+    public void testParcelUnparcelForAudioCodecAttributes() {
+        if (!ImsUtils.shouldTestImsService()) {
+            return;
+        }
+        ImsStreamMediaProfile data = new ImsStreamMediaProfile(
+                ImsStreamMediaProfile.AUDIO_QUALITY_AMR_WB,
+                ImsStreamMediaProfile.DIRECTION_SEND_RECEIVE,
+                ImsStreamMediaProfile.VIDEO_QUALITY_QCIF,
+                ImsStreamMediaProfile.DIRECTION_RECEIVE,
+                ImsStreamMediaProfile.RTT_MODE_FULL);
+        data.setAudioCodecAttributes(
+                new AudioCodecAttributes(5.0f, new Range<Float>(1.0f, 10.0f), 15.0f,
+                        new Range<Float>(10.0f, 20.0f)));
+
+        ImsStreamMediaProfile unparceledData = (ImsStreamMediaProfile) parcelUnparcel(data);
+
+        assertEquals(data.getAudioDirection(), unparceledData.getAudioDirection());
+        assertEquals(data.getAudioQuality(), unparceledData.getAudioQuality());
+        assertEquals(data.getRttMode(), unparceledData.getRttMode());
+        assertEquals(data.getVideoDirection(), unparceledData.getVideoDirection());
+        assertEquals(data.getVideoQuality(), unparceledData.getVideoQuality());
+
+        assertEquals(data.getAudioCodecAttributes().getBitrateKbps(),
+                unparceledData.getAudioCodecAttributes().getBitrateKbps(), 0.1);
+        assertEquals(data.getAudioCodecAttributes().getBitrateRangeKbps().getLower(),
+                unparceledData.getAudioCodecAttributes().getBitrateRangeKbps().getLower(), 0.1);
+        assertEquals(data.getAudioCodecAttributes().getBitrateRangeKbps().getUpper(),
+                unparceledData.getAudioCodecAttributes().getBitrateRangeKbps().getUpper(), 0.1);
+        assertEquals(data.getAudioCodecAttributes().getBandwidthKhz(),
+                unparceledData.getAudioCodecAttributes().getBandwidthKhz(), 0.1);
+        assertEquals(data.getAudioCodecAttributes().getBandwidthRangeKhz().getLower(),
+                unparceledData.getAudioCodecAttributes().getBandwidthRangeKhz().getLower(), 0.1);
+        assertEquals(data.getAudioCodecAttributes().getBandwidthRangeKhz().getUpper(),
+                unparceledData.getAudioCodecAttributes().getBandwidthRangeKhz().getUpper(), 0.1);
     }
 
     @Test
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsUtils.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsUtils.java
index 50ae5b7..2c09de8 100644
--- a/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsUtils.java
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/ImsUtils.java
@@ -44,6 +44,12 @@
     // Id for compressed auto configuration xml.
     public static final int ITEM_COMPRESSED = 2001;
 
+    public static boolean shouldTestTelephony() {
+        final PackageManager pm = InstrumentationRegistry.getInstrumentation().getContext()
+                .getPackageManager();
+        return pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
+    }
+
     public static boolean shouldTestImsService() {
         final PackageManager pm = InstrumentationRegistry.getInstrumentation().getContext()
                 .getPackageManager();
@@ -120,8 +126,18 @@
      * Retry every 5 seconds until the condition is true or fail after TEST_TIMEOUT_MS seconds.
      */
     public static boolean retryUntilTrue(Callable<Boolean> condition) throws Exception {
+        return retryUntilTrue(condition, TEST_TIMEOUT_MS, 14 /*numTries*/);
+    }
+
+    /**
+     * Retry every timeoutMs/numTimes until the condition is true or fail if the condition is never
+     * met.
+     */
+    public static boolean retryUntilTrue(Callable<Boolean> condition,
+            int timeoutMs, int numTimes) throws Exception {
+        int sleepTime = timeoutMs / numTimes;
         int retryCounter = 0;
-        while (retryCounter < (TEST_TIMEOUT_MS / 5000)) {
+        while (retryCounter < numTimes) {
             try {
                 Boolean isSuccessful = condition.call();
                 isSuccessful = (isSuccessful == null) ? false : isSuccessful;
@@ -129,7 +145,7 @@
             } catch (Exception e) {
                 // we will retry
             }
-            Thread.sleep(5000);
+            Thread.sleep(sleepTime);
             retryCounter++;
         }
         return false;
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/RcsContactUceCapabilityTest.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/RcsContactUceCapabilityTest.java
index 2eb16cd..5e8616c 100644
--- a/tests/tests/telephony/current/src/android/telephony/ims/cts/RcsContactUceCapabilityTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/RcsContactUceCapabilityTest.java
@@ -21,7 +21,10 @@
 
 import android.net.Uri;
 import android.os.Parcel;
+import android.telephony.ims.RcsContactPresenceTuple;
+import android.telephony.ims.RcsContactPresenceTuple.ServiceCapabilities;
 import android.telephony.ims.RcsContactUceCapability;
+import android.telephony.ims.RcsContactUceCapability.PresenceBuilder;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
@@ -35,9 +38,6 @@
 public class RcsContactUceCapabilityTest {
 
     private static final Uri TEST_CONTACT = Uri.fromParts("sip", "me.test", null);
-    private static final Uri TEST_VT_CONTACT = Uri.fromParts("sip", "contact.test", null);
-    private static final String TEST_EXTENSION_TAG = "+g.3gpp.iari-ref=\"urn%3Aurn-7%3A3gpp"
-            + "-application.ims.iari.rcs.mnc000.mcc000.testService\"";
 
     @Test
     @Ignore("RCS APIs not public yet")
@@ -46,11 +46,29 @@
             return;
         }
 
-        RcsContactUceCapability.Builder builder = new RcsContactUceCapability.Builder(TEST_CONTACT);
-        builder.add(RcsContactUceCapability.CAPABILITY_IP_VIDEO_CALL, TEST_VT_CONTACT);
-        builder.add(RcsContactUceCapability.CAPABILITY_IP_VOICE_CALL);
-        builder.add(TEST_EXTENSION_TAG);
-        RcsContactUceCapability testCapability = builder.build();
+        final boolean isAudioCapable = true;
+        final boolean isVideoCapable = true;
+        final String serviceVersion = "1.0";
+        final String serviceDescription = "service description test";
+
+        // Create the test capability
+        ServiceCapabilities.Builder servCapsBuilder = new ServiceCapabilities.Builder(
+                isAudioCapable, isVideoCapable);
+        servCapsBuilder.addSupportedDuplexMode(ServiceCapabilities.DUPLEX_MODE_FULL);
+
+        RcsContactPresenceTuple.Builder tupleBuilder = new RcsContactPresenceTuple.Builder(
+                RcsContactPresenceTuple.TUPLE_BASIC_STATUS_OPEN,
+                RcsContactPresenceTuple.SERVICE_ID_MMTEL, serviceVersion);
+        tupleBuilder.addContactUri(TEST_CONTACT)
+                .addDescription(serviceDescription)
+                .addServiceCapabilities(servCapsBuilder.build());
+
+        PresenceBuilder presenceBuilder = new PresenceBuilder(TEST_CONTACT,
+                RcsContactUceCapability.SOURCE_TYPE_CACHED,
+                RcsContactUceCapability.REQUEST_RESULT_FOUND);
+        presenceBuilder.addCapabilityTuple(tupleBuilder.build());
+
+        RcsContactUceCapability testCapability = presenceBuilder.build();
 
         // parcel and unparcel
         Parcel infoParceled = Parcel.obtain();
@@ -60,18 +78,35 @@
                 RcsContactUceCapability.CREATOR.createFromParcel(infoParceled);
         infoParceled.recycle();
 
-        assertTrue(unparceledCapability.isCapable(
-                RcsContactUceCapability.CAPABILITY_IP_VOICE_CALL));
-        assertTrue(unparceledCapability.isCapable(
-                RcsContactUceCapability.CAPABILITY_IP_VIDEO_CALL));
-        assertEquals(TEST_VT_CONTACT, unparceledCapability.getServiceUri(
-                RcsContactUceCapability.CAPABILITY_IP_VIDEO_CALL));
-        assertEquals(TEST_CONTACT, unparceledCapability.getServiceUri(
-                RcsContactUceCapability.CAPABILITY_IP_VOICE_CALL));
-        assertEquals(TEST_CONTACT, unparceledCapability.getContactUri());
+        boolean unparceledVolteCapable = false;
+        boolean unparceledVtCapable = false;
+        String unparceledTupleStatus = RcsContactPresenceTuple.TUPLE_BASIC_STATUS_CLOSED;
+        String unparceledDuplexMode = ServiceCapabilities.DUPLEX_MODE_RECEIVE_ONLY;
 
-        List<String> extensions = unparceledCapability.getCapableExtensionTags();
-        assertEquals(1, extensions.size());
-        assertEquals(TEST_EXTENSION_TAG, extensions.get(0));
+        RcsContactPresenceTuple unparceledTuple =
+                unparceledCapability.getPresenceTuple(RcsContactPresenceTuple.SERVICE_ID_MMTEL);
+
+        if (unparceledTuple != null) {
+            unparceledTupleStatus = unparceledTuple.getStatus();
+
+            ServiceCapabilities serviceCaps = unparceledTuple.getServiceCapabilities();
+            if (serviceCaps != null) {
+                unparceledVolteCapable = serviceCaps.isAudioCapable();
+                unparceledVtCapable = serviceCaps.isVideoCapable();
+                List<String> duplexModes = serviceCaps.getSupportedDuplexModes();
+                if (duplexModes != null && !duplexModes.isEmpty()) {
+                    unparceledDuplexMode = duplexModes.get(0);
+                }
+            }
+        }
+
+        assertEquals(TEST_CONTACT, unparceledCapability.getContactUri());
+        assertTrue(unparceledVolteCapable);
+        assertTrue(unparceledVtCapable);
+        assertEquals(RcsContactPresenceTuple.TUPLE_BASIC_STATUS_OPEN, unparceledTupleStatus);
+        assertEquals(ServiceCapabilities.DUPLEX_MODE_FULL, unparceledDuplexMode);
+        assertEquals(RcsContactPresenceTuple.SERVICE_ID_MMTEL, unparceledTuple.getServiceId());
+        assertEquals(serviceVersion, unparceledTuple.getServiceVersion());
+        assertEquals(serviceDescription, unparceledTuple.getServiceDescription());
     }
 }
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/RcsUceAdapterTest.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/RcsUceAdapterTest.java
index a1816d8..dc4045c 100644
--- a/tests/tests/telephony/current/src/android/telephony/ims/cts/RcsUceAdapterTest.java
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/RcsUceAdapterTest.java
@@ -38,6 +38,7 @@
 import android.telephony.ims.ImsException;
 import android.telephony.ims.ImsManager;
 import android.telephony.ims.ImsRcsManager;
+import android.telephony.ims.RcsContactUceCapability;
 import android.telephony.ims.RcsUceAdapter;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -250,7 +251,15 @@
         // requestCapabilities
         try {
             uceAdapter.requestCapabilities(Runnable::run, numbers,
-                    new RcsUceAdapter.CapabilitiesCallback() {});
+                    new RcsUceAdapter.CapabilitiesCallback() {
+                        @Override
+                        public void onCapabilitiesReceived(
+                                List<RcsContactUceCapability> capabilities) {}
+                        @Override
+                        public void onComplete() {}
+                        @Override
+                        public void onError(int errorCode) {}
+                    });
             fail("requestCapabilities should require READ_PRIVILEGED_PHONE_STATE.");
         } catch (SecurityException e) {
             //expected
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/RtpHeaderExtensionTest.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/RtpHeaderExtensionTest.java
new file mode 100644
index 0000000..01ce64e
--- /dev/null
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/RtpHeaderExtensionTest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2020 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.telephony.ims.cts;
+
+import static junit.framework.Assert.assertEquals;
+
+import android.os.Parcel;
+import android.telephony.ims.RtpHeaderExtension;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class RtpHeaderExtensionTest {
+    @Test
+    public void testParceling() {
+        byte[] testBytes = new byte[1];
+        testBytes[0] = 5;
+        RtpHeaderExtension extension = new RtpHeaderExtension(1, testBytes);
+        assertEquals(1, extension.getLocalIdentifier());
+        assertEquals(5, extension.getExtensionData()[0]);
+
+        Parcel dataParceled = Parcel.obtain();
+        extension.writeToParcel(dataParceled, 0);
+        dataParceled.setDataPosition(0);
+        RtpHeaderExtension unparceledData =
+                RtpHeaderExtension.CREATOR.createFromParcel(dataParceled);
+        dataParceled.recycle();
+
+        assertEquals(extension.getLocalIdentifier(), unparceledData.getLocalIdentifier());
+        assertEquals(extension.getExtensionData()[0], unparceledData.getExtensionData()[0]);
+        assertEquals(extension, unparceledData);
+    }
+}
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/RtpHeaderExtensionTypeTest.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/RtpHeaderExtensionTypeTest.java
new file mode 100644
index 0000000..e34e9ab
--- /dev/null
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/RtpHeaderExtensionTypeTest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2020 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.telephony.ims.cts;
+
+import static junit.framework.Assert.assertEquals;
+
+import android.net.Uri;
+import android.os.Parcel;
+import android.telephony.ims.RtpHeaderExtensionType;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class RtpHeaderExtensionTypeTest {
+    private static final int TEST_ID = 1;
+    private static final Uri TEST_URI = Uri.parse("http://developer.android.com/092020/test1");
+
+    @Test
+    public void testParceling() {
+        RtpHeaderExtensionType test = new RtpHeaderExtensionType(TEST_ID, TEST_URI);
+        assertEquals(TEST_ID,  test.getLocalIdentifier());
+        assertEquals(TEST_URI, test.getUri());
+
+        Parcel dataParceled = Parcel.obtain();
+        test.writeToParcel(dataParceled, 0);
+        dataParceled.setDataPosition(0);
+        RtpHeaderExtensionType unparceledData =
+                RtpHeaderExtensionType.CREATOR.createFromParcel(dataParceled);
+        dataParceled.recycle();
+
+        assertEquals(test, unparceledData);
+    }
+}
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/SipDelegateManagerTest.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/SipDelegateManagerTest.java
new file mode 100644
index 0000000..cb02a0c
--- /dev/null
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/SipDelegateManagerTest.java
@@ -0,0 +1,456 @@
+/*
+ * Copyright (C) 2020 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.telephony.ims.cts;
+
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertTrue;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.fail;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.PersistableBundle;
+import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.telephony.ims.ImsException;
+import android.telephony.ims.ImsManager;
+import android.telephony.ims.ImsService;
+import android.telephony.ims.SipDelegateManager;
+import android.telephony.ims.feature.ImsFeature;
+import android.telephony.ims.stub.ImsFeatureConfiguration;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.compatibility.common.util.ShellIdentityUtils;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * CTS tests for {@link SipDelegateManager} API.
+ */
+@RunWith(AndroidJUnit4.class)
+public class SipDelegateManagerTest {
+
+    private static int sTestSlot = 0;
+    private static int sTestSub = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+    private static ImsServiceConnector sServiceConnector;
+    private static CarrierConfigReceiver sReceiver;
+
+    private static class CarrierConfigReceiver extends BroadcastReceiver {
+        private CountDownLatch mLatch = new CountDownLatch(1);
+        private final int mSubId;
+
+        CarrierConfigReceiver(int subId) {
+            mSubId = subId;
+        }
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED.equals(intent.getAction())) {
+                int subId = intent.getIntExtra(CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX, -1);
+                if (mSubId == subId) {
+                    mLatch.countDown();
+                }
+            }
+        }
+
+        void clearQueue() {
+            mLatch = new CountDownLatch(1);
+        }
+
+        void waitForCarrierConfigChanged() throws Exception {
+            mLatch.await(5000, TimeUnit.MILLISECONDS);
+        }
+    }
+
+    @BeforeClass
+    public static void beforeAllTests() throws Exception {
+        // First, only populate test slot/sub
+        if (!ImsUtils.shouldTestTelephony()) {
+            return;
+        }
+
+        TelephonyManager tm = (TelephonyManager) getContext()
+                .getSystemService(Context.TELEPHONY_SERVICE);
+        sTestSub = ImsUtils.getPreferredActiveSubId();
+        sTestSlot = SubscriptionManager.getSlotIndex(sTestSub);
+        if (tm.getSimState(sTestSlot) != TelephonyManager.SIM_STATE_READY) {
+            return;
+        }
+        // Next, only start tests that require ImsResolver to bind to test ImsService if
+        // feature FEATURE_TELEPHONY_IMS is supported on this device.
+        if (!ImsUtils.shouldTestImsService()) {
+            return;
+        }
+        sServiceConnector = new ImsServiceConnector(InstrumentationRegistry.getInstrumentation());
+        // Remove all live ImsServices until after these tests are done
+        sServiceConnector.clearAllActiveImsServices(sTestSlot);
+
+        sReceiver = new CarrierConfigReceiver(sTestSub);
+        IntentFilter filter = new IntentFilter(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
+        // ACTION_CARRIER_CONFIG_CHANGED is sticky, so we will get a callback right away.
+        InstrumentationRegistry.getInstrumentation().getContext()
+                .registerReceiver(sReceiver, filter);
+    }
+
+    @AfterClass
+    public static void afterAllTests() throws Exception {
+        // Only clean up ImsResolver overrides if feature FEATURE_TELEPHONY_IMS is supported.
+        if (!ImsUtils.shouldTestImsService()) {
+            return;
+        }
+
+        // Restore all ImsService configurations that existed before the test.
+        if (sServiceConnector != null) {
+            sServiceConnector.disconnectServices();
+        }
+        sServiceConnector = null;
+
+        // Ensure there are no CarrierConfig overrides as well as reset the ImsResolver in case the
+        // ImsService override changed in CarrierConfig while we were overriding it.
+        overrideCarrierConfig(null);
+
+        if (sReceiver != null) {
+            InstrumentationRegistry.getInstrumentation().getContext().unregisterReceiver(sReceiver);
+            sReceiver = null;
+        }
+    }
+
+    @Before
+    public void beforeTest() {
+        if (!ImsUtils.shouldTestTelephony()) {
+            return;
+        }
+        TelephonyManager tm = (TelephonyManager) InstrumentationRegistry.getInstrumentation()
+                .getContext().getSystemService(Context.TELEPHONY_SERVICE);
+        if (tm.getSimState(sTestSlot) != TelephonyManager.SIM_STATE_READY) {
+            fail("This test requires that there is a SIM in the device!");
+        }
+        // Correctness check: ensure that the subscription hasn't changed between tests.
+        int[] subs = SubscriptionManager.getSubId(sTestSlot);
+
+        if (subs == null) {
+            fail("This test requires there is an active subscription in slot " + sTestSlot);
+        }
+        boolean isFound = false;
+        for (int sub : subs) {
+            isFound |= (sTestSub == sub);
+        }
+        if (!isFound) {
+            fail("Invalid state found: the test subscription in slot " + sTestSlot + " changed "
+                    + "during this test.");
+        }
+    }
+
+    @After
+    public void afterTest() throws Exception {
+        if (!ImsUtils.shouldTestImsService()) {
+            return;
+        }
+        // Unbind the ImsService after the test completes only if feature FEATURE_TELEPHONY_IMS
+        // is enabled.
+        if (sServiceConnector != null) {
+            sServiceConnector.disconnectCarrierImsService();
+        }
+    }
+
+    @Test
+    // Note this test can run on devices with only feature FEATURE_TELEPHONY, so ImsResolver may not
+    // be running.
+    public void testIncorrectPermissions() throws Exception {
+        if (!ImsUtils.shouldTestTelephony()) {
+            return;
+        }
+        SipDelegateManager manager = getSipDelegateManager();
+        try {
+            manager.isSupported();
+            fail("isSupported requires READ_PRIVILEGED_PHONE_STATE");
+        } catch (SecurityException e) {
+            //expected
+        }
+    }
+
+    @Test
+    // Note this test can run on devices with only feature FEATURE_TELEPHONY, so ImsResolver may not
+    // be running.
+    public void testFeatureImsNotSupported() throws Exception {
+        if (!ImsUtils.shouldTestTelephony()) {
+            return;
+        }
+        if (ImsUtils.shouldTestImsService()) {
+            // Return if FEATURE_TELEPHONY_IMS is supported, we only want to test devices where
+            // telephony is supported, but IMS isn't.
+            return;
+        }
+        SipDelegateManager manager = getSipDelegateManager();
+        try {
+            // If FEATURE_TELEPHONY_IMS is not supported this should already return false.
+            Boolean result = ShellIdentityUtils.invokeThrowableMethodWithShellPermissions(
+                    manager, SipDelegateManager::isSupported, ImsException.class,
+                    "android.permission.READ_PRIVILEGED_PHONE_STATE");
+            assertNotNull(result);
+            assertFalse("isSupported should return false on devices that do not support "
+                    + "feature FEATURE_TELEPHONY_IMS", result);
+        } catch (SecurityException e) {
+            fail("isSupported requires READ_PRIVILEGED_PHONE_STATE permission");
+        }
+    }
+
+    @Test
+    public void testIsSupportedWithSipTransportCapable() throws Exception {
+        if (!ImsUtils.shouldTestImsService()) {
+            return;
+        }
+        PersistableBundle b = new PersistableBundle();
+        b.putBoolean(CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, true);
+        overrideCarrierConfig(b);
+        connectTestImsServiceWithSipTransport();
+
+        SipDelegateManager manager = getSipDelegateManager();
+        Boolean result = null;
+        try {
+            result = callUntilImsServiceIsAvailable(() ->
+                    ShellIdentityUtils.invokeThrowableMethodWithShellPermissions(manager,
+                            SipDelegateManager::isSupported, ImsException.class,
+                            "android.permission.READ_PRIVILEGED_PHONE_STATE"));
+        } catch (SecurityException e) {
+            fail("isSupported requires READ_PRIVILEGED_PHONE_STATE permission");
+        }
+        assertNotNull(result);
+        assertTrue("isSupported should return true", result);
+    }
+
+    @Test
+    public void testIsSupportedWithSipTransportCapableCarrierConfigNotSet() throws Exception {
+        if (!ImsUtils.shouldTestImsService()) {
+            return;
+        }
+        PersistableBundle b = new PersistableBundle();
+        // Carrier Config is explicitly set to not support single registration.
+        b.putBoolean(CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, false);
+        overrideCarrierConfig(b);
+        connectTestImsServiceWithSipTransport();
+
+        Boolean result = callUntilImsServiceIsAvailable(() ->
+                ShellIdentityUtils.invokeThrowableMethodWithShellPermissions(
+                        getSipDelegateManager(), SipDelegateManager::isSupported,
+                        ImsException.class, "android.permission.READ_PRIVILEGED_PHONE_STATE"));
+        assertNotNull(result);
+        assertFalse("isSupported should return false if"
+                + "CarrierConfigManager.Ims.KEY_RCS_SINGLE_REGISTRATION_REQUIRED_BOOL is set to "
+                + "false", result);
+    }
+
+    @Test
+    public void testIsSupportedWithSipTransportCapableOnlyRcs() throws Exception {
+        if (!ImsUtils.shouldTestImsService()) {
+            return;
+        }
+        PersistableBundle b = new PersistableBundle();
+        b.putBoolean(CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, true);
+        overrideCarrierConfig(b);
+        assertTrue(sServiceConnector.connectCarrierImsServiceLocally());
+
+        ImsFeatureConfiguration c = getConfigForRcs();
+        assertTrue(sServiceConnector.triggerFrameworkConnectionToCarrierImsService(c));
+        verifyImsServiceState(c);
+
+        Boolean result = callUntilImsServiceIsAvailable(() ->
+                ShellIdentityUtils.invokeThrowableMethodWithShellPermissions(
+                        getSipDelegateManager(), SipDelegateManager::isSupported,
+                        ImsException.class, "android.permission.READ_PRIVILEGED_PHONE_STATE"));
+        assertNotNull(result);
+        assertFalse("isSupported should return false in the case that the ImsService is only "
+                + "attached for MMTEL and not MMTEL and RCS", result);
+    }
+
+
+    @Test
+    public void testIsSupportedWithSipTransportCapableButNotImplemented() throws Exception {
+        if (!ImsUtils.shouldTestImsService()) {
+            return;
+        }
+        PersistableBundle b = new PersistableBundle();
+        b.putBoolean(CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, true);
+        overrideCarrierConfig(b);
+
+        assertTrue(sServiceConnector.connectCarrierImsServiceLocally());
+        // SipTransport set as capable, but no SipTransport implementation is returned.
+        sServiceConnector.getCarrierService().addCapabilities(
+                ImsService.CAPABILITY_SIP_DELEGATE_CREATION);
+        ImsFeatureConfiguration c = getConfigForMmTelAndRcs();
+        assertTrue(sServiceConnector.triggerFrameworkConnectionToCarrierImsService(c));
+        verifyImsServiceState(c);
+
+        Boolean result = callUntilImsServiceIsAvailable(() ->
+                ShellIdentityUtils.invokeThrowableMethodWithShellPermissions(
+                        getSipDelegateManager(), SipDelegateManager::isSupported,
+                        ImsException.class, "android.permission.READ_PRIVILEGED_PHONE_STATE"));
+        assertNotNull(result);
+        assertFalse("isSupported should return false in the case that SipTransport is not "
+                + "implemented", result);
+    }
+
+    @Test
+    public void testIsSupportedWithSipTransportImplementedButNotCapable() throws Exception {
+        if (!ImsUtils.shouldTestImsService()) {
+            return;
+        }
+        PersistableBundle b = new PersistableBundle();
+        b.putBoolean(CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, true);
+        overrideCarrierConfig(b);
+
+        assertTrue(sServiceConnector.connectCarrierImsServiceLocally());
+        // SipTransport is set as Implemented, but not Capable
+        sServiceConnector.getCarrierService().setSipTransportImplemented();
+        ImsFeatureConfiguration c = getConfigForMmTelAndRcs();
+        assertTrue(sServiceConnector.triggerFrameworkConnectionToCarrierImsService(c));
+        verifyImsServiceState(c);
+
+        Boolean result = callUntilImsServiceIsAvailable(() ->
+                ShellIdentityUtils.invokeThrowableMethodWithShellPermissions(
+                        getSipDelegateManager(), SipDelegateManager::isSupported,
+                        ImsException.class, "android.permission.READ_PRIVILEGED_PHONE_STATE"));
+        assertNotNull(result);
+        assertFalse("isSupported should return false in the case that SipTransport is not "
+                + "set as capable in ImsService#getImsServiceCapabilities", result);
+    }
+
+    @Test
+    public void testIsSupportedWithSipTransportNotImplementedNotCapable() throws Exception {
+        if (!ImsUtils.shouldTestImsService()) {
+            return;
+        }
+        PersistableBundle b = new PersistableBundle();
+        b.putBoolean(CarrierConfigManager.Ims.KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, true);
+        overrideCarrierConfig(b);
+
+        assertTrue(sServiceConnector.connectCarrierImsServiceLocally());
+        // NoytImplemented/capable
+        ImsFeatureConfiguration c = getConfigForMmTelAndRcs();
+        assertTrue(sServiceConnector.triggerFrameworkConnectionToCarrierImsService(c));
+        verifyImsServiceState(c);
+
+        Boolean result = callUntilImsServiceIsAvailable(() ->
+                ShellIdentityUtils.invokeThrowableMethodWithShellPermissions(
+                        getSipDelegateManager(), SipDelegateManager::isSupported,
+                        ImsException.class, "android.permission.READ_PRIVILEGED_PHONE_STATE"));
+        assertNotNull(result);
+        assertFalse("isSupported should return false in the case that SipTransport is not "
+                + "set as capable in ImsService#getImsServiceCapabilities", result);
+    }
+
+    private void connectTestImsServiceWithSipTransport() throws Exception {
+        assertTrue(sServiceConnector.connectCarrierImsServiceLocally());
+        sServiceConnector.getCarrierService().addCapabilities(
+                ImsService.CAPABILITY_SIP_DELEGATE_CREATION);
+        sServiceConnector.getCarrierService().setSipTransportImplemented();
+        ImsFeatureConfiguration c = getConfigForMmTelAndRcs();
+        assertTrue(sServiceConnector.triggerFrameworkConnectionToCarrierImsService(c));
+        verifyImsServiceState(c);
+    }
+
+    private void verifyImsServiceState(ImsFeatureConfiguration config) {
+        for (ImsFeatureConfiguration.FeatureSlotPair p : config.getServiceFeatures()) {
+            switch (p.featureType) {
+                case ImsFeature.FEATURE_MMTEL: {
+                    sServiceConnector.getCarrierService().waitForLatchCountdown(
+                            TestImsService.LATCH_CREATE_MMTEL);
+                    assertNotNull("ImsService created, but ImsService#createMmTelFeature was not "
+                            + "called!", sServiceConnector.getCarrierService().getMmTelFeature());
+                    break;
+                }
+                case ImsFeature.FEATURE_RCS: {
+                    sServiceConnector.getCarrierService().waitForLatchCountdown(
+                            TestImsService.LATCH_CREATE_RCS);
+                    assertNotNull("ImsService created, but ImsService#createRcsFeature was not "
+                            + "called!", sServiceConnector.getCarrierService().getRcsFeature());
+                    break;
+                }
+            }
+        }
+    }
+
+    /**
+     * Wait up to five seconds (retrying a command 1 time per second) until ImsExceptions due to the
+     * ImsService not being available go away. If the ImsService never becomes available, this
+     * method will return null.
+     */
+    private <T> T callUntilImsServiceIsAvailable(Callable<T> command) throws Exception {
+        int retry = 0;
+        while (retry < 5) {
+            try {
+                return command.call();
+            } catch (ImsException e) {
+                // we want to absorb only the unavailable error, as telephony may still be
+                // internally setting up. Any other type of ImsException is unexpected.
+                if (e.getCode() != ImsException.CODE_ERROR_SERVICE_UNAVAILABLE) {
+                    throw e;
+                }
+            }
+            Thread.sleep(1000);
+            retry++;
+        }
+        return null;
+    }
+
+    private ImsFeatureConfiguration getConfigForMmTelAndRcs() {
+        return new ImsFeatureConfiguration.Builder()
+                .addFeature(sTestSlot, ImsFeature.FEATURE_EMERGENCY_MMTEL)
+                .addFeature(sTestSlot, ImsFeature.FEATURE_MMTEL)
+                .addFeature(sTestSlot, ImsFeature.FEATURE_RCS)
+                .build();
+    }
+    private ImsFeatureConfiguration getConfigForRcs() {
+        return new ImsFeatureConfiguration.Builder()
+                .addFeature(sTestSlot, ImsFeature.FEATURE_RCS)
+                .build();
+    }
+
+    private static void overrideCarrierConfig(PersistableBundle bundle) throws Exception {
+        CarrierConfigManager carrierConfigManager = InstrumentationRegistry.getInstrumentation()
+                .getContext().getSystemService(CarrierConfigManager.class);
+        sReceiver.clearQueue();
+        ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(carrierConfigManager,
+                (m) -> m.overrideConfig(sTestSub, bundle));
+        sReceiver.waitForCarrierConfigChanged();
+    }
+
+    private SipDelegateManager getSipDelegateManager() {
+        ImsManager imsManager = getContext().getSystemService(ImsManager.class);
+        assertNotNull(imsManager);
+        return imsManager.getSipDelegateManager(sTestSub);
+    }
+
+    private static Context getContext() {
+        return InstrumentationRegistry.getInstrumentation().getContext();
+    }
+}
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/TestImsService.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/TestImsService.java
index eb3fc18..89019b7 100644
--- a/tests/tests/telephony/current/src/android/telephony/ims/cts/TestImsService.java
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/TestImsService.java
@@ -27,9 +27,12 @@
 import android.telephony.ims.stub.ImsConfigImplBase;
 import android.telephony.ims.stub.ImsFeatureConfiguration;
 import android.telephony.ims.stub.ImsRegistrationImplBase;
+import android.telephony.ims.stub.SipTransportImplBase;
 import android.util.Log;
 
 
+import androidx.annotation.Nullable;
+
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -45,8 +48,12 @@
     private TestRcsFeature mTestRcsFeature;
     private TestMmTelFeature mTestMmTelFeature;
     private TestImsConfig mTestImsConfig;
+    private TestSipTransport mTestSipTransport;
     private ImsService mTestImsService;
     private boolean mIsEnabled = false;
+    private boolean mSetNullRcsBinding = false;
+    private boolean mIsSipTransportImplemented = false;
+    private long mCapabilities = 0;
     private ImsFeatureConfiguration mFeatureConfig;
     private final Object mLock = new Object();
 
@@ -91,6 +98,8 @@
                 attachBaseContext(context);
             }
             mTestImsConfig = new TestImsConfig();
+            // For testing, just run on binder thread until required otherwise.
+            mTestSipTransport = new TestSipTransport(Runnable::run);
         }
 
         @Override
@@ -99,6 +108,11 @@
         }
 
         @Override
+        public long getImsServiceCapabilities() {
+            return mCapabilities;
+        }
+
+        @Override
         public void readyForFeatureCreation() {
             synchronized (mLock) {
                 countDownLatch(LATCH_FEATURES_READY);
@@ -146,6 +160,9 @@
                             }
                         }
                         );
+                if (mSetNullRcsBinding) {
+                    return null;
+                }
                 return mTestRcsFeature;
             }
         }
@@ -188,6 +205,16 @@
         public ImsRegistrationImplBase getRegistration(int slotId) {
             return sImsRegistrationImplBase;
         }
+
+        @Nullable
+        @Override
+        public SipTransportImplBase getSipTransport(int slotId) {
+            if (mIsSipTransportImplemented) {
+                return mTestSipTransport;
+            } else {
+                return null;
+            }
+        }
     }
 
     private final LocalBinder mBinder = new LocalBinder();
@@ -227,6 +254,9 @@
             mTestMmTelFeature = null;
             mTestRcsFeature = null;
             mIsEnabled = false;
+            mSetNullRcsBinding = false;
+            mIsSipTransportImplemented = false;
+            mCapabilities = 0;
             for (int i = 0; i < LATCH_MAX; i++) {
                 sLatches[i] = new CountDownLatch(1);
             }
@@ -253,12 +283,30 @@
         }
     }
 
+    public void setNullRcsBinding() {
+        synchronized (mLock) {
+            mSetNullRcsBinding = true;
+        }
+    }
+
     public void setIsEnabled(boolean isEnabled) {
         synchronized (mLock) {
             mIsEnabled = isEnabled;
         }
     }
 
+    public void addCapabilities(long capabilities) {
+        synchronized (mLock) {
+            mCapabilities |= capabilities;
+        }
+    }
+
+    public void setSipTransportImplemented() {
+        synchronized (mLock) {
+            mIsSipTransportImplemented = true;
+        }
+    }
+
     public boolean waitForLatchCountdown(int latchIndex) {
         boolean complete = false;
         try {
diff --git a/tests/tests/telephony/current/src/android/telephony/ims/cts/TestSipTransport.java b/tests/tests/telephony/current/src/android/telephony/ims/cts/TestSipTransport.java
new file mode 100644
index 0000000..b7db4c8
--- /dev/null
+++ b/tests/tests/telephony/current/src/android/telephony/ims/cts/TestSipTransport.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2020 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.telephony.ims.cts;
+
+import android.telephony.ims.stub.SipTransportImplBase;
+
+import java.util.concurrent.Executor;
+
+public class TestSipTransport extends SipTransportImplBase {
+
+    public TestSipTransport(Executor executor) {
+        super(executor);
+    }
+}
diff --git a/tests/tests/telephony/sdk28/Android.bp b/tests/tests/telephony/sdk28/Android.bp
index 2566653..2a3ecd1 100644
--- a/tests/tests/telephony/sdk28/Android.bp
+++ b/tests/tests/telephony/sdk28/Android.bp
@@ -26,11 +26,10 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
 }
diff --git a/tests/tests/telephony/sdk28/AndroidTest.xml b/tests/tests/telephony/sdk28/AndroidTest.xml
index b8c086f..9dbdb1b 100644
--- a/tests/tests/telephony/sdk28/AndroidTest.xml
+++ b/tests/tests/telephony/sdk28/AndroidTest.xml
@@ -21,6 +21,7 @@
     <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
     <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
     <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
+    <option name="config-descriptor:metadata" key="token" value="SIM_CARD" />
     <target_preparer class="android.telephony.cts.preconditions.TelephonyPreparer">
         <option name="apk" value="CtsTelephonyPreparerApp.apk" />
         <option name="package" value="android.telephony.cts.preconditions.app" />
diff --git a/tests/tests/telephony2/Android.bp b/tests/tests/telephony2/Android.bp
index 773b229..19a4fad 100644
--- a/tests/tests/telephony2/Android.bp
+++ b/tests/tests/telephony2/Android.bp
@@ -24,11 +24,10 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
 }
diff --git a/tests/tests/telephony2/AndroidTest.xml b/tests/tests/telephony2/AndroidTest.xml
index 3d3d476..e8454b6 100644
--- a/tests/tests/telephony2/AndroidTest.xml
+++ b/tests/tests/telephony2/AndroidTest.xml
@@ -19,7 +19,7 @@
     <option name="not-shardable" value="true" />
     <option name="config-descriptor:metadata" key="parameter" value="instant_app" />
     <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
-    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
+    <option name="config-descriptor:metadata" key="parameter" value="not_secondary_user" />
     <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
         <option name="cleanup-apks" value="true" />
         <option name="test-file-name" value="CtsTelephony2TestCases.apk" />
diff --git a/tests/tests/telephony2/src/android/telephony2/cts/NoLocationPermissionTest.java b/tests/tests/telephony2/src/android/telephony2/cts/NoLocationPermissionTest.java
new file mode 100644
index 0000000..48d1cc59
--- /dev/null
+++ b/tests/tests/telephony2/src/android/telephony2/cts/NoLocationPermissionTest.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2019 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.telephony2.cts;
+
+import static android.content.pm.PackageManager.FEATURE_TELEPHONY;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+import android.content.Context;
+import android.telephony.CellInfo;
+import android.telephony.PhoneStateListener;
+import android.telephony.TelephonyManager;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.List;
+
+
+@RunWith(AndroidJUnit4.class)
+public class NoLocationPermissionTest {
+
+    private Context mContext;
+
+    @Before
+    public void setUp() throws Exception {
+        mContext = InstrumentationRegistry.getContext();
+    }
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void testGetCellLocation() {
+        if (!mContext.getPackageManager().hasSystemFeature(FEATURE_TELEPHONY)) {
+            return;
+        }
+
+        TelephonyManager telephonyManager = mContext.getSystemService(TelephonyManager.class);
+        assertNotNull(telephonyManager);
+
+        try {
+            telephonyManager.getCellLocation();
+            fail("Should throw SecurityException");
+        } catch (SecurityException e) {
+            // expected
+        }
+    }
+
+    @Test
+    public void testGetAllCellInfo() {
+        if (!mContext.getPackageManager().hasSystemFeature(FEATURE_TELEPHONY)) {
+            return;
+        }
+
+        TelephonyManager telephonyManager = mContext.getSystemService(TelephonyManager.class);
+        assertNotNull(telephonyManager);
+
+        try {
+            telephonyManager.getAllCellInfo();
+            fail("Should throw SecurityException");
+        } catch (SecurityException e) {
+            // expected
+        }
+    }
+
+    @Test
+    public void testListenCellLocation() {
+        if (!mContext.getPackageManager().hasSystemFeature(FEATURE_TELEPHONY)) {
+            return;
+        }
+
+        TelephonyManager telephonyManager = mContext.getSystemService(TelephonyManager.class);
+        assertNotNull(telephonyManager);
+
+        try {
+            telephonyManager.listen(new PhoneStateListener(Runnable::run),
+                    PhoneStateListener.LISTEN_CELL_LOCATION);
+            fail("Should throw SecurityException");
+        } catch (SecurityException e) {
+            // expected
+        }
+    }
+
+    @Test
+    public void testRequestCellInfoUpdate() {
+        if (!mContext.getPackageManager().hasSystemFeature(FEATURE_TELEPHONY)) {
+            return;
+        }
+
+        TelephonyManager telephonyManager = mContext.getSystemService(TelephonyManager.class);
+        assertNotNull(telephonyManager);
+
+        try {
+            telephonyManager.requestCellInfoUpdate(Runnable::run,
+                    new TelephonyManager.CellInfoCallback() {
+                        @Override
+                        public void onCellInfo(List<CellInfo> cellInfos) {
+                        }
+                    });
+            fail("Should throw SecurityException");
+        } catch (SecurityException e) {
+            // expected
+        }
+    }
+}
diff --git a/tests/tests/telephony3/Android.bp b/tests/tests/telephony3/Android.bp
index 2e14e02..7249851 100644
--- a/tests/tests/telephony3/Android.bp
+++ b/tests/tests/telephony3/Android.bp
@@ -23,8 +23,7 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
-    libs: ["android.test.runner.stubs"] + ["android.test.base.stubs"],
+    libs: ["android.test.runner"] + ["android.test.base"],
 }
diff --git a/tests/tests/telephony4/Android.bp b/tests/tests/telephony4/Android.bp
index b75e61b..08097b5 100644
--- a/tests/tests/telephony4/Android.bp
+++ b/tests/tests/telephony4/Android.bp
@@ -17,8 +17,8 @@
     defaults: ["cts_defaults"],
     libs: [
         "telephony-common",
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     static_libs: [
         "ctstestrunner-axt",
@@ -30,7 +30,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     certificate: ":android_telephony_cts_testkey",
diff --git a/tests/tests/telephonyprovider/Android.bp b/tests/tests/telephonyprovider/Android.bp
index f5f6f5a..59d3cbc 100644
--- a/tests/tests/telephonyprovider/Android.bp
+++ b/tests/tests/telephonyprovider/Android.bp
@@ -28,14 +28,13 @@
         "truth-prebuilt",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/telephonyprovider/AndroidTest.xml b/tests/tests/telephonyprovider/AndroidTest.xml
index 50892c3..d8bd082 100644
--- a/tests/tests/telephonyprovider/AndroidTest.xml
+++ b/tests/tests/telephonyprovider/AndroidTest.xml
@@ -20,7 +20,7 @@
     <!-- TelephonyProvider uses permissions not available to instant apps. -->
     <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
     <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
-    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
+    <option name="config-descriptor:metadata" key="parameter" value="not_secondary_user" />
 
     <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
         <option name="cleanup-apks" value="true" />
diff --git a/tests/tests/telephonyprovider/src/android/telephonyprovider/cts/MmsTest.java b/tests/tests/telephonyprovider/src/android/telephonyprovider/cts/MmsTest.java
index 85df75d..36cf75b 100644
--- a/tests/tests/telephonyprovider/src/android/telephonyprovider/cts/MmsTest.java
+++ b/tests/tests/telephonyprovider/src/android/telephonyprovider/cts/MmsTest.java
@@ -471,13 +471,13 @@
      *
      * When an insert fails, the resulting URI could be in several states. In many cases the
      * resulting URI will be null. However, if an insert fails due to appops privileges it will
-     * return a dummy URI. This URI should either point to no rows, or to a single row. If it does
-     * point to a row, it the subject should not match the subject of the attempted insert.
+     * return a placeholder URI. This URI should either point to no rows, or to a single row. If it
+     * does point to a row, it the subject should not match the subject of the attempted insert.
      *
      * In normal circumstances, the environment should be clean before the test, so as long as our
      * subjects are unique, we should not have a false test failure. However, if the environment is
-     * not clean, we could lead to a false test failure if the returned dummy URI subject happens to
-     * match the subject of our attempted insert.
+     * not clean, we could lead to a false test failure if the returned placeholder URI subject
+     * happens to match the subject of our attempted insert.
      */
     private void assertThatMmsInsertFailed(@Nullable Uri uriReturnedFromInsert,
             String subjectOfAttemptedInsert) {
diff --git a/tests/tests/tethering/Android.bp b/tests/tests/tethering/Android.bp
deleted file mode 100644
index 85bb0e0..0000000
--- a/tests/tests/tethering/Android.bp
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (C) 2019 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.
-
-android_test {
-    name: "CtsTetheringTest",
-    defaults: ["cts_defaults"],
-
-    libs: [
-        "android.test.base.stubs",
-    ],
-
-    srcs: [
-        "src/**/*.java",
-    ],
-
-    static_libs: [
-        "TetheringCommonTests",
-        "TetheringIntegrationTestsLib",
-        "compatibility-device-util-axt",
-        "cts-net-utils",
-        "net-tests-utils",
-        "ctstestrunner-axt",
-        "junit",
-        "junit-params",
-    ],
-
-    jni_libs: [
-        // For mockito extended
-        "libdexmakerjvmtiagent",
-        "libstaticjvmtiagent",
-    ],
-
-    // Change to system current when TetheringManager move to bootclass path.
-    platform_apis: true,
-
-    // Tag this module as a cts test artifact
-    test_suites: [
-        "cts",
-        "general-tests",
-        "mts",
-    ],
-
-    // Include both the 32 and 64 bit versions
-    compile_multilib: "both",
-}
diff --git a/tests/tests/tethering/AndroidManifest.xml b/tests/tests/tethering/AndroidManifest.xml
deleted file mode 100644
index 665002e..0000000
--- a/tests/tests/tethering/AndroidManifest.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Copyright (C) 2019 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.tethering.cts">
-
-    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-
-    <application android:debuggable="true">
-        <uses-library android:name="android.test.runner" />
-    </application>
-    <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
-                     android:targetPackage="android.tethering.cts"
-                     android:label="CTS tests of android.tethering">
-        <meta-data android:name="listener"
-            android:value="com.android.cts.runner.CtsTestRunListener" />
-    </instrumentation>
-
-</manifest>
diff --git a/tests/tests/tethering/AndroidTest.xml b/tests/tests/tethering/AndroidTest.xml
deleted file mode 100644
index e752e3a..0000000
--- a/tests/tests/tethering/AndroidTest.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2019 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.
--->
-<configuration description="Config for CTS Tethering test cases">
-    <option name="test-suite-tag" value="cts" />
-    <option name="config-descriptor:metadata" key="component" value="networking" />
-    <option name="config-descriptor:metadata" key="token" value="SIM_CARD" />
-    <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
-    <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
-    <option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
-    <option name="not-shardable" value="true" />
-    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
-        <option name="cleanup-apks" value="true" />
-        <option name="test-file-name" value="CtsTetheringTest.apk" />
-    </target_preparer>
-    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
-        <option name="package" value="android.tethering.cts" />
-    </test>
-
-    <object type="module_controller" class="com.android.tradefed.testtype.suite.module.MainlineTestModuleController">
-        <option name="mainline-module-package-name" value="com.google.android.tethering" />
-    </object>
-</configuration>
diff --git a/tests/tests/tethering/OWNERS b/tests/tests/tethering/OWNERS
deleted file mode 100644
index cd6abeb..0000000
--- a/tests/tests/tethering/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-# Bug component: 31808
-lorenzo@google.com
-satk@google.com
-
diff --git a/tests/tests/tethering/src/android/tethering/cts/TetheringManagerTest.java b/tests/tests/tethering/src/android/tethering/cts/TetheringManagerTest.java
deleted file mode 100644
index f47f454..0000000
--- a/tests/tests/tethering/src/android/tethering/cts/TetheringManagerTest.java
+++ /dev/null
@@ -1,800 +0,0 @@
-/*
- * Copyright (C) 2019 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.tethering.test;
-
-import static android.content.pm.PackageManager.FEATURE_TELEPHONY;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
-import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
-import static android.net.NetworkCapabilities.TRANSPORT_ETHERNET;
-import static android.net.TetheringManager.TETHERING_USB;
-import static android.net.TetheringManager.TETHERING_WIFI;
-import static android.net.TetheringManager.TETHERING_WIFI_P2P;
-import static android.net.TetheringManager.TETHER_ERROR_ENTITLEMENT_UNKNOWN;
-import static android.net.TetheringManager.TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION;
-import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR;
-import static android.net.TetheringManager.TETHER_HARDWARE_OFFLOAD_FAILED;
-import static android.net.TetheringManager.TETHER_HARDWARE_OFFLOAD_STARTED;
-import static android.net.TetheringManager.TETHER_HARDWARE_OFFLOAD_STOPPED;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeFalse;
-import static org.junit.Assume.assumeTrue;
-
-import android.app.UiAutomation;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.PackageManager;
-import android.net.ConnectivityManager;
-import android.net.LinkAddress;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.TetheredClient;
-import android.net.TetheringManager;
-import android.net.TetheringManager.OnTetheringEntitlementResultListener;
-import android.net.TetheringManager.TetheringEventCallback;
-import android.net.TetheringManager.TetheringInterfaceRegexps;
-import android.net.TetheringManager.TetheringRequest;
-import android.net.cts.util.CtsNetUtils;
-import android.net.cts.util.CtsNetUtils.TestNetworkCallback;
-import android.net.wifi.WifiClient;
-import android.net.wifi.WifiManager;
-import android.net.wifi.WifiManager.SoftApCallback;
-import android.os.Bundle;
-import android.os.ConditionVariable;
-import android.os.PersistableBundle;
-import android.os.ResultReceiver;
-import android.telephony.CarrierConfigManager;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-
-import androidx.annotation.NonNull;
-import androidx.test.InstrumentationRegistry;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.testutils.ArrayTrackRecord;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Consumer;
-
-@RunWith(AndroidJUnit4.class)
-public class TetheringManagerTest {
-
-    private Context mContext;
-
-    private ConnectivityManager mCm;
-    private TetheringManager mTM;
-    private WifiManager mWm;
-    private PackageManager mPm;
-
-    private TetherChangeReceiver mTetherChangeReceiver;
-    private CtsNetUtils mCtsNetUtils;
-
-    private static final int DEFAULT_TIMEOUT_MS = 60_000;
-
-    private void adoptShellPermissionIdentity() {
-        final UiAutomation uiAutomation =
-                InstrumentationRegistry.getInstrumentation().getUiAutomation();
-        uiAutomation.adoptShellPermissionIdentity();
-    }
-
-    private void dropShellPermissionIdentity() {
-        final UiAutomation uiAutomation =
-                InstrumentationRegistry.getInstrumentation().getUiAutomation();
-        uiAutomation.dropShellPermissionIdentity();
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        adoptShellPermissionIdentity();
-        mContext = InstrumentationRegistry.getContext();
-        mCm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
-        mTM = (TetheringManager) mContext.getSystemService(Context.TETHERING_SERVICE);
-        mWm = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
-        mPm = mContext.getPackageManager();
-        mCtsNetUtils = new CtsNetUtils(mContext);
-        mTetherChangeReceiver = new TetherChangeReceiver();
-        final IntentFilter filter = new IntentFilter(
-                TetheringManager.ACTION_TETHER_STATE_CHANGED);
-        final Intent intent = mContext.registerReceiver(mTetherChangeReceiver, filter);
-        if (intent != null) mTetherChangeReceiver.onReceive(null, intent);
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        mTM.stopAllTethering();
-        mContext.unregisterReceiver(mTetherChangeReceiver);
-        dropShellPermissionIdentity();
-    }
-
-    private static class StopSoftApCallback implements SoftApCallback {
-        private final ConditionVariable mWaiting = new ConditionVariable();
-        @Override
-        public void onStateChanged(int state, int failureReason) {
-            if (state == WifiManager.WIFI_AP_STATE_DISABLED) mWaiting.open();
-        }
-
-        @Override
-        public void onConnectedClientsChanged(List<WifiClient> clients) { }
-
-        public void waitForSoftApStopped() {
-            if (!mWaiting.block(DEFAULT_TIMEOUT_MS)) {
-                fail("stopSoftAp Timeout");
-            }
-        }
-    }
-
-    // Wait for softAp to be disabled. This is necessary on devices where stopping softAp
-    // deletes the interface. On these devices, tethering immediately stops when the softAp
-    // interface is removed, but softAp is not yet fully disabled. Wait for softAp to be
-    // fully disabled, because otherwise the next test might fail because it attempts to
-    // start softAp before it's fully stopped.
-    private void expectSoftApDisabled() {
-        final StopSoftApCallback callback = new StopSoftApCallback();
-        try {
-            mWm.registerSoftApCallback(c -> c.run(), callback);
-            // registerSoftApCallback will immediately call the callback with the current state, so
-            // this callback will fire even if softAp is already disabled.
-            callback.waitForSoftApStopped();
-        } finally {
-            mWm.unregisterSoftApCallback(callback);
-        }
-    }
-
-    private class TetherChangeReceiver extends BroadcastReceiver {
-        private class TetherState {
-            final ArrayList<String> mAvailable;
-            final ArrayList<String> mActive;
-            final ArrayList<String> mErrored;
-
-            TetherState(Intent intent) {
-                mAvailable = intent.getStringArrayListExtra(
-                        TetheringManager.EXTRA_AVAILABLE_TETHER);
-                mActive = intent.getStringArrayListExtra(
-                        TetheringManager.EXTRA_ACTIVE_TETHER);
-                mErrored = intent.getStringArrayListExtra(
-                        TetheringManager.EXTRA_ERRORED_TETHER);
-            }
-        }
-
-        @Override
-        public void onReceive(Context content, Intent intent) {
-            String action = intent.getAction();
-            if (action.equals(TetheringManager.ACTION_TETHER_STATE_CHANGED)) {
-                mResult.add(new TetherState(intent));
-            }
-        }
-
-        public final LinkedBlockingQueue<TetherState> mResult = new LinkedBlockingQueue<>();
-
-        // Expects that tethering reaches the desired state.
-        // - If active is true, expects that tethering is enabled on at least one interface
-        //   matching ifaceRegexs.
-        // - If active is false, expects that tethering is disabled on all the interfaces matching
-        //   ifaceRegexs.
-        // Fails if any interface matching ifaceRegexs becomes errored.
-        public void expectTethering(final boolean active, final String[] ifaceRegexs) {
-            while (true) {
-                final TetherState state = pollAndAssertNoError(DEFAULT_TIMEOUT_MS, ifaceRegexs);
-                assertNotNull("Did not receive expected state change, active: " + active, state);
-
-                if (isIfaceActive(ifaceRegexs, state) == active) return;
-            }
-        }
-
-        private TetherState pollAndAssertNoError(final int timeout, final String[] ifaceRegexs) {
-            final TetherState state = pollTetherState(timeout);
-            assertNoErroredIfaces(state, ifaceRegexs);
-            return state;
-        }
-
-        private TetherState pollTetherState(final int timeout) {
-            try {
-                return mResult.poll(timeout, TimeUnit.MILLISECONDS);
-            } catch (InterruptedException e) {
-                fail("No result after " + timeout + " ms");
-                return null;
-            }
-        }
-
-        private boolean isIfaceActive(final String[] ifaceRegexs, final TetherState state) {
-            return isIfaceMatch(ifaceRegexs, state.mActive);
-        }
-
-        private void assertNoErroredIfaces(final TetherState state, final String[] ifaceRegexs) {
-            if (state == null || state.mErrored == null) return;
-
-            if (isIfaceMatch(ifaceRegexs, state.mErrored)) {
-                fail("Found failed tethering interfaces: " + Arrays.toString(state.mErrored.toArray()));
-            }
-        }
-    }
-
-    private static class StartTetheringCallback implements TetheringManager.StartTetheringCallback {
-        private static int TIMEOUT_MS = 30_000;
-        public static class CallbackValue {
-            public final int error;
-
-            private CallbackValue(final int e) {
-                error = e;
-            }
-
-            public static class OnTetheringStarted extends CallbackValue {
-                OnTetheringStarted() { super(TETHER_ERROR_NO_ERROR); }
-            }
-
-            public static class OnTetheringFailed extends CallbackValue {
-                OnTetheringFailed(final int error) { super(error); }
-            }
-
-            @Override
-            public String toString() {
-                return String.format("%s(%d)", getClass().getSimpleName(), error);
-            }
-        }
-
-        private final ArrayTrackRecord<CallbackValue>.ReadHead mHistory =
-                new ArrayTrackRecord<CallbackValue>().newReadHead();
-
-        @Override
-        public void onTetheringStarted() {
-            mHistory.add(new CallbackValue.OnTetheringStarted());
-        }
-
-        @Override
-        public void onTetheringFailed(final int error) {
-            mHistory.add(new CallbackValue.OnTetheringFailed(error));
-        }
-
-        public void verifyTetheringStarted() {
-            final CallbackValue cv = mHistory.poll(TIMEOUT_MS, c -> true);
-            assertNotNull("No onTetheringStarted after " + TIMEOUT_MS + " ms", cv);
-            assertTrue("Fail start tethering:" + cv,
-                    cv instanceof CallbackValue.OnTetheringStarted);
-        }
-
-        public void expectTetheringFailed(final int expected) throws InterruptedException {
-            final CallbackValue cv = mHistory.poll(TIMEOUT_MS, c -> true);
-            assertNotNull("No onTetheringFailed after " + TIMEOUT_MS + " ms", cv);
-            assertTrue("Expect fail with error code " + expected + ", but received: " + cv,
-                (cv instanceof CallbackValue.OnTetheringFailed) && (cv.error == expected));
-        }
-    }
-
-    private static boolean isIfaceMatch(final List<String> ifaceRegexs,
-            final List<String> ifaces) {
-        return isIfaceMatch(ifaceRegexs.toArray(new String[0]), ifaces);
-    }
-
-    private static boolean isIfaceMatch(final String[] ifaceRegexs, final List<String> ifaces) {
-        if (ifaceRegexs == null) fail("ifaceRegexs should not be null");
-
-        if (ifaces == null) return false;
-
-        for (String s : ifaces) {
-            for (String regex : ifaceRegexs) {
-                if (s.matches(regex)) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    @Test
-    public void testStartTetheringWithStateChangeBroadcast() throws Exception {
-        if (!mTM.isTetheringSupported()) return;
-
-        final String[] wifiRegexs = mTM.getTetherableWifiRegexs();
-        if (wifiRegexs.length == 0) return;
-
-        final String[] tetheredIfaces = mTM.getTetheredIfaces();
-        assertTrue(tetheredIfaces.length == 0);
-
-        final StartTetheringCallback startTetheringCallback = new StartTetheringCallback();
-        final TetheringRequest request = new TetheringRequest.Builder(TETHERING_WIFI)
-                .setShouldShowEntitlementUi(false).build();
-        mTM.startTethering(request, c -> c.run() /* executor */, startTetheringCallback);
-        startTetheringCallback.verifyTetheringStarted();
-
-        mTetherChangeReceiver.expectTethering(true /* active */, wifiRegexs);
-
-        mTM.stopTethering(TETHERING_WIFI);
-        expectSoftApDisabled();
-        mTetherChangeReceiver.expectTethering(false /* active */, wifiRegexs);
-    }
-
-    @Test
-    public void testTetheringRequest() {
-        final TetheringRequest tr = new TetheringRequest.Builder(TETHERING_WIFI).build();
-        assertEquals(TETHERING_WIFI, tr.getTetheringType());
-        assertNull(tr.getLocalIpv4Address());
-        assertNull(tr.getClientStaticIpv4Address());
-        assertFalse(tr.isExemptFromEntitlementCheck());
-        assertTrue(tr.getShouldShowEntitlementUi());
-
-        final LinkAddress localAddr = new LinkAddress("192.168.24.5/24");
-        final LinkAddress clientAddr = new LinkAddress("192.168.24.100/24");
-        final TetheringRequest tr2 = new TetheringRequest.Builder(TETHERING_USB)
-                .setStaticIpv4Addresses(localAddr, clientAddr)
-                .setExemptFromEntitlementCheck(true)
-                .setShouldShowEntitlementUi(false).build();
-
-        assertEquals(localAddr, tr2.getLocalIpv4Address());
-        assertEquals(clientAddr, tr2.getClientStaticIpv4Address());
-        assertEquals(TETHERING_USB, tr2.getTetheringType());
-        assertTrue(tr2.isExemptFromEntitlementCheck());
-        assertFalse(tr2.getShouldShowEntitlementUi());
-    }
-
-    // Must poll the callback before looking at the member.
-    private static class TestTetheringEventCallback implements TetheringEventCallback {
-        private static final int TIMEOUT_MS = 30_000;
-
-        public enum CallbackType {
-            ON_SUPPORTED,
-            ON_UPSTREAM,
-            ON_TETHERABLE_REGEX,
-            ON_TETHERABLE_IFACES,
-            ON_TETHERED_IFACES,
-            ON_ERROR,
-            ON_CLIENTS,
-            ON_OFFLOAD_STATUS,
-        };
-
-        public static class CallbackValue {
-            public final CallbackType callbackType;
-            public final Object callbackParam;
-            public final int callbackParam2;
-
-            private CallbackValue(final CallbackType type, final Object param, final int param2) {
-                this.callbackType = type;
-                this.callbackParam = param;
-                this.callbackParam2 = param2;
-            }
-        }
-
-        private final ArrayTrackRecord<CallbackValue> mHistory =
-                new ArrayTrackRecord<CallbackValue>();
-
-        private final ArrayTrackRecord<CallbackValue>.ReadHead mCurrent =
-                mHistory.newReadHead();
-
-        private TetheringInterfaceRegexps mTetherableRegex;
-        private List<String> mTetherableIfaces;
-        private List<String> mTetheredIfaces;
-
-        @Override
-        public void onTetheringSupported(boolean supported) {
-            mHistory.add(new CallbackValue(CallbackType.ON_SUPPORTED, null, (supported ? 1 : 0)));
-        }
-
-        @Override
-        public void onUpstreamChanged(Network network) {
-            mHistory.add(new CallbackValue(CallbackType.ON_UPSTREAM, network, 0));
-        }
-
-        @Override
-        public void onTetherableInterfaceRegexpsChanged(TetheringInterfaceRegexps reg) {
-            mTetherableRegex = reg;
-            mHistory.add(new CallbackValue(CallbackType.ON_TETHERABLE_REGEX, reg, 0));
-        }
-
-        @Override
-        public void onTetherableInterfacesChanged(List<String> interfaces) {
-            mTetherableIfaces = interfaces;
-            mHistory.add(new CallbackValue(CallbackType.ON_TETHERABLE_IFACES, interfaces, 0));
-        }
-
-        @Override
-        public void onTetheredInterfacesChanged(List<String> interfaces) {
-            mTetheredIfaces = interfaces;
-            mHistory.add(new CallbackValue(CallbackType.ON_TETHERED_IFACES, interfaces, 0));
-        }
-
-        @Override
-        public void onError(String ifName, int error) {
-            mHistory.add(new CallbackValue(CallbackType.ON_ERROR, ifName, error));
-        }
-
-        @Override
-        public void onClientsChanged(Collection<TetheredClient> clients) {
-            mHistory.add(new CallbackValue(CallbackType.ON_CLIENTS, clients, 0));
-        }
-
-        @Override
-        public void onOffloadStatusChanged(int status) {
-            mHistory.add(new CallbackValue(CallbackType.ON_OFFLOAD_STATUS, status, 0));
-        }
-
-        public void expectTetherableInterfacesChanged(@NonNull List<String> regexs) {
-            assertNotNull("No expected tetherable ifaces callback", mCurrent.poll(TIMEOUT_MS,
-                (cv) -> {
-                    if (cv.callbackType != CallbackType.ON_TETHERABLE_IFACES) return false;
-                    final List<String> interfaces = (List<String>) cv.callbackParam;
-                    return isIfaceMatch(regexs, interfaces);
-                }));
-        }
-
-        public void expectTetheredInterfacesChanged(@NonNull List<String> regexs) {
-            assertNotNull("No expected tethered ifaces callback", mCurrent.poll(TIMEOUT_MS,
-                (cv) -> {
-                    if (cv.callbackType != CallbackType.ON_TETHERED_IFACES) return false;
-
-                    final List<String> interfaces = (List<String>) cv.callbackParam;
-
-                    // Null regexs means no active tethering.
-                    if (regexs == null) return interfaces.isEmpty();
-
-                    return isIfaceMatch(regexs, interfaces);
-                }));
-        }
-
-        public void expectCallbackStarted() {
-            int receivedBitMap = 0;
-            // The each bit represent a type from CallbackType.ON_*.
-            // Expect all of callbacks except for ON_ERROR.
-            final int expectedBitMap = 0xff ^ (1 << CallbackType.ON_ERROR.ordinal());
-            // Receive ON_ERROR on started callback is not matter. It just means tethering is
-            // failed last time, should able to continue the test this time.
-            while ((receivedBitMap & expectedBitMap) != expectedBitMap) {
-                final CallbackValue cv = mCurrent.poll(TIMEOUT_MS, c -> true);
-                if (cv == null) {
-                    fail("No expected callbacks, " + "expected bitmap: "
-                            + expectedBitMap + ", actual: " + receivedBitMap);
-                }
-
-                receivedBitMap |= (1 << cv.callbackType.ordinal());
-            }
-        }
-
-        public void expectOneOfOffloadStatusChanged(int... offloadStatuses) {
-            assertNotNull("No offload status changed", mCurrent.poll(TIMEOUT_MS, (cv) -> {
-                if (cv.callbackType != CallbackType.ON_OFFLOAD_STATUS) return false;
-
-                final int status = (int) cv.callbackParam;
-                for (int offloadStatus : offloadStatuses) if (offloadStatus == status) return true;
-
-                return false;
-            }));
-        }
-
-        public void expectErrorOrTethered(final String iface) {
-            assertNotNull("No expected callback", mCurrent.poll(TIMEOUT_MS, (cv) -> {
-                if (cv.callbackType == CallbackType.ON_ERROR
-                        && iface.equals((String) cv.callbackParam)) {
-                    return true;
-                }
-                if (cv.callbackType == CallbackType.ON_TETHERED_IFACES
-                        && ((List<String>) cv.callbackParam).contains(iface)) {
-                    return true;
-                }
-
-                return false;
-            }));
-        }
-
-        public Network getCurrentValidUpstream() {
-            final CallbackValue result = mCurrent.poll(TIMEOUT_MS, (cv) -> {
-                return (cv.callbackType == CallbackType.ON_UPSTREAM)
-                        && cv.callbackParam != null;
-            });
-
-            assertNotNull("No valid upstream", result);
-            return (Network) result.callbackParam;
-        }
-
-        public void assumeTetheringSupported() {
-            final ArrayTrackRecord<CallbackValue>.ReadHead history =
-                    mHistory.newReadHead();
-            assertNotNull("No onSupported callback", history.poll(TIMEOUT_MS, (cv) -> {
-                if (cv.callbackType != CallbackType.ON_SUPPORTED) return false;
-
-                assumeTrue(cv.callbackParam2 == 1 /* supported */);
-                return true;
-            }));
-        }
-
-        public TetheringInterfaceRegexps getTetheringInterfaceRegexps() {
-            return mTetherableRegex;
-        }
-
-        public List<String> getTetherableInterfaces() {
-            return mTetherableIfaces;
-        }
-
-        public List<String> getTetheredInterfaces() {
-            return mTetheredIfaces;
-        }
-    }
-
-    private TestTetheringEventCallback registerTetheringEventCallback() {
-        final TestTetheringEventCallback tetherEventCallback =
-                new TestTetheringEventCallback();
-
-        mTM.registerTetheringEventCallback(c -> c.run() /* executor */, tetherEventCallback);
-        tetherEventCallback.expectCallbackStarted();
-
-        return tetherEventCallback;
-    }
-
-    private void unregisterTetheringEventCallback(final TestTetheringEventCallback callback) {
-        mTM.unregisterTetheringEventCallback(callback);
-    }
-
-    private List<String> getWifiTetherableInterfaceRegexps(
-            final TestTetheringEventCallback callback) {
-        return callback.getTetheringInterfaceRegexps().getTetherableWifiRegexs();
-    }
-
-    private boolean isWifiTetheringSupported(final TestTetheringEventCallback callback) {
-        return !getWifiTetherableInterfaceRegexps(callback).isEmpty();
-    }
-
-    private void startWifiTethering(final TestTetheringEventCallback callback)
-            throws InterruptedException {
-        final List<String> wifiRegexs = getWifiTetherableInterfaceRegexps(callback);
-        assertFalse(isIfaceMatch(wifiRegexs, callback.getTetheredInterfaces()));
-
-        final StartTetheringCallback startTetheringCallback = new StartTetheringCallback();
-        final TetheringRequest request = new TetheringRequest.Builder(TETHERING_WIFI)
-                .setShouldShowEntitlementUi(false).build();
-        mTM.startTethering(request, c -> c.run() /* executor */, startTetheringCallback);
-        startTetheringCallback.verifyTetheringStarted();
-
-        callback.expectTetheredInterfacesChanged(wifiRegexs);
-
-        callback.expectOneOfOffloadStatusChanged(
-                TETHER_HARDWARE_OFFLOAD_STARTED,
-                TETHER_HARDWARE_OFFLOAD_FAILED);
-    }
-
-    private void stopWifiTethering(final TestTetheringEventCallback callback) {
-        mTM.stopTethering(TETHERING_WIFI);
-        expectSoftApDisabled();
-        callback.expectTetheredInterfacesChanged(null);
-        callback.expectOneOfOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STOPPED);
-    }
-
-    @Test
-    public void testRegisterTetheringEventCallback() throws Exception {
-        final TestTetheringEventCallback tetherEventCallback = registerTetheringEventCallback();
-        tetherEventCallback.assumeTetheringSupported();
-
-        if (!isWifiTetheringSupported(tetherEventCallback)) {
-            unregisterTetheringEventCallback(tetherEventCallback);
-            return;
-        }
-
-        startWifiTethering(tetherEventCallback);
-
-        final List<String> tetheredIfaces = tetherEventCallback.getTetheredInterfaces();
-        assertEquals(1, tetheredIfaces.size());
-        final String wifiTetheringIface = tetheredIfaces.get(0);
-
-        stopWifiTethering(tetherEventCallback);
-
-        try {
-            final int ret = mTM.tether(wifiTetheringIface);
-
-            // There is no guarantee that the wifi interface will be available after disabling
-            // the hotspot, so don't fail the test if the call to tether() fails.
-            assumeTrue(ret == TETHER_ERROR_NO_ERROR);
-
-            // If calling #tether successful, there is a callback to tell the result of tethering
-            // setup.
-            tetherEventCallback.expectErrorOrTethered(wifiTetheringIface);
-        } finally {
-            mTM.untether(wifiTetheringIface);
-            unregisterTetheringEventCallback(tetherEventCallback);
-        }
-    }
-
-    @Test
-    public void testGetTetherableInterfaceRegexps() {
-        final TestTetheringEventCallback tetherEventCallback = registerTetheringEventCallback();
-        tetherEventCallback.assumeTetheringSupported();
-
-        final TetheringInterfaceRegexps tetherableRegexs =
-                tetherEventCallback.getTetheringInterfaceRegexps();
-        final List<String> wifiRegexs = tetherableRegexs.getTetherableWifiRegexs();
-        final List<String> usbRegexs = tetherableRegexs.getTetherableUsbRegexs();
-        final List<String> btRegexs = tetherableRegexs.getTetherableBluetoothRegexs();
-
-        assertEquals(wifiRegexs, Arrays.asList(mTM.getTetherableWifiRegexs()));
-        assertEquals(usbRegexs, Arrays.asList(mTM.getTetherableUsbRegexs()));
-        assertEquals(btRegexs, Arrays.asList(mTM.getTetherableBluetoothRegexs()));
-
-        //Verify that any regex name should only contain in one array.
-        wifiRegexs.forEach(s -> assertFalse(usbRegexs.contains(s)));
-        wifiRegexs.forEach(s -> assertFalse(btRegexs.contains(s)));
-        usbRegexs.forEach(s -> assertFalse(btRegexs.contains(s)));
-
-        unregisterTetheringEventCallback(tetherEventCallback);
-    }
-
-    @Test
-    public void testStopAllTethering() throws Exception {
-        final TestTetheringEventCallback tetherEventCallback = registerTetheringEventCallback();
-        tetherEventCallback.assumeTetheringSupported();
-
-        try {
-            if (!isWifiTetheringSupported(tetherEventCallback)) return;
-
-            // TODO: start ethernet tethering here when TetheringManagerTest is moved to
-            // TetheringIntegrationTest.
-
-            startWifiTethering(tetherEventCallback);
-
-            mTM.stopAllTethering();
-            tetherEventCallback.expectTetheredInterfacesChanged(null);
-        } finally {
-            unregisterTetheringEventCallback(tetherEventCallback);
-        }
-    }
-
-    @Test
-    public void testEnableTetheringPermission() throws Exception {
-        dropShellPermissionIdentity();
-        final StartTetheringCallback startTetheringCallback = new StartTetheringCallback();
-        mTM.startTethering(new TetheringRequest.Builder(TETHERING_WIFI).build(),
-                c -> c.run() /* executor */, startTetheringCallback);
-        startTetheringCallback.expectTetheringFailed(TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION);
-    }
-
-    private class EntitlementResultListener implements OnTetheringEntitlementResultListener {
-        private final CompletableFuture<Integer> future = new CompletableFuture<>();
-
-        @Override
-        public void onTetheringEntitlementResult(int result) {
-            future.complete(result);
-        }
-
-        public int get(long timeout, TimeUnit unit) throws Exception {
-            return future.get(timeout, unit);
-        }
-
-    }
-
-    private void assertEntitlementResult(final Consumer<EntitlementResultListener> functor,
-            final int expect) throws Exception {
-        final EntitlementResultListener listener = new EntitlementResultListener();
-        functor.accept(listener);
-
-        assertEquals(expect, listener.get(DEFAULT_TIMEOUT_MS, TimeUnit.MILLISECONDS));
-    }
-
-    @Test
-    public void testRequestLatestEntitlementResult() throws Exception {
-        assumeTrue(mTM.isTetheringSupported());
-        // Verify that requestLatestTetheringEntitlementResult() can get entitlement
-        // result(TETHER_ERROR_ENTITLEMENT_UNKNOWN due to invalid downstream type) via listener.
-        assertEntitlementResult(listener -> mTM.requestLatestTetheringEntitlementResult(
-                TETHERING_WIFI_P2P, false, c -> c.run(), listener),
-                TETHER_ERROR_ENTITLEMENT_UNKNOWN);
-
-        // Verify that requestLatestTetheringEntitlementResult() can get entitlement
-        // result(TETHER_ERROR_ENTITLEMENT_UNKNOWN due to invalid downstream type) via receiver.
-        assertEntitlementResult(listener -> mTM.requestLatestTetheringEntitlementResult(
-                TETHERING_WIFI_P2P,
-                new ResultReceiver(null /* handler */) {
-                    @Override
-                    public void onReceiveResult(int resultCode, Bundle resultData) {
-                        listener.onTetheringEntitlementResult(resultCode);
-                    }
-                }, false),
-                TETHER_ERROR_ENTITLEMENT_UNKNOWN);
-
-        // Do not request TETHERING_WIFI entitlement result if TETHERING_WIFI is not available.
-        assumeTrue(mTM.getTetherableWifiRegexs().length > 0);
-
-        // Verify that null listener will cause IllegalArgumentException.
-        try {
-            mTM.requestLatestTetheringEntitlementResult(
-                    TETHERING_WIFI, false, c -> c.run(), null);
-        } catch (IllegalArgumentException expect) { }
-
-        // Override carrier config to ignore entitlement check.
-        final PersistableBundle bundle = new PersistableBundle();
-        bundle.putBoolean(CarrierConfigManager.KEY_REQUIRE_ENTITLEMENT_CHECKS_BOOL, false);
-        overrideCarrierConfig(bundle);
-
-        // Verify that requestLatestTetheringEntitlementResult() can get entitlement
-        // result TETHER_ERROR_NO_ERROR due to provisioning bypassed.
-        assertEntitlementResult(listener -> mTM.requestLatestTetheringEntitlementResult(
-                TETHERING_WIFI, false, c -> c.run(), listener), TETHER_ERROR_NO_ERROR);
-
-        // Reset carrier config.
-        overrideCarrierConfig(null);
-    }
-
-    private void overrideCarrierConfig(PersistableBundle bundle) {
-        final CarrierConfigManager configManager = (CarrierConfigManager) mContext
-                .getSystemService(Context.CARRIER_CONFIG_SERVICE);
-        final int subId = SubscriptionManager.getDefaultSubscriptionId();
-        configManager.overrideConfig(subId, bundle);
-    }
-
-    @Test
-    public void testTetheringUpstream() throws Exception {
-        assumeTrue(mPm.hasSystemFeature(FEATURE_TELEPHONY));
-        final TestTetheringEventCallback tetherEventCallback = registerTetheringEventCallback();
-        tetherEventCallback.assumeTetheringSupported();
-        final boolean previousWifiEnabledState = mWm.isWifiEnabled();
-
-        try {
-            if (!isWifiTetheringSupported(tetherEventCallback)) return;
-
-            if (previousWifiEnabledState) {
-                mCtsNetUtils.disconnectFromWifi(null);
-            }
-
-            final TestNetworkCallback networkCallback = new TestNetworkCallback();
-            Network activeNetwork = null;
-            try {
-                mCm.registerDefaultNetworkCallback(networkCallback);
-                activeNetwork = networkCallback.waitForAvailable();
-            } finally {
-                mCm.unregisterNetworkCallback(networkCallback);
-            }
-
-            assertNotNull("No active network. Please ensure the device has working mobile data.",
-                    activeNetwork);
-            final NetworkCapabilities activeNetCap = mCm.getNetworkCapabilities(activeNetwork);
-
-            // If active nework is ETHERNET, tethering may not use cell network as upstream.
-            assumeFalse(activeNetCap.hasTransport(TRANSPORT_ETHERNET));
-
-            assertTrue(activeNetCap.hasTransport(TRANSPORT_CELLULAR));
-
-            startWifiTethering(tetherEventCallback);
-
-            final TelephonyManager telephonyManager = (TelephonyManager) mContext.getSystemService(
-                    Context.TELEPHONY_SERVICE);
-            final boolean dunRequired = telephonyManager.isTetheringApnRequired();
-            final int expectedCap = dunRequired ? NET_CAPABILITY_DUN : NET_CAPABILITY_INTERNET;
-            final Network network = tetherEventCallback.getCurrentValidUpstream();
-            final NetworkCapabilities netCap = mCm.getNetworkCapabilities(network);
-            assertTrue(netCap.hasTransport(TRANSPORT_CELLULAR));
-            assertTrue(netCap.hasCapability(expectedCap));
-
-            stopWifiTethering(tetherEventCallback);
-        } finally {
-            unregisterTetheringEventCallback(tetherEventCallback);
-            if (previousWifiEnabledState) {
-                mCtsNetUtils.connectToWifi();
-            }
-        }
-    }
-}
diff --git a/tests/tests/text/Android.bp b/tests/tests/text/Android.bp
index b2e297c..0a7d918 100644
--- a/tests/tests/text/Android.bp
+++ b/tests/tests/text/Android.bp
@@ -33,8 +33,8 @@
     ],
 
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
 
     jni_libs: [
@@ -47,7 +47,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "mts",
     ],
diff --git a/tests/tests/text/OWNERS b/tests/tests/text/OWNERS
index a163bf7..73d670f6 100644
--- a/tests/tests/text/OWNERS
+++ b/tests/tests/text/OWNERS
@@ -5,5 +5,5 @@
 nona@google.com
 clarabayarri@google.com
 nfuller@google.com
-tobiast@google.com
+ngeoffray@google.com
 vichang@google.com
diff --git a/tests/tests/text/src/android/text/format/cts/DateFormatTest.java b/tests/tests/text/src/android/text/format/cts/DateFormatTest.java
index 98c1e52..925b05e 100644
--- a/tests/tests/text/src/android/text/format/cts/DateFormatTest.java
+++ b/tests/tests/text/src/android/text/format/cts/DateFormatTest.java
@@ -352,4 +352,15 @@
                     "settings put system " + Settings.System.TIME_12_24 + " " + timeFormat);
         }
     }
+
+    @Test
+    public void test_getBestDateTimePattern() {
+        assertEquals("d MMMM", DateFormat.getBestDateTimePattern(new Locale("ca", "ES"), "MMMMd"));
+        assertEquals("d 'de' MMMM", DateFormat.getBestDateTimePattern(new Locale("es", "ES"),
+                "MMMMd"));
+        assertEquals("d. MMMM", DateFormat.getBestDateTimePattern(new Locale("de", "CH"), "MMMMd"));
+        assertEquals("MMMM d", DateFormat.getBestDateTimePattern(new Locale("en", "US"), "MMMMd"));
+        assertEquals("d LLLL", DateFormat.getBestDateTimePattern(new Locale("fa", "IR"), "MMMMd"));
+        assertEquals("M月d日", DateFormat.getBestDateTimePattern(new Locale("ja", "JP"), "MMMMd"));
+    }
 }
diff --git a/tests/tests/textclassifier/Android.bp b/tests/tests/textclassifier/Android.bp
index cad6924..c3e0383 100644
--- a/tests/tests/textclassifier/Android.bp
+++ b/tests/tests/textclassifier/Android.bp
@@ -20,11 +20,10 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "mts"
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     static_libs: [
         "androidx.test.core",
         "androidx.test.rules",
diff --git a/tests/tests/textclassifier/QueryTextClassifierServiceActivity/Android.bp b/tests/tests/textclassifier/QueryTextClassifierServiceActivity/Android.bp
index 17dd73c..ccc9362 100644
--- a/tests/tests/textclassifier/QueryTextClassifierServiceActivity/Android.bp
+++ b/tests/tests/textclassifier/QueryTextClassifierServiceActivity/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "mts"
     ],
diff --git a/tests/tests/theme/Android.bp b/tests/tests/theme/Android.bp
index bd4154c..20a8ce2 100644
--- a/tests/tests/theme/Android.bp
+++ b/tests/tests/theme/Android.bp
@@ -19,15 +19,14 @@
     static_libs: ["ctstestrunner-axt"],
 
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
 
     srcs: ["src/**/*.java"],
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/tests/tests/toast/Android.bp b/tests/tests/toast/Android.bp
index 23dd572..aa85ab9 100644
--- a/tests/tests/toast/Android.bp
+++ b/tests/tests/toast/Android.bp
@@ -19,7 +19,6 @@
     defaults: ["cts_defaults"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: [
diff --git a/tests/tests/toastlegacy/Android.bp b/tests/tests/toastlegacy/Android.bp
index f9bb54c..a558405 100644
--- a/tests/tests/toastlegacy/Android.bp
+++ b/tests/tests/toastlegacy/Android.bp
@@ -19,7 +19,6 @@
     defaults: ["cts_defaults"],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: [
diff --git a/tests/tests/tools/processors/view_inspector/Android.bp b/tests/tests/tools/processors/view_inspector/Android.bp
index cfa6b1d..7b39403 100644
--- a/tests/tests/tools/processors/view_inspector/Android.bp
+++ b/tests/tests/tools/processors/view_inspector/Android.bp
@@ -28,7 +28,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ]
 }
diff --git a/tests/tests/transition/Android.bp b/tests/tests/transition/Android.bp
index 063e303..35cd22a 100644
--- a/tests/tests/transition/Android.bp
+++ b/tests/tests/transition/Android.bp
@@ -26,13 +26,12 @@
         "platform-test-annotations",
     ],
 
-    libs: ["android.test.runner.stubs"],
+    libs: ["android.test.runner"],
 
     srcs: ["src/**/*.java"],
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/tests/tests/tv/Android.bp b/tests/tests/tv/Android.bp
index f399c49..93e4be3 100644
--- a/tests/tests/tv/Android.bp
+++ b/tests/tests/tv/Android.bp
@@ -18,13 +18,12 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     srcs: ["src/**/*.java"],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     static_libs: [
         "androidx.test.core",
diff --git a/tests/tests/tv/src/android/media/tv/cts/TvTrackInfoSubject.java b/tests/tests/tv/src/android/media/tv/cts/TvTrackInfoSubject.java
index cb1bae9..5525963 100644
--- a/tests/tests/tv/src/android/media/tv/cts/TvTrackInfoSubject.java
+++ b/tests/tests/tv/src/android/media/tv/cts/TvTrackInfoSubject.java
@@ -33,7 +33,7 @@
 import com.google.common.truth.Subject;
 
 /** Test {@link Subject} for {@link TvTrackInfo}. */
-public final class TvTrackInfoSubject extends Subject<TvTrackInfoSubject, TvTrackInfo> {
+public final class TvTrackInfoSubject extends Subject {
     // TODO(b/153190774): Move to androidx.test.ext.truth
 
     @Nullable
diff --git a/tests/tests/uiautomation/Android.bp b/tests/tests/uiautomation/Android.bp
index 529d9b5..9254d27 100644
--- a/tests/tests/uiautomation/Android.bp
+++ b/tests/tests/uiautomation/Android.bp
@@ -18,7 +18,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: [
@@ -26,7 +25,7 @@
         "ctstestrunner-axt",
         "ub-uiautomator",
     ],
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
     srcs: ["src/**/*.java"],
     sdk_version: "test_current",
 }
diff --git a/tests/tests/uidisolation/Android.bp b/tests/tests/uidisolation/Android.bp
index f365066..0dbac1a 100644
--- a/tests/tests/uidisolation/Android.bp
+++ b/tests/tests/uidisolation/Android.bp
@@ -18,7 +18,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     static_libs: [
@@ -27,8 +26,8 @@
     ],
     libs: [
         "org.apache.http.legacy",
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     sdk_version: "current",
diff --git a/tests/tests/uirendering/Android.bp b/tests/tests/uirendering/Android.bp
index ee9fa2b..c014aa6 100644
--- a/tests/tests/uirendering/Android.bp
+++ b/tests/tests/uirendering/Android.bp
@@ -30,11 +30,10 @@
         "kotlin-test",
     ],
 
-    libs: ["android.test.runner.stubs"],
+    libs: ["android.test.runner"],
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/uirendering27/Android.bp b/tests/tests/uirendering27/Android.bp
index a4f9e32..07bc405 100644
--- a/tests/tests/uirendering27/Android.bp
+++ b/tests/tests/uirendering27/Android.bp
@@ -30,11 +30,10 @@
         "kotlin-test",
     ],
 
-    libs: ["android.test.runner.stubs"],
+    libs: ["android.test.runner"],
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/usb/Android.bp b/tests/tests/usb/Android.bp
index 5138124..5195233 100644
--- a/tests/tests/usb/Android.bp
+++ b/tests/tests/usb/Android.bp
@@ -21,8 +21,8 @@
 	"ctstestrunner-axt",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
 
diff --git a/tests/tests/util/Android.bp b/tests/tests/util/Android.bp
index 8879628..f2fa420 100644
--- a/tests/tests/util/Android.bp
+++ b/tests/tests/util/Android.bp
@@ -18,10 +18,9 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
-    libs: ["android.test.runner.stubs"],
+    libs: ["android.test.runner"],
     static_libs: [
         "androidx.annotation_annotation",
         "androidx.test.rules",
diff --git a/tests/tests/util/src/android/util/cts/AndroidExceptionTest.java b/tests/tests/util/src/android/util/cts/AndroidExceptionTest.java
index 05a5bf6..04d56a2 100644
--- a/tests/tests/util/src/android/util/cts/AndroidExceptionTest.java
+++ b/tests/tests/util/src/android/util/cts/AndroidExceptionTest.java
@@ -50,5 +50,12 @@
         } catch (AndroidException e) {
             assertEquals(CAUSE, e.getCause());
         }
+
+        try {
+            throw new AndroidException(NAME, CAUSE);
+        } catch (AndroidException e) {
+            assertEquals(NAME, e.getMessage());
+            assertEquals(CAUSE, e.getCause());
+        }
     }
 }
diff --git a/tests/tests/util/src/android/util/cts/ArrayMapTest.java b/tests/tests/util/src/android/util/cts/ArrayMapTest.java
index cc9feac..b70166b 100644
--- a/tests/tests/util/src/android/util/cts/ArrayMapTest.java
+++ b/tests/tests/util/src/android/util/cts/ArrayMapTest.java
@@ -39,6 +39,7 @@
 import java.util.AbstractMap;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -671,4 +672,31 @@
         assertEquals(a.hashCode(), b.hashCode());
     }
 
+    @Test
+    public void testRemoveAll() {
+        final ArrayMap<Integer, String> map = new ArrayMap<>();
+        for (Integer i : Arrays.asList(0, 1, 2, 3, 4, 5)) {
+            map.put(i, i.toString());
+        }
+
+        final ArrayMap<Integer, String> expectedMap = new ArrayMap<>();
+        for (Integer i :  Arrays.asList(2, 4)) {
+            expectedMap.put(i, String.valueOf(i));
+        }
+        map.removeAll(Arrays.asList(0, 1, 3, 5, 6));
+        if (!compare(map, expectedMap)) {
+            fail("ArrayMap removeAll failure, expect " + expectedMap + ", but " + map);
+        }
+
+        map.removeAll(Collections.emptyList());
+        if (!compare(map, expectedMap)) {
+            fail("ArrayMap removeAll failure for empty maps, expect " + expectedMap + ", but " +
+                    map);
+        }
+
+        map.removeAll(Arrays.asList(2, 4));
+        if (!map.isEmpty()) {
+            fail("ArrayMap removeAll failure, expect empty, but " + map);
+        }
+    }
 }
diff --git a/tests/tests/vcn/OWNERS b/tests/tests/vcn/OWNERS
new file mode 100644
index 0000000..350d2db
--- /dev/null
+++ b/tests/tests/vcn/OWNERS
@@ -0,0 +1,2 @@
+nharold@google.com
+junyin@google.com
\ No newline at end of file
diff --git a/tests/tests/view/Android.mk b/tests/tests/view/Android.mk
index 3ba381c..3c16650 100644
--- a/tests/tests/view/Android.mk
+++ b/tests/tests/view/Android.mk
@@ -22,7 +22,7 @@
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 LOCAL_MULTILIB := both
 
@@ -38,7 +38,8 @@
     platform-test-annotations \
     ub-uiautomator \
     truth-prebuilt \
-    CtsSurfaceValidatorLib
+    CtsSurfaceValidatorLib \
+    cts-wm-util
 
 
 LOCAL_JNI_SHARED_LIBRARIES := libctsview_jni libnativehelper_compat_libc++
diff --git a/tests/tests/view/sdk28/Android.bp b/tests/tests/view/sdk28/Android.bp
index b8195a5..71eb9e4 100644
--- a/tests/tests/view/sdk28/Android.bp
+++ b/tests/tests/view/sdk28/Android.bp
@@ -19,15 +19,14 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
     compile_multilib: "both",
 
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
 
     static_libs: [
diff --git a/tests/tests/view/src/android/view/cts/ASurfaceControlTest.java b/tests/tests/view/src/android/view/cts/ASurfaceControlTest.java
index 05f8d4a..affc2ae 100644
--- a/tests/tests/view/src/android/view/cts/ASurfaceControlTest.java
+++ b/tests/tests/view/src/android/view/cts/ASurfaceControlTest.java
@@ -18,6 +18,8 @@
 
 import static org.junit.Assert.assertTrue;
 
+import static android.server.wm.WindowManagerState.getLogicalDisplaySize;
+
 import android.animation.ObjectAnimator;
 import android.animation.PropertyValuesHolder;
 import android.animation.ValueAnimator;
@@ -77,6 +79,7 @@
     @Before
     public void setup() {
         mActivity = mActivityRule.getActivity();
+        mActivity.setLogicalDisplaySize(getLogicalDisplaySize());
     }
 
     /**
diff --git a/tests/tests/view/src/android/view/cts/PixelCopyViewProducerActivity.java b/tests/tests/view/src/android/view/cts/PixelCopyViewProducerActivity.java
index 07aa4fd..780b071 100644
--- a/tests/tests/view/src/android/view/cts/PixelCopyViewProducerActivity.java
+++ b/tests/tests/view/src/android/view/cts/PixelCopyViewProducerActivity.java
@@ -21,7 +21,6 @@
 import android.app.Activity;
 import android.content.Context;
 import android.content.pm.ActivityInfo;
-import android.content.pm.PackageManager;
 import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.Paint;
@@ -31,6 +30,7 @@
 import android.view.View;
 import android.view.ViewTreeObserver.OnDrawListener;
 import android.view.WindowInsets;
+import android.view.cts.util.DisplayUtils;
 import android.widget.FrameLayout;
 
 import java.util.concurrent.CountDownLatch;
@@ -56,9 +56,7 @@
         super.onCreate(savedInstanceState);
 
         // Check if the device supports both of portrait and landscape orientation screens.
-        final PackageManager pm = getPackageManager();
-        mSupportsRotation = pm.hasSystemFeature(PackageManager.FEATURE_SCREEN_LANDSCAPE)
-                    && pm.hasSystemFeature(PackageManager.FEATURE_SCREEN_PORTRAIT);
+        mSupportsRotation = DisplayUtils.supportOrientationRequest(this);
         if (mSupportsRotation) {
             setRequestedOrientation(ORIENTATIONS[mCurrentOrientation]);
         }
@@ -74,11 +72,10 @@
     @Override
     public void onDraw() {
         final int requestedOrientation = ORIENTATIONS[mCurrentOrientation];
-        boolean screenPortrait =
+        boolean isRequestingPortrait =
                 requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
                 || requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
-        boolean contentPortrait = mContent.getHeight() > mContent.getWidth();
-        if (mSupportsRotation && (screenPortrait != contentPortrait)) {
+        if (mSupportsRotation && (isRequestingPortrait != DisplayUtils.isDevicePortrait(this))) {
             return;
         }
         mContent.post(() -> {
diff --git a/tests/tests/view/src/android/view/cts/PixelCopyWideGamutViewProducerActivity.java b/tests/tests/view/src/android/view/cts/PixelCopyWideGamutViewProducerActivity.java
index d8a512d..3128328 100644
--- a/tests/tests/view/src/android/view/cts/PixelCopyWideGamutViewProducerActivity.java
+++ b/tests/tests/view/src/android/view/cts/PixelCopyWideGamutViewProducerActivity.java
@@ -16,10 +16,11 @@
 
 package android.view.cts;
 
+import static org.junit.Assert.fail;
+
 import android.app.Activity;
 import android.content.Context;
 import android.content.pm.ActivityInfo;
-import android.content.pm.PackageManager;
 import android.content.res.AssetManager;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
@@ -29,14 +30,13 @@
 import android.os.Bundle;
 import android.view.View;
 import android.view.ViewTreeObserver.OnDrawListener;
+import android.view.cts.util.DisplayUtils;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
-import static org.junit.Assert.fail;
-
 public class PixelCopyWideGamutViewProducerActivity extends Activity implements OnDrawListener {
     private static final int[] ORIENTATIONS = {
             ActivityInfo.SCREEN_ORIENTATION_PORTRAIT,
@@ -55,9 +55,7 @@
         super.onCreate(savedInstanceState);
 
         // Check if the device supports both of portrait and landscape orientation screens.
-        final PackageManager pm = getPackageManager();
-        mSupportsRotation = pm.hasSystemFeature(PackageManager.FEATURE_SCREEN_LANDSCAPE)
-                    && pm.hasSystemFeature(PackageManager.FEATURE_SCREEN_PORTRAIT);
+        mSupportsRotation = DisplayUtils.supportOrientationRequest(this);
         if (mSupportsRotation) {
             setRequestedOrientation(ORIENTATIONS[mCurrentOrientation]);
         }
@@ -72,11 +70,10 @@
     @Override
     public void onDraw() {
         final int requestedOrientation = ORIENTATIONS[mCurrentOrientation];
-        boolean screenPortrait =
+        boolean isRequestingPortrait =
                 requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
                 || requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
-        boolean contentPortrait = mContent.getHeight() > mContent.getWidth();
-        if (mSupportsRotation && (screenPortrait != contentPortrait)) {
+        if (mSupportsRotation && (isRequestingPortrait != DisplayUtils.isDevicePortrait(this))) {
             return;
         }
         mContent.post(() -> {
diff --git a/tests/tests/view/src/android/view/cts/SurfaceViewSyncTest.java b/tests/tests/view/src/android/view/cts/SurfaceViewSyncTest.java
index a2b01f4..645d9fa 100644
--- a/tests/tests/view/src/android/view/cts/SurfaceViewSyncTest.java
+++ b/tests/tests/view/src/android/view/cts/SurfaceViewSyncTest.java
@@ -15,6 +15,8 @@
  */
 package android.view.cts;
 
+import static android.server.wm.WindowManagerState.getLogicalDisplaySize;
+
 import android.animation.ObjectAnimator;
 import android.animation.PropertyValuesHolder;
 import android.animation.ValueAnimator;
@@ -70,6 +72,7 @@
     public void setup() {
         mActivity = mActivityRule.getActivity();
         mMediaPlayer = mActivity.getMediaPlayer();
+        mActivity.setLogicalDisplaySize(getLogicalDisplaySize());
     }
 
     /**
diff --git a/tests/tests/view/src/android/view/cts/TouchDelegateTestActivity.java b/tests/tests/view/src/android/view/cts/TouchDelegateTestActivity.java
index 49f9eb7..7c87b36 100644
--- a/tests/tests/view/src/android/view/cts/TouchDelegateTestActivity.java
+++ b/tests/tests/view/src/android/view/cts/TouchDelegateTestActivity.java
@@ -70,9 +70,9 @@
                     @Override
                     public void onGlobalLayout() {
                         final int[] parentLocation = new int[2];
-                        parent.getLocationOnScreen(parentLocation);
+                        parent.getLocationInWindow(parentLocation);
                         final int[] buttonLocation = new int[2];
-                        button.getLocationOnScreen(buttonLocation);
+                        button.getLocationInWindow(buttonLocation);
                         x = parentLocation[0] + parent.getWidth() / 2;
                         final int gap = buttonLocation[1] - parentLocation[1];
 
diff --git a/tests/tests/view/src/android/view/cts/util/DisplayUtils.java b/tests/tests/view/src/android/view/cts/util/DisplayUtils.java
new file mode 100644
index 0000000..92b0457
--- /dev/null
+++ b/tests/tests/view/src/android/view/cts/util/DisplayUtils.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2020 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.cts.util;
+
+import android.app.Activity;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.util.DisplayMetrics;
+
+/** Utilities class for querying display info. */
+public class DisplayUtils {
+
+    /** Whether the device supports orientation request from apps. */
+    public static boolean supportOrientationRequest(final Activity activity) {
+        final PackageManager pm = activity.getPackageManager();
+        return pm.hasSystemFeature(PackageManager.FEATURE_SCREEN_LANDSCAPE)
+                && pm.hasSystemFeature(PackageManager.FEATURE_SCREEN_PORTRAIT)
+                && !isCloseToSquareDisplay(activity);
+    }
+
+    /** Checks whether the display dimension is close to square. */
+    public static boolean isCloseToSquareDisplay(final Activity activity) {
+        final Resources resources = activity.getResources();
+        final float closeToSquareMaxAspectRatio;
+        try {
+            closeToSquareMaxAspectRatio = resources.getFloat(resources.getIdentifier(
+                    "config_closeToSquareDisplayMaxAspectRatio", "dimen", "android"));
+        } catch (Resources.NotFoundException e) {
+            // Assume device is not close to square.
+            return false;
+        }
+        final DisplayMetrics displayMetrics = new DisplayMetrics();
+        activity.getDisplay().getRealMetrics(displayMetrics);
+        final int w = displayMetrics.widthPixels;
+        final int h = displayMetrics.heightPixels;
+        final float aspectRatio = Math.max(w, h) / (float) Math.min(w, h);
+        return aspectRatio <= closeToSquareMaxAspectRatio;
+    }
+
+    /** Whether the device is in portrait. */
+    public static boolean isDevicePortrait(final Activity activity) {
+        final DisplayMetrics displayMetrics = new DisplayMetrics();
+        activity.getDisplay().getRealMetrics(displayMetrics);
+        return displayMetrics.widthPixels < displayMetrics.heightPixels;
+    }
+
+    private DisplayUtils() {}
+}
diff --git a/tests/tests/view/surfacevalidator/src/android/view/cts/surfacevalidator/CapturedActivity.java b/tests/tests/view/surfacevalidator/src/android/view/cts/surfacevalidator/CapturedActivity.java
index ab35c55..9401370 100644
--- a/tests/tests/view/surfacevalidator/src/android/view/cts/surfacevalidator/CapturedActivity.java
+++ b/tests/tests/view/surfacevalidator/src/android/view/cts/surfacevalidator/CapturedActivity.java
@@ -98,6 +98,7 @@
     private volatile boolean mOnWatch;
     private CountDownLatch mCountDownLatch;
     private boolean mProjectionServiceBound = false;
+    private Point mLogicalDisplaySize = new Point();
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -130,6 +131,10 @@
         bindMediaProjectionService();
     }
 
+    public void setLogicalDisplaySize(Point logicalDisplaySize) {
+        mLogicalDisplaySize.set(logicalDisplaySize.x, logicalDisplaySize.y);
+    }
+
     public void dismissPermissionDialog() {
         // The permission dialog will be auto-opened by the activity - find it and accept
         UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
@@ -248,7 +253,6 @@
             Log.d(TAG, "Starting capture");
 
             Display display = getWindow().getDecorView().getDisplay();
-            Point size = new Point();
             DisplayMetrics metrics = new DisplayMetrics();
             display.getMetrics(metrics);
 
@@ -258,7 +262,6 @@
             final Display defaultDisplay = displayManager.getDisplay(Display.DEFAULT_DISPLAY);
             final int rotation = defaultDisplay.getRotation();
             Display.Mode mode = defaultDisplay.getMode();
-            size = new Point(mode.getPhysicalWidth(), mode.getPhysicalHeight());
 
             View testAreaView = findViewById(android.R.id.content);
             Rect boundsToCheck = new Rect(0, 0, testAreaView.getWidth(), testAreaView.getHeight());
@@ -271,11 +274,11 @@
             }
 
             mSurfacePixelValidator = new SurfacePixelValidator2(CapturedActivity.this,
-                    size, boundsToCheck, animationTestCase.getChecker());
-            Log.d("MediaProjection", "Size is " + size.toString()
-                    + ", bounds are " + boundsToCheck.toShortString());
+                mLogicalDisplaySize, boundsToCheck, animationTestCase.getChecker());
+                Log.d("MediaProjection", "Size is " + mLogicalDisplaySize.toString()
+                + ", bounds are " + boundsToCheck.toShortString());
             mVirtualDisplay = mMediaProjection.createVirtualDisplay("CtsCapturedActivity",
-                    size.x, size.y,
+                    mLogicalDisplaySize.x, mLogicalDisplaySize.y,
                     metrics.densityDpi,
                     DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                     mSurfacePixelValidator.getSurface(),
diff --git a/tests/tests/voiceinteraction/Android.bp b/tests/tests/voiceinteraction/Android.bp
index f242200..c44c539 100644
--- a/tests/tests/voiceinteraction/Android.bp
+++ b/tests/tests/voiceinteraction/Android.bp
@@ -25,7 +25,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/voiceinteraction/service/Android.bp b/tests/tests/voiceinteraction/service/Android.bp
index 4033b4a..587ed1a 100644
--- a/tests/tests/voiceinteraction/service/Android.bp
+++ b/tests/tests/voiceinteraction/service/Android.bp
@@ -24,7 +24,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/VoiceInteractionTest.java b/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/VoiceInteractionTest.java
index fbb4836..bc43563 100644
--- a/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/VoiceInteractionTest.java
+++ b/tests/tests/voiceinteraction/src/android/voiceinteraction/cts/VoiceInteractionTest.java
@@ -45,7 +45,7 @@
 @AppModeFull(reason = "DirectActionsTest is enough")
 public class VoiceInteractionTest extends AbstractVoiceInteractionTestCase {
     static final String TAG = "VoiceInteractionTest";
-    private static final int TIMEOUT_MS = 20 * 1000;
+    private static final int TIMEOUT_MS = 30 * 1000;
 
     private TestStartActivity mTestActivity;
     private TestResultsReceiver mReceiver;
diff --git a/tests/tests/voiceinteraction/testapp/Android.bp b/tests/tests/voiceinteraction/testapp/Android.bp
index 5d38ed2..94e1a0e 100644
--- a/tests/tests/voiceinteraction/testapp/Android.bp
+++ b/tests/tests/voiceinteraction/testapp/Android.bp
@@ -21,7 +21,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
\ No newline at end of file
diff --git a/tests/tests/voicesettings/Android.bp b/tests/tests/voicesettings/Android.bp
index 5974ce3..d68dbaf 100644
--- a/tests/tests/voicesettings/Android.bp
+++ b/tests/tests/voicesettings/Android.bp
@@ -20,14 +20,13 @@
         "compatibility-device-util-axt",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/voicesettings/service/Android.bp b/tests/tests/voicesettings/service/Android.bp
index f759727..4a514a9 100644
--- a/tests/tests/voicesettings/service/Android.bp
+++ b/tests/tests/voicesettings/service/Android.bp
@@ -23,7 +23,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/tests/webkit/Android.bp b/tests/tests/webkit/Android.bp
index cf0d440..13a4cf4 100644
--- a/tests/tests/webkit/Android.bp
+++ b/tests/tests/webkit/Android.bp
@@ -16,9 +16,9 @@
     name: "CtsWebkitTestCases",
     defaults: ["cts_defaults"],
     libs: [
-        "android.test.runner.stubs",
+        "android.test.runner",
         "org.apache.http.legacy",
-        "android.test.base.stubs",
+        "android.test.base",
     ],
     static_libs: [
         "compatibility-device-util-axt",
@@ -31,7 +31,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     // uncomment when dalvik.annotation.Test* are removed or part of SDK
diff --git a/tests/tests/webkit/assets/webkit/test_jsInterface.html b/tests/tests/webkit/assets/webkit/test_jsInterface.html
index 662dfe0..9365cac 100644
--- a/tests/tests/webkit/assets/webkit/test_jsInterface.html
+++ b/tests/tests/webkit/assets/webkit/test_jsInterface.html
@@ -16,6 +16,6 @@
 <html>
     <title>Original title</title>
     <!-- Calls into the javascript interface for the activity -->
-    <body onload='window.dummy.provideResult(document.title)'>
+    <body onload='window.interface.provideResult(document.title)'>
     </body>
 </html>
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java b/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
index 14d584a..2a9d690 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
@@ -1226,6 +1226,11 @@
 
         setWebViewSize(64, 64);
 
+        // Set the webview non-focusable to avoid drawing the focus highlight.
+        WebkitUtils.onMainThreadSync(() -> {
+            mOnUiThread.getWebView().setFocusable(false);
+        });
+
         Map<Integer, Integer> histogram;
         Integer[] colourValues;
 
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
index 5e29eea..c0b75e6 100755
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
@@ -602,7 +602,7 @@
         mOnUiThread.getSettings().setJavaScriptEnabled(true);
         mOnUiThread.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
 
-        final class DummyJavaScriptInterface {
+        final class TestJavaScriptInterface {
             private boolean mWasProvideResultCalled;
             private String mResult;
 
@@ -632,8 +632,8 @@
             }
         }
 
-        final DummyJavaScriptInterface obj = new DummyJavaScriptInterface();
-        mOnUiThread.addJavascriptInterface(obj, "dummy");
+        final TestJavaScriptInterface obj = new TestJavaScriptInterface();
+        mOnUiThread.addJavascriptInterface(obj, "interface");
         assertFalse(obj.wasProvideResultCalled());
 
         startWebServer(false);
@@ -644,13 +644,13 @@
         // Verify that only methods annotated with @JavascriptInterface are exposed
         // on the JavaScript interface object.
         assertEquals("\"function\"",
-                mOnUiThread.evaluateJavascriptSync("typeof dummy.provideResult"));
+                mOnUiThread.evaluateJavascriptSync("typeof interface.provideResult"));
 
         assertEquals("\"undefined\"",
-                mOnUiThread.evaluateJavascriptSync("typeof dummy.wasProvideResultCalled"));
+                mOnUiThread.evaluateJavascriptSync("typeof interface.wasProvideResultCalled"));
 
         assertEquals("\"undefined\"",
-                mOnUiThread.evaluateJavascriptSync("typeof dummy.getClass"));
+                mOnUiThread.evaluateJavascriptSync("typeof interface.getClass"));
     }
 
     public void testAddJavascriptInterfaceNullObject() throws Exception {
@@ -779,14 +779,14 @@
             }
         };
 
-        mOnUiThread.addJavascriptInterface(mJsInterfaceWasCalled, "dummy");
+        mOnUiThread.addJavascriptInterface(mJsInterfaceWasCalled, "interface");
 
         mOnUiThread.loadUrlAndWaitForCompletion("about:blank");
 
         assertFalse(mJsInterfaceWasCalled.get());
 
         assertEquals("\"pass\"", mOnUiThread.evaluateJavascriptSync(
-                "try {dummy.call(); 'fail'; } catch (exception) { 'pass'; } "));
+                "try {interface.call(); 'fail'; } catch (exception) { 'pass'; } "));
         assertTrue(mJsInterfaceWasCalled.get());
     }
 
@@ -797,19 +797,16 @@
 
         mOnUiThread.getSettings().setJavaScriptEnabled(true);
 
-        class DummyJavaScriptInterface {
-        }
-        final DummyJavaScriptInterface obj = new DummyJavaScriptInterface();
-        mOnUiThread.addJavascriptInterface(obj, "dummy");
+        mOnUiThread.addJavascriptInterface(new Object(), "interface");
         mOnUiThread.loadUrlAndWaitForCompletion("about:blank");
 
-        assertEquals("42", mOnUiThread.evaluateJavascriptSync("dummy.custom_property = 42"));
+        assertEquals("42", mOnUiThread.evaluateJavascriptSync("interface.custom_property = 42"));
 
-        assertEquals("true", mOnUiThread.evaluateJavascriptSync("'custom_property' in dummy"));
+        assertEquals("true", mOnUiThread.evaluateJavascriptSync("'custom_property' in interface"));
 
         mOnUiThread.reloadAndWaitForCompletion();
 
-        assertEquals("false", mOnUiThread.evaluateJavascriptSync("'custom_property' in dummy"));
+        assertEquals("false", mOnUiThread.evaluateJavascriptSync("'custom_property' in interface"));
     }
 
     public void testJavascriptInterfaceForClientPopup() throws Exception {
@@ -821,18 +818,18 @@
         mOnUiThread.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
         mOnUiThread.getSettings().setSupportMultipleWindows(true);
 
-        class DummyJavaScriptInterface {
+        class TestJavaScriptInterface {
             @JavascriptInterface
             public int test() {
                 return 42;
             }
         }
-        final DummyJavaScriptInterface obj = new DummyJavaScriptInterface();
+        final TestJavaScriptInterface obj = new TestJavaScriptInterface();
 
         final WebView childWebView = mOnUiThread.createWebView();
         WebViewOnUiThread childOnUiThread = new WebViewOnUiThread(childWebView);
         childOnUiThread.getSettings().setJavaScriptEnabled(true);
-        childOnUiThread.addJavascriptInterface(obj, "dummy");
+        childOnUiThread.addJavascriptInterface(obj, "interface");
 
         final SettableFuture<Void> onCreateWindowFuture = SettableFuture.create();
         mOnUiThread.setWebChromeClient(new WebViewSyncLoader.WaitForProgressClient(mOnUiThread) {
@@ -857,10 +854,10 @@
 
         childOnUiThread.loadUrlAndWaitForCompletion("about:blank");
 
-        assertEquals("true", childOnUiThread.evaluateJavascriptSync("'dummy' in window"));
+        assertEquals("true", childOnUiThread.evaluateJavascriptSync("'interface' in window"));
 
         assertEquals("The injected object should be functional", "42",
-                childOnUiThread.evaluateJavascriptSync("dummy.test()"));
+                childOnUiThread.evaluateJavascriptSync("interface.test()"));
     }
 
     private final class TestPictureListener implements PictureListener {
@@ -2444,51 +2441,48 @@
         assertEquals(kRequest, (long) WebkitUtils.waitForFuture(visualStateFuture));
     }
 
-    /**
-     * This should remain functionally equivalent to
-     * androidx.webkit.WebViewCompatTest#testSetSafeBrowsingWhitelistWithMalformedList.
-     * Modifications to this test should be reflected in that test as necessary. See
-     * http://go/modifying-webview-cts.
-     */
-    public void testSetSafeBrowsingWhitelistWithMalformedList() throws Exception {
-        if (!NullWebViewUtils.isWebViewAvailable()) {
-            return;
-        }
-
-        List whitelist = new ArrayList<String>();
-        // Protocols are not supported in the whitelist
-        whitelist.add("http://google.com");
-        final SettableFuture<Boolean> safeBrowsingWhitelistFuture = SettableFuture.create();
-        WebView.setSafeBrowsingWhitelist(whitelist, new ValueCallback<Boolean>() {
+    private static boolean setSafeBrowsingAllowlistSync(List<String> allowlist) {
+        final SettableFuture<Boolean> safeBrowsingAllowlistFuture = SettableFuture.create();
+        WebView.setSafeBrowsingWhitelist(allowlist, new ValueCallback<Boolean>() {
             @Override
             public void onReceiveValue(Boolean success) {
-                safeBrowsingWhitelistFuture.set(success);
+                safeBrowsingAllowlistFuture.set(success);
             }
         });
-        assertFalse(WebkitUtils.waitForFuture(safeBrowsingWhitelistFuture));
+        return WebkitUtils.waitForFuture(safeBrowsingAllowlistFuture);
     }
 
     /**
      * This should remain functionally equivalent to
-     * androidx.webkit.WebViewCompatTest#testSetSafeBrowsingWhitelistWithValidList. Modifications
-     * to this test should be reflected in that test as necessary. See
+     * androidx.webkit.WebViewCompatTest#testSetSafeBrowsingAllowlistWithMalformedList.
+     * Modifications to this test should be reflected in that test as necessary. See
      * http://go/modifying-webview-cts.
      */
-    public void testSetSafeBrowsingWhitelistWithValidList() throws Exception {
+    public void testSetSafeBrowsingAllowlistWithMalformedList() throws Exception {
         if (!NullWebViewUtils.isWebViewAvailable()) {
             return;
         }
 
-        List whitelist = new ArrayList<String>();
-        whitelist.add("safe-browsing");
-        final SettableFuture<Boolean> safeBrowsingWhitelistFuture = SettableFuture.create();
-        WebView.setSafeBrowsingWhitelist(whitelist, new ValueCallback<Boolean>() {
-            @Override
-            public void onReceiveValue(Boolean success) {
-                safeBrowsingWhitelistFuture.set(success);
-            }
-        });
-        assertTrue(WebkitUtils.waitForFuture(safeBrowsingWhitelistFuture));
+        List allowlist = new ArrayList<String>();
+        // Protocols are not supported in the allowlist
+        allowlist.add("http://google.com");
+        assertFalse("Malformed list entry should fail", setSafeBrowsingAllowlistSync(allowlist));
+    }
+
+    /**
+     * This should remain functionally equivalent to
+     * androidx.webkit.WebViewCompatTest#testSetSafeBrowsingAllowlistWithValidList. Modifications
+     * to this test should be reflected in that test as necessary. See
+     * http://go/modifying-webview-cts.
+     */
+    public void testSetSafeBrowsingAllowlistWithValidList() throws Exception {
+        if (!NullWebViewUtils.isWebViewAvailable()) {
+            return;
+        }
+
+        List allowlist = new ArrayList<String>();
+        allowlist.add("safe-browsing");
+        assertTrue("Valid allowlist should be successful", setSafeBrowsingAllowlistSync(allowlist));
 
         final SettableFuture<Void> pageFinishedFuture = SettableFuture.create();
         mOnUiThread.setWebViewClient(new WebViewClient() {
diff --git a/tests/tests/widget/Android.bp b/tests/tests/widget/Android.bp
index 146e978..20b79ce 100644
--- a/tests/tests/widget/Android.bp
+++ b/tests/tests/widget/Android.bp
@@ -28,7 +28,7 @@
         "truth-prebuilt",
     ],
 
-    libs: ["android.test.runner.stubs"],
+    libs: ["android.test.runner"],
 
     srcs: [
         "src/**/*.java",
@@ -41,7 +41,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/tests/tests/widget/app/Android.bp b/tests/tests/widget/app/Android.bp
index 50a8020..0ecbb72 100644
--- a/tests/tests/widget/app/Android.bp
+++ b/tests/tests/widget/app/Android.bp
@@ -24,7 +24,6 @@
     ],
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tests/tests/widget/res/layout/textview_selectallonfocus.xml b/tests/tests/widget/res/layout/textview_selectallonfocus.xml
index b1c3682..af292b0 100644
--- a/tests/tests/widget/res/layout/textview_selectallonfocus.xml
+++ b/tests/tests/widget/res/layout/textview_selectallonfocus.xml
@@ -35,7 +35,7 @@
         android:selectAllOnFocus="false"
         android:focusable="true"/>
 
-        <TextView android:id="@+id/selectAllOnFocus_dummy"
+        <TextView android:id="@+id/selectAllOnFocus_placeholder"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:focusable="true"/>
diff --git a/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java b/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
index dd9b971..f5cea34 100644
--- a/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
+++ b/tests/tests/widget/src/android/widget/cts/PopupWindowTest.java
@@ -84,6 +84,8 @@
 
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
+import java.util.ArrayList;
+import java.util.Collections;
 
 @FlakyTest
 @SmallTest
@@ -1742,21 +1744,23 @@
 
     @Test
     public void testClipToScreenClipsToInsets() throws Throwable {
-        int[] orientationValues = {ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE,
-                ActivityInfo.SCREEN_ORIENTATION_PORTRAIT};
+        final ArrayList<Integer> orientations = new ArrayList();
+
+        // test landscape orientation if device support it
+        if (hasDeviceFeature(PackageManager.FEATURE_SCREEN_LANDSCAPE)) {
+            orientations.add(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
+        }
+        // test portrait orientation if device support it
+        if (hasDeviceFeature(PackageManager.FEATURE_SCREEN_PORTRAIT)) {
+            orientations.add(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+        }
+        // if device support both orientations and current is landscape, test portrait first
         int currentOrientation = mActivity.getResources().getConfiguration().orientation;
-        if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
-            orientationValues[0] = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
-            orientationValues[1] = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
+        if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE && orientations.size() > 1) {
+            Collections.swap(orientations, 0, 1);
         }
 
-        for (int i = 0; i < 2; i++) {
-            final int orientation = orientationValues[i];
-            if (orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
-                    && !hasDeviceFeature(PackageManager.FEATURE_SCREEN_PORTRAIT)) {
-                // skip test for devices not supporting portrait orientation
-                continue;
-            }
+        for (int orientation : orientations) {
             mActivity.runOnUiThread(() ->
                     mActivity.setRequestedOrientation(orientation));
             mActivity.waitForConfigurationChanged();
diff --git a/tests/tests/widget/src/android/widget/cts/ProgressBarTest.java b/tests/tests/widget/src/android/widget/cts/ProgressBarTest.java
index 1d3a5ed..7a512af 100644
--- a/tests/tests/widget/src/android/widget/cts/ProgressBarTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ProgressBarTest.java
@@ -38,7 +38,9 @@
 import android.graphics.PorterDuff;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
+import android.graphics.drawable.LayerDrawable;
 import android.os.Parcelable;
+import android.os.SystemClock;
 import android.util.AttributeSet;
 import android.view.View;
 import android.view.animation.AccelerateDecelerateInterpolator;
@@ -48,6 +50,7 @@
 import android.widget.ProgressBar;
 import android.widget.cts.util.TestUtils;
 
+import androidx.test.InstrumentationRegistry;
 import androidx.test.annotation.UiThreadTest;
 import androidx.test.filters.SmallTest;
 import androidx.test.rule.ActivityTestRule;
@@ -696,6 +699,30 @@
         assertEquals(maxHeight, mProgressBar.getMaxHeight());
     }
 
+    @Test
+    public void testAnimationNotOverwriteNewProgress() throws Throwable {
+        mActivityRule.runOnUiThread(() -> {
+            mProgressBarHorizontal.setMin(0);
+            mProgressBarHorizontal.setMax(10);
+            mProgressBarHorizontal.setProgress(10, true);
+            mProgressBarHorizontal.setProgress(0, false);
+        });
+        // wait for completion of animation.
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+        SystemClock.sleep(80);
+        assertEquals(0, mProgressBarHorizontal.getProgress());
+        // test level of progress drawable
+        Drawable progressDrawable = mProgressBarHorizontal.getCurrentDrawable();
+        if (progressDrawable instanceof LayerDrawable) {
+            Drawable d = ((LayerDrawable) progressDrawable)
+                    .findDrawableByLayerId(android.R.id.progress);
+            if (d != null) {
+                progressDrawable = d;
+            }
+        }
+        assertEquals(0, progressDrawable.getLevel());
+    }
+
     /*
      * Mock class for ProgressBar to test protected methods
      */
diff --git a/tests/tests/widget/src/android/widget/cts/TextViewTest.java b/tests/tests/widget/src/android/widget/cts/TextViewTest.java
index 86e674e..e0fb5e8 100644
--- a/tests/tests/widget/src/android/widget/cts/TextViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TextViewTest.java
@@ -739,7 +739,7 @@
         mTextView = findTextView(R.id.selectAllOnFocus_default);
         mTextView.setText(blank, BufferType.SPANNABLE);
         // change the focus
-        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
+        findTextView(R.id.selectAllOnFocus_placeholder).requestFocus();
         assertFalse(mTextView.isFocused());
         mTextView.requestFocus();
         assertTrue(mTextView.isFocused());
@@ -750,7 +750,7 @@
         mTextView.setText(content, BufferType.SPANNABLE);
         mTextView.setSelectAllOnFocus(true);
         // change the focus
-        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
+        findTextView(R.id.selectAllOnFocus_placeholder).requestFocus();
         assertFalse(mTextView.isFocused());
         mTextView.requestFocus();
         assertTrue(mTextView.isFocused());
@@ -761,7 +761,7 @@
         Selection.setSelection((Spannable) mTextView.getText(), 0);
         mTextView.setSelectAllOnFocus(false);
         // change the focus
-        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
+        findTextView(R.id.selectAllOnFocus_placeholder).requestFocus();
         assertFalse(mTextView.isFocused());
         mTextView.requestFocus();
         assertTrue(mTextView.isFocused());
@@ -772,7 +772,7 @@
         mTextView.setText(blank, BufferType.SPANNABLE);
         mTextView.setSelectAllOnFocus(true);
         // change the focus
-        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
+        findTextView(R.id.selectAllOnFocus_placeholder).requestFocus();
         assertFalse(mTextView.isFocused());
         mTextView.requestFocus();
         assertTrue(mTextView.isFocused());
@@ -783,7 +783,7 @@
         Selection.setSelection((Spannable) mTextView.getText(), 0);
         mTextView.setSelectAllOnFocus(false);
         // change the focus
-        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
+        findTextView(R.id.selectAllOnFocus_placeholder).requestFocus();
         assertFalse(mTextView.isFocused());
         mTextView.requestFocus();
         assertTrue(mTextView.isFocused());
@@ -5790,11 +5790,11 @@
     public void testSelectAllJustAfterTap() throws Throwable {
         // Prepare an EditText with focus.
         mActivityRule.runOnUiThread(() -> {
-            // Make a dummy focusable so that initial focus doesn't go to our test textview
+            // Make a placeholder focusable so that initial focus doesn't go to our test textview
             LinearLayout top = new LinearLayout(mActivity);
-            TextView dummy = new TextView(mActivity);
-            dummy.setFocusableInTouchMode(true);
-            top.addView(dummy, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+            TextView placeholder = new TextView(mActivity);
+            placeholder.setFocusableInTouchMode(true);
+            top.addView(placeholder, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
             mTextView = new EditText(mActivity);
             top.addView(mTextView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
             mActivity.setContentView(top);
@@ -6952,11 +6952,11 @@
         final View.OnClickListener mockOnClickListener = mock(View.OnClickListener.class);
         final int safeDoubleTapTimeout = ViewConfiguration.getDoubleTapTimeout() + 1;
         mActivityRule.runOnUiThread(() -> {
-            // set up a dummy focusable so that initial focus doesn't go to our test textview
+            // set up a placeholder focusable so that initial focus doesn't go to our test textview
             LinearLayout top = new LinearLayout(mActivity);
-            TextView dummy = new TextView(mActivity);
-            dummy.setFocusableInTouchMode(true);
-            top.addView(dummy, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+            TextView placeholder = new TextView(mActivity);
+            placeholder.setFocusableInTouchMode(true);
+            top.addView(placeholder, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
             mTextView = new TextView(mActivity);
             mTextView.setText("...text 11:11. some more text is in here...");
             mTextView.setFocusable(true);
@@ -8586,6 +8586,8 @@
     private void initializeTextForSmartSelection(CharSequence text) throws Throwable {
         assertTrue(text.length() >= SMARTSELECT_END);
         mActivityRule.runOnUiThread(() -> {
+            // Support small devices. b/155842369
+            mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 20);
             mTextView.setTextIsSelectable(true);
             mTextView.setText(text);
             mTextView.setTextClassifier(FAKE_TEXT_CLASSIFIER);
diff --git a/tests/tests/widget29/Android.bp b/tests/tests/widget29/Android.bp
index 6a2059d..b2c26af 100644
--- a/tests/tests/widget29/Android.bp
+++ b/tests/tests/widget29/Android.bp
@@ -28,7 +28,7 @@
         "truth-prebuilt",
     ],
 
-    libs: ["android.test.runner.stubs"],
+    libs: ["android.test.runner"],
 
     srcs: [
         "src/**/*.java",
@@ -41,7 +41,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
diff --git a/tests/tests/wifi/Android.bp b/tests/tests/wifi/Android.bp
index 3c301cd..792cfd1 100644
--- a/tests/tests/wifi/Android.bp
+++ b/tests/tests/wifi/Android.bp
@@ -20,7 +20,7 @@
     compile_multilib: "both",
 
     libs: [
-        "android.test.base.stubs",
+        "android.test.base",
     ],
 
     srcs: [ "src/**/*.java" ],
@@ -36,7 +36,6 @@
 
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "mts",
         "sts",
diff --git a/tests/tests/wifi/OWNERS b/tests/tests/wifi/OWNERS
index 6ac1b8f..28faebd 100644
--- a/tests/tests/wifi/OWNERS
+++ b/tests/tests/wifi/OWNERS
@@ -1,5 +1,5 @@
 # Bug component: 33618
+dysu@google.com
 etancohen@google.com
-mplass@google.com
 rpius@google.com
 satk@google.com
diff --git a/tests/tests/wifi/src/android/net/wifi/aware/cts/SingleDeviceTest.java b/tests/tests/wifi/src/android/net/wifi/aware/cts/SingleDeviceTest.java
index aab3641..cebc20a 100644
--- a/tests/tests/wifi/src/android/net/wifi/aware/cts/SingleDeviceTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/aware/cts/SingleDeviceTest.java
@@ -24,6 +24,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.pm.PackageManager;
 import android.location.LocationManager;
 import android.net.ConnectivityManager;
 import android.net.MacAddress;
@@ -628,9 +629,16 @@
         assertNotNull("Subscribe session", discoverySession);
 
         // 2. update-subscribe
-        subscribeConfig = new SubscribeConfig.Builder().setServiceName(
-                serviceName).setServiceSpecificInfo("extras".getBytes())
-                .setMinDistanceMm(MIN_DISTANCE_MM).build();
+        boolean rttSupported = getContext().getPackageManager().hasSystemFeature(
+                    PackageManager.FEATURE_WIFI_RTT);
+        SubscribeConfig.Builder builder = new SubscribeConfig.Builder().setServiceName(
+                    serviceName).setServiceSpecificInfo("extras".getBytes());
+
+        if (rttSupported) {
+            builder.setMinDistanceMm(MIN_DISTANCE_MM);
+        }
+        subscribeConfig = builder.build();
+
         discoverySession.updateSubscribe(subscribeConfig);
         assertTrue("Subscribe update", discoveryCb.waitForCallback(
                 DiscoverySessionCallbackTest.ON_SESSION_CONFIG_UPDATED));
diff --git a/tests/tests/wifi/src/android/net/wifi/cts/ConcurrencyTest.java b/tests/tests/wifi/src/android/net/wifi/cts/ConcurrencyTest.java
index 49613bf..cb2447c 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/ConcurrencyTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/ConcurrencyTest.java
@@ -554,6 +554,7 @@
         String originalDeviceName = getDeviceName();
         assertNotNull(originalDeviceName);
 
+        resetResponse(mMyResponse);
         ShellIdentityUtils.invokeWithShellPermissions(() -> {
             mWifiP2pManager.setDeviceName(
                     mWifiP2pChannel, testDeviceName, mActionListener);
@@ -565,6 +566,7 @@
         assertEquals(testDeviceName, currentDeviceName);
 
         // restore the device name at the end
+        resetResponse(mMyResponse);
         ShellIdentityUtils.invokeWithShellPermissions(() -> {
             mWifiP2pManager.setDeviceName(
                     mWifiP2pChannel, originalDeviceName, mActionListener);
diff --git a/tests/tests/wifi/src/android/net/wifi/cts/EasyConnectStatusCallbackTest.java b/tests/tests/wifi/src/android/net/wifi/cts/EasyConnectStatusCallbackTest.java
index b79bd16..07256a3 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/EasyConnectStatusCallbackTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/EasyConnectStatusCallbackTest.java
@@ -44,7 +44,7 @@
     private static final int TEST_WAIT_DURATION_MS = 12_000; // Long delay is necessary, see below
     private WifiManager mWifiManager;
     private static final String TEST_DPP_URI =
-            "DPP:C:81/1;I:Easy_Connect_Demo;M:000102030405;"
+            "DPP:C:81/1,117/40;I:Easy_Connect_Demo;M:000102030405;"
                     + "K:MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgACDmtXD1Sz6/5B4YRdmTkbkkFLDwk8f0yRnfm1Go"
                     + "kpx/0=;;";
     private final HandlerThread mHandlerThread = new HandlerThread("EasyConnectTest");
diff --git a/tests/tests/wifi/src/android/net/wifi/cts/WifiInfoTest.java b/tests/tests/wifi/src/android/net/wifi/cts/WifiInfoTest.java
index 22124eb..643f42d 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/WifiInfoTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/WifiInfoTest.java
@@ -233,7 +233,7 @@
                 .build();
 
         // different instances
-        assertThat(info1).isNotSameAs(info2);
+        assertThat(info1).isNotSameInstanceAs(info2);
 
         // assert that info1 didn't change
         assertThat(info1.getSSID()).isEqualTo("\"" + TEST_SSID + "\"");
diff --git a/tests/tests/wifi/src/android/net/wifi/cts/WifiManagerTest.java b/tests/tests/wifi/src/android/net/wifi/cts/WifiManagerTest.java
index f4afa87..f1d2a23 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/WifiManagerTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/WifiManagerTest.java
@@ -1771,13 +1771,15 @@
             }
             waitForDisconnection();
 
-            // Now trigger connection to the first saved network.
+            // Now trigger connection to the last saved network.
+            WifiConfiguration savedNetworkToConnect =
+                    savedNetworks.get(savedNetworks.size() - 1);
             synchronized (mLock) {
                 try {
                     if (withNetworkId) {
-                        mWifiManager.connect(savedNetworks.get(0).networkId, actionListener);
+                        mWifiManager.connect(savedNetworkToConnect.networkId, actionListener);
                     } else {
-                        mWifiManager.connect(savedNetworks.get(0), actionListener);
+                        mWifiManager.connect(savedNetworkToConnect, actionListener);
                     }
                     // now wait for callback
                     mLock.wait(TEST_WAIT_DURATION_MS);
@@ -1788,7 +1790,7 @@
             assertTrue(actionListener.onSuccessCalled);
             // Wait for connection to complete & ensure we are connected to the saved network.
             waitForConnection();
-            assertEquals(savedNetworks.get(0).networkId,
+            assertEquals(savedNetworkToConnect.networkId,
                     mWifiManager.getConnectionInfo().getNetworkId());
         } finally {
             // Re-enable all saved networks before exiting.
@@ -1882,30 +1884,37 @@
         TestActionListener actionListener = new TestActionListener(mLock);
         UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
         List<WifiConfiguration> savedNetworks = null;
-        WifiConfiguration savedNetwork = null;
+        WifiConfiguration currentConfig = null;
         try {
             uiAutomation.adoptShellPermissionIdentity();
             // These below API's only work with privileged permissions (obtained via shell identity
             // for test)
-            savedNetworks = mWifiManager.getConfiguredNetworks();
-
-            // Ensure that the saved network is not metered.
-            savedNetwork = savedNetworks.get(0);
-            assertNotEquals("Ensure that the saved network is configured as unmetered",
-                    savedNetwork.meteredOverride,
-                    WifiConfiguration.METERED_OVERRIDE_METERED);
 
             // Trigger a scan & wait for connection to one of the saved networks.
             mWifiManager.startScan();
             waitForConnection();
 
+            WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
+
+            // find the current network's WifiConfiguration
+            currentConfig = mWifiManager.getConfiguredNetworks()
+                    .stream()
+                    .filter(config -> config.networkId == wifiInfo.getNetworkId())
+                    .findAny()
+                    .get();
+
+            // Ensure that the current network is not metered.
+            assertNotEquals("Ensure that the saved network is configured as unmetered",
+                    currentConfig.meteredOverride,
+                    WifiConfiguration.METERED_OVERRIDE_METERED);
+
             // Check the network capabilities to ensure that the network is marked not metered.
             waitForNetworkCallbackAndCheckForMeteredness(false);
 
             // Now mark the network metered and save.
             synchronized (mLock) {
                 try {
-                    WifiConfiguration modSavedNetwork = new WifiConfiguration(savedNetwork);
+                    WifiConfiguration modSavedNetwork = new WifiConfiguration(currentConfig);
                     modSavedNetwork.meteredOverride = WifiConfiguration.METERED_OVERRIDE_METERED;
                     mWifiManager.save(modSavedNetwork, actionListener);
                     // now wait for callback
@@ -1923,8 +1932,8 @@
 
         } finally {
             // Restore original network config (restore the meteredness back);
-            if (savedNetwork != null) {
-                mWifiManager.updateNetwork(savedNetwork);
+            if (currentConfig != null) {
+                mWifiManager.updateNetwork(currentConfig);
             }
             uiAutomation.dropShellPermissionIdentity();
         }
diff --git a/tests/tests/wifi/src/android/net/wifi/cts/WifiNetworkSpecifierTest.java b/tests/tests/wifi/src/android/net/wifi/cts/WifiNetworkSpecifierTest.java
index 9553156..bdbc699 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/WifiNetworkSpecifierTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/WifiNetworkSpecifierTest.java
@@ -173,8 +173,8 @@
 
         List<WifiConfiguration> savedNetworks = ShellIdentityUtils.invokeWithShellPermissions(
                 () -> mWifiManager.getPrivilegedConfiguredNetworks());
-        // Pick any one of the saved networks on the device (assumes that it is in range)
-        mTestNetwork = savedNetworks.get(0);
+        // Pick the last saved network on the device (assumes that it is in range)
+        mTestNetwork = savedNetworks.get(savedNetworks.size()  - 1);
 
         // Wait for Wifi to be disconnected.
         PollingCheck.check(
diff --git a/tests/tests/wifi/src/android/net/wifi/rtt/cts/TestBase.java b/tests/tests/wifi/src/android/net/wifi/rtt/cts/TestBase.java
index 9c0078d..be8f4e9 100644
--- a/tests/tests/wifi/src/android/net/wifi/rtt/cts/TestBase.java
+++ b/tests/tests/wifi/src/android/net/wifi/rtt/cts/TestBase.java
@@ -77,6 +77,15 @@
         return pm.hasSystemFeature(PackageManager.FEATURE_WIFI_RTT);
     }
 
+    /**
+     * Returns a flag indicating whether or not Wi-Fi Aware should be tested. Wi-Fi Aware
+     * should be tested if the feature is supported on the current device.
+     */
+    static boolean shouldTestWifiAware(Context context) {
+        final PackageManager pm = context.getPackageManager();
+        return pm.hasSystemFeature(PackageManager.FEATURE_WIFI_AWARE);
+    }
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
diff --git a/tests/tests/wifi/src/android/net/wifi/rtt/cts/WifiRttTest.java b/tests/tests/wifi/src/android/net/wifi/rtt/cts/WifiRttTest.java
index 458917d..cfd6448 100644
--- a/tests/tests/wifi/src/android/net/wifi/rtt/cts/WifiRttTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/rtt/cts/WifiRttTest.java
@@ -383,7 +383,7 @@
      * Verify ranging request with aware peer Mac address and peer handle.
      */
     public void testAwareRttWithMacAddress() throws InterruptedException {
-        if (!shouldTestWifiRtt(getContext())) {
+        if (!(shouldTestWifiRtt(getContext()) && shouldTestWifiAware(getContext()))) {
             return;
         }
         RangingRequest request = new RangingRequest.Builder()
@@ -402,7 +402,7 @@
      * Verify ranging request with aware peer handle.
      */
     public void testAwareRttWithPeerHandle() throws InterruptedException {
-        if (!shouldTestWifiRtt(getContext())) {
+        if (!(shouldTestWifiRtt(getContext()) && shouldTestWifiAware(getContext()))) {
             return;
         }
         PeerHandle peerHandle = mock(PeerHandle.class);
diff --git a/tests/tests/wrap/Android.mk b/tests/tests/wrap/Android.mk
deleted file mode 100644
index b798d87..0000000
--- a/tests/tests/wrap/Android.mk
+++ /dev/null
@@ -1,15 +0,0 @@
-# Copyright (C) 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-include $(call all-subdir-makefiles)
diff --git a/tests/tests/wrap/nowrap/Android.mk b/tests/tests/wrap/nowrap/Android.mk
index e18f116..8f50ddc 100644
--- a/tests/tests/wrap/nowrap/Android.mk
+++ b/tests/tests/wrap/nowrap/Android.mk
@@ -26,7 +26,7 @@
 	androidx.test.rules
 LOCAL_JAVA_LIBRARIES := android.test.runner.stubs android.test.base.stubs
 LOCAL_SRC_FILES := $(call all-java-files-under, ../src)
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 LOCAL_SDK_VERSION := current
 
 LOCAL_PACKAGE_NAME := CtsWrapNoWrapTestCases
diff --git a/tests/tests/wrap/wrap_debug/Android.mk b/tests/tests/wrap/wrap_debug/Android.mk
index 4f750aa..e8d8f1f 100644
--- a/tests/tests/wrap/wrap_debug/Android.mk
+++ b/tests/tests/wrap/wrap_debug/Android.mk
@@ -26,7 +26,7 @@
 	androidx.test.rules
 LOCAL_JAVA_LIBRARIES := android.test.runner.stubs android.test.base.stubs
 LOCAL_SRC_FILES := $(call all-java-files-under, ../src)
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 LOCAL_SDK_VERSION := current
 
 LOCAL_PREBUILT_JNI_LIBS_arm := ../wrap.sh
diff --git a/tests/tests/wrap/wrap_debug_malloc_debug/Android.mk b/tests/tests/wrap/wrap_debug_malloc_debug/Android.mk
index 5992aa0..06a2850 100644
--- a/tests/tests/wrap/wrap_debug_malloc_debug/Android.mk
+++ b/tests/tests/wrap/wrap_debug_malloc_debug/Android.mk
@@ -26,7 +26,7 @@
 	androidx.test.rules
 LOCAL_JAVA_LIBRARIES := android.test.runner.stubs android.test.base.stubs
 LOCAL_SRC_FILES := $(call all-java-files-under, ../src)
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 LOCAL_SDK_VERSION := current
 
 LOCAL_PREBUILT_JNI_LIBS_arm := wrap.sh
diff --git a/tests/tests/wrap/wrap_nodebug/Android.mk b/tests/tests/wrap/wrap_nodebug/Android.mk
index 3867574..aaebda2 100644
--- a/tests/tests/wrap/wrap_nodebug/Android.mk
+++ b/tests/tests/wrap/wrap_nodebug/Android.mk
@@ -26,7 +26,7 @@
 	androidx.test.rules
 LOCAL_JAVA_LIBRARIES := android.test.runner.stubs android.test.base.stubs
 LOCAL_SRC_FILES := $(call all-java-files-under, ../src)
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 LOCAL_SDK_VERSION := current
 
 LOCAL_PREBUILT_JNI_LIBS_arm := ../wrap.sh
diff --git a/tests/tvprovider/Android.bp b/tests/tvprovider/Android.bp
index 2c44900..a99191e 100644
--- a/tests/tvprovider/Android.bp
+++ b/tests/tvprovider/Android.bp
@@ -20,14 +20,13 @@
         "ctstestrunner-axt",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/video/Android.bp b/tests/video/Android.bp
index 30927f2..2741e64a 100644
--- a/tests/video/Android.bp
+++ b/tests/video/Android.bp
@@ -22,8 +22,8 @@
         "ctstestrunner-axt",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     jni_libs: [
         "libctscodecutils_jni",
@@ -33,7 +33,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
     sdk_version: "test_current",
diff --git a/tests/vr/Android.bp b/tests/vr/Android.bp
index bcbdcad..69c9cd2 100644
--- a/tests/vr/Android.bp
+++ b/tests/vr/Android.bp
@@ -21,8 +21,8 @@
         "compatibility-device-util-axt",
     ],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     jni_libs: [
         "libctsvrextensions_jni",
@@ -37,7 +37,6 @@
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 }
diff --git a/tools/Android.mk b/tools/Android.mk
deleted file mode 100644
index 0a05aed..0000000
--- a/tools/Android.mk
+++ /dev/null
@@ -1,15 +0,0 @@
-# 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.
-
-include $(call all-subdir-makefiles)
diff --git a/tools/cts-api-coverage/Android.bp b/tools/cts-api-coverage/Android.bp
index b0df7f1..95395ed 100644
--- a/tools/cts-api-coverage/Android.bp
+++ b/tools/cts-api-coverage/Android.bp
@@ -35,7 +35,6 @@
         // dependencies of all of the tests must be on its classpath. This is
         // super fragile.
         "tradefed",
-        "hosttestlib",
         "platformprotos",
     ],
 }
diff --git a/tools/cts-device-info/Android.mk b/tools/cts-device-info/Android.mk
index d6140a5..cc67eee 100644
--- a/tools/cts-device-info/Android.mk
+++ b/tools/cts-device-info/Android.mk
@@ -40,7 +40,7 @@
 LOCAL_PACKAGE_NAME := CtsDeviceInfo
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests sts mts vts
+LOCAL_COMPATIBILITY_SUITE := cts general-tests sts mts vts
 
 include $(BUILD_CTS_DEVICE_INFO_PACKAGE)
 
diff --git a/tools/cts-device-info/jni/Android.bp b/tools/cts-device-info/jni/Android.bp
index c8b788f..bbf7f5b 100644
--- a/tools/cts-device-info/jni/Android.bp
+++ b/tools/cts-device-info/jni/Android.bp
@@ -18,6 +18,7 @@
         "CtsDeviceInfoJniOnLoad.cpp",
         "com_android_cts_deviceinfo_VulkanDeviceInfo.cpp",
     ],
+    header_libs: ["jni_headers"],
     static_libs: ["libvkjson_ndk"],
     shared_libs: [
         "libvulkan",
diff --git a/tools/cts-dynamic-config/Android.mk b/tools/cts-dynamic-config/Android.mk
index 4a6220a..4cb0c96 100644
--- a/tools/cts-dynamic-config/Android.mk
+++ b/tools/cts-dynamic-config/Android.mk
@@ -20,7 +20,7 @@
 LOCAL_MODULE_CLASS := FAKE
 LOCAL_IS_HOST_MODULE := true
 
-LOCAL_COMPATIBILITY_SUITE := cts general-tests vts10 mts
+LOCAL_COMPATIBILITY_SUITE := cts general-tests mts
 
 # my_test_config_file := DynamicConfig.xml
 # TODO (sbasi): Update to use BUILD_HOST_TEST_CONFIG when it's primary install
diff --git a/tools/cts-holo-generation/Android.bp b/tools/cts-holo-generation/Android.bp
index 72fb338..49c4a34 100644
--- a/tools/cts-holo-generation/Android.bp
+++ b/tools/cts-holo-generation/Android.bp
@@ -22,8 +22,8 @@
     },
     static_libs: ["androidx.test.rules"],
     libs: [
-        "android.test.runner.stubs",
-        "android.test.base.stubs",
+        "android.test.runner",
+        "android.test.base",
     ],
     srcs: ["src/**/*.java"],
     sdk_version: "current",
diff --git a/tools/cts-media-preparer-app/Android.bp b/tools/cts-media-preparer-app/Android.bp
index 8199fc0..c073617 100644
--- a/tools/cts-media-preparer-app/Android.bp
+++ b/tools/cts-media-preparer-app/Android.bp
@@ -29,7 +29,6 @@
     // tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
         "mts",
     ],
diff --git a/tools/cts-preconditions/Android.bp b/tools/cts-preconditions/Android.bp
index 952b880..100cb69 100644
--- a/tools/cts-preconditions/Android.bp
+++ b/tools/cts-preconditions/Android.bp
@@ -20,16 +20,16 @@
         "compatibility-device-preconditions",
     ],
 
-    libs: ["android.test.base.stubs"],
+    libs: ["android.test.base"],
 
     srcs: ["src/**/*.java"],
 
     // Tag this module as a cts test artifact
     test_suites: [
         "cts",
-        "vts10",
         "general-tests",
     ],
 
-    sdk_version: "26",
+    // android.test.base exists starting from 28
+    sdk_version: "28",
 }
diff --git a/tools/cts-test-metrics/CtsCameraTestCases.reportlog.json b/tools/cts-test-metrics/CtsCameraTestCases.reportlog.json
new file mode 100644
index 0000000..81a9ef1
--- /dev/null
+++ b/tools/cts-test-metrics/CtsCameraTestCases.reportlog.json
@@ -0,0 +1 @@
+{"test_reprocessing_throughput":[{"camera_id":"0","format":35,"reprocess_type":"YUV reprocessing","capture_message":"capture latency","latency":[237.0,102.0,99.0,105.0,124.0,92.0],"camera_reprocessing_average_latency":126.5},{"camera_id":"0","format":34,"reprocess_type":"opaque reprocessing","capture_message":"capture latency","latency":[206.0,91.0,92.0,89.0,119.0,84.0],"camera_reprocessing_average_latency":113.5},{"camera_id":"1","format":35,"reprocess_type":"YUV reprocessing","capture_message":"capture latency","latency":[216.0,84.0,80.0,83.0,93.0,76.0],"camera_reprocessing_average_latency":105.33333333333333},{"camera_id":"1","format":34,"reprocess_type":"opaque reprocessing","capture_message":"capture latency","latency":[212.0,83.0,71.0,80.0,93.0,74.0],"camera_reprocessing_average_latency":102.16666666666667},{"camera_id":"0","format":35,"reprocess_type":"YUV reprocessing","capture_message":"capture latency","latency":[228.0,105.0,85.0,86.0,116.0,83.0],"camera_reprocessing_average_latency":117.16666666666667},{"camera_id":"0","format":34,"reprocess_type":"opaque reprocessing","capture_message":"capture latency","latency":[195.0,89.0,94.0,94.0,116.0,86.0],"camera_reprocessing_average_latency":112.33333333333333},{"camera_id":"1","format":35,"reprocess_type":"YUV reprocessing","capture_message":"capture latency","latency":[150.0,83.0,75.0,75.0,102.0,76.0],"camera_reprocessing_average_latency":93.5},{"camera_id":"1","format":34,"reprocess_type":"opaque reprocessing","capture_message":"capture latency","latency":[198.0,85.0,78.0,71.0,95.0,77.0],"camera_reprocessing_average_latency":100.66666666666667}],"test_camera_launch_average":[{"camera_launch_average_time_for_all_cameras":326.1},{"camera_launch_average_time_for_all_cameras":321.8}],"test_reprocessing_latency":[{"camera_id":"0","format":35,"reprocess_type":"YUV reprocessing","capture_message":"shot to shot latency","latency":[303.0,254.0,259.0,196.0,201.0,195.0],"camera_reprocessing_shot_to_shot_average_latency":234.66666666666666},{"camera_id":"0","format":34,"reprocess_type":"opaque reprocessing","capture_message":"shot to shot latency","latency":[248.0,172.0,209.0,188.0,201.0,204.0],"camera_reprocessing_shot_to_shot_average_latency":203.66666666666666},{"camera_id":"1","format":35,"reprocess_type":"YUV reprocessing","capture_message":"shot to shot latency","latency":[190.0,238.0,220.0,213.0,144.0,154.0],"camera_reprocessing_shot_to_shot_average_latency":193.16666666666666},{"camera_id":"1","format":34,"reprocess_type":"opaque reprocessing","capture_message":"shot to shot latency","latency":[237.0,166.0,153.0,148.0,162.0,140.0],"camera_reprocessing_shot_to_shot_average_latency":167.66666666666666},{"camera_id":"0","format":35,"reprocess_type":"YUV reprocessing","capture_message":"shot to shot latency","latency":[302.0,262.0,256.0,197.0,200.0,201.0],"camera_reprocessing_shot_to_shot_average_latency":236.33333333333334},{"camera_id":"0","format":34,"reprocess_type":"opaque reprocessing","capture_message":"shot to shot latency","latency":[251.0,166.0,199.0,199.0,213.0,201.0],"camera_reprocessing_shot_to_shot_average_latency":204.83333333333334},{"camera_id":"1","format":35,"reprocess_type":"YUV reprocessing","capture_message":"shot to shot latency","latency":[199.0,153.0,159.0,164.0,152.0,166.0],"camera_reprocessing_shot_to_shot_average_latency":165.5},{"camera_id":"1","format":34,"reprocess_type":"opaque reprocessing","capture_message":"shot to shot latency","latency":[210.0,143.0,161.0,162.0,158.0,156.0],"camera_reprocessing_shot_to_shot_average_latency":165.0}],"test_high_quality_reprocessing_latency":[{"camera_id":"0","format":35,"reprocess_type":"YUV reprocessing","capture_message":"shot to shot latency for High Quality noise reduction and edge modes","latency":[479.0,398.0,351.0,487.0,461.0,395.0],"camera_reprocessing_shot_to_shot_average_latency":428.5},{"camera_id":"0","format":34,"reprocess_type":"opaque reprocessing","capture_message":"shot to shot latency for High Quality noise reduction and edge modes","latency":[355.0,324.0,335.0,334.0,336.0,347.0],"camera_reprocessing_shot_to_shot_average_latency":338.5},{"camera_id":"1","format":35,"reprocess_type":"YUV reprocessing","capture_message":"shot to shot latency for High Quality noise reduction and edge modes","latency":[235.0,220.0,223.0,228.0,222.0,227.0],"camera_reprocessing_shot_to_shot_average_latency":225.83333333333334},{"camera_id":"1","format":34,"reprocess_type":"opaque reprocessing","capture_message":"shot to shot latency for High Quality noise reduction and edge modes","latency":[256.0,186.0,230.0,215.0,226.0,242.0],"camera_reprocessing_shot_to_shot_average_latency":225.83333333333334},{"camera_id":"0","format":35,"reprocess_type":"YUV reprocessing","capture_message":"shot to shot latency for High Quality noise reduction and edge modes","latency":[415.0,327.0,336.0,340.0,323.0,332.0],"camera_reprocessing_shot_to_shot_average_latency":345.5},{"camera_id":"0","format":34,"reprocess_type":"opaque reprocessing","capture_message":"shot to shot latency for High Quality noise reduction and edge modes","latency":[381.0,302.0,331.0,332.0,336.0,333.0],"camera_reprocessing_shot_to_shot_average_latency":335.8333333333333},{"camera_id":"1","format":35,"reprocess_type":"YUV reprocessing","capture_message":"shot to shot latency for High Quality noise reduction and edge modes","latency":[231.0,222.0,223.0,227.0,227.0,223.0],"camera_reprocessing_shot_to_shot_average_latency":225.5},{"camera_id":"1","format":34,"reprocess_type":"opaque reprocessing","capture_message":"shot to shot latency for High Quality noise reduction and edge modes","latency":[275.0,178.0,222.0,224.0,249.0,204.0],"camera_reprocessing_shot_to_shot_average_latency":225.33333333333334}],"test_single_capture":[{"camera_id":"0","camera_capture_latency":[476.0,639.0,654.0,639.0,665.0],"camera_capture_result_latency":[260.0,465.0,490.0,471.0,474.0]},{"camera_id":"1","camera_capture_latency":[461.0,639.0,627.0,637.0,631.0],"camera_capture_result_latency":[341.0,530.0,533.0,533.0,535.0]},{"camera_id":"0","camera_capture_latency":[465.0,643.0,660.0,649.0,642.0],"camera_capture_result_latency":[251.0,467.0,491.0,474.0,475.0]},{"camera_id":"1","camera_capture_latency":[457.0,541.0,533.0,546.0,534.0],"camera_capture_result_latency":[338.0,475.0,467.0,477.0,471.0]}],"test_single_capture_average":[{"camera_capture_result_average_latency_for_all_cameras":463.2},{"camera_capture_result_average_latency_for_all_cameras":438.6}],"test_reprocessing_capture_stall":[{"camera_id":"0","format":35,"reprocess_type":"YUV reprocessing","max_capture_timestamp_gaps":[66.929849,66.927076,66.827072],"capture_average_frame_duration":[66.742792,66.742792,66.742792],"camera_reprocessing_average_max_capture_timestamp_gaps":66.89466566666665},{"camera_id":"0","format":34,"reprocess_type":"opaque reprocessing","max_capture_timestamp_gaps":[66.838494,66.862969,67.054342],"capture_average_frame_duration":[66.742792,66.742792,66.742792],"camera_reprocessing_average_max_capture_timestamp_gaps":66.91860166666667},{"camera_id":"1","format":35,"reprocess_type":"YUV reprocessing","max_capture_timestamp_gaps":[75.091,75.156,75.092],"capture_average_frame_duration":[75.08460800000003,75.08460800000003,75.08460800000003],"camera_reprocessing_average_max_capture_timestamp_gaps":75.113},{"camera_id":"1","format":34,"reprocess_type":"opaque reprocessing","max_capture_timestamp_gaps":[75.096,75.09,75.091],"capture_average_frame_duration":[75.08460800000003,75.08460800000003,75.08460800000003],"camera_reprocessing_average_max_capture_timestamp_gaps":75.09233333333333},{"camera_id":"0","format":35,"reprocess_type":"YUV reprocessing","max_capture_timestamp_gaps":[66.810656,67.101617,66.811857],"capture_average_frame_duration":[66.742792,66.742792,66.742792],"camera_reprocessing_average_max_capture_timestamp_gaps":66.90804333333334},{"camera_id":"0","format":34,"reprocess_type":"opaque reprocessing","max_capture_timestamp_gaps":[133.322575,66.919741,66.95088],"capture_average_frame_duration":[66.742792,66.742792,66.742792],"camera_reprocessing_average_max_capture_timestamp_gaps":89.06439866666666},{"camera_id":"1","format":35,"reprocess_type":"YUV reprocessing","max_capture_timestamp_gaps":[80.088,80.091,80.089],"capture_average_frame_duration":[80.08507200000001,80.08507200000001,80.08507200000001],"camera_reprocessing_average_max_capture_timestamp_gaps":80.08933333333333},{"camera_id":"1","format":34,"reprocess_type":"opaque reprocessing","max_capture_timestamp_gaps":[80.092,80.091,80.091],"capture_average_frame_duration":[80.08507200000001,80.08507200000001,80.08507200000001],"camera_reprocessing_average_max_capture_timestamp_gaps":80.09133333333334}],"test_camera_launch":[{"camera_id":"0","camera_open_time":[116.0,85.0,88.0,83.0,86.0],"camera_configure_stream_time":[20.0,11.0,11.0,10.0,10.0],"camera_start_preview_time":[312.0,224.0,223.0,219.0,230.0],"camera_camera_stop_preview":[278.0,255.0,265.0,268.0,267.0],"camera_camera_close_time":[107.0,124.0,103.0,108.0,127.0],"camera_launch_time":[448.0,320.0,322.0,312.0,326.0]},{"camera_id":"1","camera_open_time":[72.0,67.0,67.0,67.0,65.0],"camera_configure_stream_time":[12.0,10.0,11.0,10.0,11.0],"camera_start_preview_time":[227.0,231.0,224.0,226.0,233.0],"camera_camera_stop_preview":[167.0,162.0,171.0,170.0,168.0],"camera_camera_close_time":[96.0,87.0,91.0,85.0,90.0],"camera_launch_time":[311.0,308.0,302.0,303.0,309.0]},{"camera_id":"0","camera_open_time":[96.0,85.0,89.0,89.0,84.0],"camera_configure_stream_time":[14.0,10.0,10.0,10.0,10.0],"camera_start_preview_time":[262.0,220.0,224.0,221.0,226.0],"camera_camera_stop_preview":[259.0,251.0,271.0,257.0,265.0],"camera_camera_close_time":[117.0,153.0,120.0,122.0,118.0],"camera_launch_time":[372.0,315.0,323.0,320.0,320.0]},{"camera_id":"1","camera_open_time":[71.0,67.0,68.0,70.0,69.0],"camera_configure_stream_time":[11.0,10.0,10.0,10.0,10.0],"camera_start_preview_time":[228.0,235.0,233.0,237.0,239.0],"camera_camera_stop_preview":[167.0,169.0,169.0,162.0,173.0],"camera_camera_close_time":[95.0,89.0,93.0,94.0,103.0],"camera_launch_time":[310.0,312.0,311.0,317.0,318.0]}],"test_high_quality_reprocessing_throughput":[{"camera_id":"0","format":35,"reprocess_type":"YUV reprocessing","capture_message":"capture latency for High Quality noise reduction and edge modes","latency":[272.0,246.0,211.0,210.0,235.0,202.0],"camera_reprocessing_average_latency":229.33333333333334},{"camera_id":"0","format":34,"reprocess_type":"opaque reprocessing","capture_message":"capture latency for High Quality noise reduction and edge modes","latency":[304.0,210.0,206.0,209.0,226.0,229.0],"camera_reprocessing_average_latency":230.66666666666666},{"camera_id":"1","format":35,"reprocess_type":"YUV reprocessing","capture_message":"capture latency for High Quality noise reduction and edge modes","latency":[246.0,123.0,116.0,114.0,131.0,109.0],"camera_reprocessing_average_latency":139.83333333333334},{"camera_id":"1","format":34,"reprocess_type":"opaque reprocessing","capture_message":"capture latency for High Quality noise reduction and edge modes","latency":[211.0,112.0,116.0,112.0,123.0,110.0],"camera_reprocessing_average_latency":130.66666666666666},{"camera_id":"0","format":35,"reprocess_type":"YUV reprocessing","capture_message":"capture latency for High Quality noise reduction and edge modes","latency":[349.0,215.0,214.0,214.0,238.0,213.0],"camera_reprocessing_average_latency":240.5},{"camera_id":"0","format":34,"reprocess_type":"opaque reprocessing","capture_message":"capture latency for High Quality noise reduction and edge modes","latency":[326.0,206.0,204.0,206.0,225.0,232.0],"camera_reprocessing_average_latency":233.16666666666666},{"camera_id":"1","format":35,"reprocess_type":"YUV reprocessing","capture_message":"capture latency for High Quality noise reduction and edge modes","latency":[238.0,119.0,130.0,116.0,130.0,114.0],"camera_reprocessing_average_latency":141.16666666666666},{"camera_id":"1","format":34,"reprocess_type":"opaque reprocessing","capture_message":"capture latency for High Quality noise reduction and edge modes","latency":[249.0,117.0,122.0,113.0,129.0,119.0],"camera_reprocessing_average_latency":141.5}]}
\ No newline at end of file
diff --git a/tools/cts-test-metrics/CtsUiHostTestCases.reportlog.json b/tools/cts-test-metrics/CtsUiHostTestCases.reportlog.json
new file mode 100644
index 0000000..6355fe3
--- /dev/null
+++ b/tools/cts-test-metrics/CtsUiHostTestCases.reportlog.json
@@ -0,0 +1 @@
+{"test_install_time":[{"install_time":[1950.0,1722.0,1762.0,1678.0,1738.0,1694.0,1787.0,1797.0,1799.0,1786.0],"install_time_average":1771.3},{"install_time":[1976.0,1986.0,1930.0,1729.0,1859.0,1875.0,1904.0,1805.0,1748.0,1875.0],"install_time_average":1868.7}]}
\ No newline at end of file
diff --git a/tools/cts-test-metrics/README b/tools/cts-test-metrics/README
new file mode 100644
index 0000000..cb68f3a
--- /dev/null
+++ b/tools/cts-test-metrics/README
@@ -0,0 +1,14 @@
+The parse_test_metrics.py script can be used to parse test metrics json files. Run the following
+command to see a demo:
+python parse_test_metrics.py CtsCameraTestCases.reportlog.json
+
+To parse multiple files, list all files as arguments. Try the following:
+python parse_test_metrics.py CtsCameraTestCases.reportlog.json CtsUiHostTestCases.reportlog.json
+python parse_test_metrics.py *.json
+
+Test metrics json files can be found in $CTS_ROOT/repository/results/$RESULT_DIR/report-log-files/
+directory.
+
+The MetricsParser class defines functions to parse a json file. The _Parse function takes a filename
+as input, reads the json file and adds the json object to json_data. The _PrintJson function
+takes the filename and corresponding json_data and prints out the streams as key, value pairs.
diff --git a/tools/cts-test-metrics/parse_test_metrics.py b/tools/cts-test-metrics/parse_test_metrics.py
new file mode 100755
index 0000000..839e372
--- /dev/null
+++ b/tools/cts-test-metrics/parse_test_metrics.py
@@ -0,0 +1,58 @@
+#!/usr/bin/python
+# 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.
+#
+
+import argparse, json, sys
+
+class MetricsParser(object):
+  """Executor of this utility"""
+
+  def __init__(self):
+    self._parser = argparse.ArgumentParser('Parse CTS Test metrics jsons')
+    self._parser.add_argument('filenames', metavar='filenames', nargs='+',
+                              help='filenames of metrics jsons to be parsed')
+    self._metrics = []
+
+  def _ParseArgs(self):
+    self._args = self._parser.parse_args()
+
+  def _Parse(self, filename):
+    json_file = open(filename)
+    json_data = json.load(json_file)
+    self._metrics.append(json_data)
+    self._PrintJson(filename, json_data)
+
+  def _PrintJson(self, filename, json_data):
+    print "\nFilename: %s" % filename
+    stream_names = json_data.keys()
+    for stream_name in stream_names:
+      metrics_list = json_data.get(stream_name)
+      for metrics in metrics_list:
+        print "\nStream Name: %s" % stream_name
+        for key in metrics.keys():
+          print "Key: %s \t Value: %s" % (key, str(metrics.get(key)))
+
+  def Run(self):
+    self._ParseArgs()
+    try:
+      for filename in self._args.filenames:
+        self._Parse(filename)
+    except (IOError, ValueError) as e:
+      print >> sys.stderr, e
+      raise KeyboardInterrupt
+
+if __name__ == '__main__':
+  MetricsParser().Run()
+
diff --git a/tools/cts-tradefed/Android.bp b/tools/cts-tradefed/Android.bp
new file mode 100644
index 0000000..93c2062
--- /dev/null
+++ b/tools/cts-tradefed/Android.bp
@@ -0,0 +1,36 @@
+// Copyright (C) 2015 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.
+
+java_library_host {
+    name: "cts-tradefed-harness",
+
+    java_resource_dirs: ["res"],
+    libs: [
+        "tradefed",
+        "compatibility-host-util",
+    ],
+    static_libs: [
+        "compatibility-tradefed",
+    ],
+}
+
+tradefed_binary_host {
+    name: "cts-tradefed",
+    wrapper: "etc/cts-tradefed",
+    short_name: "CTS",
+    full_name: "Compatibility Test Suite",
+    version: "11_r2",
+    static_libs: ["cts-tradefed-harness"],
+    required: ["compatibility-host-util"],
+}
diff --git a/tools/cts-tradefed/DynamicConfig.xml b/tools/cts-tradefed/DynamicConfig.xml
new file mode 100644
index 0000000..60b0e98
--- /dev/null
+++ b/tools/cts-tradefed/DynamicConfig.xml
@@ -0,0 +1,21 @@
+<!-- Copyright (C) 2015 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.
+-->
+
+<!--TODO(b/117957288): Remove dynamic config from suite-level.-->
+<dynamicConfig>
+    <entry key="media_files_url">
+         <value>https://dl.google.com/dl/android/cts/android-cts-media-1.4.zip</value>
+    </entry>
+</dynamicConfig>
diff --git a/tools/cts-tradefed/README b/tools/cts-tradefed/README
new file mode 100644
index 0000000..99d155a
--- /dev/null
+++ b/tools/cts-tradefed/README
@@ -0,0 +1,83 @@
+CTS Trade Federation
+---------------------
+
+CTS Trade Federation, cts-tradefed for short, is the next
+generation test harness for CTS.
+
+cts-tradefed is built on top of the Android Trade Federation test harness.
+
+It works in a similar manner to the prior CTS harness, but supports some
+advanced features such as:
+
+  - modular, flexible extensible design. cts-tradefed can be extended to
+support running CTS in a continuous test environment.
+  - supports sharding a CTS test run across multiple devices in parallel
+  - automatically continue a CTS test run on another device if connection
+is lost
+
+Configuring cts-tradefed
+------------------------
+
+1. Ensure 'adb' is in your current PATH. adb can be found in the
+Android SDK available from http://developer.android.com
+
+Example:
+  PATH=$PATH:/home/myuser/android-sdk-linux_x86/platform-tools
+
+2. Follow the 'Setting up your device' steps documented in the
+CTS User Manual. The CTS User Manual can be downloaded at
+http://source.android.com/compatibility/downloads.html
+
+3. Connect the device to the host machine.
+
+4. Ensure device is visible via 'adb devices'
+
+Using cts-tradefed
+-------------------
+
+To run a test plan on a single device:
+
+1. Make sure you have at least one device connected
+2. Launch the cts-tradefed console by running the 'cts-tradefed'. If you've
+downloaded and extracted the CTS zip, the script can be found at
+  android-cts/tools/cts-tradefed
+Or else if you are working from the Android source tree and have run make cts,
+the script can be found at
+  out/host/linux-x86/cts/android-cts/tools/cts-tradefed
+3. Type:
+'run cts' to run the default CTS plan
+
+Some other useful commands are
+
+To run a test module:
+'run cts --module <module_name>'
+
+To run a specific test:
+'run cts --module <module_name> --test <test_name>'
+
+To shard a plan test run on multiple devices
+'run cts --shard-count <number of shards>
+note: all connected devices must be running the same build
+
+For more options:
+'run cts --help'
+
+CTS Tradefed Development
+------------------------
+See http://source.android.com for instructions on obtaining the Android
+platform source code and setting up a build environment.
+
+The source for the CTS extensions for tradefed can be found at
+<android source root>/cts/tools/tradefed-host
+
+The source for the tradefed framework can be found on the 'tradefed' branch.
+
+Perform these steps to build and run cts-tradefed from the development
+environment:
+cd <path to android source root>
+make cts
+cts-tradefed
+
+More documentation and details on using and extending trade federation will
+be forthcoming in the near future.
+
diff --git a/tools/cts-tradefed/etc/cts-tradefed b/tools/cts-tradefed/etc/cts-tradefed
new file mode 100755
index 0000000..ed62d05
--- /dev/null
+++ b/tools/cts-tradefed/etc/cts-tradefed
@@ -0,0 +1,142 @@
+#!/bin/bash
+
+# Copyright (C) 2015 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.
+
+# launcher script for cts-tradefed harness
+# can be used from an Android build environment, or a standalone cts zip
+
+checkFile() {
+    if [ ! -f "$1" ]; then
+        echo "Unable to locate $1"
+        exit
+    fi;
+}
+
+checkPath() {
+    if ! type -P $1 &> /dev/null; then
+        echo "Unable to find $1 in path."
+        exit
+    fi;
+}
+
+# readlink does not work on MacOS so rely on our own realpath
+realpath() {
+    [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
+}
+
+checkPath aapt
+checkPath adb
+checkPath java
+
+# check java version
+JAVA_VERSION=$(java -version 2>&1 | grep -m 1 'version [ "]\(1\.8\|9\|11\).*[ "]')
+if [ "${JAVA_VERSION}" == "" ]; then
+    echo "Wrong java version. 1.8, 9, or 11 is required."
+    exit
+fi
+
+# check debug flag and set up remote debugging
+if [ -n "${TF_DEBUG}" ]; then
+  if [ -z "${TF_DEBUG_PORT}" ]; then
+    TF_DEBUG_PORT=10088
+  fi
+  RDBG_FLAG=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=${TF_DEBUG_PORT}
+fi
+
+JAVA_BINARY=${CTS_ROOT}/android-cts/jdk/bin/java
+
+if [ ! -f "${JAVA_BINARY}" ]; then
+    JAVA_BINARY=java
+fi
+
+# get OS
+HOST=`uname`
+if [ "$HOST" == "Linux" ]; then
+    OS="linux-x86"
+elif [ "$HOST" == "Darwin" ]; then
+    OS="darwin-x86"
+    # Bundled java is for linux so use host JDK on Darwin
+    JAVA_BINARY=java
+else
+    echo "Unrecognized OS"
+    exit
+fi
+
+# check if in Android build env
+if [ ! -z "${ANDROID_BUILD_TOP}" ]; then
+    if [ ! -z "${ANDROID_HOST_OUT}" ]; then
+      CTS_ROOT=${ANDROID_HOST_OUT}/cts
+    else
+      CTS_ROOT=${ANDROID_BUILD_TOP}/${OUT_DIR:-out}/host/${OS}/cts
+    fi
+    if [ ! -d ${CTS_ROOT} ]; then
+        echo "Could not find $CTS_ROOT in Android build environment. Try 'make cts'"
+        exit
+    fi;
+fi;
+
+if [ -z ${CTS_ROOT} ]; then
+    # assume we're in an extracted cts install
+    CTS_ROOT="$(dirname $(realpath $0))/../.."
+fi;
+
+JAR_DIR=${CTS_ROOT}/android-cts/tools
+JARS="tradefed
+  tradefed-test-framework
+  loganalysis
+  compatibility-host-util
+  compatibility-host-util-tests
+  cts-tradefed
+  cts-tradefed-tests
+  compatibility-common-util-tests
+  compatibility-tradefed-tests"
+
+for JAR in $JARS; do
+    checkFile ${JAR_DIR}/${JAR}.jar
+    JAR_PATH=${JAR_PATH}:${JAR_DIR}/${JAR}.jar
+done
+JAR_PATH=${JAR_PATH:1} # Strip off leading ':'
+
+OPTIONAL_JARS="
+  google-tradefed
+  google-tradefed-tests
+  google-tf-prod-tests"
+
+STANDALONE_JAR_DIR=${ANDROID_HOST_OUT}/framework
+for JAR in $OPTIONAL_JARS; do
+    if [ -f "${JAR_DIR}/${JAR}.jar" ]; then
+        JAR_PATH=${JAR_PATH}:${JAR_DIR}/${JAR}.jar
+    elif [ -f "${STANDALONE_JAR_DIR}/${JAR}.jar" ]; then
+        JAR_PATH=${JAR_PATH}:${STANDALONE_JAR_DIR}/${JAR}.jar
+    fi;
+done
+
+# load any shared libraries for host-side executables
+LIB_DIR=${CTS_ROOT}/android-cts/lib
+if [ "$HOST" == "Linux" ]; then
+    LD_LIBRARY_PATH=${LIB_DIR}:${LIB_DIR}64:${LD_LIBRARY_PATH}
+    export LD_LIBRARY_PATH
+elif [ "$HOST" == "Darwin" ]; then
+    DYLD_LIBRARY_PATH=${LIB_DIR}:${LIB_DIR}64:${DYLD_LIBRARY_PATH}
+    export DYLD_LIBRARY_PATH
+fi
+
+# include any host-side test jars
+for j in ${CTS_ROOT}/android-cts/testcases/*.jar; do
+    JAR_PATH=${JAR_PATH}:$j
+done
+
+${JAVA_BINARY} $RDBG_FLAG -Xmx6g -XX:+HeapDumpOnOutOfMemoryError -cp ${JAR_PATH} -DCTS_ROOT=${CTS_ROOT} com.android.compatibility.common.tradefed.command.CompatibilityConsole "$@"
+
diff --git a/tools/cts-tradefed/res/config/basic-reporters.xml b/tools/cts-tradefed/res/config/basic-reporters.xml
new file mode 100644
index 0000000..6fddf24
--- /dev/null
+++ b/tools/cts-tradefed/res/config/basic-reporters.xml
@@ -0,0 +1,17 @@
+<?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.
+-->
+<configuration description="Configuration with basic CTS reporters" >
+</configuration>
diff --git a/tools/cts-tradefed/res/config/collect-tests-only.xml b/tools/cts-tradefed/res/config/collect-tests-only.xml
new file mode 100644
index 0000000..a3769a9
--- /dev/null
+++ b/tools/cts-tradefed/res/config/collect-tests-only.xml
@@ -0,0 +1,35 @@
+<?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.
+-->
+<configuration description="Runs CTS from a pre-existing CTS installation">
+
+    <include name="cts" />
+
+    <!-- This tells cts-tradefed and the server what the plan name is, reports that have this plan
+         name should not be accepted, as it doesn't actually run the tests it simply marks all of
+         them as passed.
+         Obviously no one would modify the report before uploading to falsify this
+         information, as that would be dishonest, and dishonesty kills kittens :'( -->
+    <option name="plan" value="collect-tests-only" />
+
+    <option name="skip-preconditions" value="true" />
+    <option name="skip-system-status-check" value="com.android.compatibility.common.tradefed.targetprep.NetworkConnectivityChecker" />
+    <option name="preparer-whitelist" value="com.android.tradefed.targetprep.suite.SuiteApkInstaller" />
+    <option name="preparer-whitelist" value="com.android.compatibility.common.tradefed.targetprep.ApkInstaller" />
+    <option name="preparer-whitelist" value="com.android.compatibility.common.tradefed.targetprep.FilePusher" />
+
+    <option name="compatibility:collect-tests-only" value="true" />
+
+</configuration>
diff --git a/tools/cts-tradefed/res/config/csi-known-failures.xml b/tools/cts-tradefed/res/config/csi-known-failures.xml
new file mode 100644
index 0000000..bbb98b7
--- /dev/null
+++ b/tools/cts-tradefed/res/config/csi-known-failures.xml
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+<configuration description="Known fialures on CSI">
+    <!-- Troublesome tests that often crash the system -->
+    <option name="compatibility:exclude-filter" value="CtsAppExitTestCases android.app.cts.ActivityManagerAppExitInfoTest#testCrash" />
+    <option name="compatibility:exclude-filter" value="CtsAppExitTestCases android.app.cts.ActivityManagerAppExitInfoTest#testNativeCrash" />
+    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.ExternalStorageHostTest#testMediaEscalation28" />
+    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.ExternalStorageHostTest#testMediaEscalation29" />
+    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.ExternalStorageHostTest#testMediaEscalation" />
+    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.ActivityManagerFgsBgStartTest#testFgsLocationPendingIntent" />
+    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.NotificationManagerTest#testNotificationManagerBubble_checkActivityFlagsDocumentLaunchMode" />
+    <option name="compatibility:exclude-filter" value="CtsDeviceIdleHostTestCases com.android.cts.deviceidle.DeviceIdleWhitelistTest#testRemovesPersistedAcrossReboots" />
+    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.DeviceOwnerTest#testProxyPacProxyTest" />
+    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedDeviceOwnerTest#testPackageInstallUserRestrictions" />
+    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#requestEmptyRoleThenDeniedAutomatically" />
+    <option name="compatibility:exclude-filter" value="CtsStatsdHostTestCases android.cts.statsd.metric.MetricActivationTests#testRestart" />
+    <option name="compatibility:exclude-filter" value="CtsStatsdHostTestCases android.cts.statsd.metric.MetricActivationTests#testMultipleActivations" />
+    <option name="compatibility:exclude-filter" value="CtsStatsdHostTestCases android.cts.statsd.atom.UidAtomTests#testANROccurred" />
+    <option name="compatibility:exclude-filter" value="CtsStatsdHostTestCases android.cts.statsd.atom.UidAtomTests#testAppCrashOccurred" />
+    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.SurfaceViewTests#testMovingWhiteSurfaceView" />
+
+    <!-- Exclude known failure of CtsMediaTestCases (mostly on some Pixel phones) -->
+    <!-- CSI doesn't seem to include ringtones. -->
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.RingtoneManagerTest" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.RingtoneTest" />
+
+    <!-- Following failures take about 10 min each, so exclude them to reduce test time. -->
+    <!-- CSI on Goldfish can pass the following tests in StreamingMediaPlayerTest. -->
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.StreamingMediaPlayerTest#testHTTP_H263_AMR_Video2" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.StreamingMediaPlayerTest#testHTTP_H264Base_AAC_Video2" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.StreamingMediaPlayerTest#testHTTP_MPEG4SP_AAC_Video2" />
+
+    <!-- CSI on Cuttlefish and Goldfish can pass the following tests in VideoCodecTest. -->
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoCodecTest#testParallelEncodingAndDecodingAVC" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoCodecTest#testParallelEncodingAndDecodingHEVC" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoCodecTest#testParallelEncodingAndDecodingVP8" />
+
+    <!-- Failures will crash the test harness, so exclude it here (even though only failed with VP9 decoder). -->
+    <!-- CSI on Cuttlefish and Goldfish can pass the following tests in VideoDecoderRotationTest. -->
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderRotationTest" />
+
+    <!-- CSI on Cuttlefish and Goldfish can pass the following tests in VideoDecoderPerfTest. -->
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testAvcOther0Perf0320x0240" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testAvcOther0Perf0720x0480" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testAvcOther0Perf1280x0720" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testAvcOther1Perf0320x0240" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testAvcOther1Perf0720x0480" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testAvcOther1Perf1280x0720" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testAvcOther1Perf1920x1080" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testHevcOther0Perf0352x0288" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testHevcOther0Perf0640x0360" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testHevcOther0Perf0720x0480" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testHevcOther0Perf1280x0720" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testHevcOther0Perf1920x1080" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testHevcOther1Perf0352x0288" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testHevcOther1Perf0640x0360" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testHevcOther1Perf0720x0480" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testHevcOther1Perf1280x0720" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testHevcOther1Perf1920x1080" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testHevcOther1Perf3840x2160" />
+
+    <!-- CSI on Cuttlefish and Goldfish can pass the following tests in VideoEncoderTest. -->
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogH263SurfMinMin" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogH265SurfArbitraryH" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogH265SurfArbitraryW" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogH265SurfMaxMax" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogH265SurfMaxMin" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogH265SurfMinMax" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogH265SurfNearMaxMax" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogH265SurfNearMaxMin" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogH265SurfNearMinMax" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogH265SurfQCIF" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogMpeg4SurfArbitraryH" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogMpeg4SurfArbitraryW" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogMpeg4SurfMaxMax" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogMpeg4SurfMinMax" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogMpeg4SurfNearMaxMax" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogMpeg4SurfNearMaxMin" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogMpeg4SurfNearMinMax" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogMpeg4SurfNearMinMin" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP8Surf480p" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP8SurfArbitraryH" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP8SurfArbitraryW" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP8SurfMaxMax" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP8SurfMaxMin" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP8SurfMinMax" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP8SurfNearMaxMax" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP8SurfNearMaxMin" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP8SurfNearMinMax" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP8SurfQCIF" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP9Surf480p" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP9SurfArbitraryH" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP9SurfArbitraryW" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP9SurfMaxMax" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP9SurfMaxMin" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP9SurfMinMax" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP9SurfNearMaxMax" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP9SurfNearMaxMin" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP9SurfNearMinMax" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP9SurfQCIF" />
+
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-automated.xml b/tools/cts-tradefed/res/config/cts-automated.xml
new file mode 100644
index 0000000..150f8b9
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-automated.xml
@@ -0,0 +1,32 @@
+<?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.
+-->
+<configuration description="Runs CTS with common options set for an automated run on userdebug/eng builds">
+
+    <include name="cts" />
+
+    <option name="plan" value="cts" />
+
+    <option name="skip-preconditions" value="false" />
+    <option name="skip-system-status-check" value="com.android.compatibility.common.tradefed.targetprep.NetworkConnectivityChecker" />
+
+    <!-- Tell all AndroidJUnitTests to exclude certain annotations -->
+    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:exclude-annotation:android.platform.test.annotations.RestrictedBuildTest" />
+
+    <!-- Tell all HostTests to exclude certain annotations -->
+    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.HostTest:exclude-annotation:android.platform.test.annotations.RestrictedBuildTest" />
+    <option name="compatibility:test-arg" value="com.android.compatibility.common.tradefed.testtype.JarHostTest:exclude-annotation:android.platform.test.annotations.RestrictedBuildTest" />
+
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-camera.xml b/tools/cts-tradefed/res/config/cts-camera.xml
new file mode 100644
index 0000000..47377b4
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-camera.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<configuration description="Runs CTS-camera from a pre-existing CTS installation">
+
+    <include name="cts" />
+
+    <option name="plan" value="cts-camera" />
+
+    <!-- All camera CTS tests -->
+    <option name="compatibility:include-filter" value="CtsCameraTestCases" />
+
+    <!-- Other camera related CTS tests -->
+    <option name="compatibility:include-filter"
+        value="CtsAppTestCases android.app.cts.SystemFeaturesTest#testCameraFeatures"/>
+    <option name="compatibility:include-filter"
+        value="CtsPermissionTestCases android.permission.cts.CameraPermissionTest"/>
+    <option name="compatibility:include-filter"
+        value="CtsPermissionTestCases android.permission.cts.Camera2PermissionTest"/>
+
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-common.xml b/tools/cts-tradefed/res/config/cts-common.xml
new file mode 100644
index 0000000..c1dffd2
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-common.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+<configuration description="Common configuration for cts and cts-reference-aosp">
+
+    <include name="everything" />
+    <option name="compatibility:run-suite-tag" value="cts" />
+    <!-- Enable module parameterization to run instant_app modules in main CTS -->
+    <option name="compatibility:enable-parameterized-modules" value="true" />
+    <include name="cts-preconditions" />
+    <include name="cts-system-checkers" />
+    <include name="cts-known-failures" />
+
+    <option name="test-tag" value="cts" />
+
+    <option name="enable-root" value="false" />
+    <!-- retain 200MB of host log -->
+    <option name="max-log-size" value="200" />
+    <!--  retain 200MB of logcat -->
+    <option name="max-tmp-logcat-file" value="209715200" />
+
+    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
+        <option name="run-command" value="settings put global package_verifier_enable 0" />
+        <option name="teardown-command" value="settings put global package_verifier_enable 1"/>
+    </target_preparer>
+
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.PropertyCheck">
+        <option name="property-name" value="ro.build.type" />
+        <option name="expected-value" value="user"/> <!-- Device should have user build -->
+        <option name="throw-error" value="false"/> <!-- Only print warning if not user build -->
+    </target_preparer>
+
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.PropertyCheck">
+        <option name="property-name" value="ro.product.locale" />
+        <option name="expected-value" value="en-US"/> <!-- Device locale should be US English -->
+        <option name="throw-error" value="false"/> <!-- Only print warning if not en-US -->
+    </target_preparer>
+
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.PropertyCheck">
+        <option name="property-name" value="persist.sys.test_harness" />
+        <option name="expected-value" value="false"/> <!-- Device shouldn't be in test harness mode -->
+        <option name="throw-error" value="true"/>
+    </target_preparer>
+
+    <template-include name="reporters" default="basic-reporters" />
+
+    <!-- Include additional test metadata output. -->
+    <template-include name="metadata-reporters" default="empty" />
+
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-dev.xml b/tools/cts-tradefed/res/config/cts-dev.xml
new file mode 100644
index 0000000..11c1052
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-dev.xml
@@ -0,0 +1,31 @@
+<?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.
+-->
+<configuration description="Runs CTS with common options set developer workflow: skips most checks">
+
+    <include name="cts" />
+
+    <option name="log-level" value="verbose" />
+    <option name="skip-preconditions" value="true" />
+    <option name="skip-device-info" value="true" />
+    <option name="result-reporter:compress-logs" value="false" />
+
+    <option name="plan" value="cts-dev" />
+    <option name="compatibility:skip-all-system-status-check" value="true" />
+    <option name="compatibility:primary-abi-only" value="true" />
+    <!-- Avoid module parameterization in cts-dev -->
+    <option name="compatibility:enable-parameterized-modules" value="false" />
+
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-device-files.xml b/tools/cts-tradefed/res/config/cts-device-files.xml
new file mode 100644
index 0000000..6acf7bb
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-device-files.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+<configuration description="CTS device files collection">
+    <option name="plan" value="cts-device-files" />
+
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.DeviceFileCollector">
+        <option name="src-file" value="/sys/fs/selinux/policy" />
+        <option name="dest-file" value="vintf-files/sepolicy"/>
+        <option name="property" key="ro.treble.enabled" value="true"/>
+    </target_preparer>
+
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.DeviceFileCollector">
+        <option name="src-file" value="/proc/config.gz" />
+        <option name="dest-file" value="vintf-files/proc_config.gz"/>
+        <option name="property" key="ro.treble.enabled" value="true"/>
+    </target_preparer>
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-exclude-instant.xml b/tools/cts-tradefed/res/config/cts-exclude-instant.xml
new file mode 100644
index 0000000..402d227
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-exclude-instant.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 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.
+-->
+<configuration description="Excluded tests applicable only to instant mode">
+    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:exclude-annotation:android.platform.test.annotations.AppModeInstant" />
+    <option name="compatibility:test-arg" value="com.android.compatibility.common.tradefed.testtype.JarHostTest:exclude-annotation:android.platform.test.annotations.AppModeInstant" />
+    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.HostTest:exclude-annotation:android.platform.test.annotations.AppModeInstant" />
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-exclude.xml b/tools/cts-tradefed/res/config/cts-exclude.xml
new file mode 100644
index 0000000..f6899a4
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-exclude.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+<configuration description="Excluded tests from main CTS runs">
+    <!-- b/64127136 -->
+    <option name="compatibility:exclude-filter" value="CtsSecurityHostTestCases android.security.cts.SELinuxHostTest#testNoExemptionsForBinderInVendorBan" />
+    <option name="compatibility:exclude-filter" value="CtsSecurityHostTestCases android.security.cts.SELinuxHostTest#testNoExemptionsForSocketsBetweenCoreAndVendorBan" />
+    <option name="compatibility:exclude-filter" value="CtsSecurityHostTestCases android.security.cts.SELinuxHostTest#testNoExemptionsForVendorExecutingCore" />
+
+    <!-- Test Harness Mode tests are not a part of CTS. They are a part
+         of their own testing plan, as they reset the device during the
+         test. It's possible and ideal in the future to incorporate the
+         tests into CTS, but until then, they should be excluded. -->
+    <option name="compatibility:exclude-filter" value="CtsTestHarnessModeTestCases" />
+
+    <!-- Exclude downstreaming tests from CTS, i.e. tests added after the
+         first major release for this API level (They are pulled into GTS
+         instead). -->
+    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:exclude-annotation:com.android.compatibility.common.util.CtsDownstreamingTest" />
+    <option name="compatibility:test-arg" value="com.android.compatibility.common.tradefed.testtype.JarHostTest:exclude-annotation:com.android.compatibility.common.util.CtsDownstreamingTest" />
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-filtered-sample.xml b/tools/cts-tradefed/res/config/cts-filtered-sample.xml
new file mode 100644
index 0000000..e4f454b
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-filtered-sample.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<configuration description="Runs CTS from a pre-existing CTS installation">
+
+    <include name="common-compatibility-config" />
+
+    <option name="plan" value="cts-filtered-sample" />
+
+    <!-- Tell all AndroidJUnitTests to only run the medium sized tests -->
+    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:size:medium" />
+
+    <!-- Include 64bit CtsContentTestCases and tell it which timeout to use -->
+    <option name="compatibility:include-filter" value="arm64-v8a CtsContentTestCases" />
+    <option name="compatibility:module-arg" value="arm64-v8a CtsContentTestCases:test-timeout:600" />
+
+    <!-- Include CtsGestureTestCases but only run the tests on arm32 -->
+    <option name="compatibility:include-filter" value="armeabi-v7a CtsGestureTestCases" />
+
+    <!-- Exclude CtsMediaStressTestCases -->
+    <option name="compatibility:exclude-filter" value="CtsMediaStressTestCases" />
+
+    <!-- Include CtsUtilTestCases but only run the small tests -->
+    <option name="compatibility:include-filter" value="CtsUtilTestCases" />
+    <option name="compatibility:module-arg" value="CtsUtilTestCases:size:small" />
+
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-foldable.xml b/tools/cts-tradefed/res/config/cts-foldable.xml
new file mode 100644
index 0000000..1a3e256
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-foldable.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+<configuration description="CTS plan for foldable devices">
+
+    <include name="cts" />
+
+    <option name="plan" value="cts-foldable" />
+    <option name="result-attribute" key="display_mode" value="1" />
+
+    <!-- CTS tests to be excluded in this plan-->
+    <option name="compatibility:exclude-filter" value="CtsDeqpTestCases" />
+
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-global-presubmit.xml b/tools/cts-tradefed/res/config/cts-global-presubmit.xml
new file mode 100644
index 0000000..5a858e7
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-global-presubmit.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+<configuration description="Runs CTS global presubmit test cases">
+
+    <include name="cts-automated" />
+
+    <option name="plan" value="cts" />
+
+    <!-- Include modules with presubmit test cases, repeat for each applicable module -->
+    <!--option name="compatibility:include-filter" value="<CTS module name goes here>" /-->
+
+    <!-- Only run tests with @GlobalPresubmit annotation. -->
+    <option name="compatibility:test-arg" value="com.android.compatibility.common.tradefed.testtype.JarHostTest:include-annotation:android.platform.test.annotations.GlobalPresubmit" />
+    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:include-annotation:android.platform.test.annotations.GlobalPresubmit" />
+    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.HostTest:include-annotation:android.platform.test.annotations.GlobalPresubmit" />
+
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-java.xml b/tools/cts-tradefed/res/config/cts-java.xml
new file mode 100644
index 0000000..722d8f7
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-java.xml
@@ -0,0 +1,28 @@
+<?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.
+-->
+<configuration description="Runs Core Java Tests from a pre-existing CTS installation">
+
+    <include name="cts" />
+
+    <option name="plan" value="cts-java" />
+
+    <!-- Include CtsLibcoreTestCases -->
+    <option name="compatibility:include-filter" value="CtsLibcoreTestCases" />
+
+    <!-- Exclude CtsLibcoreTestCases harmony -->
+    <option name="compatibility:exclude-filter" value="CtsLibcoreTestCases android.core.tests.libcore.package.harmony" />
+
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-jvmti.xml b/tools/cts-tradefed/res/config/cts-jvmti.xml
new file mode 100644
index 0000000..ce60582
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-jvmti.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 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.
+-->
+<configuration description="Runs JVMTI Tests from a pre-existing CTS installation">
+
+    <!-- Using cts-dev to avoid system checkers. -->
+    <include name="cts-dev" />
+
+    <option name="plan" value="cts-jvmti" />
+
+    <!-- Include all JVMTI test cases -->
+    <option name="compatibility:include-filter" value="CtsJvmtiAttachingHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRedefineClassesHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest902HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest903HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest904HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest905HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest906HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest907HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest908HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest910HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest911HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest912HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest913HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest914HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest915HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest917HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest918HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest919HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest920HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest922HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest923HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest924HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest926HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest927HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest928HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest930HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest931HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest932HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest940HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest942HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest944HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest945HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest947HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest951HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest982HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest983HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest984HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest985HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest986HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest988HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest989HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest990HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest991HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest992HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest993HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest994HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest995HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest996HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest997HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1900HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1901HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1902HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1903HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1904HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1906HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1907HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1908HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1909HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1910HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1911HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1912HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1913HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1914HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1915HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1916HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1917HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1920HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1921HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1922HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1923HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1924HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1925HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1926HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1927HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1928HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1930HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1931HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1932HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1933HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1934HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1936HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1937HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1939HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1941HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1942HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1943HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1953HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiTaggingHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiTrackingHostTestCases" />
+
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-known-failures.xml b/tools/cts-tradefed/res/config/cts-known-failures.xml
new file mode 100644
index 0000000..de90e52
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-known-failures.xml
@@ -0,0 +1,222 @@
+<?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.
+-->
+<configuration description="Configuration with CTS known failures" >
+    <!-- <option name="compatibility:exclude-filter" value="MODULE_NAME" /> Excludes whole module -->
+    <!-- <option name="compatibility:exclude-filter" value="MODULE_NAME PACKAGE_NAME" /> Excludes whole package -->
+    <!-- <option name="compatibility:exclude-filter" value="MODULE_NAME PACKAGE_NAME.CLASS_NAME" /> Excludes whole class -->
+    <!-- <option name="compatibility:exclude-filter" value="MODULE_NAME PACKAGE_NAME.CLASS_NAME#TEST_NAME" /> Excludes individual test -->
+
+    <!-- b/38182235 -->
+    <option name="compatibility:exclude-filter" value="CtsLocationTestCases android.location.cts.GnssTtffTests#testTtffWithNetwork" />
+    <option name="compatibility:exclude-filter" value="CtsLocationTestCases[instant] android.location.cts.GnssTtffTests#testTtffWithNetwork" />
+
+    <!-- b/23776893 -->
+    <option name="compatibility:exclude-filter" value="CtsDumpsysHostTestCases android.dumpsys.cts.DumpsysHostTest#testBatterystatsOutput" />
+    <option name="compatibility:exclude-filter" value="CtsDumpsysHostTestCases android.dumpsys.cts.DumpsysHostTest#testGfxinfoFramestats" />
+
+    <!-- b/16720689 -->
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.DebuggerOnDemand.OnthrowDebuggerLaunchTest#testDebuggerLaunch001" />
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.DebuggerOnDemand.OnthrowDebuggerLaunchTest#testDebuggerLaunch002" />
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.DebuggerOnDemand.OnthrowDebuggerLaunchTest#testDebuggerLaunch003" />
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.DebuggerOnDemand.OnthrowDebuggerLaunchTest#testDebuggerLaunch004" />
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.DebuggerOnDemand.OnthrowLaunchDebugger001#testDebugger002" />
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.DebuggerOnDemand.OnthrowLaunchDebugger002#testDebugger" />
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.ClassUnloadTest#testClassUnloadEvent" />
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorContendedEnteredTest#testMonitorContendedEnteredForClassMatch" />
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorContendedEnterTest#testMonitorContendedEnterForClassMatch" />
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorWaitedTest#testMonitorWaitedForClassExclude" />
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorWaitedTest#testMonitorWaitedForClassMatchExact" />
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorWaitedTest#testMonitorWaitedForClassMatchFirst" />
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorWaitedTest#testMonitorWaitedForClassMatchSecond" />
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorWaitedTest#testMonitorWaitedForClassOnly" />
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorWaitTest#testMonitorWaitForClassExclude" />
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorWaitTest#testMonitorWaitForClassMatchExact" />
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorWaitTest#testMonitorWaitForClassMatchFirst" />
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorWaitTest#testMonitorWaitForClassMatchSecond" />
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorWaitTest#testMonitorWaitForClassOnly" />
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.ReferenceType.ClassFileVersionTest#testClassFileVersion001" />
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.ReferenceType.NestedTypesTest#testNestedTypes001" />
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.ThreadReference.StopTest#testStop001" />
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.VirtualMachine.HoldEventsTest#testHoldEvents001" />
+    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.VirtualMachine.ReleaseEventsTest#testReleaseEvents001" />
+
+    <!-- b/21262226 -->
+    <option name="compatibility:exclude-filter" value="CtsJobSchedulerTestCases android.jobscheduler.cts.ConnectivityConstraintTest#testConnectivityConstraintExecutes_withMobile" />
+    <option name="compatibility:exclude-filter" value="CtsJobSchedulerTestCases android.jobscheduler.cts.ConnectivityConstraintTest#testUnmeteredConstraintFails_withMobile" />
+
+    <!-- b/18682315 -->
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.SSLCertificateSocketFactoryTest#test_createSocket_bind" />
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.SSLCertificateSocketFactoryTest#test_createSocket_simple" />
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.SSLCertificateSocketFactoryTest#test_createSocket_wrapping" />
+
+    <!-- b/17394321 -->
+    <option name="compatibility:exclude-filter" value="CtsOpenGlPerfTestCases android.openglperf.cts.GlAppSwitchTest#testGlActivitySwitchingFast" />
+    <option name="compatibility:exclude-filter" value="CtsOpenGlPerfTestCases android.openglperf.cts.GlAppSwitchTest#testGlActivitySwitchingSlow" />
+
+    <!-- b/113071420-->
+    <option name="compatibility:exclude-filter" value="x86 CtsPerfettoTestCases PerfettoTest#TestFtraceProducer" />
+
+    <!-- b/18461670 -->
+    <option name="compatibility:exclude-filter" value="CtsSecurityTestCases android.security.cts.AudioPolicyBinderTest#test_getStreamVolumeLeak" />
+    <option name="compatibility:exclude-filter" value="CtsSecurityTestCases android.security.cts.AudioPolicyBinderTest#test_isStreamActive" />
+    <option name="compatibility:exclude-filter" value="CtsSecurityTestCases android.security.cts.AudioPolicyBinderTest#test_isStreamActiveRemotely" />
+    <option name="compatibility:exclude-filter" value="CtsSecurityTestCases android.security.cts.AudioPolicyBinderTest#test_startAudioSource" />
+    <option name="compatibility:exclude-filter" value="CtsSecurityTestCases android.security.cts.AudioPolicyBinderTest#test_startOutput" />
+    <option name="compatibility:exclude-filter" value="CtsSecurityTestCases android.security.cts.AudioPolicyBinderTest#test_stopOutput" />
+    <!-- b/27218502 -->
+    <option name="compatibility:exclude-filter" value="CtsSecurityTestCases android.security.cts.MediaCryptoTest#testMediaCryptoClearKey" />
+    <option name="compatibility:exclude-filter" value="CtsSecurityTestCases android.security.cts.MediaCryptoTest#testMediaCryptoWidevine" />
+
+    <!-- b/63916274 -->
+    <option name="compatibility:exclude-filter" value="CtsTelecomTestCases android.telecom.cts.WiredHeadsetTest" />
+
+    <!-- b/62302163 -->
+    <option name="compatibility:exclude-filter" value="CtsSecurityBulletinHostTestCases android.security.cts.Poc17_04#testPocCVE_2017_0564" />
+
+    <!-- b/72460579 -->
+    <option name="compatibility:exclude-filter" value="CtsSecurityBulletinHostTestCases android.security.cts.Poc17_05#testPocCVE_2017_0630" />
+
+    <!-- b/27873815 -->
+    <option name="compatibility:exclude-filter" value="arm64-v8a CtsRenderscriptLegacyTestCases" />
+    <option name="compatibility:exclude-filter" value="x86_64 CtsRenderscriptLegacyTestCases" />
+    <option name="compatibility:exclude-filter" value="mips64 CtsRenderscriptLegacyTestCases" />
+
+    <!-- b/17536113 -->
+    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.UsageStatsTest#testNoAccessSilentlyFails" />
+
+    <!-- b/26235244 -->
+    <option name="compatibility:exclude-filter" value="android.util.cts.EventLogTest#testWriteEventWithOversizeValue" />
+
+    <!-- b/63115400 -->
+    <option name="compatibility:exclude-filter" value="CtsSecurityHostTestCases android.security.cts.SELinuxHostTest#testAospFileContexts" />
+    <!-- b/64221494 -->
+    <option name="compatibility:exclude-filter" value="CtsSecurityHostTestCases android.security.cts.SELinuxHostTest#testAospPropertyContexts" />
+    <!-- b/64221494 -->
+    <option name="compatibility:exclude-filter" value="CtsSecurityHostTestCases android.security.cts.SELinuxHostTest#testAospSeappContexts" />
+
+    <!-- b/63378294 b/64382381 -->
+    <option name="compatibility:exclude-filter" value="CtsSecurityHostTestCases android.security.cts.SELinuxNeverallowRulesTest#testNeverallowRules440" />
+
+    <!-- b/36686383 -->
+    <option name="compatibility:exclude-filter" value="CtsIncidentHostTestCases com.android.server.cts.ErrorsTest#testANR" />
+
+    <!-- b/33090965 -->
+    <option name="compatibility:exclude-filter" value="CtsVideoTestCases android.video.cts.VideoEncoderDecoderTest#testVp9Goog0Perf0320x0180" />
+    <option name="compatibility:exclude-filter" value="CtsVideoTestCases android.video.cts.VideoEncoderDecoderTest#testVp9Goog0Perf0640x0360" />
+    <option name="compatibility:exclude-filter" value="CtsVideoTestCases android.video.cts.VideoEncoderDecoderTest#testVp9Goog0Perf1280x0720" />
+    <option name="compatibility:exclude-filter" value="CtsVideoTestCases android.video.cts.VideoEncoderDecoderTest#testVp9Goog0Perf1920x1080" />
+
+    <!-- b/63916274 -->
+    <option name="compatibility:exclude-filter" value="CtsTelecomTestCases android.telecom.cts.WiredHeadsetTest" />
+
+    <!-- b/38463882 -->
+    <option name="compatibility:exclude-filter" value="x86_64 CtsLiblogTestCases liblog#event_log_tags" />
+
+    <!-- b/38464828 -->
+    <option name="compatibility:exclude-filter" value="CtsFileSystemTestCases android.filesystem.cts.AlmostFullTest" />
+
+    <!-- b/37271927 -->
+    <option name="compatibility:exclude-filter" value="CtsViewTestCases android.view.cts.ViewTest#testUpdateDragShadow" />
+
+    <!-- b/62481870 -->
+    <option name="compatibility:exclude-filter" value="CtsNativeMediaAAudioTestCases android.nativemedia.aaudio.AAudioOutputStreamCallbackTest#testPlayback" />
+
+    <!-- b/134654621 -->
+    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.AppConfigurationTests#testTaskCloseRestoreFreeOrientation" />
+    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.AppConfigurationTests#testAppOrientationRequestConfigClears" />
+
+    <!-- b/62976713 -->
+    <option name="compatibility:exclude-filter" value="arm64-v8a CtsMediaBitstreamsTestCases" />
+    <option name="compatibility:exclude-filter" value="x86_64 CtsMediaBitstreamsTestCases" />
+    <option name="compatibility:exclude-filter" value="mips64 CtsMediaBitstreamsTestCases" />
+
+    <!-- b/38420898 -->
+    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyAccelMultiChannel" />
+    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyGyroMultiChannel" />
+    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyMagMultiChannel" />
+    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyAccelMultiMode" />
+    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyGyroMultiMode" />
+    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyMagMultiMode" />
+    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRegisterMultipleChannelsUsingSameMemory" />
+    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testCloseWithoutConfigStop" />
+    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyAccelGyroSingleChannel" />
+    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyAccelMagSingleChannel" />
+    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyGyroMagSingleChannel" />
+    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyAccelUncalAccelSingleChannel" />
+    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyGyroUncalGyroSingleChannel" />
+    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyMagUncalMagSingleChannel" />
+    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testTimestampAccel" />
+    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testTimestampGyro" />
+    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testTimestampMag" />
+    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testAtomicCounterAccel" />
+    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testAtomicCounterGyro" />
+    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testAtomicCounterMag" />
+    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRegisterMultipleChannels" />
+    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testReconfigure" />
+
+    <!-- b/65843095 -->
+    <option name="compatibility:exclude-filter" value="CtsLogdTestCases logd#statistics" />
+    <option name="compatibility:exclude-filter" value="CtsLogdTestCases logd#sepolicy_rate_limiter" />
+
+    <!-- b/67377433 -->
+    <!-- fails only on angler/bullhead userdebug -->
+    <option name="compatibility:exclude-filter" value="CtsLiblogTestCases liblog#wrap_mode_blocks" />
+
+    <!-- b/132274449 -->
+    <option name="compatibility:exclude-filter" value="CtsStatsdHostTestCases android.cts.statsd.validation.BatteryStatsValidationTests#testConnectivityStateChange" />
+    <option name="compatibility:exclude-filter" value="CtsStatsdHostTestCases[instant] android.cts.statsd.validation.BatteryStatsValidationTests#testConnectivityStateChange" />
+
+    <!-- b/148080781 -->
+    <option name="compatibility:exclude-filter" value="CtsStatsdHostTestCases android.cts.statsd.atom.UidAtomTests#testForegroundServiceState" />
+    <option name="compatibility:exclude-filter" value="CtsStatsdHostTestCases[instant] android.cts.statsd.atom.UidAtomTests#testForegroundServiceState" />
+
+    <!-- b/110354076 -->
+    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.DeviceOwnerTest#testCreateAndManageUser_DontSkipSetupWizard" />
+
+    <!-- b/123280814 -->
+    <option name="compatibility:exclude-filter" value="CtsLocation2TestCases android.location2.cts.LocationManagerTest#testGetCoarseLocationUpdates_withListener" />
+    <option name="compatibility:exclude-filter" value="CtsLocation2TestCases android.location2.cts.LocationManagerTest#testGetNetworkProviderLocationUpdates_withListener" />
+
+    <!-- b/116002979 -->
+    <option name="compatibility:exclude-filter" value="CtsSecurityTestCases android.security.cts.ListeningPortsTest" />
+
+    <!-- b/117107760 -->
+    <option name="compatibility:exclude-filter" value="CtsHarmfulAppWarningHostTestCases android.harmfulappwarning.cts.HarmfulAppWarningTest#testDismissDialog" />
+    <option name="compatibility:exclude-filter" value="CtsHarmfulAppWarningHostTestCases android.harmfulappwarning.cts.HarmfulAppWarningTest#testLaunchAnyway" />
+    <option name="compatibility:exclude-filter" value="CtsHarmfulAppWarningHostTestCases android.harmfulappwarning.cts.HarmfulAppWarningTest#testUninstall" />
+
+    <!-- b/119312212 -->
+    <option name="compatibility:exclude-filter" value="CtsAngleIntegrationHostTestCases android.angle.cts.CtsAngleDebugOptionHostTest#testDebugOptionOn" />
+
+    <!-- b/129859594 -->
+    <option name="compatibility:exclude-filter" value="CtsAtomicInstallTestCases com.android.tests.atomicinstall.AtomicInstallTest#testFailInconsistentMultiPackageCommit" />
+
+    <!-- b/126548816 -->
+    <option name="compatibility:exclude-filter" value="CtsRcsTestCases" />
+
+    <!-- b/112688380 -->
+    <option name="compatibility:exclude-filter" value="CtsActivityManagerDeviceTestCases android.server.am.ActivityManagerAppConfigurationTests#testAppOrientationRequestConfigClears" />
+    <option name="compatibility:exclude-filter" value="CtsActivityManagerDeviceTestCases android.server.am.ActivityManagerAppConfigurationTests#testTaskCloseRestoreFreeOrientation" />
+    <!-- b/112688380, b/139936670 -->
+    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.AppConfigurationTests#testAppOrientationRequestConfigClears" />
+    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.AppConfigurationTests#testTaskCloseRestoreFreeOrientation" />
+
+    <!-- b/167931576 -->
+    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.ActivityVisibilityTests#testTurnScreenOnAttrNoLockScreen" />
+
+    <!-- b/135533962 -->
+    <option name="compatibility:exclude-filter" value="arm64-v8a CtsWrapWrapDebugMallocDebugTestCases" />
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-meerkat.xml b/tools/cts-tradefed/res/config/cts-meerkat.xml
new file mode 100644
index 0000000..99ac0ee
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-meerkat.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+<configuration description="Tests monitored by Meerkat Platform team (anti-abuse related).">
+
+    <include name="cts" />
+
+    <option name="plan" value="cts-meerkat" />
+
+    <!-- Disable instant tests -->
+    <option name="compatibility:enable-parameterized-modules" value="false" />
+
+    <!-- Overlays & touches -->
+    <option name="compatibility:include-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.WindowInputTests"/>
+    <option name="compatibility:include-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.WindowUntrustedTouchTest"/>
+    <option name="compatibility:include-filter" value="CtsSecurityTestCases android.security.cts.MotionEventTest"/>
+
+    <!-- System Alert Window (SAW) -->
+    <option name="compatibility:include-filter" value="CtsSystemIntentTestCases"/>
+    <option name="compatibility:include-filter" value="CtsMediaTestCases android.media.cts.MediaProjectionTest"/>
+
+    <!-- Toasts -->
+    <option name="compatibility:include-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.ToastWindowTest"/>
+    <option name="compatibility:include-filter" value="CtsWidgetTestCases android.widget.cts.ToastTest"/>
+    <option name="compatibility:include-filter" value="CtsWidgetTestCases29 android.widget.cts29.ToastTest"/>
+    <option name="compatibility:include-filter" value="CtsToastTestCases android.widget.toast.cts.LegacyToastTest"/>
+
+    <!-- Background activity launch -->
+    <option name="compatibility:include-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.lifecycle.ActivityStarterTests"/>
+    <option name="compatibility:include-filter" value="CtsActivityManagerBackgroundActivityTestCases android.server.wm.BackgroundActivityLaunchTest"/>
+
+    <!-- Icon hiding -->
+    <option name="compatibility:include-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.LimitAppIconHidingTest"/>
+    <option name="compatibility:include-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.DeviceOwnerTest"/>
+    <option name="compatibility:include-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.LauncherAppsProfileTest"/>
+
+    <!-- App ops -->
+    <option name="compatibility:include-filter" value="CtsAppOpsTestCases android.app.appops.cts.AppOpsTest"/>
+    <option name="compatibility:include-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.AlertWindowsTests"/>
+    <option name="compatibility:include-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityLoggingTest"/>
+    <option name="compatibility:include-filter" value="CtsPackageInstallTestCases android.packageinstaller.install.cts.SessionTest"/>
+    <option name="compatibility:include-filter" value="CtsPackageInstallTestCases android.packageinstaller.install.cts.ExternalSourcesTestAppOpAllowed"/>
+    <option name="compatibility:include-filter" value="CtsPackageUninstallTestCases"/>
+
+    <!-- Tests that we've added for b/72485440 and in ag/3789406 -->
+    <option name="compatibility:include-filter" value="CtsContentTestCases android.content.cts.ContextTest"/>
+    <option name="compatibility:include-filter" value="CtsContentTestCases android.content.cts.ContextMoreTest"/>
+    <option name="compatibility:include-filter" value="CtsContentTestCases android.content.cts.ContextWrapperTest"/>
+
+    <!-- Tests that we've added for b/73451844 -->
+    <option name="compatibility:include-filter" value="CtsContentTestCases android.content.pm.cts.PackageManagerTest"/>
+
+    <!-- Network watchlist tests -->
+    <option name="compatibility:include-filter" value="CtsNetTestCases android.net.cts.NetworkWatchlistTest"/>
+
+    <!-- App data isolation -->
+    <option name="compatibility:include-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.AppDataIsolationTests"/>
+
+    <!-- Install attribution -->
+    <option name="compatibility:include-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.AppSecurityTests"/>
+    <option name="compatibility:include-filter" value="CtsPackageInstallTestCases android.packageinstaller.install.cts.InstallSourceInfoTest"/>
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-on-csi-cf.xml b/tools/cts-tradefed/res/config/cts-on-csi-cf.xml
new file mode 100644
index 0000000..787ab93
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-on-csi-cf.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+<configuration description="Excluded tests for Cuttlefish">
+
+    <!-- Inherit from cts-on-csi for exclude list common for all CSI devices -->
+    <include name="cts-on-csi" />
+
+    <!-- Troublesome tests that often crash the system -->
+    <option name="compatibility:exclude-filter" value="CtsPackageInstallTestCases android.packageinstaller.install.cts.IntentTest#packageNotInstalledSecureFrp" />
+    <option name="compatibility:exclude-filter" value="CtsPermission3TestCases android.permission3.cts.PermissionReviewTest#testReviewPermissionWhenServiceIsBound" />
+
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-on-csi-no-apks.xml b/tools/cts-tradefed/res/config/cts-on-csi-no-apks.xml
new file mode 100644
index 0000000..b10f519
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-on-csi-no-apks.xml
@@ -0,0 +1,195 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+<configuration description="Excluded tests for APKs not in CSI">
+
+    <!-- No Browser2 -->
+    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.EphemeralTest#testEphemeralQuery" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testViewNormalUrl" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testViewSecureUrl" />
+    <option name="compatibility:exclude-filter" value="CtsMatchFlagTestCases android.matchflags.cts.MatchFlagTests#startNoBrowserRequireDefault" />
+    <option name="compatibility:exclude-filter" value="CtsMatchFlagTestCases android.matchflags.cts.MatchFlagTests#startNoBrowserIntentWithNoMatchingApps" />
+    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#openDefaultAppDetailsAndSetDefaultAppThenIsDefaultApp" />
+    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#requestRoleAndAllowThenIsRoleHolder" />
+    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#dontAddRoleHolderThenIsNotRoleHolder" />
+    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#openDefaultAppListAndSetDefaultAppThenIsDefaultApp" />
+    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#requestRoleAndDenyThenHasDontAskAgain" />
+    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#requestRoleAndDenyWithDontAskAgainThenDeniedAutomatically" />
+    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#requestRoleAndDenyWithDontAskAgainAndReinstallThenShowsUiWithoutDontAskAgain" />
+    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#openDefaultAppDetailsAndSetDefaultAppAndSetAnotherThenIsNotDefaultApp" />
+    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#requestRoleAndDenyWithDontAskAgainAndClearDataThenShowsUiWithoutDontAskAgain" />
+    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#openDefaultAppListAndSetDefaultAppThenIsDefaultAppInList" />
+    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#requestRoleFirstTimeNoDontAskAgain" />
+    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#requestHoldingRoleThenAllowedAutomatically" />
+    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#openDefaultAppDetailsThenIsNotDefaultApp" />
+    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#addAndRemoveRoleHolderThenRoleIsNotHeld" />
+    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#dontAddRoleHolderThenRoleIsNotHeld" />
+    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#addAndClearRoleHoldersThenIsNotRoleHolder" />
+    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#addAndRemoveRoleHolderThenIsNotRoleHolder" />
+    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#requestRoleAndDenyThenIsNotRoleHolder" />
+    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#requestRoleAndDenyWithDontAskAgainReturnsCanceled" />
+
+    <!-- No Calendar -->
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testCalendarAddAppointment" />
+
+    <!-- No Camera2 -->
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testCamera" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testImageCaptureIntentsHandledBySystem" />
+
+    <!-- No Contacts -->
+    <option name="compatibility:exclude-filter" value="CtsContactsProviderTestCases android.provider.cts.contacts.ContactsContractIntentsTest#testPickContactDir" />
+    <option name="compatibility:exclude-filter" value="CtsContactsProviderTestCases android.provider.cts.contacts.ContactsContractIntentsTest#testViewContactDir" />
+    <option name="compatibility:exclude-filter" value="CtsContactsProviderTestCases android.provider.cts.contacts.ContactsContract_ContactsTest#testContentUri" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testContactsCallLogs" />
+
+    <!-- No DeskClock -->
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testAlarmClockDismissAlarm" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testAlarmClockSetAlarm" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testAlarmClockSetTimer" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testAlarmClockShowAlarms" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testAlarmClockShowTimers" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testAlarmClockSnoozeAlarm" />
+
+    <!-- No Dialer -->
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testDialPhoneNumber" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testDialVoicemail" />
+    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedDeviceOwnerTest#testLockTask_defaultDialer" />
+    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedProfileOwnerTest#testLockTask_defaultDialer" />
+    <option name="compatibility:exclude-filter" value="CtsTelecomTestCases android.telecom.cts.DefaultDialerOperationsTest#testActionDialHandling" />
+    <option name="compatibility:exclude-filter" value="CtsTelecomTestCases android.telecom.cts.DefaultDialerOperationsTest#testDialerUI" />
+
+    <!-- No Gallery2 -->
+    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.ExternalStorageHostTest#testSystemGalleryExists" />
+    <option name="compatibility:exclude-filter" value="CtsOsTestCases android.os.cts.StrictModeTest#testFileUriExposure" />
+    <option name="compatibility:exclude-filter" value="CtsOsTestCases android.os.cts.StrictModeTest#testVmPenaltyListener" />
+    <option name="compatibility:exclude-filter" value="CtsOsTestCases android.os.cts.StrictModeTest#testContentUriWithoutPermission" />
+
+    <!-- No Gallery2, Music -->
+    <option name="compatibility:exclude-filter" value="CtsProviderTestCases android.provider.cts.media.MediaStoreIntentsTest" />
+
+    <!-- No Launcher and Home -->
+    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityEmbeddedDisplayTest" />
+    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityEmbeddedHierarchyTest" />
+    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityEndToEndTest" />
+    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityFocusAndInputFocusSyncTest" />
+    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityGestureDispatchTest" />
+    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityGlobalActionsTest" />
+    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityMagnificationTest#testA11yNodeInfoVisibility_whenOutOfMagnifiedArea_shouldVisible" />
+    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityPaneTest" />
+    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityTakeScreenshotTest#testTakeScreenshotWithSecureWindow_GetScreenshotAndVerifyBitmap" />
+    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityTextActionTest" />
+    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityTextTraversalTest" />
+    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityViewTreeReportingTest" />
+    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityWindowQueryTest" />
+    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityWindowReportingTest" />
+    <option name="compatibility:exclude-filter" value="CtsAdminPackageInstallerTestCases android.packageinstaller.admin.cts.SessionCommitBroadcastTest#testBroadcastNotReceivedForDifferentLauncher" />
+    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.ActivityManagerProcessStateTest#testBgRestrictedForegroundService" />
+    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.ActivityManagerProcessStateTest#testCantSaveStateLaunchAndBackground" />
+    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.ActivityManagerProcessStateTest#testCantSaveStateLaunchAndSwitch" />
+    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.ActivityManagerTest#testKillingPidsOnImperceptible" />
+    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.ActivityManagerTest#testTimeTrackingAPI_ChainedActivityExit" />
+    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.ActivityManagerTest#testTimeTrackingAPI_SimpleStartExit" />
+    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.ActivityManagerTest#testTimeTrackingAPI_SwitchAwayTriggers" />
+    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.BooleanTileServiceTest" />
+    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.TileServiceTest" />
+    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.QuietModeHostsideTest" />
+    <option name="compatibility:exclude-filter" value="CtsShortcutManagerLauncher1" />
+    <option name="compatibility:exclude-filter" value="CtsShortcutManagerLauncher2" />
+    <option name="compatibility:exclude-filter" value="CtsShortcutManagerLauncher3" />
+    <option name="compatibility:exclude-filter" value="CtsShortcutManagerLauncher4" />
+    <option name="compatibility:exclude-filter" value="CtsShortcutManagerPackage1" />
+    <option name="compatibility:exclude-filter" value="CtsShortcutManagerPackage2" />
+    <option name="compatibility:exclude-filter" value="CtsShortcutManagerPackage3" />
+    <option name="compatibility:exclude-filter" value="CtsShortcutManagerPackage4" />
+    <option name="compatibility:exclude-filter" value="CtsShortcutManagerTestCases" />
+    <option name="compatibility:exclude-filter" value="CtsShortcutManagerThrottlingTest" />
+
+    <!-- No Music -->
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testMusicPlayback" />
+
+    <!-- No QuickSearchBox -->
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testWebSearchNormalUrl" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testWebSearchPlainText" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testWebSearchSecureUrl" />
+
+    <!-- No Settings -->
+    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilitySettingsTest" />
+    <option name="compatibility:exclude-filter" value="CtsAdminTestCases android.admin.cts.DeviceAdminActivationTest" />
+    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.StorageHostTest#testFullDisk" />
+    <option name="compatibility:exclude-filter" value="CtsAutoFillServiceTestCases android.autofillservice.cts.SettingsIntentTest" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testAddNetworksIntent" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testEasyConnectIntent" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testInteractAcrossProfilesSettings" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testLocationScanningSettings" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testNotificationPolicyDetailIntent" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testPictureInPictureSettings" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testPowerUsageSummarySettings" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testRequestSetAutofillServiceIntent" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testSettings" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testTapAnPaySettings" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testUsageAccessSettings" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testVoiceInputSettingsIntent" />
+    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.ManagedProfileTest#testSettingsIntents" />
+    <option name="compatibility:exclude-filter" value="CtsOsTestCases android.os.cts.AutoRevokeTest#testAutoRevoke_userWhitelisting" />
+    <option name="compatibility:exclude-filter" value="CtsOsTestCases android.os.cts.AutoRevokeTest#testInstallGrants_notRevokedImmediately" />
+    <option name="compatibility:exclude-filter" value="CtsPackageInstallTestCases android.packageinstaller.install.cts.ExternalSourcesTestAppOpAllowed#testManageUnknownSourcesExists" />
+    <option name="compatibility:exclude-filter" value="CtsProviderTestCases android.provider.cts.SettingsPanelTest" />
+    <option name="compatibility:exclude-filter" value="CtsProviderTestCases android.provider.cts.settings.SettingsTest#testUserDictionarySettingsExists" />
+    <option name="compatibility:exclude-filter" value="CtsSettingsHostTestCases" />
+    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleControllerManagerTest#settingsIsNotVisibleForHomeRole" />
+    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#openDefaultAppListThenIsNotDefaultAppInList" />
+
+    <!-- No SettingsIntelligence -->
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testSettingsSearchIntent" />
+
+    <!-- No StorageManager -->
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testManageStorage" />
+
+    <!-- No SystemUI -->
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.AudioPlaybackCaptureTest" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.MediaProjectionTest" />
+    <option name="compatibility:exclude-filter" value="CtsPermission3TestCases android.permission3.cts.PermissionTest22#testCompatRevoked" />
+    <option name="compatibility:exclude-filter" value="CtsPermission3TestCases android.permission3.cts.PermissionTest23#testGranted" />
+    <option name="compatibility:exclude-filter" value="CtsPermission3TestCases android.permission3.cts.PermissionTest23#testRevokeAffectsWholeGroup" />
+    <option name="compatibility:exclude-filter" value="CtsPermission3TestCases android.permission3.cts.PermissionTest23#testGrantPreviouslyRevokedWithPrejudiceShowsPrompt" />
+    <option name="compatibility:exclude-filter" value="CtsPermission3TestCases android.permission3.cts.PermissionTest23#testNoResidualPermissionsOnUninstall" />
+    <option name="compatibility:exclude-filter" value="CtsPermission3TestCases android.permission3.cts.PermissionUpgradeTest#testRevokePropagatedOnUpgradeOldToNewModel" />
+
+    <option name="compatibility:exclude-filter" value="CtsViewTestCases android.view.cts.SurfaceViewSyncTest" />
+    <option name="compatibility:exclude-filter" value="CtsViewTestCases android.view.cts.ASurfaceControlTest" />
+
+    <!-- No WebView -->
+    <option name="compatibility:exclude-filter" value="CtsAssistTestCases android.assist.cts.WebViewTest#testWebView" />
+    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.EphemeralTest#testWebViewLoads" />
+    <option name="compatibility:exclude-filter" value="CtsAutoFillServiceTestCases android.autofillservice.cts.inline.InlineWebViewActivityTest" />
+    <option name="compatibility:exclude-filter" value="CtsAutoFillServiceTestCases android.autofillservice.cts.WebViewActivityTest" />
+    <option name="compatibility:exclude-filter" value="CtsAutoFillServiceTestCases android.autofillservice.cts.WebViewMultiScreenLoginActivityTest" />
+    <option name="compatibility:exclude-filter" value="CtsAutoFillServiceTestCases android.autofillservice.cts.inline.InlineWebViewActivityTest" />
+    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.ManagedProfileProvisioningTest#testWebview" />
+    <option name="compatibility:exclude-filter" value="CtsHostsideWebViewTests" />
+    <option name="compatibility:exclude-filter" value="CtsInputMethodTestCases android.view.inputmethod.cts.KeyboardVisibilityControlTest#testShowHideKeyboardOnWebView" />
+    <option name="compatibility:exclude-filter" value="CtsTextTestCases android.text.cts.EmojiTest" />
+    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.LayerTests#testWebViewScaledWithParentLayer" />
+    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.LayerTests#testWebViewWithAlpha" />
+    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.LayerTests#testWebViewWithAlphaLayer" />
+    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.LayerTests#testWebViewWithLayer" />
+    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.LayerTests#testWebViewWithOffsetLayer" />
+    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.LayerTests#testWebViewWithParentLayer" />
+    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.LayerTests#testWebViewWithUnclippedLayer" />
+    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.LayerTests#testWebViewWithUnclippedLayerAndComplexClip" />
+    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.PathClippingTests#testWebViewClipWithCircle" />
+    <option name="compatibility:exclude-filter" value="CtsWebkitTestCases" />
+
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-on-csi-wmd.xml b/tools/cts-tradefed/res/config/cts-on-csi-wmd.xml
new file mode 100644
index 0000000..240a149
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-on-csi-wmd.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+<configuration description="Excluded tests for CtsWindowManagerDeviceTestCases">
+
+    <!-- Troublesome tests that often crash the system -->
+    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.ActivityVisibilityTests#testTurnScreenOnActivity_withRelayout" />
+    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.AnrTests" />
+    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.MultiDisplaySecurityTests#testNoInputConnectionForUntrustedVirtualDisplay" />
+    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.MultiDisplaySystemDecorationTests#testImeApiForBug118341760" />
+    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.MultiDisplaySystemDecorationTests#testCrossDisplayBasicImeOperations" />
+    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.StartActivityTests#testStartActivityByNavigateUpToFromDiffUid" />
+
+    <!-- No Home -->
+    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.MultiDisplaySystemDecorationTests#testLaunchHomeActivityOnSecondaryDisplayWithoutDecorations" />
+    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.MultiDisplaySystemDecorationTests#testLaunchSingleSecondaryHomeActivityOnDisplayWithDecorations" />
+    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.MultiDisplaySystemDecorationTests#testLaunchSingleHomeActivityOnDisplayWithDecorations" />
+    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.MultiDisplaySystemDecorationTests#testLaunchHomeActivityOnUntrustedVirtualSecondaryDisplay" />
+    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.MultiDisplaySystemDecorationTests#testLaunchSecondaryHomeActivityOnDisplayWithDecorations" />
+    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.MultiDisplaySystemDecorationTests#testLaunchHomeActivityOnDisplayWithDecorations" />
+    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.StartActivityTests#testStartHomeIfNoActivities" />
+
+    <!-- No SystemUI -->
+    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.SurfaceControlTest" />
+    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.SurfaceViewSurfaceValidatorTest" />
+
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-on-csi.xml b/tools/cts-tradefed/res/config/cts-on-csi.xml
new file mode 100644
index 0000000..7ec61d1
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-on-csi.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+<configuration description="Runs a subset of CTS-on-GSI tests using a core system image (CSI)">
+
+    <include name="cts-on-gsi" />
+    <include name="cts-on-csi-no-apks" />
+    <include name="csi-known-failures" />
+
+    <!--
+    CtsWindowManagerDeviceTestCases has about two hundred failed tests on CSI,
+    so it has its own exclude list.
+    -->
+    <include name="cts-on-csi-wmd" />
+
+    <option name="plan" value="cts-on-csi" />
+
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-on-gsi-exclude.xml b/tools/cts-tradefed/res/config/cts-on-gsi-exclude.xml
new file mode 100644
index 0000000..e369dfa
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-on-gsi-exclude.xml
@@ -0,0 +1,258 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 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.
+-->
+<configuration description="Excluded tests from cts-on-gsi">
+    <!-- Tell all AndroidJUnitTests to exclude certain annotations -->
+    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:exclude-annotation:android.platform.test.annotations.RestrictedBuildTest" />
+
+    <!-- Tell all HostTests to exclude certain annotations -->
+    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.HostTest:exclude-annotation:android.platform.test.annotations.RestrictedBuildTest" />
+    <option name="compatibility:test-arg" value="com.android.compatibility.common.tradefed.testtype.JarHostTest:exclude-annotation:android.platform.test.annotations.RestrictedBuildTest" />
+
+    <!-- Radio system of a general system image is not checked -->
+    <option name="compatibility:exclude-filter" value="CtsTelephonyTestCases" />
+    <option name="compatibility:exclude-filter" value="CtsTelephony2TestCases" />
+    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.SystemFeaturesTest#testLocationFeatures" />
+
+    <!-- Exclude telephony related testcases -->
+    <option name="compatibility:exclude-filter" value="CtsNetTestCasesLegacyApi22 android.net.cts.legacy.api22.ConnectivityManagerLegacyTest#testStartUsingNetworkFeature_enableHipri" />
+    <option name="compatibility:exclude-filter" value="CtsPermission2TestCases android.permission2.cts.NoReceiveSmsPermissionTest#testAppSpecificSmsToken" />
+    <option name="compatibility:exclude-filter" value="CtsPermission2TestCases android.permission2.cts.NoReceiveSmsPermissionTest#testReceiveTextMessage" />
+    <option name="compatibility:exclude-filter" value="CtsSecurityHostTestCases android.security.cts.SELinuxHostTest#testNoExemptionsForBinderInVendorBan" />
+    <option name="compatibility:exclude-filter" value="CtsSecurityHostTestCases android.security.cts.SELinuxHostTest#testNoExemptionsForSocketsBetweenCoreAndVendorBan" />
+    <option name="compatibility:exclude-filter" value="CtsSecurityHostTestCases android.security.cts.SELinuxHostTest#testNoExemptionsForVendorExecutingCore" />
+    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.NetworkUsageStatsTest#testAppDetails" />
+    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.NetworkUsageStatsTest#testAppSummary" />
+    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.NetworkUsageStatsTest#testCallback" />
+    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.NetworkUsageStatsTest#testDeviceSummary" />
+    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.NetworkUsageStatsTest#testTagDetails" />
+    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.NetworkUsageStatsTest#testUidDetails" />
+    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.NetworkUsageStatsTest#testUserSummary" />
+
+    <!-- Exclude not applicable testcases-->
+    <option name="compatibility:exclude-filter" value="CtsSignatureTestCases" />
+
+    <!--
+        Exclude testcases failing on Pixel devices
+        TODO(jaeshin@): b/68300743
+    -->
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testVoiceCommand" />
+    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testVoiceSearchHandsFree" />
+
+    <!-- Excluded tese case - TODO(jiyong): b/67739526 to reenable that -->
+    <option name="compatibility:exclude-filter" value="CtsJniTestCases android.jni.cts.JniStaticTest#test_linker_namespaces" />
+
+    <!-- b/68190722: Remove testcases that require RRO which is planned for Pi -->
+    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.ActionBarTest#testOpenOptionsMenu" />
+    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.ActionBarTest#testOptionsMenuKey" />
+    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.ActivityKeyboardShortcutsTest#testRequestShowKeyboardShortcuts" />
+
+    <!-- b/71958344: Exclude until CTS releases it -->
+    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.OverlayHostTest#testInstallingOverlayHasNoEffect" />
+
+    <!-- b/161837932: Fix MediaPlayerTests that use "too small" resolution -->
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.MediaPlayerTest#testOnSubtitleDataListener" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.MediaPlayerTest#testChangeSubtitleTrack" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.MediaPlayerTest#testDeselectTrackForSubtitleTracks" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.MediaPlayerTest#testGetTrackInfoForVideoWithSubtitleTracks" />
+
+    <!-- b/74583365: CtsAppSecurityHostTestCases flaky -->
+    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.AdoptableHostTest#testApps " />
+    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.AdoptableHostTest#testEjected" />
+    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.AdoptableHostTest#testPackageInstaller" />
+    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.AdoptableHostTest#testPrimaryStorage" />
+
+    <!-- b/152359655: ResumeOnReboot can't work on GSI -->
+    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.ResumeOnRebootHostTest" />
+
+    <!-- b/77175538: CtsViewTestCases failure flaky -->
+    <option name="compatibility:exclude-filter" value="CtsViewTestCases android.view.cts.PixelCopyTest#testWindowProducerCopyToRGBA16F" />
+
+    <!-- b/73727333: CtsSystemUiTestCases failure flaky -->
+    <option name="compatibility:exclude-filter" value="CtsSystemUiTestCases android.systemui.cts.LightBarTests#testLightNavigationBar" />
+    <option name="compatibility:exclude-filter" value="CtsSystemUiTestCases android.systemui.cts.LightBarThemeTest#testNavigationBarDivider" />
+
+    <!-- b/80388296: CtsDevicePolicyManagerTestCases failure flaky -->
+    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedManagedProfileOwnerTest#testDisallowAutofill_allowed" />
+    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedManagedProfileOwnerTest#testPackageInstallUserRestrictions" />
+    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedManagedProfileOwnerTest#testPermissionAppUpdate" />
+    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedManagedProfileOwnerTest#testPermissionGrant" />
+    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedManagedProfileOwnerTest#testPermissionMixedPolicies" />
+    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedManagedProfileOwnerTest#testPermissionPolicy" />
+    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedManagedProfileOwnerTest#testSuspendPackage" />
+
+    <!-- b/80407835: CtsServicesHostTestCases failure flaky -->
+    <option name="compatibility:exclude-filter" value="CtsServicesHostTestCases android.server.cts.KeyguardTests#testDialogShowWhenLockedActivity" />
+    <option name="compatibility:exclude-filter" value="CtsServicesHostTestCases android.server.cts.KeyguardTests#testTranslucentShowWhenLockedActivity" />
+
+    <!-- b/80284482: Flaky tests -->
+    <option name="compatibility:exclude-filter" value="CtsAlarmManagerTestCases android.alarmmanager.cts.AppStandbyTests#testAllowWhileIdleAlarms" />
+    <option name="compatibility:exclude-filter" value="CtsAlarmManagerTestCases android.alarmmanager.cts.AppStandbyTests#testBucketUpgradeToNoDelay" />
+    <option name="compatibility:exclude-filter" value="CtsAlarmManagerTestCases android.alarmmanager.cts.AppStandbyTests#testBucketUpgradeToSmallerDelay" />
+    <option name="compatibility:exclude-filter" value="CtsAlarmManagerTestCases android.alarmmanager.cts.AppStandbyTests#testFrequentDelay" />
+    <option name="compatibility:exclude-filter" value="CtsAlarmManagerTestCases android.alarmmanager.cts.AppStandbyTests#testRareDelay" />
+    <option name="compatibility:exclude-filter" value="CtsAlarmManagerTestCases android.alarmmanager.cts.AppStandbyTests#testWorkingSetDelay" />
+
+    <!-- b/110260628: A confirmed GSI incompatibility (waiver) -->
+    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.DeviceOwnerTest#testCreateAndManageUser_DontSkipSetupWizard" />
+    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.DeviceOwnerTest#testSecurityLoggingWithSingleUser" />
+    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedDeviceOwnerTest#testKeyManagement" />
+    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedProfileOwnerTest#testKeyManagement" />
+    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedManagedProfileOwnerTest#testKeyManagement" />
+
+    <!-- b/110405497: Flaky tests (waiver) -->
+    <option name="compatibility:exclude-filter" value="CtsKeystoreTestCases android.keystore.cts.KeyAttestationTest#testDeviceIdAttestation" />
+
+    <!-- b/141113818: Allows unlock for CTS-on-GSI -->
+    <option name="compatibility:exclude-filter" value="CtsKeystoreTestCases android.keystore.cts.KeyAttestationTest#testEcAttestation_DeviceLocked" />
+    <option name="compatibility:exclude-filter" value="CtsKeystoreTestCases android.keystore.cts.KeyAttestationTest#testRsaAttestation_DeviceLocked" />
+
+    <!-- b/110385515: Flaky due to a particular SIM card requirement (excluded) -->
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.ConnectivityManagerTest#testOpenConnection" />
+    <option name="compatibility:exclude-filter" value="CtsWifiTestCases android.net.wifi.rtt.cts.WifiRttTest#testRangingToTestAp" />
+
+    <!-- b/110417203: Flaky tests -->
+    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.NetworkUsageStatsTest#testUidTagStateDetails" />
+
+    <!-- b/80077786: MyVerizonServices fail -->
+    <option name="compatibility:exclude-filter" value="CtsPermission2TestCases android.permission2.cts.PrivappPermissionsTest#testPrivappPermissionsEnforcement" />
+
+    <!-- b/111101428: CtsOsTestCases irrelevant test cases -->
+    <option name="compatibility:exclude-filter" value="CtsOsTestCases android.os.cts.BuildTest#testIsSecureUserBuild" />
+    <option name="compatibility:exclude-filter" value="CtsOsTestCases android.os.cts.BuildVersionTest#testBuildFingerprint" />
+
+    <!-- b/110405126: CtsPermissionTestCases flaky (due to SIM card setting) -->
+    <option name="compatibility:exclude-filter" value="CtsPermissionTestCases android.permission.cts.TelephonyManagerPermissionTest#testGetDeviceId" />
+    <option name="compatibility:exclude-filter" value="CtsPermissionTestCases android.permission.cts.TelephonyManagerPermissionTest#testGetImei" />
+    <option name="compatibility:exclude-filter" value="CtsPermissionTestCases android.permission.cts.TelephonyManagerPermissionTest#testGetLine1Number" />
+    <option name="compatibility:exclude-filter" value="CtsPermissionTestCases android.permission.cts.TelephonyManagerPermissionTest#testGetSimSerialNumber" />
+    <option name="compatibility:exclude-filter" value="CtsPermissionTestCases android.permission.cts.TelephonyManagerPermissionTest#testGetSubscriberId" />
+    <option name="compatibility:exclude-filter" value="CtsPermissionTestCases android.permission.cts.TelephonyManagerPermissionTest#testSetDataEnabled" />
+    <option name="compatibility:exclude-filter" value="CtsPermissionTestCases android.permission.cts.TelephonyManagerPermissionTest#testVoiceMailNumber" />
+
+    <!-- b/111967702: CtsSecurityTestCases irrelevant test cases -->
+    <option name="compatibility:exclude-filter" value="CtsSecurityTestCases android.security.cts.BannedFilesTest#testNoSu" />
+    <option name="compatibility:exclude-filter" value="CtsSecurityTestCases android.security.cts.BannedFilesTest#testNoSuInPath" />
+
+    <!-- b/116170534: CtsMediaTestCases regression (9.0 R4 waiver) -->
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.DecoderTest#testH265HDR10StaticMetadata" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VolumeShaperTest#testPlayerCornerCase" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VolumeShaperTest#testPlayerCornerCase2" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VolumeShaperTest#testPlayerCubicMonotonic" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VolumeShaperTest#testPlayerDuck" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VolumeShaperTest#testPlayerJoin" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VolumeShaperTest#testPlayerRamp" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VolumeShaperTest#testPlayerRunDuringPauseStop" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VolumeShaperTest#testPlayerStepRamp" />
+    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VolumeShaperTest#testPlayerTwoShapers" />
+
+    <!-- b/157286547 CtsIncidentHostTestCases ErrorsTest failure -->
+    <option name="compatibility:exclude-filter" value="CtsIncidentHostTestCases com.android.server.cts.ErrorsTest#testNativeCrash" />
+
+    <!-- b/111167329: CtsCameraTestCases failure -->
+    <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.SurfaceViewPreviewTest#testSurfaceSet"/>
+
+    <!-- b/135588722: CtsUsesLibraryHostTestCases (10_r1 waiver) -->
+    <option name="compatibility:exclude-filter" value="CtsUsesLibraryHostTestCases android.classloaders.cts.UsesLibraryHostTest#testMissingLibrary_full"/>
+    <option name="compatibility:exclude-filter" value="CtsUsesLibraryHostTestCases android.classloaders.cts.UsesLibraryHostTest#testUsesLibrary_full"/>
+    <option name="compatibility:exclude-filter" value="CtsCompilationTestCases android.compilation.cts.AdbRootDependentCompilationTest"/>
+
+    <!-- b/145371681: CtsContentSuggestionsTestCases and CtsAppPredictionServiceTestCases (10_r2 waiver) -->
+    <option name="compatibility:exclude-filter" value="CtsAppPredictionServiceTestCases" />
+    <option name="compatibility:exclude-filter" value="CtsContentSuggestionsTestCases" />
+
+    <!-- b/143513519: CtsCameraTestCases (10_r3 waiver) -->
+    <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.camera.cts.HeifWriterTest#testHeif"/>
+
+    <!-- b/155107044: CtsNetTestCases -->
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testInterfaceCountersUdp4"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm64Tcp4UdpEncap"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testInterfaceCountersUdp6"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacMd5Tcp6"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha512Tcp4"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacMd5Tcp4"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha512Tcp6"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha1Udp6"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha1Udp4"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha1Tcp6"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha1Tcp4"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm128Tcp4"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm128Tcp6"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm96Tcp6"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha1Tcp4UdpEncap"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm96Tcp4"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testCryptTcp4UdpEncap"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm128Udp4UdpEncap"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testCryptUdp6"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAuthUdp4"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testCryptUdp4"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAuthUdp6"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testCryptTcp6"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha1Udp4UdpEncap"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testCryptTcp4"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAuthUdp4UdpEncap"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testIkeOverUdpEncapSocket"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm128Udp4"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm128Udp6"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha256Tcp6"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha256Tcp4"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacMd5Udp4UdpEncap"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm96Tcp4UdpEncap"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testInterfaceCountersUdp4UdpEncap"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha512Udp4"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha512Udp6"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha256Tcp4UdpEncap"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha384Udp6"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha384Udp4UdpEncap"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha256Udp4UdpEncap"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm64Tcp4"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm64Tcp6"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha512Udp4UdpEncap"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm96Udp6"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha384Tcp6"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm96Udp4"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha384Udp4"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha256Udp4"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacMd5Udp6"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAuthTcp4"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacMd5Udp4"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAuthTcp6"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha384Tcp4"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm128Tcp4UdpEncap"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testCryptUdp4UdpEncap"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAuthTcp4UdpEncap"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacMd5Tcp4UdpEncap"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm64Udp4UdpEncap"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha256Udp6"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm64Udp4"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha384Tcp4UdpEncap"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm64Udp6"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm96Udp4UdpEncap"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha512Tcp4UdpEncap"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.TrafficStatsTest#testTrafficStatsForLocalhost"/>
+    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.TrafficStatsTest#testValidTotalStats"/>
+
+    <!-- b/150807956: Temporarily disabled due to bad experiment channel -->
+    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.LayerTests#testWebViewWithLayerAndComplexClip" />
+    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.PathClippingTests#testWebViewClipWithCircle" />
+
+    <!-- b/159295445, b/159294948: CtsDevicePolicyManagerTestCases -->
+    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedDeviceOwnerTest#testDelegatedCertInstallerDeviceIdAttestation" />
+    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.OrgOwnedProfileOwnerTest#testDelegatedCertInstallerDeviceIdAttestation" />
+    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.OrgOwnedProfileOwnerTest#testDeviceIdAttestationForProfileOwner" />
+
+    <!-- b/153032202: CtsSystemUiTestCases (10_r3 waiver) -->
+    <option name="compatibility:exclude-filter" value="CtsSystemUiTestCases android.systemui.cts.WindowInsetsBehaviorTests#swipeOutsideLimit_systemUiVisible_allEventsCanceled"/>
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-on-gsi-presubmit.xml b/tools/cts-tradefed/res/config/cts-on-gsi-presubmit.xml
new file mode 100644
index 0000000..3c42a12
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-on-gsi-presubmit.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 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.
+-->
+<configuration description="Runs a subset of CTS-on-GSI tests selected for presubmit testing">
+    <option name="plan" value="cts-on-gsi-presubmit" />
+    <include name="cts-automated" />
+    <!-- CTS-on-GSI is not expected to run parameterized modules -->
+    <option name="compatibility:enable-parameterized-modules" value="false" />
+    <option name="compatibility:primary-abi-only" value="true" />
+
+    <include name="cts-on-gsi-exclude" />
+
+    <option name="compatibility:test-arg" value="com.android.compatibility.common.tradefed.testtype.JarHostTest:include-annotation:android.platform.test.annotations.Presubmit" />
+    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:include-annotation:android.platform.test.annotations.Presubmit" />
+    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.HostTest:include-annotation:android.platform.test.annotations.Presubmit" />
+</configuration>
+
diff --git a/tools/cts-tradefed/res/config/cts-on-gsi-sim.xml b/tools/cts-tradefed/res/config/cts-on-gsi-sim.xml
new file mode 100644
index 0000000..5150942
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-on-gsi-sim.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+<configuration description="Runs cts-on-gsi on device with SIM card">
+
+    <include name="cts-on-gsi" />
+
+    <include name="cts-sim-include" />
+
+    <option name="plan" value="cts-on-gsi-sim" />
+
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-on-gsi.xml b/tools/cts-tradefed/res/config/cts-on-gsi.xml
new file mode 100644
index 0000000..a87ba2e
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-on-gsi.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 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.
+-->
+<configuration description="Runs a subset of CTS tests using a general system image (GSI)">
+    <!-- Enforce collecting vendor build information -->
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsDeviceInfoCollector" />
+
+    <!-- Common CTS config -->
+    <include name="cts" />
+
+    <!-- CTS-on-GSI is not expected to run parameterized modules -->
+    <option name="compatibility:enable-parameterized-modules" value="false" />
+    <option name="compatibility:primary-abi-only" value="true" />
+
+    <include name="cts-on-gsi-exclude" />
+    <!-- Overwrite the "cts" plan configured in cts.xml -->
+    <option name="plan" value="cts-on-gsi" />
+
+    <!-- For CTS-on-GSI, override the suite name to VTS for the R release only -->
+    <option name="cts-on-gsi-variant" value="true" />
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-preconditions.xml b/tools/cts-tradefed/res/config/cts-preconditions.xml
new file mode 100644
index 0000000..6a4f47e
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-preconditions.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<configuration description="CTS precondition configs">
+
+    <include name="cts-device-files" />
+
+    <option name="plan" value="cts-preconditions" />
+
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.DynamicConfigPusher">
+        <option name="target" value="host" />
+        <!-- the name under which to find the configuration -->
+        <option name="config-filename" value="cts" />
+        <option name="extract-from-resource" value="true" />
+        <!-- the name of the resource inside the jar -->
+        <option name="dynamic-resource-name" value="cts-tradefed" />
+    </target_preparer>
+
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.StayAwakePreparer" />
+
+    <!-- Disable "Android Beta Program" -->
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.PackageDisabler" >
+        <option name="package" value="com.android.yadayada"/>
+    </target_preparer>
+
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.SettingsPreparer">
+        <option name="device-setting" value="verifier_verify_adb_installs"/>
+        <option name="setting-type" value="global"/>
+        <option name="set-value" value="0"/>
+    </target_preparer>
+
+    <!-- Disable crash error dialogs to avoid affecting following tests -->
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.SettingsPreparer">
+        <option name="device-setting" value="hide_error_dialogs"/>
+        <option name="setting-type" value="global"/>
+        <option name="set-value" value="1"/>
+    </target_preparer>
+
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.ApkPreconditionCheck">
+        <option name="apk" value="CtsPreconditions.apk"/>
+        <option name="package" value="com.android.preconditions.cts"/>
+    </target_preparer>
+
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.WifiCheck" />
+
+    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
+        <option name="run-command" value="rm -rf /sdcard/device-info-files" />
+        <option name="run-command" value="rm -rf /sdcard/report-log-files" />
+        <!-- Disable keyguard -->
+        <option name="run-command" value="locksettings set-disabled true"/>
+    </target_preparer>
+
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.DeviceInfoCollector">
+        <option name="apk" value="CtsDeviceInfo.apk"/>
+        <option name="package" value="com.android.compatibility.common.deviceinfo"/>
+        <option name="src-dir" value="/sdcard/device-info-files/"/>
+        <option name="dest-dir" value="device-info-files/"/>
+        <option name="temp-dir" value="temp-device-info-files/"/>
+        <option name="throw-error" value="false"/>
+    </target_preparer>
+
+    <!-- The following values are used in cts/common/device-side/util/DeviceReportLog.java,
+    cts/harness/common/host-side/util/MetricsReportLog.java and tools/tradefed-host/util/ReportLogUtil.java.
+    Any change in these values must also be translated to the stated files.
+    -->
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.ReportLogCollector">
+        <option name="src-dir" value="/sdcard/report-log-files/"/>
+        <option name="dest-dir" value="report-log-files/"/>
+        <option name="temp-dir" value="temp-report-logs/"/>
+    </target_preparer>
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-presubmit.xml b/tools/cts-tradefed/res/config/cts-presubmit.xml
new file mode 100644
index 0000000..5997779
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-presubmit.xml
@@ -0,0 +1,29 @@
+<?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.
+-->
+<configuration description="Runs CTS presubmit test cases">
+
+    <include name="cts-automated" />
+
+    <!-- Only run tests with @Presubmit annotation -->
+    <!-- This serve as a base config for CTS tests used for presubmit;
+         additional filtering parameters should be applied to further narrow
+         down the choice of tests, e.g. module filter
+    -->
+    <option name="compatibility:test-arg" value="com.android.compatibility.common.tradefed.testtype.JarHostTest:include-annotation:android.platform.test.annotations.Presubmit" />
+    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:include-annotation:android.platform.test.annotations.Presubmit" />
+    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.HostTest:include-annotation:android.platform.test.annotations.Presubmit" />
+
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-sim-include.xml b/tools/cts-tradefed/res/config/cts-sim-include.xml
new file mode 100644
index 0000000..1614c18
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-sim-include.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+<configuration description="Include CTS test that require SIM card">
+
+    <!-- CTS tests that need SIM card-->
+    <option name="compatibility:include-filter" value="signed-CtsOmapiTestCases" />
+    <option name="compatibility:include-filter" value="signed-CtsSecureElementAccessControlTestCases1" />
+    <option name="compatibility:include-filter" value="signed-CtsSecureElementAccessControlTestCases2" />
+    <option name="compatibility:include-filter" value="signed-CtsSecureElementAccessControlTestCases3" />
+    <option name="compatibility:include-filter" value="CtsCarrierApiTestCases" />
+    <option name="compatibility:include-filter" value="CtsJobSchedulerTestCases" />
+    <option name="compatibility:include-filter" value="CtsNetTestCases" />
+    <option name="compatibility:include-filter" value="CtsNetTestCasesLegacyApi22" />
+    <option name="compatibility:include-filter" value="CtsOmapiTestCases" />
+    <option name="compatibility:include-filter" value="CtsPermissionTestCases" />
+    <option name="compatibility:include-filter" value="CtsPermission2TestCases" />
+    <option name="compatibility:include-filter" value="CtsSecureElementAccessControlTestCases1" />
+    <option name="compatibility:include-filter" value="CtsSecureElementAccessControlTestCases2" />
+    <option name="compatibility:include-filter" value="CtsSecureElementAccessControlTestCases3" />
+    <option name="compatibility:include-filter" value="CtsSimRestrictedApisTestCases" />
+    <option name="compatibility:include-filter" value="CtsStatsdHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsTelecomTestCases" />
+    <option name="compatibility:include-filter" value="CtsTelecomTestCases2" />
+    <option name="compatibility:include-filter" value="CtsTelecomTestCases3" />
+    <option name="compatibility:include-filter" value="CtsTelephonyTestCases" />
+    <option name="compatibility:include-filter" value="CtsTelephony2TestCases" />
+    <option name="compatibility:include-filter" value="CtsTelephony3TestCases" />
+    <option name="compatibility:include-filter" value="CtsTelephonySdk28TestCases" />
+    <option name="compatibility:include-filter" value="CtsTetheringTest" />
+    <option name="compatibility:include-filter" value="CtsUsageStatsTestCases" />
+
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-sim.xml b/tools/cts-tradefed/res/config/cts-sim.xml
new file mode 100644
index 0000000..234c33f
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-sim.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+<configuration description="Runs CTS-sim on device with SIM card">
+
+    <include name="cts" />
+
+    <include name="cts-sim-include" />
+
+    <option name="plan" value="cts-sim" />
+
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-system-checkers.xml b/tools/cts-tradefed/res/config/cts-system-checkers.xml
new file mode 100644
index 0000000..7639bf9
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-system-checkers.xml
@@ -0,0 +1,30 @@
+<?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.
+-->
+<configuration description="CTS system checker configs">
+    <system_checker class="com.android.tradefed.suite.checker.UserChecker" />
+    <system_checker class="com.android.compatibility.common.tradefed.targetprep.NetworkConnectivityChecker" />
+    <system_checker class="com.android.tradefed.suite.checker.ShellStatusChecker" />
+    <system_checker class="com.android.tradefed.suite.checker.EnforcedSeLinuxChecker">
+        <!-- We expect selinux enforced for CTS -->
+        <option name="expect-enforced" value="true" />
+    </system_checker>
+    <system_checker class="com.android.tradefed.suite.checker.KeyguardStatusChecker" />
+    <system_checker class="com.android.tradefed.suite.checker.LeakedThreadStatusChecker" />
+    <system_checker class="com.android.tradefed.suite.checker.TimeStatusChecker" />
+    <system_checker class="com.android.tradefed.suite.checker.DeviceSettingChecker" />
+    <system_checker class="com.android.tradefed.suite.checker.SystemServerStatusChecker" />
+    <system_checker class="com.android.tradefed.suite.checker.SystemServerFileDescriptorChecker" />
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-virtual-device-stable.xml b/tools/cts-tradefed/res/config/cts-virtual-device-stable.xml
new file mode 100644
index 0000000..512e8a2
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-virtual-device-stable.xml
@@ -0,0 +1,222 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+<configuration description="Runs stable set of CTS tests for virtual devices">
+
+    <include name="cts-virtual-device" />
+
+    <option name="plan" value="cts-virtual-device-stable" />
+
+    <!-- CTS tests shown to be stable on virtual devices-->
+    <option name="compatibility:include-filter" value="CtsAccelerationTestCases" />
+    <option name="compatibility:include-filter" value="CtsAlarmClockTestCases" />
+    <option name="compatibility:include-filter" value="CtsAndroidTestBase27ApiSignatureTestCases" />
+    <option name="compatibility:include-filter" value="CtsAndroidTestMockCurrentApiSignatureTestCases" />
+    <option name="compatibility:include-filter" value="CtsAndroidTestRunnerCurrentApiSignatureTestCases" />
+    <option name="compatibility:include-filter" value="CtsAnimationTestCases" />
+    <option name="compatibility:include-filter" value="CtsApacheHttpLegacy27ApiSignatureTestCases" />
+    <option name="compatibility:include-filter" value="CtsApacheHttpLegacyCurrentApiSignatureTestCases" />
+    <option name="compatibility:include-filter" value="CtsApacheHttpLegacyUsesLibraryApiSignatureTestCases" />
+    <option name="compatibility:include-filter" value="CtsAppComponentFactoryTestCases" />
+    <option name="compatibility:include-filter" value="CtsAppUsageHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsAslrMallocTestCases" />
+    <option name="compatibility:include-filter" value="CtsAtraceHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsBackgroundRestrictionsTestCases" />
+    <option name="compatibility:include-filter" value="CtsBionicTestCases" />
+    <option name="compatibility:include-filter" value="CtsCalendarcommon2TestCases" />
+    <option name="compatibility:include-filter" value="CtsClassLoaderFactoryInMemoryDexClassLoaderTestCases" />
+    <option name="compatibility:include-filter" value="CtsClassLoaderFactoryPathClassLoaderTestCases" />
+    <option name="compatibility:include-filter" value="CtsCompilationTestCases" />
+    <option name="compatibility:include-filter" value="CtsContactsProviderWipe" />
+    <option name="compatibility:include-filter" value="CtsCppToolsTestCases" />
+    <option name="compatibility:include-filter" value="CtsCurrentApiSignatureTestCases" />
+    <option name="compatibility:include-filter" value="CtsDatabaseTestCases" />
+    <option name="compatibility:include-filter" value="CtsDebugTestCases" />
+    <option name="compatibility:include-filter" value="CtsDeviceIdleHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsDexMetadataHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsDreamsTestCases" />
+    <option name="compatibility:include-filter" value="CtsDynamicLinkerTestCases" />
+    <option name="compatibility:include-filter" value="CtsEdiHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsExtendedMockingTestCases" />
+    <option name="compatibility:include-filter" value="CtsFragmentTestCases" />
+    <option name="compatibility:include-filter" value="CtsFragmentTestCasesSdk26" />
+    <option name="compatibility:include-filter" value="CtsGestureTestCases" />
+    <option name="compatibility:include-filter" value="CtsHiddenApiBlocklistApi27TestCases" />
+    <option name="compatibility:include-filter" value="CtsHiddenApiBlocklistApi28TestCases" />
+    <option name="compatibility:include-filter" value="CtsHiddenApiBlocklistCurrentApiTestCases" />
+    <option name="compatibility:include-filter" value="CtsHiddenApiBlocklistDebugClassTestCases" />
+    <option name="compatibility:include-filter" value="CtsHiddenApiKillswitchDebugClassTestCases" />
+    <option name="compatibility:include-filter" value="CtsHiddenApiKillswitchSdkListTestCases" />
+    <option name="compatibility:include-filter" value="CtsHiddenApiKillswitchWildcardTestCases" />
+    <option name="compatibility:include-filter" value="CtsHostsideNumberBlockingTestCases" />
+    <option name="compatibility:include-filter" value="CtsHostsideTvTests" />
+    <option name="compatibility:include-filter" value="CtsHostsideWebViewTests" />
+    <option name="compatibility:include-filter" value="CtsHostTzDataTests" />
+    <option name="compatibility:include-filter" value="CtsIcuTestCases" />
+    <option name="compatibility:include-filter" value="CtsInlineMockingTestCases" />
+    <option name="compatibility:include-filter" value="CtsInputMethodTestCases" />
+    <option name="compatibility:include-filter" value="CtsIntentSignatureTestCases" />
+    <option name="compatibility:include-filter" value="CtsJankDeviceTestCases" />
+    <option name="compatibility:include-filter" value="CtsJdwpSecurityHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJdwpTestCases" />
+    <option name="compatibility:include-filter" value="CtsJniTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiAttachingHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiAttachingTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRedefineClassesHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1900HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1901HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1902HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1903HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1904HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1906HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1907HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1908HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1909HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1910HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1911HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1912HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1913HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1914HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1915HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1916HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1917HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1920HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1921HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1922HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1923HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1924HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1925HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1926HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1927HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1928HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1930HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1931HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1932HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1933HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1934HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1936HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1937HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1939HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1941HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1942HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1943HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1953HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1958HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest902HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest903HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest904HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest905HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest906HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest907HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest908HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest910HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest911HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest912HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest913HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest914HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest915HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest917HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest918HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest919HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest920HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest922HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest923HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest924HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest926HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest927HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest928HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest930HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest931HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest932HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest940HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest942HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest944HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest945HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest947HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest951HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest982HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest983HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest984HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest985HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest986HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest988HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest989HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest990HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest991HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest992HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest993HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest994HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest996HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiRunTest997HostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiTaggingHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsJvmtiTrackingHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsKernelConfigTestCases" />
+    <option name="compatibility:include-filter" value="CtsLeanbackJankTestCases" />
+    <option name="compatibility:include-filter" value="CtsLibcoreApiEvolutionTestCases" />
+    <option name="compatibility:include-filter" value="CtsLibcoreCoreApiTestCases" />
+    <option name="compatibility:include-filter" value="CtsLibcoreCorePlatformApiTestCases" />
+    <option name="compatibility:include-filter" value="CtsLibcoreJsr166TestCases" />
+    <option name="compatibility:include-filter" value="CtsLibcoreLegacy22TestCases" />
+    <option name="compatibility:include-filter" value="CtsLibcoreOjTestCases" />
+    <option name="compatibility:include-filter" value="CtsLibcoreOkHttpTestCases" />
+    <option name="compatibility:include-filter" value="CtsLibcoreSimpleMModuleTestCases" />
+    <option name="compatibility:include-filter" value="CtsLibcoreSimpleModuleTestCases" />
+    <option name="compatibility:include-filter" value="CtsLibcoreWycheproofBCTestCases" />
+    <option name="compatibility:include-filter" value="CtsLibcoreWycheproofConscryptTestCases" />
+    <option name="compatibility:include-filter" value="CtsLiblogTestCases" />
+    <option name="compatibility:include-filter" value="CtsLocationFineTestCases" />
+    <option name="compatibility:include-filter" value="CtsLocationCoarseTestCases" />
+    <option name="compatibility:include-filter" value="CtsLocationNoneTestCases" />
+    <option name="compatibility:include-filter" value="CtsLogdTestCases" />
+    <option name="compatibility:include-filter" value="CtsMockingDebuggableTestCases" />
+    <option name="compatibility:include-filter" value="CtsMockingTestCases" />
+    <option name="compatibility:include-filter" value="CtsMultiUserHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsNativeNetTestCases" />
+    <option name="compatibility:include-filter" value="CtsNativeNetTestCases" />
+    <option name="compatibility:include-filter" value="CtsNdefTestCases" />
+    <option name="compatibility:include-filter" value="CtsNdkBinderTestCases" />
+    <option name="compatibility:include-filter" value="CtsNetTestCasesLegacyPermission22" />
+    <option name="compatibility:include-filter" value="CtsNNAPITestCases" />
+    <option name="compatibility:include-filter" value="CtsOmapiTestCases" />
+    <option name="compatibility:include-filter" value="CtsPdfTestCases" />
+    <option name="compatibility:include-filter" value="CtsPermissionTestCasesSdk28" />
+    <option name="compatibility:include-filter" value="CtsPreference2TestCases" />
+    <option name="compatibility:include-filter" value="CtsPreferenceTestCases" />
+    <option name="compatibility:include-filter" value="CtsProtoTestCases" />
+    <option name="compatibility:include-filter" value="CtsRenderscriptLegacyTestCases" />
+    <option name="compatibility:include-filter" value="CtsRsBlasTestCases" />
+    <option name="compatibility:include-filter" value="CtsRsCppTestCases" />
+    <option name="compatibility:include-filter" value="CtsSecureElementAccessControlTestCases1" />
+    <option name="compatibility:include-filter" value="CtsSecureElementAccessControlTestCases2" />
+    <option name="compatibility:include-filter" value="CtsSecureElementAccessControlTestCases3" />
+    <option name="compatibility:include-filter" value="CtsSliceTestCases" />
+    <option name="compatibility:include-filter" value="CtsSustainedPerformanceHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsSystemApiAnnotationTestCases" />
+    <option name="compatibility:include-filter" value="CtsTelecomTestCases2" />
+    <option name="compatibility:include-filter" value="CtsTelephony2TestCases" />
+    <option name="compatibility:include-filter" value="CtsTelephony3TestCases" />
+    <option name="compatibility:include-filter" value="CtsTextTestCases" />
+    <option name="compatibility:include-filter" value="CtsToastTestCases" />
+    <option name="compatibility:include-filter" value="CtsTransitionTestCases" />
+    <option name="compatibility:include-filter" value="CtsTvProviderTestCases" />
+    <option name="compatibility:include-filter" value="CtsUiDeviceTestCases" />
+    <option name="compatibility:include-filter" value="CtsUsbTests" />
+    <option name="compatibility:include-filter" value="CtsVoiceInteractionTestCases" />
+    <option name="compatibility:include-filter" value="CtsVrTestCases" />
+    <option name="compatibility:include-filter" value="CtsWifiBroadcastsHostTestCases" />
+    <option name="compatibility:include-filter" value="CtsWrapWrapDebugMallocDebugTestCases" />
+    <option name="compatibility:include-filter" value="CtsWrapWrapDebugTestCases" />
+
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-virtual-device.xml b/tools/cts-tradefed/res/config/cts-virtual-device.xml
new file mode 100644
index 0000000..697ee2f
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts-virtual-device.xml
@@ -0,0 +1,36 @@
+<?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.
+-->
+<configuration description="Runs CTS with common options set for an automated run on userdebug/eng builds, and per module rules suitable for virtual devices">
+
+    <include name="cts-automated" />
+
+    <!-- Tell all AndroidJUnitTests to exclude certain annotations -->
+    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:exclude-annotation:android.support.test.filters.RequiresDevice" />
+    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:exclude-annotation:androidx.test.filters.RequiresDevice" />
+    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:exclude-annotation:android.platform.test.annotations.RequiresDevice" />
+
+    <!-- Tell all HostTests to exclude certain annotations -->
+    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.HostTest:exclude-annotation:android.platform.test.annotations.RequiresDevice" />
+    <option name="compatibility:test-arg" value="com.android.compatibility.common.tradefed.testtype.JarHostTest:exclude-annotation:android.platform.test.annotations.RequiresDevice" />
+
+    <!-- add per module rules for virtual devices below -->
+    <option name="compatibility:module-arg" value="CtsDeqpTestCases:include-filter:dEQP-GLES2.functional.prerequisite#*" />
+    <option name="compatibility:module-arg" value="CtsDeqpTestCases:include-filter:dEQP-EGL.*" />
+    <option name="compatibility:module-arg" value="CtsLibcoreTestCases:core-expectation:/virtualdeviceknownfailures.txt" />
+
+    <!-- Virtual devices usually run as root -->
+    <option name="compatibility:skip-system-status-check" value="com.android.tradefed.suite.checker.ShellStatusChecker" />
+</configuration>
diff --git a/tools/cts-tradefed/res/config/cts.xml b/tools/cts-tradefed/res/config/cts.xml
new file mode 100644
index 0000000..bc5c447
--- /dev/null
+++ b/tools/cts-tradefed/res/config/cts.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<configuration description="Runs CTS from a pre-existing CTS installation">
+
+    <include name="cts-common" />
+    <include name="cts-exclude" />
+    <include name="cts-exclude-instant" />
+
+    <option name="plan" value="cts" />
+
+</configuration>
diff --git a/tools/cts-tradefed/res/config/retry.xml b/tools/cts-tradefed/res/config/retry.xml
new file mode 100644
index 0000000..0a01dc3
--- /dev/null
+++ b/tools/cts-tradefed/res/config/retry.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 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.
+-->
+<configuration description="Runs a retry of a previous CTS session.">
+    <object type="previous_loader" class="com.android.compatibility.common.tradefed.result.suite.PreviousResultLoader" />
+    <test class="com.android.tradefed.testtype.suite.retry.RetryRescheduler" />
+
+    <logger class="com.android.tradefed.log.FileLogger">
+        <option name="log-level-display" value="WARN" />
+    </logger>
+</configuration>
diff --git a/tools/cts-tradefed/res/config/security-bulletin.xml b/tools/cts-tradefed/res/config/security-bulletin.xml
new file mode 100644
index 0000000..02175a9
--- /dev/null
+++ b/tools/cts-tradefed/res/config/security-bulletin.xml
@@ -0,0 +1,31 @@
+<?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.
+-->
+<configuration description="Runs Security Patch test cases">
+
+    <option name="plan" value="security-bulletin" />
+
+    <include name="cts"/>
+
+    <option name="compatibility:include-filter" value="CtsSecurityTestCases" />
+
+    <option name="compatibility:include-filter" value="CtsSecurityHostTestCases" />
+
+    <!-- Only run tests with @SecurityTest annotation. -->
+    <option name="compatibility:module-arg" value="CtsSecurityHostTestCases:include-annotation:android.platform.test.annotations.SecurityTest"/>
+
+    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:include-annotation:android.platform.test.annotations.SecurityTest" />
+
+</configuration>
diff --git a/tools/cts-tradefed/tests/Android.bp b/tools/cts-tradefed/tests/Android.bp
new file mode 100644
index 0000000..0d0bcea
--- /dev/null
+++ b/tools/cts-tradefed/tests/Android.bp
@@ -0,0 +1,26 @@
+// Copyright (C) 2015 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.
+
+java_library_host {
+    name: "cts-tradefed-tests",
+
+    srcs: ["src/**/*.java"],
+
+    libs: [
+        "tradefed",
+        "cts-tradefed",
+    ],
+    // We ship the Deqp Runner tests with the CTS one to validate them.
+    static_libs: ["CtsDeqpRunnerTests"],
+}
diff --git a/tools/cts-tradefed/tests/run_cts_tests.sh b/tools/cts-tradefed/tests/run_cts_tests.sh
new file mode 100755
index 0000000..428b9ec
--- /dev/null
+++ b/tools/cts-tradefed/tests/run_cts_tests.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+# Copyright (C) 2018 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.
+
+# A simple helper script that runs the CTS harness unit tests
+
+CTS_DIR=`dirname $0`/../etc
+
+${CTS_DIR}/cts-tradefed run singleCommand host -n \
+  --console-result-reporter:suppress-passed-tests \
+  --class com.android.compatibility.common.tradefed.UnitTests \
+  --class com.android.compatibility.common.util.HostUnitTests \
+  --class com.android.compatibility.common.util.UnitTests \
+  --class com.android.compatibility.tradefed.CtsTradefedTest \
+  --class com.drawelements.deqp.runner.DeqpTestRunnerTest \
+  "$@"
diff --git a/tools/cts-tradefed/tests/src/com/android/compatibility/tradefed/CtsTradefedTest.java b/tools/cts-tradefed/tests/src/com/android/compatibility/tradefed/CtsTradefedTest.java
new file mode 100644
index 0000000..5d5df59
--- /dev/null
+++ b/tools/cts-tradefed/tests/src/com/android/compatibility/tradefed/CtsTradefedTest.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.compatibility.tradefed;
+
+import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
+import com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.config.OptionSetter;
+import com.android.tradefed.util.FileUtil;
+
+import junit.framework.TestCase;
+
+import java.io.File;
+
+/**
+ * Tests for cts-tradefed.
+ */
+public class CtsTradefedTest extends TestCase {
+
+    private static final String PROPERTY_NAME = "CTS_ROOT";
+    private static final String SUITE_FULL_NAME = "Compatibility Test Suite";
+    private static final String SUITE_NAME = "CTS";
+    private static final String SUITE_PLAN = "cts";
+    private static final String DYNAMIC_CONFIG_URL = "";
+
+    private String mOriginalProperty = null;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mOriginalProperty = System.getProperty(PROPERTY_NAME);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (mOriginalProperty != null) {
+            System.setProperty(PROPERTY_NAME, mOriginalProperty);
+        }
+        super.tearDown();
+    }
+
+    public void testSuiteInfoLoad() throws Exception {
+        // Test the values in the manifest can be loaded
+        File root = FileUtil.createTempDir("root");
+        System.setProperty(PROPERTY_NAME, root.getAbsolutePath());
+        File base = new File(root, "android-cts");
+        base.mkdirs();
+        File tests = new File(base, "testcases");
+        tests.mkdirs();
+        CompatibilityBuildProvider provider = new CompatibilityBuildProvider();
+        OptionSetter setter = new OptionSetter(provider);
+        setter.setOptionValue("plan", SUITE_PLAN);
+        setter.setOptionValue("dynamic-config-url", DYNAMIC_CONFIG_URL);
+        IBuildInfo info = provider.getBuild();
+        CompatibilityBuildHelper helper = new CompatibilityBuildHelper(info);
+        assertEquals("Incorrect suite full name", SUITE_FULL_NAME, helper.getSuiteFullName());
+        assertEquals("Incorrect suite name", SUITE_NAME, helper.getSuiteName());
+        FileUtil.recursiveDelete(root);
+    }
+}
diff --git a/tools/manifest-generator/Android.bp b/tools/manifest-generator/Android.bp
new file mode 100644
index 0000000..9d6cdb8
--- /dev/null
+++ b/tools/manifest-generator/Android.bp
@@ -0,0 +1,25 @@
+// Copyright (C) 2015 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.
+
+java_library_host {
+    name: "compatibility-manifest-generator",
+
+    srcs: ["src/**/*.java"],
+
+    static_libs: ["kxml2-2.3.0"],
+
+    manifest: "MANIFEST.mf",
+
+    use_tools_jar: true,
+}
diff --git a/tools/manifest-generator/MANIFEST.mf b/tools/manifest-generator/MANIFEST.mf
new file mode 100644
index 0000000..4f62631
--- /dev/null
+++ b/tools/manifest-generator/MANIFEST.mf
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+Main-Class: com.android.compatibility.common.generator.ManifestGenerator
diff --git a/tools/manifest-generator/src/com/android/compatibility/common/generator/ManifestGenerator.java b/tools/manifest-generator/src/com/android/compatibility/common/generator/ManifestGenerator.java
new file mode 100644
index 0000000..c78723f
--- /dev/null
+++ b/tools/manifest-generator/src/com/android/compatibility/common/generator/ManifestGenerator.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.compatibility.common.generator;
+
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.kxml2.io.KXmlSerializer;
+
+public class ManifestGenerator {
+
+    private static final String DEFAULT_MIN_SDK = "8";
+
+    private static final String USAGE =
+            "Usage: manifest-generator -n NAME -p PACKAGE_NAME -o OUTPUT_FILE -i INSTRUMENT_NAME "
+                    + "[-s MIN_SDK_VERSION] [-t TARGET_SDK_VERSION] [-r PERMISSION]+ "
+                    + "[-a ACTIVITY]+ [-l REQUIRED_LIBRARY]+ [-lo OPTIONAL_LIBRARY]+";
+    private static final String MANIFEST = "manifest";
+    private static final String USES_SDK = "uses-sdk";
+    private static final String USES_PERMISSION = "uses-permission";
+    private static final String APPLICATION = "application";
+    private static final String INSTRUMENTATION = "instrumentation";
+    private static final String ACTIVITY = "activity";
+    private static final String USES_LIBRARY = "uses-library";
+
+    public static void main(String[] args) {
+        String pkgName = null;
+        String instrumentName = null;
+        String minSdk = DEFAULT_MIN_SDK;
+        String targetSdk = null;
+        List<String> permissions = new ArrayList<>();
+        List<String> activities = new ArrayList<>();
+        List<String> libraries = new ArrayList<>();
+        List<String> optionalLibs = new ArrayList<>();
+        String output = null;
+
+        for (int i = 0; i < args.length - 1; i++) {
+            if (args[i].equals("-p")) {
+                pkgName = args[++i];
+            } else if (args[i].equals("-a")) {
+                activities.add(args[++i]);
+            } else if (args[i].equals("-l")) {
+                libraries.add(args[++i]);
+            } else if (args[i].equals("-lo")) {
+                optionalLibs.add(args[++i]);
+            } else if (args[i].equals("-o")) {
+                output = args[++i];
+            } else if (args[i].equals("-i")) {
+                instrumentName = args[++i];
+            } else if (args[i].equals("-r")) {
+                permissions.add(args[++i]);
+            } else if (args[i].equals("-s")) {
+                minSdk = args[++i];
+            } else if (args[i].equals("-t")) {
+                targetSdk = args[++i];
+            }
+        }
+
+        if (pkgName == null) {
+            error("Missing package name");
+        } else if (instrumentName == null) {
+            error("Missing instrumentation name");
+        } else if (activities.isEmpty()) {
+            error("No activities");
+        } else if (output == null) {
+            error("Missing output file");
+        }
+
+        FileOutputStream out = null;
+        try {
+            out = new FileOutputStream(output);
+            generate(
+                    out,
+                    pkgName,
+                    instrumentName,
+                    minSdk,
+                    targetSdk,
+                    permissions,
+                    activities,
+                    libraries,
+                    optionalLibs);
+        } catch (Exception e) {
+            System.err.println("Couldn't create manifest file");
+        } finally {
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (Exception e) {
+                    // Ignore
+                }
+            }
+        }
+    }
+
+    /*package*/ static void generate(
+            OutputStream out,
+            String pkgName,
+            String instrumentName,
+            String minSdk,
+            String targetSdk,
+            List<String> permissions,
+            List<String> activities,
+            List<String> libraries,
+            List<String> optionalLibs)
+            throws Exception {
+        final String ns = null;
+        KXmlSerializer serializer = new KXmlSerializer();
+        serializer.setOutput(out, "UTF-8");
+        serializer.startDocument("UTF-8", true);
+        serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
+        serializer.startTag(ns, MANIFEST);
+        serializer.attribute(ns, "xmlns:android", "http://schemas.android.com/apk/res/android");
+        serializer.attribute(ns, "package", pkgName);
+        serializer.startTag(ns, USES_SDK);
+        serializer.attribute(ns, "android:minSdkVersion", minSdk);
+        if (targetSdk != null) {
+            serializer.attribute(ns, "android:targetSdkVersion", targetSdk);
+        }
+        serializer.endTag(ns, USES_SDK);
+        for (String permission : permissions) {
+            serializer.startTag(ns, USES_PERMISSION);
+            serializer.attribute(ns, "android:name", permission);
+            serializer.endTag(ns, USES_PERMISSION);
+        }
+        serializer.startTag(ns, APPLICATION);
+        for (String library : libraries) {
+            serializer.startTag(ns, USES_LIBRARY);
+            serializer.attribute(ns, "android:name", library);
+            serializer.endTag(ns, USES_LIBRARY);
+        }
+        for (String optionalLib : optionalLibs) {
+            serializer.startTag(ns, USES_LIBRARY);
+            serializer.attribute(ns, "android:name", optionalLib);
+            serializer.attribute(ns, "android:required", "false");
+            serializer.endTag(ns, USES_LIBRARY);
+        }
+        for (String activity : activities) {
+            serializer.startTag(ns, ACTIVITY);
+            serializer.attribute(ns, "android:name", activity);
+            serializer.endTag(ns, ACTIVITY);
+        }
+        serializer.endTag(ns, APPLICATION);
+        serializer.startTag(ns, INSTRUMENTATION);
+        serializer.attribute(ns, "android:name", instrumentName);
+        serializer.attribute(ns, "android:targetPackage", pkgName);
+        serializer.endTag(ns, INSTRUMENTATION);
+        serializer.endTag(ns, MANIFEST);
+        serializer.endDocument();
+        out.flush();
+    }
+
+    private static void error(String message) {
+        System.err.println(message);
+        System.err.println(USAGE);
+        System.exit(1);
+    }
+}
diff --git a/tools/manifest-generator/tests/Android.bp b/tools/manifest-generator/tests/Android.bp
new file mode 100644
index 0000000..b8f012d
--- /dev/null
+++ b/tools/manifest-generator/tests/Android.bp
@@ -0,0 +1,24 @@
+// Copyright (C) 2015 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.
+
+java_test_host {
+    name: "compatibility-manifest-generator-tests",
+
+    srcs: ["src/**/*.java"],
+
+    libs: [
+        "compatibility-manifest-generator",
+        "junit",
+    ],
+}
diff --git a/tools/manifest-generator/tests/run_tests.sh b/tools/manifest-generator/tests/run_tests.sh
new file mode 100755
index 0000000..0a77a9b
--- /dev/null
+++ b/tools/manifest-generator/tests/run_tests.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+# Copyright (C) 2015 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.
+
+# Helper script for running unit tests for compatibility libraries
+
+HARNESS_DIR=$(dirname ${0})/../../../..
+source ${HARNESS_DIR}/test_defs.sh
+
+JARS="
+    compatibility-manifest-generator\
+    compatibility-manifest-generator-tests"
+
+run_tests "com.android.compatibility.common.generator.ManifestGeneratorTest" "${JARS}" "${@}"
+
diff --git a/tools/manifest-generator/tests/src/com/android/compatibility/common/generator/ManifestGeneratorTest.java b/tools/manifest-generator/tests/src/com/android/compatibility/common/generator/ManifestGeneratorTest.java
new file mode 100644
index 0000000..c95ec64
--- /dev/null
+++ b/tools/manifest-generator/tests/src/com/android/compatibility/common/generator/ManifestGeneratorTest.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.compatibility.common.generator;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+/** Unit tests for {@link ManifestGenerator}. */
+public class ManifestGeneratorTest extends TestCase {
+
+    private static final String PACKAGE = "test.package";
+    private static final String INSTRUMENT = "test.package.TestInstrument";
+    private static final String MIN_SDK = "8";
+    private static final String TARGET_SDK = "17";
+    private static final String MANIFEST =
+            "<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\r\n"
+                    + "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" "
+                    + "package=\"test.package\">\r\n"
+                    + "  <uses-sdk android:minSdkVersion=\"8\" android:targetSdkVersion=\"17\" "
+                    + "/>\r\n"
+                    + "%s"
+                    + "  <application>\r\n"
+                    + "%s"
+                    + "%s"
+                    + "%s"
+                    + "  </application>\r\n"
+                    + "  <instrumentation android:name=\"test.package.TestInstrument\" "
+                    + "android:targetPackage=\"test.package\" />\r\n"
+                    + "</manifest>";
+    private static final String PERMISSION = "  <uses-permission android:name=\"%s\" />\r\n";
+    private static final String PERMISSION_A = "android.permission.PermissionA";
+    private static final String PERMISSION_B = "android.permission.PermissionB";
+    private static final String ACTIVITY = "    <activity android:name=\"%s\" />\r\n";
+    private static final String ACTIVITY_A = "test.package.ActivityA";
+    private static final String ACTIVITY_B = "test.package.ActivityB";
+    private static final String USES_LIBRARY = "    <uses-library android:name=\"%s\" />\r\n";
+    private static final String USES_OPTIONAL_LIBRARY =
+            "    <uses-library android:name=\"%s\" android:required=\"false\" />\r\n";
+    private static final String LIBRARY = "test.runner.library";
+    private static final String OPTIONAL_LIBRARY = "android.test.base";
+
+    public void testManifest() throws Exception {
+        List<String> permissions = new ArrayList<>();
+        permissions.add(PERMISSION_A);
+        permissions.add(PERMISSION_B);
+        List<String> activities = new ArrayList<>();
+        activities.add(ACTIVITY_A);
+        activities.add(ACTIVITY_B);
+        List<String> libraries = new ArrayList<>();
+        libraries.add(LIBRARY);
+        List<String> optionalLibs = new ArrayList<>();
+        optionalLibs.add(OPTIONAL_LIBRARY);
+        OutputStream output = new OutputStream() {
+            private StringBuilder string = new StringBuilder();
+            @Override
+            public void write(int b) throws IOException {
+                this.string.append((char) b);
+            }
+
+            @Override
+            public String toString(){
+                return this.string.toString();
+            }
+        };
+        ManifestGenerator.generate(
+                output,
+                PACKAGE,
+                INSTRUMENT,
+                MIN_SDK,
+                TARGET_SDK,
+                permissions,
+                activities,
+                libraries,
+                optionalLibs);
+        String permissionXml = String.format(PERMISSION, PERMISSION_A)
+                + String.format(PERMISSION, PERMISSION_B);
+        String activityXml = String.format(ACTIVITY, ACTIVITY_A)
+                + String.format(ACTIVITY, ACTIVITY_B);
+        String libraryXml = String.format(USES_LIBRARY, LIBRARY);
+        String optionalLibraryXml = String.format(USES_OPTIONAL_LIBRARY, OPTIONAL_LIBRARY);
+        String expected =
+                String.format(MANIFEST, permissionXml, libraryXml, optionalLibraryXml, activityXml);
+        assertEquals("Wrong manifest output", expected, output.toString());
+    }
+
+}
diff --git a/tools/release-parser/Android.bp b/tools/release-parser/Android.bp
index 99b1e29..b2582df 100644
--- a/tools/release-parser/Android.bp
+++ b/tools/release-parser/Android.bp
@@ -35,7 +35,6 @@
     // super fragile.
     static_libs: [
         "compatibility-host-util",
-        "hosttestlib",
         "dexlib2",
         "jsonlib",
         "tradefed",
diff --git a/tools/selinux/SELinuxNeverallowTestFrame.py b/tools/selinux/SELinuxNeverallowTestFrame.py
index 92985ef..740e983 100644
--- a/tools/selinux/SELinuxNeverallowTestFrame.py
+++ b/tools/selinux/SELinuxNeverallowTestFrame.py
@@ -81,7 +81,7 @@
             // Caching this variable to save time.
             if (mVendorSepolicyVersion == -1) {
                 mVendorSepolicyVersion =
-                        android.security.cts.SELinuxHostTest.getVendorSepolicyVersion(mDevice);
+                        android.security.cts.SELinuxHostTest.getVendorSepolicyVersion(mBuild, mDevice);
             }
         }
     }
@@ -94,6 +94,10 @@
         return PropertyUtil.getFirstApiLevel(mDevice) > 29;
     }
 
+    private boolean isDeviceLaunchingWithS() throws Exception {
+        return PropertyUtil.getFirstApiLevel(mDevice) > 30;
+    }
+
     private boolean isCompatiblePropertyEnforcedDevice() throws Exception {
         return android.security.cts.SELinuxHostTest.isCompatiblePropertyEnforcedDevice(mDevice);
     }
@@ -112,6 +116,7 @@
         String neverallowRule = "$NEVERALLOW_RULE_HERE$";
         boolean fullTrebleOnly = $TREBLE_ONLY_BOOL_HERE$;
         boolean launchingWithROnly = $LAUNCHING_WITH_R_ONLY_BOOL_HERE$;
+        boolean launchingWithSOnly = $LAUNCHING_WITH_S_ONLY_BOOL_HERE$;
         boolean compatiblePropertyOnly = $COMPATIBLE_PROPERTY_ONLY_BOOL_HERE$;
 
         if ((fullTrebleOnly) && (!isFullTrebleDevice())) {
@@ -122,6 +127,10 @@
             // This test applies only to devices launching with R or later but this device isn't one
             return;
         }
+        if ((launchingWithSOnly) && (!isDeviceLaunchingWithS())) {
+            // This test applies only to devices launching with S or later but this device isn't one
+            return;
+        }
         if ((compatiblePropertyOnly) && (!isCompatiblePropertyEnforcedDevice())) {
             // This test applies only to devices on which compatible property is enforced but this
             // device isn't one
diff --git a/tools/selinux/SELinuxNeverallowTestGen.py b/tools/selinux/SELinuxNeverallowTestGen.py
index 8ecd2b6..a28863b 100755
--- a/tools/selinux/SELinuxNeverallowTestGen.py
+++ b/tools/selinux/SELinuxNeverallowTestGen.py
@@ -18,7 +18,12 @@
 
 # full-Treble only tests are inside sections delimited by BEGIN_{section} and
 # END_{section} comments.
-sections = ["TREBLE_ONLY", "COMPATIBLE_PROPERTY_ONLY", "LAUNCHING_WITH_R_ONLY"]
+sections = [
+    "TREBLE_ONLY",
+    "COMPATIBLE_PROPERTY_ONLY",
+    "LAUNCHING_WITH_R_ONLY",
+    "LAUNCHING_WITH_S_ONLY",
+]
 
 # extract_neverallow_rules - takes an intermediate policy file and pulls out the
 # neverallow rules by taking all of the non-commented text between the 'neverallow'
diff --git a/tools/vm-tests-tf/Android.mk b/tools/vm-tests-tf/Android.mk
index fdbf169..44217ae 100644
--- a/tools/vm-tests-tf/Android.mk
+++ b/tools/vm-tests-tf/Android.mk
@@ -65,7 +65,7 @@
 LOCAL_MODULE_PATH := $(intermediates)
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 include $(BUILD_SYSTEM)/base_rules.mk
 
diff --git a/tools/vm-tests-tf/build/src/util/build/BuildCTSHostSources.java b/tools/vm-tests-tf/build/src/util/build/BuildCTSHostSources.java
index bcdcd49..30279ef 100644
--- a/tools/vm-tests-tf/build/src/util/build/BuildCTSHostSources.java
+++ b/tools/vm-tests-tf/build/src/util/build/BuildCTSHostSources.java
@@ -39,6 +39,7 @@
     private static String HOSTJUNIT_SRC_OUTPUT_FOLDER = "";
 
     private static final String TARGET_JAR_ROOT_PATH = "/data/local/tmp/vm-tests";
+    private static final String APEX_ART_BIN_PATH = "/apex/com.android.art/bin";
 
     /**
      * @param args
@@ -178,9 +179,9 @@
     }
 
     private static String getShellExecJavaLine(String classpath, String mainclass) {
-      String cmd = String.format("ANDROID_DATA=%s dalvikvm|#ABI#| -Xmx512M -Xss32K " +
-              "-Djava.io.tmpdir=%s -classpath %s %s", TARGET_JAR_ROOT_PATH, TARGET_JAR_ROOT_PATH,
-              classpath, mainclass);
+      String cmd = String.format("ANDROID_DATA=%s %s/dalvikvm|#ABI#| -Xmx512M -Xss32K " +
+              "-Djava.io.tmpdir=%s -classpath %s %s", TARGET_JAR_ROOT_PATH, APEX_ART_BIN_PATH,
+              TARGET_JAR_ROOT_PATH, classpath, mainclass);
       StringBuilder code = new StringBuilder();
       code.append("    String cmd = AbiFormatter.formatCmdForAbi(\"")
           .append(cmd)
diff --git a/tools/vm-tests-tf/targetprep/Android.mk b/tools/vm-tests-tf/targetprep/Android.mk
index b4c2bf0..b87b08a 100644
--- a/tools/vm-tests-tf/targetprep/Android.mk
+++ b/tools/vm-tests-tf/targetprep/Android.mk
@@ -25,7 +25,7 @@
 LOCAL_MODULE := compatibility-host-vm-targetprep
 
 # Tag this module as a cts test artifact
-LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests
+LOCAL_COMPATIBILITY_SUITE := cts general-tests
 
 include $(BUILD_HOST_JAVA_LIBRARY)